计算函数的偏导数

时间:2014-02-23 10:21:06

标签: java matlab math partial derivative

我需要计算用户指定函数的一阶导数。程序从文件读取函数作为字符串,然后需要通过一个变量计算派生。函数有更多变量,可以是线性或非线性的。 最简单的方法是什么?

可以调用MATLAB(也许)是可能的吗?

程序没有任何Internet访问权限。

3 个答案:

答案 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 ++库,可用于解析和解决函数。

在所有功能中,您可以通过变量派生函数。