常微分方程初值问题:单步方法 [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