【微分方程数值解】有限差分法(二)两点边值问题数值算例(附python代码)
1.两点边值问题形式
一般的两点边值问题形式为:
−uxx=f(x)-u_{xx}=f(x)−uxx=f(x)
u(a)=α,u(b)=βu(a)=\alpha,u(b)=\betau(a)=α,u(b)=β
下给出一个具体两点边值的问题用以分析:
−uxx=16π2sin(4πx)-u_{xx}=16\pi^2sin(4\pi x)−uxx=16π2sin(4πx)
u(0)=0,u(1)=0u(0)=0,u(1)=0u(0)=0,u(1)=0
其中问题的真解为:u(x)=sin(4πx)u(x)=sin(4πx)u(x)=sin(4πx)
2.求解思路
按照我们上一节中有限差分法步骤:
- 求解区域的划分
将区间[0,1]等距划分为n份,节点记为x0,x1,x2...xnx_0,x_1,x_2...x_nx0,x1,x2...xn
- 选取差分格式
以二阶中心差分格式 xi+1+xi−1−2xih2\frac{x_{i+1}+x_{i-1}-2x_{i}}{h^2}h2xi+1+xi−1−2xi 代替题目中的 uxxu_{xx}uxx
即可以得到 xi+1+xi−1−2xih2=16π2sin(4πx)\frac{x_{i+1}+x_{i-1}-2x_{i}}{h^2}=16\pi^2sin(4\pi x)h2xi+1+xi−1−2xi=16π2sin(4πx) (式2.1),其中 i =0,1,2…n - 边界处理
这里已经给出了具体的边值 u(0)=0,u(1)=0u(0)=0,u(1)=0u(0)=0,u(1)=0 ,和方程是相容的,不需要额外的处理. - 得出代数方程组并求解
将上面的(式2.1)写成代数方程组的格式,即:
{x0=0ax0+bx1+ax2=f(x1)ax1+bx2+ax3=f(x2)⋮axn−2+bxn−1+axn=f(xn−1)xn=0\begin{cases} x_0=0\\ ax_0+bx_1+ax_2=f(x_1)\\ ax_1+bx_2+ax_3=f(x_2)\\ \vdots\\ ax_{n-2}+bx_{n-1}+ax_n=f(x_{n-1})\\ x_n=0 \end{cases} ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧x0=0ax0+bx1+ax2=f(x1)ax1+bx2+ax3=f(x2)⋮axn−2+bxn−1+axn=f(xn−1)xn=0
其中a=−1h2,b=2h2a=-\frac{1}{h^2},b=\frac{2}{h^2}a=−h21,b=h22
将方程组左端转化为成矩阵形式,即为一个类三对角矩阵,将其记为A:
A=[1000⋯0aba0⋯00aba⋯0⋮⋮⋮⋮⋱⋮00⋯aba00⋯001]A=\begin{bmatrix} {1}&{0}&{0}&{0}&{\cdots}&{0}\\ {a}&{b}&{a}&{0}&{\cdots}&{0}\\ {0}&{a}&{b}&{a}&{\cdots}&{0}\\ {\vdots}&{\vdots}&{\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {0}&{0}&{\cdots}&{a}&{b}&{a}\\ {0}&{0}&{\cdots}&{0}&{0}&{1}\\ \end{bmatrix}A=⎣⎢⎢⎢⎢⎢⎢⎢⎡1a0⋮000ba⋮000ab⋮⋯⋯00a⋮a0⋯⋯⋯⋱b0000⋮a1⎦⎥⎥⎥⎥⎥⎥⎥⎤
方程右端记为矩阵b:
b=[f(x0),f(x1),f(x2)⋯f(xn)]Tb=\begin{bmatrix} {f(x_0)},{f(x_1)},{f(x_2)}&{\cdots}&{f(x_n)}\\ \end{bmatrix}^Tb=[f(x0),f(x1),f(x2)⋯f(xn)]T
即求解 Ax=bAx=bAx=b
3.求解代码与结果分析
先以将区间划分为20份为例,求出数值解
import numpy as np
#准备工作
def initial(L,R,NS):x = np.linspace(L,R,NS+1)h = (R-L) / NSreturn x,h#右端函数f
def f(x):return 16*(np.pi)**2*np.sin(4*np.pi*x)
#解方程
def solve(NS):#矩阵AA1 = np.array([1]+[b]*(NS-1)+[1])A2 = np.array([a]*(NS-1)+[0])A3 = np.array([0]+[a]*(NS-1))A = np.diag(A1)+np.diag(A2,-1)+np.diag(A3,1)#矩阵bbr = f(x)uh = np.linalg.solve(A,br)return uh
L = 0.0
R = 1.0
NS = 20x,h = initial(L,R,NS)
a = -1/h**2
b = 2/h**2
uh = solve(NS)
print("N=20时数值解\n",uh)
结果:
[Out]:
N=20时数值解[ 1.09917379e-14 6.07510380e-01 9.82972443e-01 9.82972443e-016.07510380e-01 -1.13114821e-14 -6.07510380e-01 -9.82972443e-01-9.82972443e-01 -6.07510380e-01 -3.28309853e-14 6.07510380e-019.82972443e-01 9.82972443e-01 6.07510380e-01 -5.45035987e-14-6.07510380e-01 -9.82972443e-01 -9.82972443e-01 -6.07510380e-01-7.73553884e-14]
是不是解出数值解就完事了呢?当然不是。我们可以将问题的差分格式解与问题的真解进行比较,以得到解的可靠性。通过数学计算我们得到问题的真解为 u(x)=sin(4πx)u(x)=sin(4πx)u(x)=sin(4πx),现用范数来衡量误差的大小:
#真解函数
def ture_u(x):ture_u = np.sin(4*np.pi*x)return ture_u
t_u = ture_u(x)
print("N=20时真解\n",t_u)
#误差范数
def err(ture_u,uh):ee = max(abs(ture_u-uh))e0 = np.sqrt(sum((ture_u-uh)**2)*h)return ee,e0
ee,e0 = err(t_u,uh)
print('最大模范数下的误差',ee)
print('平方和范数下的误差',e0)
结果:
[Out]:
N=20时真解[ 0.00000000e+00 5.87785252e-01 9.51056516e-01 9.51056516e-015.87785252e-01 1.22464680e-16 -5.87785252e-01 -9.51056516e-01-9.51056516e-01 -5.87785252e-01 -2.44929360e-16 5.87785252e-019.51056516e-01 9.51056516e-01 5.87785252e-01 3.67394040e-16-5.87785252e-01 -9.51056516e-01 -9.51056516e-01 -5.87785252e-01-4.89858720e-16]
最大模范数下的误差 0.03191592653467212
平方和范数下的误差 0.023729365914438843
接下来绘图比较NS=20时与真解的差距:
#绘图比较
import matplotlib.pyplot as plt
plt.figure()
plt.plot(x,uh)
plt.plot(x,t_u)
plt.title("solution")
plt.show()
结果:
最后,我们还可以从数学的角度分析所采用的差分格式的一些性质。因为差分格式的误差为 O(h2)O(h^2)O(h2) ,所以理论上来说网格每加密一倍,与真解的误差大致会缩小到原来的1/41/41/4。下讨论网格加密时的变化:
#误差与网格关系讨论
N = [10,20,40,80]
print("接下来是网格密度加倍时误差变化情况")
for i in range (4):NS = N[i]x,h = initial(L,R,NS)a = -1/h**2b = 2/h**2uh = solve(NS)t_u = ture_u(x)ee,e0 = err(t_u,uh)print(ee)
结果:
接下来是网格密度加倍时误差变化情况
0.13569108849388545
0.03191592653467212
0.00826541696629457
0.002058706764599627
由结果观察可知,当网格每加密一倍时误差确实减少为原来的1/41/41/4。
至此,两点边值的相关问题已经分析完了,下一节我们将讨论均匀直棒热传导问题(抛物型问题)。博主在准备考研中,不过还是会尽快更新的~
【微分方程数值解】有限差分法(二)两点边值问题数值算例(附python代码)相关推荐
- 详解 Benders 分解与一个算例的 python 代码
听说过 benders 分解几年了,在生产管理.路径规划与选址问题中经常应用,一直没有细看,最近论文里面也见到,还是有必要了解一下它的基本思想与用法的. 目录 1. 基本思想 2. 线性规划模型与对偶 ...
- 四维空间的二维线框投影可视化(附matlab代码)
四维空间的二维线框投影可视化(附matlab代码) 1 三维空间在2维屏幕上的投影 1.1平行投影 1.2透视投影 2 四维空间在2维屏幕上的投影 2.1 四维空间与三维空间的一些区别 2.2 四维空 ...
- 需要额外端口信息_二端口网络及算例
这里是一则小广告: 关注作者请点击这里哦:zdr0 我的专栏里面不仅有学习笔记,也有一些科普文章,相信我的专栏不会让您失望哦-大家可以关注一下:数学及自然科学 记得点赞加收藏哦- 创作不易,请赞赏一下 ...
- 动态规划原理介绍(附7个算例,有代码讲解)
动态规划思想 动态规划(Dynamicprogramming)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗 ...
- RRT* 算法原理以及在二维仿真环境中的实现 -- Python代码实现
RRT* 算法是在 RRT 的基础上做出了一些改进,主要改进的点有两点: 新结点生成后,优化其父结点. 在生成新结点 new_node 后,首先设置一个搜索区域的半径,搜索该区域中的树结点,并计算其中 ...
- Dijkstra 路径规划算法在二维仿真环境中的应用 -- Python代码实现
在上一节中,介绍了 Dijkstra 算法的原理以及在图中的应用,这一节将一步步实现 Dijkstra 路径规划算法在二维环境中的路径规划,来进一步加深对 Dijkstra 算法的理解. 所需要用到的 ...
- Euler-Maruyama 方法数值算例
pdf原文件 将随机微分方程写成积分形式有 其中都是标量函数并且初始条件是随机变量.这里的积分采用的是 Ito 积分,方程的解是随变化的随机变量.现在定义一种求解上述方程的数值方法,并且将数值方法在时 ...
- RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现
在上一节中,介绍了 RRT 算法的原理,这一节将一步步实现 RRT 路径规划算法在二维环境中的路径规划,来进一步加深对 RRT 算法的理解. 二维环境的搭建 我们将搭建下图所示的二维环境,绿色点为起点 ...
- 有限元方法基础-以二维拉普拉斯方程为例(附程序)
文章目录 前言 问题描述 问题区域 偏微分方程 变分问题(弱形式) 有限元离散 二维线性有限元 : 参考基函数 2D linear finite element : affine mapping 有限 ...
最新文章
- Python的range()函数
- 心得丨走过最长的路,就是机器学习过程中的弯路
- crysis3 android,Crytek谈安卓版《Crysis 3》:Tegra X1图形性能OK,瓶颈是CPU
- python中import os_python import os
- sqlserver sql语句|经典sql语句|实用sql语句
- [Qt教程] 第49篇 进阶(九) 多媒体应用简介
- 使用 Chrome Timeline 来优化页面性能
- Linux 命令之 cut
- java 数据挖掘 开源_5个开源数据挖掘工具,收下这波干货
- 安装时间大于30秒_高送转第一股秒板,封单金额近百亿!最新高送转潜力股名单曝光...
- 软考计算机评职称,软考通过后如何评职称?
- TCA笔记4:TCA代码笔记
- 《腾讯是怎么长大的》读书笔记
- 机器学习之线性回归 Linear Regression(二)Python实现
- 考研数学要背诵的知识点
- sublime的注册方法 非常好用
- ZigBee学习之7——OSAL(操作系统抽象层)API解读
- Java官方教程(三-1)运算符 operator(2020.12.18)
- 在体育方面计算机的应用,计算机技术在高校体育教学中的应用
- 计算机网络习题:网络层部分