二阶常微分方程的数值解法(中心差分法和有限体积法)

这里我们介绍中心差分法和有限体积法求解方程。
题目:
用差分法的中心差分格式和有限体积法求解两点边值问题
u′′−α(2x−1)u′−2αu=0,0<x<1u(0)=u(1)=1,u^{\prime\prime}-\alpha\left(2x-1\right)u^\prime-2\alpha u=0,0<x<1 u\left(0\right)=u\left(1\right)=1,u′′−α(2x−1)u′−2αu=0,0<x<1u(0)=u(1)=1,
其中,参数α=10\alpha=10α=10,得到不同网格最大误差和收敛阶。

问题分析

Step 1:网格剖分:首先取 N + 1 个节点为: a=x0<x1<x2<⋯<xN=ba=x_0<x_1<x_2<\cdots<x_N=ba=x0​<x1​<x2​<⋯<xN​=b,
将区间 [a,b] 作等距剖分,划分为 N 个小区间,记 h=xi+1−xi,i=1,2,⋯,N−1h=x_{i+1}-x_i,i=1,2,\cdots,N-1h=xi+1​−xi​,i=1,2,⋯,N−1为网格步长.再进行对偶剖分:取相邻节点 xi+1,xix_{i+1} ,x_ixi+1​,xi​ 的中点xi+12=12(xi+1−xi),i=1,2,⋯,N−1.x_{i+\frac{1}{2}}=\frac{1}{2}\left(x_{i+1}-x_i\right),i=1,2,\cdots,N-1.xi+21​​=21​(xi+1​−xi​),i=1,2,⋯,N−1.由这些节点构成的剖分为对偶剖分.
(i)中心差分法:
1h2(ui+1−2ui+ui−1)−α(2xi−1)2h(ui+1−ui−1)−2αui=0\frac{1}{h^2}\left(u_{i+1}-2u_i+u_{i-1}\right)-\frac{\alpha\left(2x_i-1\right)}{2h}\left(u_{i+1}-u_{i-1}\right)-2\alpha u_i=0h21​(ui+1​−2ui​+ui−1​)−2hα(2xi​−1)​(ui+1​−ui−1​)−2αui​=0
⇒\Rightarrow⇒
(1h2−ri)ui+1+(−2h2−2α)ui+(1h2+ri)ui−1=0\left(\frac{1}{h^2}-r_i\right)u_{i+1}+\left(-\frac{2}{h^2}-2\alpha\right)u_i+\left(\frac{1}{h^2}+r_i\right)u_{i-1}=0(h21​−ri​)ui+1​+(−h22​−2α)ui​+(h21​+ri​)ui−1​=0,

where ri=α(2xi−1)2h.r_i=\frac{\alpha\left(2x_i-1\right)}{2h}.ri​=2hα(2xi​−1)​.
Let A=[−2h2−2α1h2−r10⋯001h2+r2−2h2−2α1h2−r2⋯00⋯⋯⋯⋯⋯⋯000⋯1h2+rN−1−2h2−2α],A=\left[\begin{matrix}-\frac{2}{h^2}-2\alpha&\frac{1}{h^2}-r_1&0&\cdots&0&0\\\frac{1}{h^2}+r_2&-\frac{2}{h^2}-2\alpha&\frac{1}{h^2}-r_2&\cdots&0&0\\\cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\0&0&0&\cdots&\frac{1}{h^2}+r_{N-1}&-\frac{2}{h^2}-2\alpha\\\end{matrix}\right],A=​−h22​−2αh21​+r2​⋯0​h21​−r1​−h22​−2α⋯0​0h21​−r2​⋯0​⋯⋯⋯⋯​00⋯h21​+rN−1​​00⋯−h22​−2α​​,
U=(u1,u2,⋯,uN−1)T,b=(−u0(1h2+r1),0,0,⋯,0,−uN(1h2+rN−1))TU=\left(u_1,u_2,\cdots,u_{N-1}\right)^T,\\ b=\left(-u_0\left(\frac{1}{h^2}+r_1\right),0,0,\cdots,0,-u_N\left(\frac{1}{h^2}+r_{N-1}\right)\right)^TU=(u1​,u2​,⋯,uN−1​)T,b=(−u0​(h21​+r1​),0,0,⋯,0,−uN​(h21​+rN−1​))T.
Then AU=b.
接着解出U即可.

