Search code examples
matlabsymbolic-math

How to get algebraic solution and symbolic Jacobian of this simple equation?


(Crossposted from Matlab Answers) I am trying to simplify this set of algebraic equations. Then, I would like to have Matlab calculate the Jacobian for me. But it does not seem to work as I expect.

Consider this simple MWE:

% State Variables
syms x_0 x_1 x_2 x_3
% Input Variables
syms u_1 u_2 u_3
% Constants
syms k_1 V_liq dvs
% 3 Algebraic Equations
stateEquations = [...
    x_1 == (x_0*(V_liq - u_1/dvs*1e3)*1e-3 + u_1)*1e3/V_liq*exp(-k_1), ...
    x_2 == (x_1*(V_liq - u_2/dvs*1e3)*1e-3 + u_2)*1e3/V_liq*exp(-k_1), ...
    x_3 == (x_2*(V_liq - u_3/dvs*1e3)*1e-3 + u_3)*1e3/V_liq*exp(-k_1)];
dstate_x3   = solve(stateEquations, x_3)
dstate_du   = jacobian(dstate_x3, [u_1 u_2 u_3])

Since dstate_x3 is empty, the Jacobian is also empty. But I simply want Matlab to replace x_2 in eq. 3 by its right-hand side, and x_1 by its right-hand side...

Could you please give me a hint on how to achieve this with Symbolic Math Toolbox? (Deriving it manually would be very time-consuming, especially with x_i, i > 3)


Solution

  • Since your system has 3 equations, you must solve it for 3 variables, not just for the variable x_3. Because solve doesn't know which variables you want so solve your system for, then it returns an empty solution.

    You want to solve for x_1, x_2 and x_3, so replace the penultimate line of your code by

    dstate   = solve(stateEquations, [x_1 x_2 x_3])
    

    Now dstate is an 1x1 struct with 3  sym fields: x_1, x_2 and x_3. Hence, replace the last line of your code by

    dstate_du   = jacobian(dstate.x_3, [u_1 u_2 u_3])
    

    Eventually, you might want to  simplify(dstate_du).