微分方程数值解法(1)——常微分方程初值问题的数值解法

article/2025/8/27 23:11:17

此处参考教材为李荣华的《微分方程数值解法》
使用工具:Matlab

1. 算法


注: 最后一行应为k4,上面为笔误

2. 算法

I.需要求解的函数
function f=f1D(t,u,ft)% ft为方程编号,u1D为精确解函数u(t),注意与f1D对应右端项函数f(t,u(t))switch ftcase 1 %P10 习题1%v=exp(-5*t);f=-5*u;case 2 % P27 例3.1%v=(1+t.^2).^2;f=4*t.*u.^(1/2);case 3 %补充练习 P54 例1%v=exp(-t);f=-u;
end
II.对应精确解
function v=u1D(t,ft)% ft为方程编号,u1D为精确解函数u(t),注意与f1D 对应右端项函数f(t,u(t))switch ftcase 1 %P10 习题1v=exp(-5*t);%f=-5*u;case 2 % P27 例3.1v=(1+t.^2).^2;%f=4*t.*u.^(1/2);case 3 %补充练习 P54 例1%v=exp(-t);f=-u;
end

III.求解问题的主函数

function ODESolver(ft,t0,T,h)t=(t0:h:T);%t节点
n=length(t);%步数
ExactU=u1D(t,ft);%精确解
%-------------------------------------- 
% 1)向前欧拉,单步显式,u(i)=u(i-1)+h*f(t(i-1),u(i-1))
u=0.*t;%数值解初始化
u(1)=ExactU(1);%设初值
tic; %记录CPU计算开始时间
for i=2:nu(i)=u(i-1)+h*f1D(t(i-1),u(i-1),ft);
end
time1=toc; %记录CPU计算结束时间
NumU1=u;%计算结束赋值
Err1=(NumU1(n)-ExactU(n));%T点处误差
RelErr1=Err1/ExactU(n);%相对误差%--------------------------------------
% 2)向后Euler法,单步隐式,u(i)=u(i-1)+h*f(t(i),u(i))
u=0.*t;%数值解初始化
u(1)=ExactU(1);%设初值
tic; %记录CPU计算开始时间
for i=2:nuc1=u(i-1)-1;%非线性迭代设初值uc2=u(i-1);%非线性迭代设初值,因为迭代uc1=uc2,故初值uc2=u(i-1)delta=10^(-5);%迭代阈值while abs(uc2-uc1)>deltauc1=uc2;uc2=u(i-1)+h*f1D(t(i),uc1,ft);endu(i)=uc2;%非线性迭代结束
end
time2=toc; %记录CPU计算结束时间
NumU2=u; %计算结束赋值
Err2=NumU2(n)-ExactU(n); %T点处误差
RelErr2=Err2/ExactU(n); %相对误差%--------------------------------------
% 3)梯形法,单步隐式法, u(i)=u(i-1)+(h/2)*(f(t(i-1),u(i-1))+f(t(i),u(i)))
u=0.*t; %数值解初始化
u(1)=ExactU(1); %设初值
tic; %记录CPU计算开始时间
for i=2:nuc1=u(i-1)-1; %非线性迭代设置初值uc2=u(i-1); %非线性迭代设置初值,因为迭代uc1=uc2,故初值uc2=u(i-1)delta=10^(-5); %d迭代阈值while abs(uc2-uc1)>deltauc1=uc2;uc2=u(i-1)+(h/2)*(f1D(t(i-1),u(i-1),ft)+f1D(t(i),uc1,ft));endu(i)=uc2; %非线性迭代结束
end
time3=toc; %记录CPU计算结束时间
NumU3=u; %计算结束赋值
Err3=NumU3(n)-ExactU(n); %T点处误差
RelErr3=Err3/ExactU(n); %相对误差%--------------------------------------
% 4) 改进Euler法,单步显示法,uc(i)=u(i-1)+h*f(t(i-1),u(i-1)),u(i)=u(i-1)+(h/2)*(f(t(i-1),u(i-1))+f(t(i),uc(i)))
u=0.*t;%数值解法初始化
u(1)=ExactU(1);%设初值
tic;%记录CPU计算开始时间
for i=2:nuc1=u(i-1)+h*4*t(i-1)*(u(i-1)^(1/2));%用向前Euler法预估u(i)=u(i-1)+(h/2)*(f1D(t(i-1),u(i-1),ft)+f1D(t(i),uc1,ft));%用梯形法校正
end
time4=toc;%记录CPU计算结束时间
NumU4=real(u);%计算结束赋值
Err4=NumU4(n)-ExactU(n);%T点处误差
RelErr4=Err4/ExactU(n);%相对误差%--------------------------------------
%5)二步法a=0,二步显式法,u(n+2)-(1+a)*u(n+1)+a*u(n)=(1/2)*h*((3-a)*f(n+1)-(1+a)*f(n))
u=0.*t;%数值解初始化
u(1)=ExactU(1);%设初值
u(2)=ExactU(2);%设初值
a=0;
tic;%记录CPU计算开始时间
for i=3:n
u(i)=(1+a)*u(i-1)-a*u(i-2)+(1/2)*h*((3-a)*f1D(t(i-1),u(i-1),ft)-(1+a)*f1D(t(i-2),u(i-2),ft));
end
time5=toc;%记录CPU计算结束时间
NumU5=u;%计算结束赋值
Err5=NumU5(n)-ExactU(n);%T点处误差
RelErr5=Err5/ExactU(n);%相对误差%--------------------------------------
%6)二步法a=-5,二步显式法,u(n+2)-(1+a)*u(n+1)+a*u(n)=(1/2)*h*((3-a)*f(n+1)-(1+a)*f(n))
u=0.*t;%数值解初始化
u(1)=ExactU(1); %设初值
u(2)=ExactU(2); %设初值
a=-5;
tic; %记录CPU计算结束时间
for i=3:n
u(i)=(1+a)*u(i-1)-a*u(i-2)+(1/2)*h* ((3-a)*f1D(t(i-1),u(i-1),ft)-(1+a)*f1D(t(i-2),u(i-2),ft));
end
time6=toc;  %记录CPU计算结束时间
NumU6=real(u); %计算结束赋值,由于u计算出现负数,开根号出现复数,故取实部
Err6=NumU6(n)-ExactU(n); %T点处误差
RelErr6=Err6/ExactU(n); %相对误差%--------------------------------------
% 7)Simpson法,二步隐式法,u(i)=u(i-2)+(2*h/6)*(f(t(i-2),u(i-2))+4*f(t(i-1),u(i-1))+f(t(i),u(i)))
u=0.*t; %数值解初始化
u(1)=ExactU(1); %设初值
u(2)=ExactU(2); %设初值
tic; %记录CPU计算结束时间
for i=3:nuc1=u(i-2); %非线性迭代设初值uc2=u(i-1); %非线性迭代设初值,因为迭代uc1=uc2,故初值uc2=u(i-1)delta=10^(-5); %迭代阈值,精度及运算时间受其影响while abs(uc2-uc1)>deltauc1=uc2;
uc2=u(i-2)+(h/3)*(f1D(t(i-2),u(i-2),ft)+4*f1D(t(i-1),u(i-1),ft)+f1D(t(i),uc1,ft));endu(i)=uc2; %非线性迭代结束
end
time7=toc; %记录CPU计算结束时间
NumU7=u; %计算结束赋值
Err7=NumU7(n)-ExactU(n);%T点处误差
RelErr7=Err7/ExactU(n);%相对误差%--------------------------------------
% 8)四级四阶RK法,单步显式法
u=0.*t;%数值解初始化
u(1)=ExactU(1);%设初值
tic;%记录CPU开始计算的时间
for i=2:nk1=f1D(t(i-1),u(i-1),ft);k2=f1D(t(i-1)+h/2,u(i-1)+(h/2)*k1,ft);k3=f1D(t(i-1)+h/2,u(i-1)+(h/2)*k2,ft);k4=f1D(t(i-1)+h,u(i-1)+h*k3,ft);u(i)=u(i-1)+(h/6)*(k1+2*k2+2*k3+k4);
end
time8=toc;%记录CPU计算结束时间
NumU8=u;%计算结束赋值
Err8=(NumU8(n)-ExactU(n));%T点处误差
RelErr8=Err8/ExactU(n);%相对误差%--------------------------------------
%画图
figure;
plot(t,ExactU,'k-*',t,NumU1,'r-o',t,NumU2,'b-o',t,NumU3,'g-o',t,NumU4,'c-o',t,NumU5,'r-d',t,NumU7,'g-d',t,NumU8,'b-d');
legend('精确解','1)向前欧拉','2)向后欧拉','3)梯形法','4)改进Euler','5)二步法a=0','7)Simpson法','8)RK法','Location','NorthEastOutside');%制表
f=figure;
data=([t;ExactU;NumU1;NumU2;NumU3;NumU4;NumU5;NumU6;NumU7;NumU8])';
data=[data;[0,0,Err1,Err2,Err3,Err4,Err5,Err6,Err7,Err8];[0,0,RelErr1,RelErr2,RelErr3,RelErr4,RelErr5,RelErr6,RelErr7,RelErr8];[0,0,time1,time2,time3,time4,time5,time6,time7,time8]];
colnames={'t','精确解','1)向前欧拉','2)向后欧拉','3)梯形法','4)改进Euler','5)二步法a=0','6)二步法a=-5','7)Simpson法','8)RK法'};
tab=uitable(f,'Data',data,'ColumnName',colnames,'Position',[50 50 800 500]);

