示例#1
0
  /**
   * Evaluate a function at a specific point for one single variable. Evaluation is done between
   * xmin and xmax. It is assumed that there are no any other variable involved
   *
   * @param indvars Define independent variable, like 'x' Only one variable is allowed
   * @param xmin xmin value for independent varible
   * @param xmax xmax value for independent varible
   * @return true if no errors
   */
  public boolean eval(String indvars, double xmin, double xmax) {

    boolean suc = true;
    String name = proxy.getName();
    int points = proxy.getPoints();

    double min = xmin;
    double max = xmax;
    x = new double[points];
    y = new double[points];
    for (int i = 0; i < points; i++) {
      x[i] = min + i * (max - min) / (points - 1);
      jep.addVariable(indvars.trim(), x[i]);

      try {
        Object result = jep.evaluate(node);
        if (result instanceof Double) {
          y[i] = ((Double) jep.evaluate(node)).doubleValue();
        }
      } catch (ParseException e) {
        jhplot.utils.Util.ErrorMessage(
            "Failed to parse function " + name + " Error:" + e.toString());
        suc = false;
      }
    }

    if (suc) isEvaluated = true;

    return suc;
  } // end 1-D evaluation
示例#2
0
  /**
   * Create a function in any dimension evaluation.
   *
   * <p>The function may have many independent variables.
   *
   * <p>
   *
   * <h3>List of commands</h3>
   *
   * <ul>
   *   <li>( ) parenthesis , comma
   *   <li>+, -, unary -, unary +
   *   <li>*, /
   *   <li>^ (raise to a power)
   *   <li>pi, e, All the constants in class SpecialFunction
   *   <li>log
   *   <li>sin, cos, tan, sinh, cosh, tanh
   *   <li>asin, acos, atan, asinh, acosh, atanh
   *   <li>sqrt
   *   <li>rand
   *   <li>exp
   *   <li>remainder
   *   <li>atan2
   *   <li>Special functions and constants. Look at the book
   *   <li>All the functions in class SpecialFunction
   *   <li>Independent variables x
   *   <li>Scientific notation using "e", "E", "d", "D".
   * </ul>
   *
   * @prama title Title of the function
   * @param name String representing the function
   * @param vars String representing variables. Each variable should be separated by a comma.
   *     Example "x,y,z"
   */
  public FND(String title, String name, String vars) {

    this.title = title;
    proxy = new FProxy(3, title, name, null, new double[] {0, 0, 0, 0, 0, 0}, maxpoints, true);

    name = proxy.getName();
    proxy.setVariables(vars);
    setTitle(title);
    lpp.setType(LinePars.F1D);
    jep = new XJep();
    jep.addStandardConstants();
    jep.addStandardFunctions();
    jep.setAllowUndeclared(true);
    jep.setImplicitMul(true);
    jep.setAllowAssignment(true);

    // get all variables
    avars = vars.split(",");
    for (int i = 0; i < avars.length; i++) {
      jep.addVariable(avars[i].trim(), 0);
    }

    jep.addVariable("x", 0);

    try {
      node = jep.parse(name);
      processed = jep.preprocess(node);
    } catch (ParseException e) {
    } catch (Exception e) {
      ErrorMessage("Error in parsing " + name);
    }
  }
示例#3
0
  /**
   * Initialize function from proxy.
   *
   * @param f
   */
  public FND(FProxy f) {
    proxy = f;
    String name = proxy.getName();
    if (proxy.getType() != 4) {
      ErrorMessage("Error in parsing FND. Wrong type! " + name);
      return;
    }

    setTitle(proxy.getTitle());
    lpp.setType(LinePars.F1D);
    jep = new XJep();
    jep.addStandardConstants();
    jep.addStandardFunctions();
    jep.setAllowUndeclared(true);
    jep.setImplicitMul(true);
    jep.setAllowAssignment(true);

    // get all variables
    String vars = proxy.getVariables();
    avars = vars.split(",");
    for (int i = 0; i < avars.length; i++) {
      jep.addVariable(avars[i].trim(), 0);
    }

    jep.addVariable("x", 0);

    try {
      node = jep.parse(name);
      processed = jep.preprocess(node);
    } catch (ParseException e) {
    } catch (Exception e) {
      ErrorMessage("Error in parsing " + name);
    }
  }
