用四阶龙格-库塔方法求微分方程组

 最近一段时间再忙期末考试,小学期课程设计的东西,没怎么更新博客....

更新一个用四阶龙格库塔方法求解脉冲微分方程,题目来源是一篇论文《Impulsive control of projective synchronization in chaotic systems 》。

概述:

做法其实也很简单,就是原来求一个因变量的龙格库塔公式变成求五个因变量的龙格库塔公式,当然,变化求解的过程是有不一样的地方的,需要特别处理一下。

% 1
t = [];
x = [];
y = [];
z = [];
sigma = 10;
u = 28;
p = 8 / 3;
X = [];
x(1) = 1;
y(1) = 2;
z(1) = 3;
X(1,1) = 2;
X(2,1) = 1;
h = 0.01; 
a = 0;
b = 1;
t(1) = 0;
gain1 = -1.1;
gain2 = -1.1;
alpha = -3;
n = fix((b-a) / h);

for i = 2 : n+1
    t(i) = t(i-1) +  h;
    
    k11 = sigma * ( y(i-1)  - x(i-1) );
    k21 = (u - z(i-1)) * x(i-1) - y(i-1);
    k31 = x(i-1) * y(i-1) - p * z(i-1);
    k41 = sigma * (  X(2, i-1) - X(1,i-1) );
    k51 = X(1,i-1) * (u - z(i-1)) - X(2,i-1);
    
    k12 = sigma * ( y(i-1) + h / 2 * k21 - x(i-1) - h / 2 * k11  );
    k22 = (u - z(i-1) - h / 2 * k31) * (x(i-1) + h / 2 * k11 ) - y(i-1) - h / 2 * k21;
    k32 = (x(i-1) + h / 2 * k11)* (y(i-1)+ h / 2 * k21 )- p * (z(i-1) + h /2 * k31  );
    k42 = sigma * (  X(2, i-1) + h/2*k51- X(1, i-1) - h/2*k41);
    k52 = (X(1,i-1) + h/2*k41  )* (u - z(i-1) - h/2*k31) - X(2,i-1) - h/2*k51;
    
    k13 = sigma * ( y(i-1) + h/2 * k22 -  x(i-1)  - h / 2 * k12 );
    k23 = (u - z(i-1) - h/2*k32 ) * (x(i-1)+h/2*k12) - y(i-1) - h / 2 * k22;
    k33 = (x(i-1) +h/2*k12) *( y(i-1)+ h/2 * k22 )- p *(z(i-1) + h / 2 * k32);
    k43 = sigma * (  X(2, i-1) + h/2*k52- X(1, i-1) - h/2*k42);
    k53 = (X(1,i-1) + h/2*k42  )* (u - z(i-1) - h/2*k32) - X(2,i-1) - h/2*k52;
    
    k14 = sigma * ( y(i-1)+h*k23 - x(i-1) - h * k13 );
    k24 = (u - z(i-1) - h*k33) * (x(i-1)+h*k13) - y(i-1) - h * k23;
    k34 = (x(i-1) +h*k13 ) * (y(i-1) + h*k23) - p * (z(i-1) + h * k33 );
    k44 = sigma * (  X(2, i-1) + h/2*k53- X(1, i-1) - h/2*k43);
    k54 = (X(1,i-1) + h/2*k43  )* (u - z(i-1) - h/2*k33) - X(2,i-1) - h/2*k53;
    
    x(i) = x(i-1) +  h / 6 * (k11 + 2 * k12 + 2 * k13 + k14); 
    y(i) = y(i-1) + h / 6 * (k21 + 2 * k22 + 2 * k23 + k24);
    z(i) = z(i-1) + h / 6 * (k31 + 2 * k32 + 2 * k33 + k34);
    X(1, i) = X(1, i-1) + h /6 * (k41+ 2 * k42 + 2 * k42 + k44);
    X(2, i) = X(2, i-1) + h / 6 * (k51 + 2 * k52 + 2*k53 + k54);
    
    if mod(i, 15) == 0
        X(1, i) = X(1, i) + gain1 * (X(1,i) - alpha * x(i) );
        X(2, i) = X(2, i) + gain2 * (X(2,i) - alpha * y(i) );
    end

end
%plot(t, x, 'b-', t, y, 'k-', t, z, 'c-', t, X(1,:), 'r-', t, X(2,:), 'm-')
% plot(t, x, t, y)
%  plot(t, X(1,:), t, X(2, :) )
e1 = X(1,:) - alpha * x;
e2 = X(2,:) - alpha * y;
plot(t, e1, t, e2)
    
    

matlab代码跑出来的图

  • 14
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
龙格-库塔法是求解微分方程数值解的一种常用方法四阶龙格-库塔法是其中的一种,它的步骤比较多。下面,我会提供一个MATLAB程序,用来实现四阶龙格-库塔求解微分方程。 1. 首先,我们需要定义一些变量和初始值,包括: - h: 步长,即每次迭代的步幅; - t0: 初始时间; - tn: 结束时间; - y0: 初始状态向量,即微分方程的初值。 代码: h = 0.01; t0 = 0; tn = 10; y0 = [1;0;0;1]; 2. 接下来,我们需要定义一个导函数,即微分方程的右侧。在这个例子中,我们使用的是下面这个微分方程: y1' = y2 y2' = -y1 y3' = y4 y4' = -y3 代码: function dydt = derivative(t,y) dydt = [y(2); -y(1); y(4); -y(3)]; 3. 然后,我们就可以开始用四阶龙格-库塔求解微分方程了。具体步骤如下: - 定义初始值; - 定义一个空的数来存储解; - 定义一个循环,每次迭代计算下一个解; - 在每次迭代中,使用四阶龙格-库塔法计算下一个解,并将其存储到数中。 代码: % Define initial values t = t0; y = y0; i = 1; results(i,:) = y'; % Loop over time steps while t < tn % Calculate next solution using RK4 k1 = h * derivative(t,y); k2 = h * derivative(t+h/2, y+k1/2); k3 = h * derivative(t+h/2, y+k2/2); k4 = h * derivative(t+h, y+k3); y = y + (k1 + 2*k2 + 2*k3 + k4) / 6; t = t + h; i = i + 1; results(i,:) = y'; end 4. 最后,我们可以画出结果。在这个例子中,我们只有4个状态变量,因此可以在4个子图中分别画出它们的时间演化曲线。 代码: % Plot results figure; for i = 1:4 subplot(2,2,i); plot(0:h:tn, results(:,i)); title(['y', num2str(i)]); end 到此为止,我们就完成了一个简单的四阶龙格-库塔求解微分方程的MATLAB程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值