四阶龙格-库塔方法matlab程序与误差对比

四阶龙格-库塔方法matlab程序与误差对比

  • 简介
  • 参考
  • code
    • 四阶龙格-库塔函数
    • 微分方程函数
    • 主程序
  • 结果
  • 分析

简介

本例子函数参考了【1】中的函数,增加了解析方法的函数与四阶龙格-库塔方法对比,并计算了百分比误差,最大误差在0.3%左右。

参考

【1】Matlab代码分享-龙格库塔(Runge-Kutta)法

code

四阶龙格-库塔函数

参考自【1】链接

function [t,y]=Runge_Kutta4(fun,tb,te,y0,N,varargin)

%四阶龙格-库塔方法求解一阶微分方程数值解

%fun 微分方程

%tb t的取值范围的左端点

%te t的取值范围的左端点

%y0 y的迭代初始值

%N 步长

%如果函数的输入参数没有N时,步长数N取默认值200

if nargin<4

N = 200;

end

h = (te-tb)/N;%步长

t = tb+(0:N)'*h;

y = zeros(size(t));

y(1) = y0;

for k=1:N

K1 = feval(fun,t(k),y(k));

K2 = feval(fun,t(k)+h/2,y(k)+h/2*K1);

K3 = feval(fun,t(k)+h/2,y(k)+h/2*K2);

K4 = feval(fun,t(k),y(k)+h*K3);

y(k+1) = y(k) + h/6*(K1+2*K2+2*K3+K4);

end

end

微分方程函数

function f=RK4_fun(t,y)
f=-y+t.^2+3;
end

主程序

clc,clear,close all

%四阶龙格-库塔方法求解一阶微分方程数值解
tb=0;
te=3;
y0=1;
[t,soly]=Runge_Kutta4('RK4_fun',tb,te,y0,100);
disp([t,soly])
%解析法结果对比
tb=0;
te=3;
N=100;
h1=(te-tb)/N;
t1=tb+(0:N)'*h1;
ytrue=-4*exp(-t1)+t1.^2-2*t1+5;%解析法算的解
subplot(2,1,1);
plot(t,soly,'+',t1,ytrue,'*');

y_err=abs(soly-ytrue)./ytrue;
subplot(2,1,2);

plot(t,y_err,'*');
title('误差曲线');

结果

四阶龙格-库塔方法matlab程序与误差对比_第1张图片

分析

从结果图中我们可以看到,绝对值误差在整个区间逐渐增大,最大有0.3%的误差,还是有相当的精度。

你可能感兴趣的:(模式变换器,matlab,开发语言)