引言
很多时候是在simulink搭建模块,这里写写在m文件中求微分方程的做法。
采用Matlab画相轨迹
状态方程为
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