我有9个方程,具有时间相关系数g
% MY M file
function dy =tarak(t,y)
G= 3.16;
g = 0.1*exp(-((t-200)/90).^2);
dy=zeros(9,1);
dy(1)=-2*2*y(1)+2*G*y(5)+2*g*y(7);
dy(2)=2*y(1)-2*G*y(5);
dy(3)=2*y(1)-2*g*y(7);
dy(4)=-2*y(4)+g*y(9);
dy(5)=-2*y(5)+G*(y(2)-y(1))+g*y(8);
dy(6)=-2*y(6)-G*y(9);
dy(7)=-2*y(7)+g*(y(3)-y(1))+G*y(8);
dy(8)=-G*y(7)-g*y(5);
dy(9)=G*y(6)-g*y(4);
然后在命令窗口中:
[T,Y] = ode45(@tarak,[0 ,500],[0 0 1 0 0 0 0 0 0])
其中系数G = 3.16
和g = 0.1*exp(-((t-200)/90).^2)
是时间相关系数和时间t = 0:500
;初始条件[0 0 1 0 0 0 0 0 0]
。
我输出y(1)
,y(2)
的值为负值。有人可以尝试使用ode45
解决上面的eqns,以便我可以比较结果。
答案 0 :(得分:1)
通过RK4的简单应用,我得到了这张照片
非常好,在y(1)
组件中有一个奇怪的初始跳转。但请注意,整体y(1)
的比例相当小。看来系统此时很僵硬,所以rk45可能有问题,隐式Runge-Kutta方法会更好。
缩放初始振荡
import numpy as np
import matplotlib.pyplot as plt
from math import exp
def dydt(t,y):
dy = np.array(y);
G = 3.16;
g = 0.1*exp(-((t-200)/90)**2);
dy[0]=-2*2*y[0]+2*G*y[4]+2*g*y[6];
dy[1]= 2*y[0]-2*G*y[4];
dy[2]= 2*y[0]-2*g*y[6];
dy[3]= -2*y[3]+ g*y[8];
dy[4]= -2*y[4]+ G*(y[1]-y[0])+g*y[7];
dy[5]= -2*y[5]- G*y[8];
dy[6]= -2*y[6]+ g*(y[2]-y[0])+G*y[7];
dy[7]= -G*y[6]- g*y[4];
dy[8]= G*y[5]- g*y[3];
return dy;
def RK4Step(f,x,y,h):
k1=f(x , y )
k2=f(x+0.5*h, y+0.5*h*k1)
k3=f(x+0.5*h, y+0.5*h*k2)
k4=f(x+ h, y+ h*k3)
return (k1+2*(k2+k3)+k4)/6.0
t= np.linspace(0,500,200+1);
dt = t[1]-t[0];
y0=np.array([0, 0, 1, 0, 0, 0, 0, 0, 0]);
y = [y0]
for t0 in t[0:-1]:
N=200;
h = dt/N;
for i in range(N):
y0 = y0 + h*RK4Step(dydt,t0+i*h,y0,h);
y.append(y0);
y = np.array(y);
plt.subplot(121);
plt.title("y(1)")
plt.plot(t,y[:,0],"b.--")
plt.subplot(122);
plt.title("y(2)")
plt.plot(t,y[:,1],"b-..")
plt.show()
答案 1 :(得分:1)
在Matlab
:
options = odeset('AbsTol', 1e-12);
[T,Y] = ode45(@tarak, [0, 500], [0 0 1 0 0 0 0 0 0], options);