常微分方程初值问题:单步方法 [MATLAB]

#先上代码后补笔记#

#可以直接复制粘贴调用的MATLAB函数代码!#

1. 朗格-库塔(Runge-Kutta)方法族

目前只实现了四阶Runge-Kutta方法。

function [ YMat ] = Runge_Kutta( func, tvec, y_init, order )
%   朗格-库塔(Runge-Kutta)算法解常微分方程(组);
%   输入四个参数:函数句柄func(接收列向量、返回列向量),积分时间列向量tvec,初值行向量y_init,阶数order;
%   输出一个参数:数值解,每一行对应积分时间列向量的一行,各列为变量一个分量。
%   暂时只实现了阶数为4的(即order='4')
col = size(y_init, 2); row = size(tvec, 1); YMat = zeros(row, col);
YMat(1, :) = y_init;
switch order
    case '4'
        for i=1:row-1
            y = YMat(i, :).'; h = tvec(i+1) - tvec(i); t = tvec(i);
            k1 = func(t, y);
            k2 = func(t + h/2, y + k1*h/2);
            k3 = func(t + h/2, y + k2*h/2);
            k4 = func(t + h, y + k3*h);
            YMat(i + 1, :) = (y + (k1 + 2*k2 + 2*k3 + k4)*h/6).';
        end
end

  

posted @ 2018-09-12 23:47  GentleMin  阅读(620)  评论(0编辑  收藏  举报