matlab 欧拉法解微分方程组_学习随笔之龙格库塔法解常微分方程

设一阶微分方程及初值为:

911f88c43cd873a8ee5b1fcd67c83073.png
  1. 欧拉法

过点(x0,y0)以y’(x0)=f(x0,y0)为斜率作切线,切线方程:

82e7acaba188d3df4cd56629ef000e34.png

欧拉法即是f(x,y)在(x0,y0)处的一阶泰勒展开,即有:

4555d1569a2553e764858beb6edcd915.png

设x0,x1,x2,…xn的步长为h,则欧拉法求解的公式可表示为:

043dda69bcf596e18d45dddc254195d0.png

欧拉法具有一阶精度,其局部阶段误差是关于步长的二阶无穷小量。

  1. 改进欧拉法

由微分中值定理,改进欧拉方程为:

c3a95a527f122c4babd763a7b3645e4d.png

由于等式两边都存有yn+1未知量,这种形式称为隐式形式。因为是近似计算,可以由欧拉公式求得yn+1的一个近似值(预报值),然后将其带入公式中再进行计算得到一个yn+1值(校正值)。(本文中公式所有的方框都为*号,显示问题)

02f7a4441c8a5d77b3f37cac20227ace.png

写成一个公式即为:

3246adbf4af9301cbdf82d372487b1fd.png

改进欧拉法具有二阶精度,其局部阶段误差是关于步长的三阶无穷小量。

  1. 龙格库塔法

根据微分中值定理,在(xn,xn+1)区间存在一个ζ满足:

1064601713262040e4b1409d6648414a.png

称ζ处的斜率f(ζ,y(ζ))为平均斜率K,则有:

f7eab41e4c0995fa055b26dd478a614a.png

显然,取xn处的斜率f(xn,yn)为K时即为欧拉法,取xn和xn+1处的斜率均值为K时为改进欧拉法。若在[xn,xn+1]区间多取几个点的斜率,以其某种加权均值作为K,可进一步提升yn+1精度。

在[xn,xn+1]区间取m个点,其中第j个点及对应的斜率Kj为:

7e5090f48bd47b2523d6f01183358b9f.png

每个斜率Kj的加权值为λj,则平均斜率K及yn+1估值为:

130eb3f9b50b34fcc53513670eb9e8ed.png

此即为龙格库塔算法,选取恰当的αj,βj和λj可使算法精度尽可能提升,算法阶数由取点数m决定,阶数越高精度越高。

二阶龙格库塔公式:

a27e31b07384c4faf6b66b5ffc4e07fd.png

三阶龙格库塔公式:

6dd5ba19b07e88402fe1a9288ead6864.png

四阶龙格库塔公式:

0f3077adced229f6d96cae47507246a1.png

Matlab代码

clear
clc
close all
%% 初始条件
syms x y f;          % 原方程为y=e^(sinx)
f(x,y) = y*cos(x); % 条件1:方程导数y'=f(x,y)
x0 = 0;
y0 = 1;            % 条件2:初值y(0)=1

h = 0.2;           % 步长
x = x0:h:10;       % x取值范围
y = exp(sin(x));    % 真实的y值(待求)
len = length(x);

%% 欧拉法
y1 = zeros(size(x)); % 初始化y
y1(1) = y0;
for ii = 2:len
    K1 = f(x(ii-1),y1(ii-1));
    y1(ii) = y1(ii-1) + h*K1;
end

%% 二阶龙格库塔
y2 = zeros(size(x)); % 初始化y
y2(1) = y0;
for ii = 2:len
    K1 = f(x(ii-1),y2(ii-1));
    K2 = f(x(ii-1)+h/2,y2(ii-1)+h*K1/2);
    y2(ii) = y2(ii-1) + h*K2;
end

%% 三阶龙格库塔
y3 = zeros(size(x));
y3(1) = y0;
for ii = 2:len
    K1 = f(x(ii-1),y3(ii-1));
    K2 = f(x(ii-1)+h/2,y3(ii-1)+h*K1/2);
    K3 = f(x(ii-1)+h,y3(ii-1)+h*(K2*2-K1));
    y3(ii) = y3(ii-1) + h*(K1+4*K2+K3)/6;
end

%% 四阶龙格库塔
y4 = zeros(size(x));
y4(1) = y0;
for ii = 2:len
    K1 = f(x(ii-1),y4(ii-1));
    K2 = f(x(ii-1)+h/2,y4(ii-1)+h*K1/2);
    K3 = f(x(ii-1)+h/2,y4(ii-1)+h*K2/2);
    K4 = f(x(ii-1)+h,y4(ii-1)+h*K3);
    y4(ii) = y3(ii-1) + h*(K1+2*K2+2*K3+K4)/6;
end

%% 绘图
figure
plot(x,y,x,y2,x,y3,x,y4,x,y1)
title('fontname{微软雅黑}fontsize{10}龙格库塔求解值');
xlabel('fontname{微软雅黑}fontsize{10}x');
ylabel('fontname{微软雅黑}fontsize{10}y');
legend('原值','2阶值','3阶值','4阶值','欧拉法')

figure
plot(x,y2-y,x,y3-y,x,y4-y,x,y1-y)
title('fontname{微软雅黑}fontsize{10}龙格库塔误差');
xlabel('fontname{微软雅黑}fontsize{10}x')
ylabel('fontname{微软雅黑}fontsize{10}');
legend('2阶误差','3阶误差','4阶误差','欧拉法')

(早期随笔文件补档)

00e38b82424d9a814a36ecb6c201f56f.png

6cdf4057ef276b924d2f4bcb80bc6c65.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值