一阶常微分方程的数值解法(二阶显式、隐式 Adams 公式及 Milne 方法)
一阶常微分方程的数值解法
这里我们介绍二阶显式、隐式 Adams 公式及 Milne 方法求解方程。
题目: 对初值问题
u ′ = u − t 2 , 0 ≤ t ≤ 1 , u ( 0 ) = 0 u^\prime=u-t^2,\ \ \ 0\le t\le1 ,u\left(0\right)=0 u′=u−t2, 0≤t≤1,u(0)=0
试分别用二阶显式,隐式 Adams 公式及 Milne 方法求数值解,取 τ = 0.2,并与精确解和 Euler 比较。
二阶显式的Adams 公式为:
u n + 1 = u n + τ 2 ( 3 f ( t n , u n ) − f ( t n − 1 , u n − 1 ) ) u_{n+1}=u_n+\frac{\tau}{2}\left(3f\left(t_n,u_n\right)-f\left(t_{n-1},u_{n-1}\right)\right) un+1=un+2τ(3f(tn,un)−f(tn−1,un−1))
二阶隐式 Adams 公式为:
u n + 1 = u n + τ 2 ( f ( t n + 1 , u n + 1 ) + f ( t n , u n ) ) u_{n+1}=u_n+\frac{\tau}{2}\left(f\left(t_{n+1},u_{n+1}\right)+f\left(t_n,u_n\right)\right) un+1=un+2τ(f(tn+1,un+1)+f(tn,un))
Milne 方法公式为:
u n + 2 = u n + τ 3 ( f ( t n + 2 , u n + 2 ) + 4 f ( t n + 1 , u n + 1 ) + f ( t n , u n ) ) u_{n+2}=u_n+\frac{\tau}{3}\left(f\left(t_{n+2},u_{n+2}\right)+4f\left(t_{n+1},u_{n+1}\right)+f\left(t_n,u_n\right)\right) un+2=un+3τ(f(tn+2,un+2)+4f(tn+1,un+1)+f(tn,un))
全部代码如下
clear all;clc;close all;
fun= inline('u-t^2','t','u');
a = 0; b =1;
u0 = 0;
h = 0.2;
M =floor(b-a)/h ;
S=Milne(fun, a, b, u0, h);%or Adamsout(fun, t0, tn, u0, h) or Adamsin(fun, t0, tn, u0, h)
plot(S(:,1),S(:,2) ,'r*-'); hold on;
exa = dsolve('Du = u-t^2', 'u(0) = 0', 't'); %求出解析解
ezplot(exa, [0,1,-1,0.05]); %画出解析解的图像
legend('数值解','解析解' );function S = Adamsout(fun, t0, tn, u0, h)%二阶显式的Adams 公式
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ; %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1); %行向量
T(1) = t0;
T(2)=t0+h;
U(1) = u0;
K = feval(fun, T(1) ,U(1));
U(2)=u0+h*K;
for i = 2:MK0 = feval(fun, T(i-1) ,U(i-1));K1 = feval(fun, T(i) ,U(i));U(i+1) = U(i) +h/2*(3*K1-K0);T(i+1) = T(i) +h;
end
S = [T' U'];function S = Adamsin(fun, t0, tn, u0, h)% 二阶隐式 Adams 法
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ; %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1); %行向量
T(1) = t0;
U(1) = u0;
for i = 1:MK1 = feval(fun, T(i) ,U(i));K2 = feval(fun, T(i)+h ,U(i)+ h*K1);U(i+1) = U(i) +h/2 *(K1 + K2);T(i+1) = T(i) +h;
end
S = [T' U'];
function S = Milne(fun, t0, tn, u0, h)%Milne 方法
%fun:微分方程的右表达式
%t0, tn为区间
%u0 为初值
M =floor(tn-t0)/h ; %离散点的个数M+1
T =zeros(1, M+1); U =zeros(1, M+1); %行向量
T(1) = t0;
T(2) = t0+h;
K=Rungekutta(fun,t0,tn,u0,h);
U=(K(:,2))';
for i = 3:(M+1)K1 = feval(fun, T(i-1) ,U(i-1));K2= feval(fun, T(i-2) ,U(i-2)); K3 = feval(fun, T(i-1)+h ,U(i));U(i) = U(i-2) +h/3 *(K2 + 4*K1+K3);T(i) = T(i-1) +h;
end
S = [T' U'];
问题结果
(1) 二阶显式的Adams数值解与解析解图像:
(2) 二阶隐式 Adams数值解与解析解图像
(3) Milne 方法数值解与解析解图像
最大误差比较:
总结
总结:从图像分析,我们能明显发现二阶隐式Adams法与Milne 方法比二阶显式Adams法的拟合度要好,从图中我们无法看出二阶隐式Adams法与Milne 方法这两者的精确度谁更高,于是我们对比了这两种方法的误差绝对值,从表格中不难看出,Milne 方法的精确度最高。
一阶常微分方程的数值解法(二阶显式、隐式 Adams 公式及 Milne 方法)相关推荐
- 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...
常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现 导读:就爱阅读网友为您分享以下"一阶常微分方程数值解的C语言编程实现"资讯,希望对您有所帮助,感谢您对92的支持! 一阶 ...
- 二阶龙格库塔公式推导_[常微分方程的数值解法系列五] 龙格-库塔(RK4)法
在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于 ...
- 二阶常微分方程的数值解法(中心差分法和有限体积法)
二阶常微分方程的数值解法(中心差分法和有限体积法) 这里我们介绍中心差分法和有限体积法求解方程. 题目: 用差分法的中心差分格式和有限体积法求解两点边值问题 u′′−α(2x−1)u′−2αu=0,0 ...
- 常微分方程初值问题数值解法[完整公式](Python)
目录 1.概述 (1)常微分方程初值问题数值解法 (2)解题步骤 (3)数值微分解法 (4)数值积分解法 2.所有知识点代码 3.结果---以三阶Runge-Kutta公式为例(其他的类似) 1.概述 ...
- [常微分方程的数值解法系列三] 改进欧拉法(预估校正法)
改进欧拉法 简介 预估-校正 截断误差 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主 ...
- [常微分方程的数值解法系列二] 欧拉法
欧拉法 简介 几何意义 证明 泰勒展开近似 求导近似 积分近似 几种欧拉方式 向前欧拉公式 向后欧拉公式 梯形公式 中点公式 截断误差 求解过程 向前欧拉公式 例子 向前欧拉公式 在惯性导航以及VIO ...
- [常微分方程的数值解法系列四] 中值法
中值法 简介 具体步骤 截断误差 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主要是应 ...
- 【数理知识】《数值分析》李庆扬老师-第9章-常微分方程初值问题数值解法
第8章 回到目录 无 第9章-常微分方程初值问题数值解法 9.1 引言 利普希茨 (Lipschitz) 条件 / 利普希茨常数 定理1 解的存在唯一性定理 定理2 解对初值依赖的敏感性 9.2 简单 ...
- [常微分方程的数值解法系列五] 龙格-库塔(RK4)法
龙格-库塔法 简介 基本思想 具体方法 一阶 二阶 求解参数 特殊二阶 三阶 高阶 步长选择 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其 ...
最新文章
- 音频处理中频域转时域的恢复
- 如何使用Scala的ClassTag
- 使用xrandr和cvt命令添加自定义的分辨率模式
- MassTransit中RequestResponse基本使用
- 升级php7_PhpStorm 2019.3 发布,全面支持 PHP 7.4
- 深度学习-TF函数-layers.concatenate用法
- 听说你想爬点壁(mei)纸图
- (C语言)素数是指大于1,且只能被1和它自身整除的正整数。现给定一个范围,请输出在此范围中素数的个数。
- [Python]小甲鱼Python视频第037课(类和对象:面向对象编程 )课后题及参考解答
- javascript操作cookie实例
- Spring Boot官宣:正式弃用 Java 8,最低要求 Java 17!怎么办?
- php生成图形验证码的几种方法
- 鼎捷t100架构_鼎捷 T100 ERP 系统.pdf
- springboot 网页聊天室
- 三大运营商网络使用频段及随身wifi选用
- 基于RTL—SDR及Simulink的FM收音机仿真
- IDC最新发布全屋智能将成为智能家居增长的重要动力,华为战略升级
- IOS开发-画曲线画弧线画圆
- 【codeforces 787C】Berzerk
- 笔记本安装Ubuntu 无法使用 Broadcom(博通) 无线网卡实现wifi上网的解决方法