(ii)有限体积法:
Let W(x)=dudxW\left(x\right)=\frac{du}{dx}W(x)=dxdu​, then dWdx−α(2x−1)W(x)−2αu=0.\frac{dW}{dx}-\alpha\left(2x-1\right)W\left(x\right)-2\alpha u=0.dxdW​−α(2x−1)W(x)−2αu=0.
两边同时积分得:
W(xi+12)−W(xi−12)−∫xi−12xi+12α(2x−1)W(x)dx−∫xi−12xi+122αudx=0.W(x_{i+\frac{1}{2}})-W(x_{i-\frac{1}{2}})-\int_{x_{i-\frac{1}{2}}}^{x_{i+\frac{1}{2}}}α(2x-1)W(x)dx-\int_{x_{i-\frac{1}{2}}}^{x_{i+\frac{1}{2}}}2αudx=0.W(xi+21​​)−W(xi−21​​)−∫xi−21​​xi+21​​​α(2x−1)W(x)dx−∫xi−21​​xi+21​​​2αudx=0.
运用积分中值定理可得:
W(xi+12)−W(xi−12)−W(xi)∫xi−12xi+12α(2x−1)dx−ui∫xi−12xi+122αdx=0.W(x_{i+\frac{1}{2}})-W(x_{i-\frac{1}{2}})-W(x_i)\int_{x_{i-\frac{1}{2}}}^{x_{i+\frac{1}{2}}}α(2x-1)dx-u_i\int_{x_{i-\frac{1}{2}}}^{x_{i+\frac{1}{2}}}2αdx=0.W(xi+21​​)−W(xi−21​​)−W(xi​)∫xi−21​​xi+21​​​α(2x−1)dx−ui​∫xi−21​​xi+21​​​2αdx=0.
⇒\Rightarrow⇒
W(xi+12)−W(xi−12)−W(xi)(xi+12+xi−12−1)hα−2αuih=0W(x_{i+\frac{1}{2}})-W(x_{i-\frac{1}{2}})-W(x_i)(x_{i+\frac{1}{2}}+x_{i-\frac{1}{2}}-1)hα-2α u_ih=0W(xi+21​​)−W(xi−21​​)−W(xi​)(xi+21​​+xi−21​​−1)hα−2αui​h=0
⇒\Rightarrow⇒
1h(ui+1−2ui+ui−1)−α4(xi+1+2xi+xi−1)(ui+1−ui−1)+α2(ui+1−ui−1)−2αuih=0\frac{1}{h}\left(u_{i+1}-2u_i+u_{i-1}\right)-\frac{\alpha}{4}\left(x_{i+1}+2x_i+x_{i-1}\right)\left(u_{i+1}-u_{i-1}\right)+\frac{\alpha}{2}\left(u_{i+1}-u_{i-1}\right)-{2\alpha\ u}_ih=0h1​(ui+1​−2ui​+ui−1​)−4α​(xi+1​+2xi​+xi−1​)(ui+1​−ui−1​)+2α​(ui+1​−ui−1​)−2α ui​h=0
⇒\Rightarrow⇒
(1h−li+α2)ui+1+(−2h−2αh)ui+(1h+li−α2)ui−1=0,\left(\frac{1}{h}-l_i+\frac{\alpha}{2}\right)u_{i+1}+\left(-\frac{2}{h}-2\alpha h\right)u_i+\left(\frac{1}{h}+l_i-\frac{\alpha}{2}\right)u_{i-1}=0,(h1​−li​+2α​)ui+1​+(−h2​−2αh)ui​+(h1​+li​−2α​)ui−1​=0,
whereli=α4(xi+1+2xi+xi−1){\ l}_i=\frac{\alpha}{4}\left(x_{i+1}+2x_i+x_{i-1}\right) li​=4α​(xi+1​+2xi​+xi−1​).
Let A=[−2h−2αh1h−l1+α20⋯001h+l2−α2−2h−2αh1h−l2+α2⋯00⋯⋯⋯⋯⋯⋯000⋯1h+lN−1−α2−2h−2αh],A=\left[\begin{matrix}-\frac{2}{h}-2\alpha h&\frac{1}{h}-l_1+\frac{\alpha}{2}&0&\cdots&0&0\\\frac{1}{h}+l_2-\frac{\alpha}{2}&-\frac{2}{h}-2\alpha h&\frac{1}{h}-l_2+\frac{\alpha}{2}&\cdots&0&0\\\cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\0&0&0&\cdots&\frac{1}{h}+l_{N-1}-\frac{\alpha}{2}&-\frac{2}{h}-2\alpha h\\\end{matrix}\right],A=​−h2​−2αhh1​+l2​−2α​⋯0​h1​−l1​+2α​−h2​−2αh⋯0​0h1​−l2​+2α​⋯0​⋯⋯⋯⋯​00⋯h1​+lN−1​−2α​​00⋯−h2​−2αh​​,

