"Jeremy" wrote in message <kjnm7c$282$1@newscl01ah.mathworks.com>...
> I'm new to MATLAB and trying to use ODE45 to find the coefficients of the matrix Riccati equation for a controls problem.
>
> I'm not sure what I'm doing wrong.
>
> I've defined my Riccati equation in a function 'regulator'
>
> %Define matrices
> function dS=regulator(t,S)
>
> A=[0 1;0 2.972];
> B=[0;390];
> Q=[(1/(pi^2)) 0;0 30];
> R=1;
>
> dS=1*(A'*S+S*AS*B*(R^1)*B'*S+Q);
>
> end
>
> Then I'm just going straight to ODE45, doing something like this:
>
> [t,S]=ode45('regulator',[0 5],[0 0;0 0])
>
> looking for a solution to matrix S.
>
> Can I solve like this or do I have to multiply out all the terms of S? Assuming S is
>
> S = [s11(t) s12(t) ; s12(t) s22(t)];
>
> Any help would be appreciated.
Jeremy: as far as I know, the ODE function only accepts vectors as input. So you will have to reshape your matrix S into a vector.
This should work:
function [dP] = fun_ric(t,Pin)
%fun_ric
% reshape input
P = reshape(Pin,2,2);
% system matrices
A=[0 1;0 2.972];
B=[0;390];
Q=[(1/(pi^2)) 0;0 30];
R=1;
Ri = R^1;
% Ricatti equation:
dPt = A'*P+P*A+QP*B*Ri*B'*P;
% reshape
dP = reshape(dPt,4,1);
end
%% Test ricatti
clear all, close all, clc
%% ode params
P0 = zeros(2);
tspan = [0 2];
%% simulate
[t, P] = ode45('fun_ric',tspan,P0);
% P matrix (comparable with: P=care(A,B,Q,R))
Ptot = reshape(P(end,:),2,2)
figure(1)
plot(t,P)
If you compare the outcome of 'care' it will be the same as for Ptot when you simulate long enough (100 sec).