示例#4
0
  /**
   * Evaluate a function at a specific point for one single variable. Evaluation is done between
   * xmin and xmax
   *
   * @param indvars Define independent variable, like 'x' Only one variable is allowed
   * @param xmin xmin value for independent varible
   * @param xmax xmax value for independent varible
   * @param vars define values for other variables, like 'y=1,z=3'
   * @return true if no errors
   */
  public boolean eval(String indvars, double xmin, double xmax, String vars) {
    String name = proxy.getName();
    int points = proxy.getPoints();
    boolean suc = true;
    String[] tmp = vars.split(",");
    // double[] vd = new double[tmp.length];
    fixedVars = vars;

    for (int i = 0; i < tmp.length; i++) {
      String[] vv = tmp[i].split("=");

      if (vv.length != 2) {
        ErrorMessage("Error in parsing list of input variablse. Did you use val=number? ");
      }

      try {
        double d = Double.valueOf(vv[1].trim()).doubleValue();
        jep.addVariable(vv[0].trim(), d);
      } catch (NumberFormatException nfe) {
        System.out.println("NumberFormatException: " + nfe.getMessage());
        suc = false;
      }
    }

    double min = xmin;
    double max = xmax;
    x = new double[points];
    y = new double[points];
    for (int i = 0; i < points; i++) {
      x[i] = min + i * (max - min) / (points - 1);
      jep.addVariable(indvars.trim(), x[i]);

      try {
        Object result = jep.evaluate(node);
        if (result instanceof Double) {
          y[i] = ((Double) jep.evaluate(node)).doubleValue();
        }
      } catch (ParseException e) {
        jhplot.utils.Util.ErrorMessage(
            "Failed to parse function " + name + " Error:" + e.toString());
        suc = false;
      }
    }

    if (suc) isEvaluated = true;

    return suc;
  } // end 1-D evaluation
示例#5
0
  /** Treat the function as complex. */
  public void simplify() {

    String name = proxy.getName();

    try {
      simp = jep.simplify(processed);
    } catch (ParseException e) {
    } catch (Exception e) {
      ErrorMessage("Error in simplification of " + name);
    }
  }
示例#6
0
  /**
   * differentiate the expression and simplify
   *
   * @param var variable used for differentiation
   */
  public void diff(String var) {
    String name = proxy.getName();

    DJep j = new DJep();
    j.addStandardConstants();
    j.addStandardFunctions();
    j.addComplex();
    j.setAllowUndeclared(true);
    j.setAllowAssignment(true);
    j.setImplicitMul(true);
    // Sets up standard rules for differentiating sin(x) etc.
    j.addStandardDiffRules();

    try {
      // parse the string
      node = j.parse(name);
      diff = j.differentiate(node, var);
      simp = j.simplify(diff);
    } catch (ParseException e) {
      ErrorMessage("Error in parsing " + name);
    }
  }
示例#7
0
 /**
  * Get the number of points
  *
  * @return Number of points
  */
 public int getPoints() {
   return proxy.getPoints();
 }
示例#8
0
 /**
  * Sets the number points between Min and Max for evaluation
  *
  * @param bins Number of points
  */
 public void setPoints(int bins) {
   proxy.setPoints(bins);
 }
示例#9
0
 /**
  * Get the maximum value in X
  *
  * @return Maximal value
  */
 public double getMax() {
   double[] d = proxy.getLimits();
   return d[1];
 }
示例#10
0
 /**
  * Set the maximum value in X
  *
  * @param max Maximal value
  */
 public void setMax(double max) {
   proxy.setLimit(1, max);
 }
示例#11
0
 /**
  * Get the minimum value in X
  *
  * @return min Minimum value
  */
 public double getMin() {
   double[] d = proxy.getLimits();
   return d[0];
 }
示例#12
0
 /**
  * Set Min value in X
  *
  * @param min Minimum value
  */
 public void setMin(double min) {
   proxy.setLimit(0, min);
 }
示例#13
0
 /**
  * Get arguments of the function (independent variables).
  *
  * @return arguments
  */
 public String getVarString() {
   return proxy.getVariables();
 }
示例#14
0
 /**
  * Get the name of the function used for evaluation
  *
  * @return Name
  */
 public String getName() {
   return proxy.getName();
 }
示例#15
0
 /**
  * Sets a name of the function, i.e. what will be used for evaluation
  *
  * @param name Name
  */
 public void setName(String name) {
   proxy.setName(name);
 }