是否可以动态地解决数学函数

时间:2013-08-29 10:06:04

标签: java api math expression-evaluation

是否有可能动态地解决数学函数,例如使用给定的API?

鉴于有一个功能

a = b + c

有没有办法写出类似于:

的东西
Function func = new Function("a=b+c");
Result result = func.resolve("a=1", "b=?", "c=a"); 
System.out.println(result.getValue());

理想情况下,resolve(Object... args)应接受Function类型的其他类。

编辑1: API应该可以包含在Java EE环境中,例如jBossAS。

编辑2:实际上我想用一个未知变量求解方程,但我想避免使用硬编码函数。因此,对于函数

a+b=c

我不想写硬编码的函数

getA(int b, int c){...}
getB(int a, int c){...}
getC(int a, int b){...}

相反,正如@Berylium所说,我想动态评估表达式。


编辑3:我正在尝试symja,我想我越来越近了,但我的语法很麻烦。

try {
    F.initSymbols(null);
    EvalUtilities util = new EvalUtilities();
    StringBufferWriter buf = new StringBufferWriter();
    String input = "....";  
    IExpr result = util.evaluate(input);
    OutputFormFactory.get().convert(buf, result);
    String output = buf.toString();
    System.out.println("Evaluation for " + input + " is " + output);
} catch (final Exception e) {

你能帮我解决输入语法吗?


编辑4:知道了:-)输入

String input = "Solve[{a==10,c==20,a+b==c},{a,b,c}]";  

输出

Evaluation for Solve[{a==10,c==20,a+b==c},{a,b,c}] is {{a->10,c->20,b->10}}

2 个答案:

答案 0 :(得分:1)

任何可嵌入的Java脚本引擎都可以:

例如,使用BeanShell

    final Interpreter interp = new Interpreter();
    try {
        interp.eval("System.out.println(\"Hello, world\");");

        final String s = "Hello, world (2)";
        interp.set("test", s);
        interp.eval("System.out.println(test);");

        System.out.println("3+4=" + interp.eval("3+4"));

        interp.set("a", 4);
        interp.set("b", 5);
        System.out.println("a + b = " + interp.eval("a + b"));

        final String script1 =
          "public int f(int a) { return a * a; }; System.out.println(f(4));";
        interp.eval(script1);

        final String script2 = 
          "public int f(int a) { return a * a; }; f(4)";
        System.out.println(interp.eval(script2));

        final String script3 = 
          "import java.util.Date; Date date = new Date(); date";
        System.out.println(interp.eval(script3));

        final String script4 = 
          "class X { public int a; } X x = new X(); x.a = 5; x.a";
        System.out.println(interp.eval(script4));

    } catch (EvalError e) {
        e.printStackTrace();
    }

一个优点是BeanShell使用的Java语法非常接近Java。因此,无需学习/使用其他语言/语法。

答案 1 :(得分:0)

symja JAR添加到构建路径后,以下代码将打印以下输出:

代码:

public static void main(String[] args) {

    try {
        F.initSymbols(null);
        EvalUtilities util = new EvalUtilities();

        StringBufferWriter buf = new StringBufferWriter();
        String input = "Solve[{a==10,c==20,a+b==c},{a,b,c}]";  
        IExpr result = util.evaluate(input);
        OutputFormFactory.get().convert(buf, result);
        String output = buf.toString();
        System.out.println("Evaluation for " + input + " is " + output);

    } catch (final Exception e) {
        e.printStackTrace();
    } finally {
        // Call terminate() only one time at the end of the program  
        ComputerThreads.terminate();
    }

}

输出:

Evaluation for Solve[{a==10,c==20,a+b==c},{a,b,c}] is {{a->10,c->20,b->10}}