Azzera filtri
Azzera filtri

Euler method with state space model

46 visualizzazioni (ultimi 30 giorni)
Hello,
Im trying solve an equation in form of a state space model with Eulers (forward) method.
My input u is a vector of accelerations that I have given on discrete points (ax). As output I expect a scalar for each discrete point on which eulers method is calculated.
What I did so far:
generate a PTD2 with those values:
s=tf('s');
pt2 = s/((s+0.1)*(s+4));
SYS = ss(pt2);
A = SYS.A;
B = SYS.B;
C = SYS.C;
D = SYS.D;
I created a linspaced timevector t_i that is equally distributed over all my discrete points. To make it easier to read I extracted some values of the real data:
% ax = traj.ax(1:10);
% you can use this vector of accelerations if you want
ax = [-0.7412; -0.749 ;-0.7525;-0.7508;-0.7443;-0.7331;-0.7178;-0.699;-0.6779;-0.6540];
t_i = linspace(1, 5, 10);
h = diff(t_i(1:2)); % calc step size
x = t_i(1) : h : t_i(end); % the range of x - not sure about this
y = zeros(length(x),2); % allocate the result y
u= ax; %make clear that ax is the input
Now I want to solve Eulers method as state space model:
for i=1:10-1
dx = A*x(i) + B*u(i);
x_k1 = x_k + dx*h; %x_k1 is x_k+1
x_k = x_k1;
% y should be a scalar output in my case, since I want to get weighted accelerations as output - but I can only compile if I put the (i,:) right now.
y(i,:) = C*x_k;
end
Is it possible to use x as a state vector of the ptd2 inside the eulers method? how should I define the range for x in this case, do I even need it?
I wrote this with the help of some code I found in the forum to differential equation problems, and tried to expand it to a state space model but im a bit lost right now. I tricked with the matrices for y, since I expect an output that is a scalar for each input but I have no idea how to achieve this.
Is it even possible to solve a state space model with this euler method?

Risposta accettata

Michael Brehmer
Michael Brehmer il 11 Dic 2020
Hello, I figured it out by my own.
I had some major errors in the definition of x_k and y.
You have to initialize x_k as standing vector, that is updated in each step of the iteration
x_k = [0;0];
for i=1:N
dx = A*x_k + B*u(i);
x_k1 = x_k + dx*h;
y(i) = C*x_k1;
x_k = x_k1;
end

Più risposte (0)

Prodotti


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by