我还没有在网上找到一个免费的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)
如果上述问题之一有一个有限的肯定答案,我很有兴趣知道它是哪一个,它是哪一个!
谢谢
答案 0 :(得分:1)
所以说实话,这只是答案的一半,因为我在java中没有看到这样的东西。
由于你在标题中添加(java ?)
,我只想说出来:使用免费的sympy库在python中有一种非常简单的方法。
更复杂的功能可以解决,衍生,集成,扩展和简化,例如这段代码:
>>> solve(Eq(x**3 + 2*x**2 + 4*x + 8, 0), x)
[-2*I, 2*I, -2]
老实说,我认为编写一个小的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();
}
}
}