Search code examples
javamatlabmathpartialderivative

Calculating partial derivatives of function


I need to compute the first derivative of user-specified function. Program reads function as string from a file and then needs to compute derivative by one variable. Function has more variables, and can be linear or nonlinear. What is the easiest way to do this?

Can calling MATLAB (maybe) be possible or whatever?

Program doesn't have any Internet accesses.


Solution

  • You can use a symbolic algebra library such as 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);
        }
    }
    

    Sample input and output:

    Enter expression:
    sin(a1) * 4 * a2 + (a1 + 1)^2
    Differentiate with respect to:
    a1
    Result:
    42