Matlab求解微分方程

引言
很多時候是在simulink搭建模塊,這裏寫寫在m文件中求微分方程的做法。

採用Matlab畫相軌跡
y¨+μ(y21)y˙+y=0\ddot{y}+\mu\left(y^{2}-1\right) \dot{y}+y=0
狀態方程爲
x˙1=x2,x˙2=μ(x121)x2x1 \dot{x}_{1}=x_{2}, \dot{x}_{2}=-\mu\left(x_{1}^{2}-1\right) x_{2}-x_{1}

1)描述方程的M函數

function y=vdp_eq(t,x,flag,mu)
y=[x(2);-mu*(x(1)*x(1)-1)*x(2)-x(1)];

2)Matlab工作空間求解語句(命令行):

h_opt=odeset;x0=[-0.2;-0.7];t_final=20;
mu=1;[t1,y1]=ode45('vdp_eq',[0,t_final],x0,h_opt,mu);
mu=2;[t2,y2]=ode45('vdp_eq',[0,t_final],x0,h_opt,mu);
plot(t1,y1(:,1),'b',t2,y2(:,1),'r');
figure;plot(y1(:,1),y1(:,2),'b',y2(:,1),y2(:,2),'r');

將ODE45數值積分、函數調用和畫圖寫到一個M文件,調用自己編寫右端函數的例子。Integrated program using M file

嵌套調用式

%%%%%%%%%%%%%%%%%%%%%%%%
%       嵌套調用式 Embedded Call function
%       
%        右端函數含在主函數內。
%%%%%%%%%%%%%%%%%%%%%%%%
function mainFunc()
h_opt=odeset;x0=[-0.2;-0.7];t_final=20;
mu=1.0;
[t1,y1]=ode45(@vdp1_eq,[0,t_final],x0,h_opt,mu);
mu=2.0;
[t2,y2]=ode45(@vdp1_eq,[0,t_final],x0,h_opt,mu);
plot(y1(:,1),y1(:,2),'b',y2(:,1),y2(:,2),'r');
title('phase locus of different parameter');
xlabel('x1');ylabel('x2');
    function y=vdp1_eq(t,x,flag)
        y=[x(2);-mu*(x(1)*x(1)-1)*x(2)-x(1)];
    end
end

分立式調用

clc, clear, close all
%%%%%%%%%%%%%%%%%%%%%%%%
%%%       分立式調用 Separate call function
%%%       右端函數未含在 主函數內。
%%%%%%%%%%%%%%%%%%%%%%%%
%function mainFunc()
h_opt=odeset;x0=[-0.2;-0.7];t_final=20;
[t1,y1]=ode45(@vdp_eq1,[0,t_final],x0,h_opt);
plot(t1,y1(:,1),'b');
plot(y1(:,1),y1(:,2),'b')
%end

function y=vdp_eq1(t,x,flag)
y=[x(2);-1.0*(x(1)*x(1)-1)*x(2)-x(1)];
end

===========================

clc, clear, close all
%%%%%%%%%%%%%%%%%%%%%%%%

h_opt=odeset;
ts=0.001;
x1(1) = -0.2;    x2(1)= -0.7;
for k=1:1:10000
    time(k)=k*ts;
      
    %Linear model
    x2(k+1) =( -1.0*(x1(k)*x1(k)-1)*x2(k)-x1(k))*ts+x2(k);
    x1(k+1) = x2(k) *ts+x1(k) ;
    
end

plot(time,x1(1:10000))
hold on
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章