Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 如何将RK4 ODE解算器从一阶调整到二阶_Matlab - Fatal编程技术网

Matlab 如何将RK4 ODE解算器从一阶调整到二阶

Matlab 如何将RK4 ODE解算器从一阶调整到二阶,matlab,Matlab,我想用matlab程序来模拟这个方程组 我需要帮助设置代码。我有一个Matlab函数,用于对一阶ODE进行Runge-Kutta4k近似,我想将其应用于二阶ODE 下面是一些代码: RK4功能: function yt = RK4_2ndOrder(dxdt,y0,h,tfinal) yt = zeros(2,length(h:tfinal)); %Memory Allocation yt(:,1) = y0; %Initial condition i = 2;

我想用matlab程序来模拟这个方程组

我需要帮助设置代码。我有一个Matlab函数,用于对一阶ODE进行Runge-Kutta4k近似,我想将其应用于二阶ODE

下面是一些代码:

RK4功能:

    function yt = RK4_2ndOrder(dxdt,y0,h,tfinal)
    yt = zeros(2,length(h:tfinal)); %Memory Allocation
    yt(:,1) = y0; %Initial condition
    i = 2;
    for t = h : h : tfinal %RK4 loop
        k1 = dxdt(t-h,yt(:,i-1));
        k2 = dxdt(t - (0.5*h), yt(:,i-1) + 0.5*k1*h);
        k3 = dxdt(t - (0.5*h), yt(:,i-1) + 0.5*k2*h);
        k4 = dxdt(t, yt(:,i-1) + (k3 * h));
        yt(:,i) = yt(:,i-1) + (1/6 * (k1 + 2*k2 + 2*k3 + k4)* h);
        i = i + 1;
    end
end
<pre><code>clc;
clear;
h = 0.01; %Time step
y0 = [0,0,0,1,0,0]; %Initial condition dx1/dt = 1 m.s
tfinal = 20;
tarray = 0:h:tfinal;
ytRK4 = RK4(y0,h,tfinal);
ytRK4_2ndOrder = RK4_2ndOrder(@dxdt,y0,h,tfinal);
plot(tarray,ytRK4_2ndOrder,'g');
</code></pre>
主要内容:

dxdt()函数:

函数dx=dxdt(t,x) m1=12000; m2=10000; m3=8000; k1=3000; k2=2400; k3=1800; dx=[x(4);x(5);x(6);-k1/m1*x(1)+k2/m1*(x(2)-x(1));k2/m2*(x(1)-x(2))+k3/m2(x(3)-x(2));k3/m3*(x(2)-x(3)); 结束 请帮助我设置问题的代码:) 我知道我必须把我的3首第二顺序的颂歌分成6首第一顺序的颂歌,但我不知道怎么做。 提前感谢您的帮助!
注意。

对于您正确给出的一阶系统,清理您的代码会给出一个脚本(如果您愿意,可以分解为单个模块或进行重用)

功能so67567216\u RK\u弹簧\u列车()
clc;清楚的
h=0.01;%时间步长
y0=[0,0,0,1,0,0];%初始条件dx1/dt=1 m.s
tfinal=20;
tarray=0:h:t最终;
ytRK2=RK2(@(t,x)dxdt(t,x),tarray,y0);
ytRK4=RK4(@(t,x)dxdt(t,x),tarray,y0);
图(tarray,ytRK4(1:3,:),'g');
函数dx=dxdt(t,x)
m1=12000;m2=10000;m3=8000;
k1=3000;k2=2400;k3=1800;
dx=[x(4);x(5);x(6);-k1/m1*x(1)+k2/m1*(x(2)-x(1));k2/m2*(x(1)-x(2))+k3/m2*(x(3)-x(2));k3/m3*(x(2)-x(3));
结束
函数yt=RK2(dxdt,tarray,y0)
N=长度(焦油);
yt=零(长度(y0),N);%内存分配
yt(:,1)=y0;%初始条件
对于i=2:N%RK4循环
h=焦油(i)-焦油(i-1);
k1=dxdt(tarray(i-1),yt(:,i-1));
k2=dxdt(tarray(i)-(0.5*h),yt(:,i-1)+0.5*k1*h);
yt(:,i)=yt(:,i-1)+k2*h;
结束%
结束%函数
函数yt=RK4(dxdt,tarray,y0)
N=长度(焦油);
yt=零(长度(y0),N);%内存分配
yt(:,1)=y0;%初始条件
对于i=2:N%RK4循环
h=焦油(i)-焦油(i-1);
k1=dxdt(tarray(i-1),yt(:,i-1));
k2=dxdt(tarray(i)-(0.5*h),yt(:,i-1)+0.5*k1*h);
k3=dxdt(tarray(i)-(0.5*h),yt(:,i-1)+0.5*k2*h);
k4=dxdt(tarray(i),yt(:,i-1)+(k3*h));
yt(:,i)=yt(:,i-1)+(1/6*(k1+2*k2+2*k3+k4)*h);
结束%
结束%函数
结束%脚本

请首先纠正明显的错误,如将函数调用与函数接口匹配,删除本不应该存在的硬编码常量,如状态空间维度不总是2。为什么在代码中已经实现了一阶系统,却宣称一阶系统存在问题?请指出哪些代码片段是您提供的,或者至少是您完全理解的。它们都是我提供的,除了我在互联网上看到的dxdt()。我宣布将我的一阶ODE解算器(有效)调整为二阶ODE解算器存在问题。有关以分区方式将RK4应用于二阶DE系统的信息,请参阅。但是你现有的框架,经过适当的修改,应该也能正常工作。我已经看过了链接,但对我来说(我是初学者)^^它离matlab编程语言太远,无法将其应用到我的程序中。。。你能用我的方法帮我设置一下吗?非常感谢!我喜欢您在我的代码中进行更改的方式(例如,传递tarray,我们可以从中找到h和tffinal,而不是同时传递它们)
<pre><code>function dx = dxdt(t,x)
m1 = 12000;
m2 = 10000;
m3 = 8000;
k1 = 3000;
k2 = 2400;
k3 = 1800;
dx = [x(4);x(5);x(6);-k1/m1*x(1)+k2/m1*(x(2)-x(1));k2/m2*(x(1)-x(2))+k3/m2(x(3)-x(2));k3/m3*(x(2)-x(3))];

end</pre></code>