Jeffrey Eiyike
- 7
- 0
The discussion revolves around a matrix Riccati differential equation implemented in MATLAB. Participants are exploring issues related to the convergence of variables in the context of a control problem.
Some participants are sharing code snippets and expressing concerns about the convergence behavior of certain variables. There is an ongoing examination of the functions used in the code, with some questioning whether they are implemented correctly. No consensus has been reached on the issues raised.
Participants note that the expected behavior of the error variable is to converge to zero and the contract to converge to one, which is not occurring in the original poster's implementation. There is also mention of potential misunderstandings regarding the MATLAB functions and their expected outputs.
Yes, please do. It's best if you post it inline using code tags. It should look like this:Jeffrey Eiyike said:I can upload the code if you want to see my attempt.
<< your MATLAB code>>
function dPdt = mRiccati(t,P, B, Q, R)
%computes Phi
P = reshape(P, size(Q)); % Convert from "n^2"-by-1 to "n"-by-"n"
dPdt = -Q + P' * B * R^-1 * B.' * P; % Determine derivative
dPdt = dPdt(:); % Convert from "n"-by-"n" to "n^2"-by-1 or converting to column vector
end
function dhdt = mRiccati2(t, P0, B, h, R)
%compute h
h = reshape(h, size(B)); % Convert from "n^2"-by-1 to "n"-by-"n"
dhdt = 0.5* P0' * B * R^-1 * B.' * h; % Determine derivative
dhdt = dhdt(:); % Convert from "n"-by-"n" to "n^2"-by-1
endfunction dXdt = mRiccati3(t,X, h0, P0, B, R, sigma)
% Compute Chi
X = reshape(X, size(R)); % Convert from "n^2"-by-1 to "n"-by-"n"
dXdt = (1/2)* h0' * B * R^-1 * B.' * h0- ((sigma^2)/2)*trace(-P0) ; % Determine derivative
dXdt = dXdt(:); % Convert from "n"-by-"n" to "n^2"-by-1
end
clear all; close all
% sigma=[1 1 1 0.5 0.5 0.5 0.33];
sigma=[1 1 1 1.4142 1.4142 1.4142 1.7321];
q=[1 1 1 1 1 1 1];
C=[5; 5; 5; 10; 10; 10; 15];
e=[4; 3; 2; 2; 2; 2; 3];
dt=0.1; %step size
B = [1; 1]; % Input vector Matrix
R = 1; %penalty on the optimal U that updates the contract
N = [0 3]; % Final condition Linear term
t_end = 20;
tspan = t_end:(-0.1):0;
%
%Solves the Matrix Differential equation Backwards
for ii=1:length(sigma);%:length(sigma) Q = [q(ii) 0; 0 0]; %Final condition on the quadratic term
%Solution for the first Matrix Differential equation
[T1 P] = ode45(@(t,P)mRiccati(t,P, B, Q, R), tspan, Q);
for i= 1:length(P)
P0 = reshape(P(i,:), size(Q));
%Solution for the second Matrix Differential equation (Phi)
[T2, h] = ode45(@(t,h) mRiccati2(t, P0, B, h, R), tspan, N);% obtain matrix P from last entry (initial value)(h)
h0 = reshape(h(i,:), size(B));
%Solution for the Third Matrix Differential equation(X)
[T3, X] = ode45(@(t,X) mRiccati3(t,X, h0, P0, B, R, sigma(ii)), tspan, 0);
end
% Flips the parameter
h=flipud(h);
P=flipud(P);
X=flipud(X);
% Compute the value function, error and contract integrand
for j= 1: length(P)
% display(num2str(length(P)))
ZZ= [e(ii, j) C(ii, j)]; % State
V(ii, j)= -0.5* ZZ*reshape(P(j,:), size(Q))*ZZ' + reshape(h(j,:), size(B))'*ZZ'- X(j); % Value function
U(ii, j)= inv(R)*B'*(-reshape(P(j,:), size(Q))*ZZ'+ reshape(h(j,:), size(B)));
C(ii, j+1) = C(ii, j) + U(ii, j)*dt; %Contract
e(ii, j+1)=e(ii, j)+ U(ii, j)*dt ;%-sigma(ii)*sqrt(dt)*normrnd(0,1); %error
end
function dPdt = mRiccati(t,P, B, Q, R)
%computes Phi
P = reshape(P, size(Q)); % Convert from "n^2"-by-1 to "n"-by-"n"
...