我需要计算用户指定函数的一阶导数。程序将函数从文件中读取为字符串,然后需要计算一个变量的导数。函数的变量较多,可以是线性的,也可以是非线性的。做这件事最简单的方法是什么?
调用MATLAB (也许)是可能的吗?
程序没有任何互联网接入。
发布于 2014-02-23 11:46:19
您可以使用符号代数库(如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
发布于 2014-02-24 22:33:54
各位,如果你能告诉我更多的事情,我会非常感激:)我有函数(和上面一样),并且需要用相同的值来计算。但我不能把它当作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);以及从第(.)款
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将其区分开来。现在,我的导数,如果需要的话,我现在可以用汤姆的方法来计算。:)
不管怎样,谢谢。如果有些人有更好的方法,我就在这里。
发布于 2014-05-10 13:41:00
我有点晚了,但是。
如果我想告诉你关于MathParseKit的事。https://github.com/B3rn475/MathParseKit
它是一个C++库,可用于解析和解决函数。
在所有功能中,允许您通过变量派生函数。
https://stackoverflow.com/questions/21966992
复制相似问题