J'essaie de tracer un portrait de phase en trois dimensions d'un système d'équations différentielles du premier ordre, mais je reçois un message d'erreur indiquant que j'ai une variable eta non reconnue. Outre le portrait de phase en trois dimensions, je souhaite également tracer x(1) en fonction de t, x(2) en fonction de t et x(3) en fonction de t, le tout sur le même graphique. J'ai commenté cette commande de tracé parce que je suis sûr de me tromper. Donc, je cherche à tracer (i) un portrait de phase 3D et (ii) un tracé temporel de x (1), x (2) et x (3) sur le même graphique. De plus, les [-0.015,0.015], [-2,2], [-4,4] que vous voyez dans l'argument de l'ode45 sont les limites des axes de x(1), x(2) et x(3 ). Je ne suis même pas sûr qu'il faille y placer les limites des axes. Quelqu'un pourrait-il s'il vous plaît aider? Merci.

[t,x] = ode45(@eqx3, eta, omega, [-0.015,0.015], [-2,2], [-4,4], initcond);
global eta omega
eta = 0.05;
omega = 25;
%tspan = [0,50]
initcond = [1, 0.5, -0.4]


%subplot(211)
%plot(t, x(:,1), t,x(:,2),'--',x(:,3),'--');
%xlabel('t')

subplot(212)
plot(x(:,1), x(:,2), x(:,3))
xlabel('x1')
ylabel('x2')
zlabel('x3')

function xdot = eqx3(t,x,eta,omega)
  global eta omega
  xdot = zeros(3,1);
  xdot(1) = -(2*eta*omega + 1)*x(1) + x(2) - 1;
  xdot(2) = -(2*eta*omega + (omega^2))*x(1) + x(3) + 2;
  xdot(3) = -(omega^2)*x(1) + x(2) - 1;
  %xdot =[xdot(1);xdot(2);xdot(3)];
end
0
jack 12 févr. 2020 à 23:45

1 réponse

Meilleure réponse

Votre code avait besoin d'être nettoyé pour

  • Supprimer les globals,
  • Définir les variables avant de les utiliser,
  • Passez les bons paramètres à l'équation ODE.
  • Utilisez une fonction anonyme @(t,x) eqx3(t,x,eta, omega) pour empaqueter les paramètres ODE avec la fonction,
  • Utilisez plot3 pour tracer en 3D le portrait de phase.

Voici le résultat que j'ai obtenu :

eta = 0.05;
omega = 25;
tspan = [0,50];
initcond = [1, 0.5, -0.4]
[t,x] = ode45(@(t,x) eqx3(t,x,eta, omega), tspan, initcond);

plot3(x(:,1), x(:,2), x(:,3))
xlabel('x1')
ylabel('x2')
zlabel('x3')

function xdot = eqx3(t,x,eta,omega)
  xdot = zeros(3,1);
  xdot(1) = -(2*eta*omega + 1)*x(1) + x(2) - 1;
  xdot(2) = -(2*eta*omega + (omega^2))*x(1) + x(3) + 2;
  xdot(3) = -(omega^2)*x(1) + x(2) - 1;
end

Qui produit

enter image description here

2
Kavka 12 févr. 2020 à 22:02