【问题标题】:Using the Runge-Kutta integration method in a system在系统中使用 Runge-Kutta 积分方法
【发布时间】:2018-08-22 07:09:28
【问题描述】:
h=0.005;                                            
x = 0:h:40;                                         
y = zeros(1,length(x)); 
y(1) = 0;                                         
F_xy = ;                    

for i=1:(length(x)-1)                              
    k_1 = F_xy(x(i),y(i));
    k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1);
    k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2));
    k_4 = F_xy((x(i)+h),(y(i)+k_3*h));

    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;  
end

我有下面的代码,我觉得是对的。我知道 F_xy 上缺少部分,因为这是我的后续问题。

我有 dx/dt = = -x(2 - y) 其中 t_0 = 0, x(t_0) = 1

并且 dy/dt = y(1 − 2x) 其中 t_0 = 0, y(t_0) = 2。

我的问题是我不知道如何将这些方程式输入代码。感谢所有帮助

【问题讨论】:

    标签: matlab numerical-methods numerical-integration


    【解决方案1】:

    您以不一致的方式同时使用tx 作为自变量。从实际的微分方程来看,自变量是t,而二维系统的因变量是xy。它们可以组合成一个状态向量u=[x,y] 然后将系统编码为接近您编写的一种方法是

    h=0.005;                                            
    t = 0:h:40;   
    u0 = [1, 2]                                       
    u = [ u0 ]                                         
    function udot = F(t,u)
         x = u(1); y = u(2);
         udot = [ -x*(2 - y),  y*(1 - 2*x) ]
    end                 
    
    for i=1:(length(t)-1)                              
        k_1 = F(t(i)      , u(i,:)        );
        k_2 = F(t(i)+0.5*h, u(i,:)+0.5*h*k_1);
        k_3 = F(t(i)+0.5*h, u(i,:)+0.5*h*k_2);
        k_4 = F(t(i)+    h, u(i,:)+    h*k_3);
    
        u(i+1,:) = u(i,:) + (h/6)*(k_1+2*k_2+2*k_3+k_4);  
    end
    

    有解决方案输出

    【讨论】:

      【解决方案2】:

      F_xy是你的导函数吗?

      如果是这样,只需将其编写为辅助函数或函数句柄即可。例如,

      F_xy=@(x,y)[-x*(2-y);y*(1-2*x)];
      

      另请注意,您的k_1, k_2, k_3, k_4, y(i) 都是二维的。您需要重新调整 y 的大小并相应地在迭代步骤中重写索引。

      【讨论】:

      • 那么RK4的第二阶段必须是k2 = F_xy(x(i)+0.5*h*k1(1), y(i)+0.5*h*k1(2))。下一点的更新也要小心,dxy = (h/6)*k_1+2*k_2+2*k_3+k_4); x(i+1)=x(i)+dxy(1); y(i+1)=y(i)+dxy(2);
      • 我只是在回答 matlab 问题。 OP 询问如何编写二维函数。我宁愿 OP 自己澄清他的问题,而不是我们推断他需要什么。
      • 我应该多写点评论的动机。我发现从抽象/数学 POV 将一侧的两个标量变量与另一侧的向量混合起来不一致。评论的其余部分表明很有可能继续这样做,但是从代码复杂性的 POV 来看,解决这种混淆可能是一个更好的主意。我对全矢量化的首选变体在我的答案中。
      • 说实话,我没有审查 RK4,也没有挖掘自己的代码并根据我将如何实现它来回答。我觉得OP可以更多地澄清他的问题。另外,我认为他需要数学方面的帮助——而不是 matlab。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多