3.给出简单结果

[^此处图略,仅给出简单数字结果;感兴趣的读者可以复制代码运行一下]

P10页:习题1
(1) 步长0.1:

在命令行窗口输入
>>ODESolver(1,0,1,0.1)

所得最后一步误差结果:

Err1 =-0.0058
Err2 =0.0106
Err3 =-6.9002e-04
Err4 =-0.0098
Err5 =0.0045
Err6 =-2.1480e+04
Err7 =-3.0847e-04
Err8 =2.6728e-05

(2)步长0.05:

在命令行窗口输入
>>ODESolver(1,0,1,0.05)

所得结果:

Err1 =-0.0036
Err2 =0.0048
Err3 =-1.7339e-04
Err4 =-0.0069
Err5 = 9.8516e-04
Err6 = -2.1437e+10
Err7 =-1.2741e-05
Err8 = 1.3516e-06

P27页:例题3.1
(1)步长0.1:

在命令行窗口输入
>>ODESolver(2,0,5,0.1)
所得结果:

Err1 = -3.5381
Err2 = 4.0508
Err3 = 0.0806
Err4 = -0.0763
Err5 = -0.3675
Err6 = -6.9711e+08
Err7 = -1.3874e-06
Err8 = -9.5303e-05

(2)步长0.05:

