方程声明中的自动函数 solving/writing (java ?)

Automatic function solving/writing from equation declaration (java ?)

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

Java需要

我想做的是:与其与 Function 的对象交互,不如与 Equation 的对象交互,这意味着我不想写两次相同的等式或断言。

假设我随着时间的推移处理相同的方程式:a+b=c。好吧,有时,我可以有 a 和 b,有时有 b 和 c,等等。如果我想得到它们,我需要为每种情况编写一个函数:f(a,b) -> c, f(a,c ) -> b 等 是否有库(Jep 除外)或者您是否知道可以执行以下伪代码的实现(方程 class):

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

一般maths/logic

仅供参考:

对于任何线性方程,是否有一个程序可以自动解释和生成使该方程成立的所有可能函数?

是否有任何线性函数可以自动解释和生成适用于该函数的方程式的程序?

让我们一起疯狂吧:

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

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

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)

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

谢谢

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

既然你把 (java ?) 放在你的标题中,我就继续说:在 python 中有一个非常简单的方法可以使用免费的 sympy 库来做到这一点。

甚至可以求解、导出、集成、扩展和简化更复杂的函数,例如这段代码示例:

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

取自Quick Examples

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

再一次,java 中可能有一些我不知道的库能够做到这一点。

Jep 的旧版本可用,它是免费的,而且是开源的。它在 https://sourceforge.net/projects/jep/ and also a slightly changed git-hub repository https://github.com/nathanfunk/jep-java-gpl 上可用。它非常实用,但缺少后来商业版本的一些功能。

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

从你的问题来看,Jep 似乎不费吹灰之力就可以做到这一点。

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


如果您严格属于线性方程领域。然后是线性规划的整个领域,那里有许多免费的数字库。参见 http://www.ee.ucl.ac.uk/~mflanaga/java/OpenSourceNumeric.html

值得一看Apache Commons Maths,功能很强大,还能解决一些非线性问题。

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