我需要计算用户指定函数的一阶导数。程序从文件读取函数作为字符串,然后需要通过一个变量计算派生。函数有更多变量,可以是线性或非线性的。 最简单的方法是什么?
可以调用MATLAB(也许)是可能的吗?
程序没有任何Internet访问权限。
答案 0 :(得分:3)
您可以使用符号代数库,例如javacalculus。
import java.util.Scanner;
import javacalculus.core.CALC;
import javacalculus.core.CalcParser;
import javacalculus.evaluator.CalcSUB;
import javacalculus.struct.CalcDouble;
import javacalculus.struct.CalcObject;
import javacalculus.struct.CalcSymbol;
public class Demo
{
public static void main(String[] args) throws Exception
{
Scanner in = new Scanner(System.in);
System.out.println("Enter expression:");
String expression = in.nextLine();
// javacalculus uses uppercase function names
expression = expression.replace("sin", "SIN");
expression = expression.replace("cos", "COS");
System.out.println("Differentiate with respect to:");
String variable = in.nextLine();
// differentiate
String command = "DIFF(" + expression + ", " + variable + ")";
CalcParser parser = new CalcParser();
CalcObject parsed = parser.parse(command);
CalcObject result = parsed.evaluate();
// compute numerical value
result = subst(result, "a1", 0.0);
result = subst(result, "a2", 10.0);
result = CALC.SYM_EVAL(result);
System.out.println("Result:");
System.out.println(result);
}
static CalcObject subst(CalcObject input, String var, double number)
{
CalcSymbol symbol = new CalcSymbol(var);
CalcDouble value = new CalcDouble(number);
return CalcSUB.numericSubstitute(input, symbol, value);
}
}
示例输入和输出:
输入表达式:
sin(a1) * 4 * a2 + (a1 + 1)^2
区别于:
a1
结果:
42
答案 1 :(得分:0)
人们,如果你告诉我这件事我会非常感激:)
我有功能(与上面相同),需要用相同的值计算它。
但是我不能把它作为CalcObject
削减,然后替换并评估它。
CalcObject result = parsed.evaluate();
// compute numerical value
result = subst(result, "a1", 0.0);
result = subst(result, "a2", 10.0);
result = CALC.SYM_EVAL(result);
和来自subst(..)
CalcSymbol symbol = new CalcSymbol(var);
CalcDouble value = new CalcDouble(number);
return CalcSUB.numericSubstitute(input, symbol, value);
在这里,我需要将CalcObeject
传递给subst(...)
然后我才能评估功能。但是怎么做呢?从字符串到CalcObject
。
我的问题还有其他解决方案或功能吗?
修改强>
我需要评估之前帖子的功能。我的问题是,如何做到这一点,我可以使用汤姆的方法来做到这一点。我有函数,变量和它们的值。不需要区分功能,只需要评估它。
分辨
也许不是最好的方式,但它有效。我从(a1+a2+a3)*q
创建了a1+a2+a3
函数,然后将其区分为q
。现在,我的衍生物,如果需要的功能,我现在可以使用汤姆的方式评估。 :)
无论如何,谢谢。 附:如果有更好的方法,我就在这里。
答案 2 :(得分:0)
我有点晚了,但是。
如果我想通知你有关MathParseKit的信息。 https://github.com/B3rn475/MathParseKit
它是一个C ++库,可用于解析和解决函数。
在所有功能中,您可以通过变量派生函数。