在命令行窗口输入
>>ODESolver(2,0,2,0.05)
所得结果:

Err1 = -1.8298
Err2 = 1.9580
Err3 = 0.0201
Err4 = -0.0196
Err5 = -0.0963
Err6 = -5.4646e+21
Err7 = -1.4567e-06
Err8 = -6.2349e-06

P54 例1
(1)步长0.1:

在命令行窗口输入
>>ODESolver(3,0,2,0.1)
所得结果:

Err1 = -0.0138
Err2 = 0.0133
Err3 = -2.2421e-04
Err4 = -0.0974
Err5 = 0.0011
Err6 = -1.2434e+08
Err7 = 1.8151e-08
Err8 = 2.4519e-07

4.对算例结果进行简单的分析

从整体来看:

第一道题在靠近1的附近,数值解精确度都比较高。第二道题在靠近0的附近,数值解精确度都比较高。其中,向前Euler法和向后Euler法落在精确解的两侧。图表的最后三行分别表示最后一步的数值误差、最后一步的相对误差、每个算法所花费的时间。

从步长来看:

图像中可以较直观的发现,h=0.05比h=0.1的精度整体更高一些。当步长变小时,对结果的分析更加清晰。

从八种不同的算法来看:

利用直观的图像以及数据表,Simpson方法误差最小,其次是RK法,二步法的误差最大(因为这种算法不稳定,可从图表中看出当a=-5时,二步法显示出不稳定性,且当步长缩小,时间增加时,不稳定性表现得非常明显)。在所有的单步法中,梯形法和改进欧拉法效果也比较好。


http://chatgpt.dhexx.cn/article/CB8CAlp0.shtml

相关文章

偏微分方程数值解法pdf_天生一对,硬核微分方程与深度学习的联姻之路

机器之心原创 作者:蒋思源 微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的路径。 近日&…

椭圆型偏微分方程数值解法

一、 一维椭圆方程数值解 matlab代码&#xff1a; function chap2_fdm_elliptic_1D % 一维椭圆方程求解(常微分方程边值问题) % -u q(x)u f(x), 0<x<1, 取q(x) x, f(x) (x-1)exp(x) % u(0) 1, u(1) e; 边界条件 % 真解为 u exp(x)N 20; h 1/N; x_al…

Python小白的数学建模课-11.偏微分方程数值解法

偏微分方程可以描述各种自然和工程现象&#xff0c; 是构建科学、工程学和其他领域的数学模型主要手段。 偏微分方程主要有三类&#xff1a;椭圆方程&#xff0c;抛物方程和双曲方程。 本文采用有限差分法求解偏微分方程&#xff0c;通过案例讲解一维平流方程、一维热传导方程…

偏微分方程数值解法pdf_单摆-微分方程浅谈

引子[1] 单摆&#xff0c;这个在中学物理都学过的东西&#xff0c;应该是非常熟悉了。 图片来源-维基百科 小角度简单摆 若最高处( )的绳子和最低处(速度最大值)的绳子的角度为 &#xff0c;则可使用下列公式算出它的振动周期。 公式证明 摆球受力分析 绳与对称线夹角为 &…

