コード例 #1
0
ファイル: FND.java プロジェクト: christinapanto/project
  /**
   * 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);
    }
  }
コード例 #2
0
ファイル: FND.java プロジェクト: christinapanto/project
  /**
   * 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);
    }
  }
コード例 #3
0
ファイル: FND.java プロジェクト: christinapanto/project
  /**
   * 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
コード例 #4
0
ファイル: FND.java プロジェクト: christinapanto/project
  /**
   * 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
コード例 #5
0
ファイル: FND.java プロジェクト: christinapanto/project
  /**
   * Evaluate a function at a specific point in x
   *
   * @param vars Values for evaluation separated by commas, x=1,y=2,z=3
   * @return function value at x
   */
  public double eval(String vars) {

    // get all variables
    String[] tmp = vars.split(",");
    // double[] vd = new double[tmp.length];

    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());
      }
    }

    try {
      Object result = jep.evaluate(node);
      if (result instanceof Double) {
        return ((Double) jep.evaluate(node)).doubleValue();
      }
    } catch (ParseException e) {
      return 0;
    }

    return 0;
  }