是否有可能动态地解决数学函数,例如使用给定的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}}
答案 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}}