偏微分方程数值解法pdf_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

抖音图标

抖音图标&#xff1a; 1.创建一张画布&#xff0c;再用圆角矩形工具创建一个圆角矩形 2.新建一个图层&#xff0c;用椭圆选框工具创建一个圆&#xff0c;再alt键从选区减去一个圆 3.再填充一个颜色&#xff0c;再剪切1/4圆接着粘贴拖拽至右上方 4.新建一个图层&#xff0c;用…

抖音图标——ps

抖音图标 1.用圆角矩形工具画个圆角&#xff08;空格键可以移动&#xff09;&#xff0c;填充为黑色&#xff0c;把此图层转换为珊格式化 2.再新建一个图层&#xff0c;用椭圆选框工具画个换个环&#xff08;用alt会出现&#xff0c;shift会出现加号&#xff09; 3.Ctrlx剪…

抖音软件分析

前几天看了看关于短视频软件的火的一些话题&#xff0c;就去看了看关于抖音的&#xff0c;对于抖音是那几个方面&#xff0c;自己也去做了一些分析&#xff0c;首先是在两个方面去做的一个理解&#xff0c;一个是软件制作&#xff0c;一个是商业运营。 软件制作 在抖音的软件…

仿抖音视频自动播放html,vue 仿抖音视频播放切换

一、第一部分html页面的准备 {{item.title}} {{item.introduction}} 二、数据说明部分 data() {let u = navigator.userAgent; return {showSlide: 0, allLoaded: false, //数据是否全部加载完 page: 1, isLoading: true, option: {}, current: 0, videoList: [], isVideoShow:…

抖音账号官方认证

介绍 认证功能入口 【我】—【创作者服务中心】— 【官方认证】 抖音黄V是什么&#xff1f; 抖音黄V是抖音平台对个人能力与专业性的认可。换句话讲&#xff0c;黄V即能体现个人身份标签又可以获得官方在内容发布的“豁免权”。如未认证的用户去进行科普&#xff0c;轻则警…

仿抖音首页界面

目录 效果图 顶部相关代码 顶部效果图 内容相关代码 内容效果图 底部导航栏相关代码 底部导航栏效果图 完整代码 html css js ​flexible.js 要想做出抖音短视频的首页界面&#xff0c;我们要引用swiper插件、还需要用到iconfont图标&#xff08;可自行到官网上下载…

抖音小程序Tiktok开发教程之 基础组件 04 icon 图标组件

什么是icon组件? icon是图标组件 icon组件运行效果 icon组件如何使用呢? 首先,在ttml界面中添加下面代码 <view class="container"><view class="body"><view class="page-section page-default"><view class="…

分享图片或链接到抖音

目录 前言 一、官方文档 二、开始配置 第一步&#xff1a;向抖音短视频申请你的 clientkey 及相关权限 第二步&#xff1a;集成到开发环境 1.根目录下build.gradle引入库 2.app moudel目录下build.gradle引入库 3.配置抖音的软件包可见性 使用一&#xff1a;Android-分…

仅用一个 HTML 标签,实现带动画的抖音 Logo

作者 | 零一 来源 | 前端印象 今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 成品图 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的Logo&…

用python+pillow模块实现抖音晃眼睛的特效,图像处理之路(附源码)

前言 利用Python实现抖音晃眼睛的特效&#xff0c;让我们愉快地开始吧~ 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; pillow模块&#xff1b; numpy模块&#xff1b; argparse模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到…

仅用一个HTML标签,实现带动画的抖音LOGO

大家好&#xff0c;我是零一&#xff0c;今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的…

uni-app项目引入图标

uni-app项目引入图标 普通图标引入 1、阿里巴巴矢量图官网创建图标项目 2、将搜索的图标添加进购物车&#xff0c;在购物车里面将图标添加进项目里面 3、下载该文件到本地&#xff0c;将该文件的css文件复制到项目里面 &#xff08;并设置大小&#xff09; 4、修改icon…

免费下载无水印抖音视频

今天&#xff0c;跟大家分享一个免费下载抖音视频的方法&#xff0c;可以去除抖音上的id水印。话不多说&#xff0c;直接上图。 1.复制手机端抖音链接。 点击这个分享图标 复制链接 发送到电脑&#xff0c;打开网页http://douyin.adsond.com/&#xff08;点此直接进入&…

抖音下载android,抖音完整版

《抖音完整版》这是一款可以发布完整版视频资源的软件&#xff0c;在软件中多种精彩丰富的视频内容&#xff0c;拥有各种最新的潮流以及特色的丰富内容&#xff0c;等你来看&#xff01;这里超多种丰富好玩的视频资源&#xff0c;特色的观看体验&#xff01;(以下来为大家介绍详…