Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于matlab的常微分方程求解系统_Matlab_Ode_Differential Equations - Fatal编程技术网

基于matlab的常微分方程求解系统

基于matlab的常微分方程求解系统,matlab,ode,differential-equations,Matlab,Ode,Differential Equations,我有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(

我有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
解上面的方程吗?这样我就可以比较结果了。

通过简单的RK4应用,我得到了这幅图

非常积极,在
y(1)
组件中有一个奇怪的初始跳跃。但请注意,总的来说,
y(1)
的规模相当小。在这一点上,系统似乎很僵硬,因此rk45可能会有问题,隐式龙格-库塔方法会更好

以及初始振荡的放大


Python代码
Matlab
中:

options = odeset('AbsTol', 1e-12);
[T,Y] = ode45(@tarak, [0, 500], [0 0 1 0 0 0 0 0 0], options);

您从哪里得到这些组件必须保持正值?这不依赖于y(5)和y(7)吗?hi Lutzl,y(1),y(2),y(3)是概率,因此不可能是负的,我的朋友用C解了上面的方程,得到了正确的结果。你们也得到了负值?不,见答案。代码是用python编写的,但这并不重要。您应该发布一个更完整的代码,看看是否有任何易于识别的问题。亲爱的Lutzl,谢谢!您的绘图似乎与我正在寻找的结果一致。您在python中使用了Odeint吗?Matlab代码可以,但您需要使用公差,因为您的第一个状态的顺序为1e-8,默认abs公差ode45为1e-6。@欢迎使用Harmansing。如果它解决了你的问题,你应该接受它作为答案。
options = odeset('AbsTol', 1e-12);
[T,Y] = ode45(@tarak, [0, 500], [0 0 1 0 0 0 0 0 0], options);