U=(u1,u1,⋯,uN−1)T,F=(−u0(1h+l1−α2),0,0,⋯,0,−uN(1h−lN−1+α2))TU=\left(u_1,u_1,\cdots,u_{N-1}\right)^T,F=\left(-u_0\left(\frac{1}{h}+l_1-\frac{\alpha}{2}\right),0,0,\cdots,0,-u_N\left(\frac{1}{h}-l_{N-1}+\frac{\alpha}{2}\right)\right)^TU=(u1​,u1​,⋯,uN−1​)T,F=(−u0​(h1​+l1​−2α​),0,0,⋯,0,−uN​(h1​−lN−1​+2α​))T
Then AU=F.
接着解出U即可.

全部代码如下(matlab)

function E=Centered(h)%中心差分法
u0=1;
uN=1;
N=1/h;
x=zeros(1,N+1);
for i=1:(N)x(i+1)=x(i)+h;
end
R=zeros(1,N+1);
for i=1:(N+1)R(i)=10*(2*x(i)-1)/(2*h);
end
A=zeros(N-1,N-1);
A(1,1)=-2/(h*h)-20;
A(1,2)=1/(h*h)-R(2);
A(N-1,N-1)=-2/(h*h)-20;
A(N-1,N-2)=1/(h*h)+R(N)
for i=2:(N-2)A(i,i)=-2/(h*h)-20;A(i,i+1)=1/(h*h)-R(i+1);A(i,i-1)=1/(h*h)+R(i+1);
end
b=zeros(1,N-1);
b(1)=-u0*(1/(h*h)+R(2));
b(N-1)=-uN*(1/(h*h)-R(N));
y=A\b';
Y=zeros(N+1,1);
Y(1,1)=1;
Y(N+1,1)=1;
for i=2:NY(i,1)=y(i-1,1);
end
plot(x,Y ,'r*-');
hold on;
exa = dsolve('D2u = 10*(2*x-1)*Du+20*u', 'u(0)=1','u(1)=1', 'x');       %求出解析解
ezplot(exa, [0,1]);       %画出解析解的图像
legend('中心差分法数值解','解析解' );
u=zeros(1,N+1);
exa=inline(exa);
for i=1:(N+1)u(i)=feval(exa,x(i));e(i)=abs(u(i)-Y(i));
end
E=max(e);function E=V(h)%有限体积法
u0=1;
uN=1;
N=1/h;
x=zeros(1,N+1);
for i=1:(N)x(i+1)=x(i)+h;
end
R=zeros(1,N+1);
for i=2:NR(i)=2.5*(x(i+1)+2*x(i)+x(i-1));
end
A=zeros(N-1,N-1);
A(1,1)=-2/h-20*h;
A(1,2)=1/h+5-R(2);
A(N-1,N-1)=-2/h-20*h;
A(N-1,N-2)=1/h-5+R(N);
for i=2:(N-2)A(i,i)=-2/h-20*h;A(i,i+1)=1/h+5-R(i+1);A(i,i-1)=1/h-5+R(i+1);
end
b=zeros(1,N-1);
b(1)=-u0*(1/h-5+R(2));
b(N-1)=-uN*(1/h+5-R(N));
y=A^(-1)*b';
Y=zeros(N+1,1);
Y(1,1)=1;
Y(N+1,1)=1;
for i=2:NY(i,1)=y(i-1,1);
end
plot(x,Y ,'r*-');
hold on;
exa = dsolve('D2u = 10*(2*x-1)*Du+20*u', 'u(0)=1','u(1)=1', 'x');       %求出解析解
ezplot(exa, [0,1]);       %画出解析解的图像
legend('有限体积法数值解','解析解' );
u=zeros(1,N+1);
exa=inline(exa);
for i=1:(N+1)u(i)=feval(exa,x(i));e(i)=abs(u(i)-Y(i));
end
E=max(e);
%调试
clear all;clc;close  all;
h=[0.1,0.2,0.01,0.02,0.05];
for i=1:5E(i)=V(h(i));F(i)=Centered(h(i));
end

问题结果

我们发现中心差分法的最大误差与有限体积法的最大误差相差较小,阶数相同,因此我们可以认为中心差分法与有限体积法两者的收敛阶相同,而我们已知中心差分法的收敛阶为2阶,因此有限体积法的收敛阶也是二阶。

