程序的基本思路是:从初值出发,先计算y对时间t的导数,得到y的变化速度;求出x对t的导数,得到x随时间的变化速度。然后时间前进一小步h=0.002,同时x和y也都发生一个小的变化,即在原来数值基础上加上时间步长h和变化速度的乘积。如果x到达1或者-1,强制让y发生变化。这个过程不断迭代,得到结果。
clear
clc
gamma=2
r=0.9
N=400000
x=zeros(1,N)
y=zeros(1,N)
t=zeros(1,N)
h=0.002
for i=2:N
t(i)=t(i-1)+h
y(i)=y(i-1)+gamma*sin(t(i-1))*h
x(i)=x(i-1)+y(i-1)*h
if abs(x(i))>=1
y(i)=-r*y(i)
x(i)=x(i-1)+y(i-1)*h
end
end
figure
plot(x,y,'.','markersize',1)
axis([-1 1 -3 3])
xlabel('Displacement')
ylabel('Velocity')
你用ode积分。然后设一个循环 比如
for omega=1:1000 看你要模拟多少范围
q0=[.....]初值
tspan=(0,100)
[T,Q]=ode45(@(t,q) odefun(........),tspan,q0)
for j=1:100 如果是倍周期分岔 或者周期解 不要这么密集 不然会卡得不行 对于概周期解 我也最多plot 二三十个点 对于每一个omega
tnew=[(j-1)*T,j*T] T是你激励频率周期 如果没有激励,你算下周期吧
[T,Q]=ode45(@(t,q) odefun(........),tnew,Q(end,:))
hold on
plot(omega,Q(end,1))
end
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)