Filter löschen
Filter löschen

How to solve a system of n differential equations?

1 Ansicht (letzte 30 Tage)
Marlon Saveri Silva
Marlon Saveri Silva am 31 Mär. 2018
Kommentiert: Walter Roberson am 31 Mär. 2018
Hello everyone, I got the solution below from the help, I tried an example with a 3x3 system and it runs ok. However, when I try to apply it to my real system, I can not find an answer. Do you have any idea why?
Example:
syms x(t) y(t)
A = [1 2; -1 1];
B = [1; 1];
Y = [x; y];
odes = diff(Y) == A*Y + B;
C = Y(0) == [2; -1];
[xSol(t), ySol(t)] = dsolve(odes,C);
My problem:
clear; close 'all'; clc;
syms T1(t) T2(t) T3(t) T4(t) T5(t)
syms x(t) y(t) z(t) w(t) p(t)
A = [-81 1 0 0 0
0.5 -0.56 0.02 0.04 0
0 0.004 -0.008 0.004 0
0 0.267 0.13 -1.4 1
0 0 0.273 3 -82.1];
B = [24000;0;0;1.333;6300];
Y = [x; y; z; w; p];
odes = diff(Y) == A*Y + B;
C = Y(0) == [300; 300; 300; 300; 300];
[xSol(t), ySol(t), zSol(t), wSol(t), pSol(t)] = dsolve(odes,C);
  2 Kommentare
Walter Roberson
Walter Roberson am 31 Mär. 2018
R2018a finds a solution. It does, however, depend upon an arbitrary constant of integration, which would tend to suggest that dsolve thinks there should be one more initial condition.
Marlon Saveri Silva
Marlon Saveri Silva am 31 Mär. 2018
Thanks Walter. I'll check monday if it may be updated to R2018a. Meanwhile, how to edit such constant of integration or do any other think to solve the problem?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Star Strider
Star Strider am 31 Mär. 2018
You appear to have a dynamic system. The Control System Toolbox would be more appropriate.
One way to solve it would be to convert it to an anonymous function and solve it with ode45:
[VF,Subs] = odeToVectorField(odes)
Sys = matlabFunction(VF,'Vars',{'t','Y'})
Y0 = [300; 300; 300; 300; 300];
[T,Y] = ode45(Sys, [0 5], Y0);
figure(1)
plot(T,Y)
grid
lgnd = regexp(sprintf('%s\n',Subs), '\n', 'split');
legend(lgnd(1:end-1), 'Location','E')
  5 Kommentare
Star Strider
Star Strider am 31 Mär. 2018
Not that I’m aware of.
You can try something like this, although you would then have to manually copy the output and paste it to your syms call (without the single quotes):
TV = sprintf('T%d(t) ', 1:10)
TV =
'T1(t) T2(t) T3(t) T4(t) T5(t) T6(t) T7(t) T8(t) T9(t) T10(t) '
I know of no way to do it programmatically.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Symbolic Math Toolbox finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by