(以h=0.1为例,我们画出了两种方法数值解与解析解的图像)

二阶常微分方程的数值解法(中心差分法和有限体积法)相关推荐

  1. [常微分方程的数值解法系列四] 中值法

    中值法 简介 具体步骤 截断误差 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主要是应 ...

  2. 二阶龙格库塔公式推导_[常微分方程的数值解法系列五] 龙格-库塔(RK4)法

    在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于 ...

  3. [常微分方程的数值解法系列五] 龙格-库塔(RK4)法

    龙格-库塔法 简介 基本思想 具体方法 一阶 二阶 求解参数 特殊二阶 三阶 高阶 步长选择 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其 ...

  4. [常微分方程的数值解法系列三] 改进欧拉法(预估校正法)

    改进欧拉法 简介 预估-校正 截断误差 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程.但之前求解微分方程的解析方法主 ...

  5. [常微分方程的数值解法系列二] 欧拉法

    欧拉法 简介 几何意义 证明 泰勒展开近似 求导近似 积分近似 几种欧拉方式 向前欧拉公式 向后欧拉公式 梯形公式 中点公式 截断误差 求解过程 向前欧拉公式 例子 向前欧拉公式 在惯性导航以及VIO ...

  6. 有限体积法求解二维方腔流(一)——动量方程和连续性方程的离散

    1. 有限体积法求解二维方腔流–理论手册 1.1. 不可压缩流体控制方程 连续性方程 ∇⋅U=0(1)\nabla \cdot U=0 \tag{1} ∇⋅U=0(1) 动量方程 ∂U∂t+∇⋅(UU ...

  7. 一阶常微分方程的数值解法(二阶显式、隐式 Adams 公式及 Milne 方法)

    一阶常微分方程的数值解法 这里我们介绍二阶显式.隐式 Adams 公式及 Milne 方法求解方程. 题目: 对初值问题 u ′ = u − t 2 , 0 ≤ t ≤ 1 , u ( 0 ) = 0 ...

  8. 二阶椭圆型第一边值问题的数值解法(五点差分格式和有限体积法)附matlab代码

    二阶椭圆型第一边值问题的数值解法(五点差分格式和有限体积法)附matlab代码 这里我们介绍五点差分格式和有限体积法求椭圆型第一边值问题, 题目: 分别采用矩形网格的五点差分格式和有限体积法求椭圆型第 ...

  9. 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...

    常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现 导读:就爱阅读网友为您分享以下"一阶常微分方程数值解的C语言编程实现"资讯,希望对您有所帮助,感谢您对92的支持! 一阶 ...

最新文章

  1. AR的平面检测和利用SceneKit构建几何体
  2. oracle两个表合并 sql,如何创建从两个表(Oracle DBMS)生成“合并”数据集的Select SQL语句?...
  3. access数据库应用系统客观题_随访数据库的建立:易侕DataWeb系统应用
  4. 还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!
  5. 如何导出共享文件夹的权限或转移
  6. 如何学习才能成为优秀的Web前端开发工程师?
  7. Zabbix监控配置
  8. python操作oracle数据库知识梳理
  9. 程序员求职之道(《程序员面试笔试宝典》)之求职的时候该不该只看钱?
  10. 在计算机里的键盘叫什么名字,电脑键盘最长的一个键叫什么名字
  11. cisco MSDP配置指南
  12. 奇技淫巧之 dummy 网卡
  13. 记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
  14. 注意啦,还没有支持64位系统的App开发者,务必在12月底前完成这件事
  15. jedisPool相关参数说明
  16. Git和小乌龟的下载安装及简单使用
  17. 写专利还是比较辛苦的
  18. matlab 四叶草,Matlab入门教程 第七章 Simulink 基础
  19. JAVA 面向对象与面向过程区别
  20. 关闭Win10休眠和快速启动

热门文章

  1. UV法测量cod原理及特点
  2. 【UV打印机】电气之负压系统(二)
  3. 攻防世界MISC(杂项)新手练习区
  4. mysql useing查询_MySQL查询优化一例——也说说 Using intersect
  5. Java课程设计-实验室预约管理系统
  6. 自媒体怎么快速入门?这几个技巧一定要掌握好
  7. LeetCode 0417「太平洋大西洋水流问题」
  8. 知识分享 | Oracle的官方ACE是个啥 and如何搞定一个ACE!
  9. 【27】grad-cam的简单逻辑实现以及效果展示
  10. P3265 [JLOI2015] 线性基