Symbolic math Tool box "diff" and "dsolve" for optimal control
6 ビュー (過去 30 日間)
古いコメントを表示
This is a simple optimal control problem where I have to differentialte the hamiltonian w.r.t "u" and substitute into the state equation . the confusion is with "diff" dunction which wants me to declare the symbolic variables as "syms x1 x2 p1 p2 u " etc where as "dsolve" wants me to declare as "syms x1(t) x2(t) p1(t) p2(t) u(t)" .
What I want to do is to find the partial derivative of the Hamiltonian w.r.t "u" and substitute back in the state equation and obtain the ode , then use "dsolve" and solve the state and costate . But I see dsolve wants me to declare as said above and hence I am unable to supply BC's as mentioned in the website https://www.mathworks.com/help/symbolic/solve-a-system-of-differential-equations.html. Any work around for this ? the initial conditions are x1(0) = x2(0) = 0; final x1(2)=5 and x2(2) =2 . I have shown here till the sustitution which works fine . But I want to use dsolve for the state and costate odes and supply the conditions and solve symbolically . i dont want to use the old "string" method whose is said will be removed in future
If I declare as "syms x1(t) x2(t) p1(t) p2(t) u(t)" "diff" function wont work with this error
Error using sym/diff (line 26)
Arguments, except for the first, must not be symbolic functions.
clear all ;close all
syms x1 x2 p1 p2 u
% Write the Hamiltonian
H = (1/2)*u^2 + p1*x2 - p2*x2 + p2*u;
% --------------------- Necessary COnditions -------------------------
%State Equations (I have substituted directly)
x1dot = x2;
x2dot = -x2 + u;
% Costate Equations (I wanted to experiment with diff ) - for my other large problem
p1dot = -diff(H,x1);
p2dot = -diff(H,x2);
% COntrol Equations
dHdu = diff(H,u);
% -----------------------------------------------------------------------
sol_u = solve(dHdu,u);
% Substitute u in second state equation
x2dot = subs(x2dot,u,sol_u);
% here I have to collect x1dot;x2dot;p1dot;p2dot as four odes and use dsolve
1 件のコメント
採用された回答
Divija Aleti
2020 年 10 月 29 日
Hi Karthi,
The issue you have stated has been fixed in MATLAB R2020b, i.e., from this version onwards, the 'diff' function can take a symbolic function as its second input argument. So, ideally this should work:
syms p1(t) p2(t) x1(t) x2(t) u(t) H
% Write the Hamiltonian (Given)
H = (1/2)*u(t)^2 + p1(t)*x2(t) - p2(t)*x2(t) + p2*u(t);
% --------------------- Necessary COnditions -------------------------
%State Equations (Given)
x1dot = x2(t);
x2dot = -x2(t)+ u(t);
% Costate Equations (Using diff, so that the same method can be used for
% larger problems with complicated Hamiltonians)
p1dot = -diff(H,x1(t));
p2dot = -diff(H,x2(t));
% COntrol Equations
dHdu = diff(H,u(t));
% -----------------------------------------------------------------------
sol_u = solve(dHdu,u(t))
% Substitute u in second state equation
x2dot = subs(x2dot,u(t),sol_u);
% Solve for x1(t), x2(t), p1(t), p2(t)
eqns = [diff(x1,t)==x1dot, diff(x2,t)==x2dot, diff(p1,t)==p1dot, diff(p2,t)==p2dot];
conds = [x1(0)==0, x2(0)==0, x1(2)==5, x2(2)==2];
S=dsolve(eqns,conds);
However, 'solve' function cannot take symbolic functions as it's second input argument. This issue has been brought to the notice of our developers. They will investigate the matter further.
0 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Calculus についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!