⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 switchingfunctionshandler.java

📁 Apache的common math数学软件包
💻 JAVA
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.commons.math.ode;import org.apache.commons.math.ConvergenceException;import org.apache.commons.math.FunctionEvaluationException;import java.util.ArrayList;import java.util.Iterator;/** This class handles several {@link SwitchingFunction switching * functions} during integration. * * @see SwitchingFunction * @version $Revision: 620312 $ $Date: 2008-02-10 12:28:59 -0700 (Sun, 10 Feb 2008) $ * @since 1.2 */public class SwitchingFunctionsHandler {  /** Simple constructor.   * Create an empty handler   */  public SwitchingFunctionsHandler() {    functions   = new ArrayList();    first       = null;    initialized = false;  }  /** Add a switching function.   * @param function switching function   * @param maxCheckInterval maximal time interval between switching   * function checks (this interval prevents missing sign changes in   * case the integration steps becomes very large)   * @param convergence convergence threshold in the event time search   * @param maxIterationCount upper limit of the iteration count in   * the event time search   */  public void add(SwitchingFunction function, double maxCheckInterval,                  double convergence, int maxIterationCount) {    functions.add(new SwitchState(function, maxCheckInterval,                                  convergence, maxIterationCount));  }  /** Check if the handler does not have any condition.   * @return true if handler is empty   */  public boolean isEmpty() {    return functions.isEmpty();  }  /** Evaluate the impact of the proposed step on all handled   * switching functions.   * @param interpolator step interpolator for the proposed step   * @return true if at least one switching function triggers an event   * before the end of the proposed step (this implies the step should   * be rejected)   * @exception DerivativeException if the interpolator fails to   * compute the function somewhere within the step   * @exception IntegratorException if an event cannot be located   */  public boolean evaluateStep(StepInterpolator interpolator)    throws DerivativeException, IntegratorException {    try {      first = null;      if (functions.isEmpty()) {        // there is nothing to do, return now to avoid setting the        // interpolator time (and hence avoid unneeded calls to the        // user function due to interpolator finalization)        return false;      }      if (! initialized) {        // initialize the switching functions        double t0 = interpolator.getPreviousTime();        interpolator.setInterpolatedTime(t0);        double [] y = interpolator.getInterpolatedState();        for (Iterator iter = functions.iterator(); iter.hasNext();) {          ((SwitchState) iter.next()).reinitializeBegin(t0, y);        }        initialized = true;      }      // check events occurrence      for (Iterator iter = functions.iterator(); iter.hasNext();) {        SwitchState state = (SwitchState) iter.next();        if (state.evaluateStep(interpolator)) {          if (first == null) {            first = state;          } else {            if (interpolator.isForward()) {              if (state.getEventTime() < first.getEventTime()) {                first = state;              }            } else {              if (state.getEventTime() > first.getEventTime()) {                first = state;              }            }          }        }      }      return first != null;    } catch (FunctionEvaluationException fee) {      throw new IntegratorException(fee);    } catch (ConvergenceException ce) {      throw new IntegratorException(ce);    }  }  /** Get the occurrence time of the first event triggered in the   * last evaluated step.   * @return occurrence time of the first event triggered in the last   * evaluated step, or </code>Double.NaN</code> if no event is   * triggered   */  public double getEventTime() {    return (first == null) ? Double.NaN : first.getEventTime();  }  /** Inform the switching functions that the step has been accepted   * by the integrator.   * @param t value of the independent <i>time</i> variable at the   * end of the step   * @param y array containing the current value of the state vector   * at the end of the step   * @exception IntegratorException if the value of one of the   * switching functions cannot be evaluated   */  public void stepAccepted(double t, double[] y)    throws IntegratorException {    try {      for (Iterator iter = functions.iterator(); iter.hasNext();) {        ((SwitchState) iter.next()).stepAccepted(t, y);      }    } catch (FunctionEvaluationException fee) {      throw new IntegratorException(fee);    }  }  /** Check if the integration should be stopped at the end of the   * current step.   * @return true if the integration should be stopped   */  public boolean stop() {    for (Iterator iter = functions.iterator(); iter.hasNext();) {      if (((SwitchState) iter.next()).stop()) {        return true;      }    }    return false;  }  /** Let the switching functions reset the state if they want.   * @param t value of the independent <i>time</i> variable at the   * beginning of the next step   * @param y array were to put the desired state vector at the beginning   * of the next step   * @return true if the integrator should reset the derivatives too   */  public boolean reset(double t, double[] y) {    boolean resetDerivatives = false;    for (Iterator iter = functions.iterator(); iter.hasNext();) {      if (((SwitchState) iter.next()).reset(t, y)) {        resetDerivatives = true;      }    }    return resetDerivatives;  }  /** Switching functions. */  private ArrayList functions;  /** First active switching function. */  private SwitchState first;  /** Initialization indicator. */  private boolean initialized;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -