0

たとえば、特定の 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)は、さらに type のクラスを受け入れる必要がありFunctionます。

編集 1: API は、jBossAS などの Java EE 環境に含める必要があります。

編集 2:実際には、未知の変数が 1 つある方程式を解きたいのですが、ハードコードされた関数は避けたいです。したがって、関数に対して

a+b=c

ハードコーディングされた関数を書きたくない

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

代わりに、@Beryrium が言うように、式を動的に評価したいと考えています。


編集 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}}
4

2 に答える 2

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

1 つの利点は、BeanShell が Java に非常に近い Java 構文を使用することです。したがって、別の言語/構文を学習/使用する必要はありません。

于 2013-08-29T11:11:18.967 に答える