自动函数求解/写入方程式声明(java?)

时间:2016-09-28 16:30:43

标签: java parsing math expression equation

我还没有在网上找到一个免费的Java库(很多人推荐Jep,但它不是免费的)。我想确切地说,我的需求不是解决线性方程(我已经阅读了它上面的帖子),但是为了节省编码时间:

Java需要

我想要做的是:我不想与Function的对象进行交互,而是希望与Equation的对象进行交互,这意味着我不想写两次相同的相等或断言。

让我们说我随着时间的推移处理相同的等式:a + b = c。好吧,有时候,我可以有a和b,有时是b和c等。如果我想得到它们,我需要为每个案例写一个函数:f(a,b) - > c,f(a,c) - > b等 是否有一个库(除了Jep之外)或者您是否知道可以执行以下伪代码的实现(公式类):

Equation eq = new Equation(a+b=c)
eq.a=1
eq.b=2
println(eq.c)  //return 3

Equation eq = new Equation(a+b=c)
eq.a=1
eq.c=3
println(eq.b)  //return 2

我们甚至可以想象这样的事情:

Equation eq = new Equation()
eq.left.addVariable().plus().addVariable()
eq.right.addVariable()
eq.left.variables.set(0)=1
eq.left.variables.set(1)=2
println(eq.get.)  //return 3

一般数学/逻辑

仅仅是因为我的个人知识:

是否存在任何线性方程,一个能够自动解释并生成所有可能函数的程序,使该方程成立?

是否存在任何线性函数,一个可以自动解释并生成该函数的等式的程序?

让我们疯了:

是否有任何编程函数(所以一个过程采用n个参数并返回结果),一个程序可以自动解释并生成所有编程函数,提供完全相同的元组(args + result)

准确地说我的最后一个问题,让我们想象一下这个伪代码:

Class FunctionE extends Equationalized{
 apply(arg1,arg2,arg3){
   //do some stuff
 return arg4
}

Equation eq = FunctionE.Equationalize() //return Equation
eq.arg1=***
eq.arg2=***
eq.arg4=***
print(eq.arg3)

如果上述问题之一有一个有限的肯定答案,我很有兴趣知道它是哪一个,它是哪一个!

谢谢

3 个答案:

答案 0 :(得分:1)

所以说实话,这只是答案的一半,因为我在java中没有看到这样的东西。

由于你在标题中添加(java ?),我只想说出来:使用免费的sympy库在python中有一种非常简单的方法。

更复杂的功能可以解决,衍生,集成,扩展和简化,例如这段代码:

 >>> solve(Eq(x**3 + 2*x**2 + 4*x + 8, 0), x)
 [-2*I, 2*I, -2]

取自Quick Examples

老实说,我认为编写一个小的python脚本并从java调用它然后就可以为java写这样的东西。

然后再说一遍,java中可能有一些我不知道的库可以做到这一点。

答案 1 :(得分:1)

旧版本的Jep可用,它在啤酒和开源中是免费的。它可以在https://sourceforge.net/projects/jep/上获得,也可以稍微更改一下git-hub存储库https://github.com/nathanfunk/jep-java-gpl。它非常实用,但却忽略了后来商业版的一些功能。

除严重错误外,此版本尚未积极开发。

看看你的问题,似乎没有Jep可以在没有相当多工作的情况下做到这一点。

(免责声明我是Jep的开发人员之一)

如果您严格遵循线性方程式。然后有一个完整的线性编程领域,那里有许多免费的数字库。见http://www.ee.ucl.ac.uk/~mflanaga/java/OpenSourceNumeric.html

值得好好看看Apache Commons Maths这是非常强大的,也可以解决一些非线性问题。

答案 2 :(得分:1)

Symja - Java Computer Algebra Library中,您可以使用此代码段对您的示例进行编程:

import org.matheclipse.core.eval.ExprEvaluator;
import org.matheclipse.core.expression.F;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.parser.client.SyntaxError;
import org.matheclipse.parser.client.math.MathException;

public class SolveSO39753012 {

    public static void main(String[] args) {
        try {
            ExprEvaluator util = new ExprEvaluator();
            IExpr eq = F.Equal(F.Plus(F.a, F.b), F.c);
            IExpr eq1 = eq.replaceAll(F.Rule(F.a, F.integer(1)));
            eq1 = eq1.replaceAll(F.Rule(F.b, F.integer(2)));

            // Solve(1+2==c, c)
            IExpr result = util.evaluate(F.Solve(eq1, F.c));
            // print: {{c->3}}
            System.out.println(result.toString());

            IExpr eq2 = eq.replaceAll(F.Rule(F.a, F.integer(1)));
            eq2 = eq2.replaceAll(F.Rule(F.c, F.integer(3)));
            // Solve(1+b==3, b)
            result = util.evaluate(F.Solve(eq2, F.b));
            // print: {{b->2}}
            System.out.println(result.toString());

        } catch (SyntaxError e) {
            // catch Symja parser errors here
            System.out.println(e.getMessage());
        } catch (MathException me) {
            // catch Symja math errors here
            System.out.println(me.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}