二阶常微分方程(ODE)的打靶法(Shooting method),有限差分基础(python)_二阶常系数非齐次微分方程打靶法-程序员宅基地

技术标签: 有限元 数值分析  python  线性代数  

第四十九篇 二阶常微分方程的打靶法

边界值问题

当我们试图用自变量的不同值所提供的信息来解二阶或更高阶的常微分方程时,我们必须使用与前面描述的不同的数值方法。
前面提到的初值问题经常涉及到“时间”作为自变量,解决技术要求我们按步骤“前进”,直到达到所需的解。在这种情况下,解的定义域不是有限的,因为原则上我们可以无限地沿着正方向或负方向前进。
边值问题涉及一个有限解的区间,在这个区间内去求解。这类问题的自变量通常是空间中测量距离的坐标。一个典型的二阶边值问题可能下面的形式。
在这里插入图片描述
解的定义域(假设为B >a)是由x在A≤x≤B的范围内的值给出的,我们需要的是找到对应于x在这个范围内的y的值。
本篇将考虑的数值解法分为三类
(a)用有限差分等效代替原来的微分方程的技术。
(b)“打靶法”,试图用一个等价初值问题代替边值问题。
“加权残差”法,即猜测一个满足边界条件的试解,并调整解内的某些参数以使误差最小化。

有限差分法

在这种方法中,微分方程中的导数项被有限差分近似代替。正如微分方程是线性的,将会显示的那样。这个过程会导致一个线性联立方程,可以使用前面描述的方法求解。
首先,需要定义一些有限差分近似来处理经常遇到的导数。考虑下图的解曲线,其中x轴被细分为规则的网格点,距离为h。
在这里插入图片描述
可以用下面任意一种方法来表示y对x的一阶导数
在这里插入图片描述
这些有限差分公式通过计算函数在xi附近的连接点的直线的斜率来逼近一阶导数。正向和反向公式有偏差,因为它们只包括xi的右侧或左侧的点。中心差分形式将xi左右的点考虑在内。
高阶导数也可以用这种方法近似。例如,在xi处的二阶导数可以通过取一阶导数的逆向差来估计,如下所示
在这里插入图片描述
如果我们把一阶导数的前向差分公式代入,得到
在这里插入图片描述
类似上面可以得到yi’‘的中心差分公式
在这里插入图片描述
类似地,三阶导数的中心差分公式可以由
在这里插入图片描述
对x的四阶导数
在这里插入图片描述
这些高阶导数的正向和逆向差分也很容易得到,并且通过在差分公式中包含更多的点,可以获得更高的精度。
逆向差分公式是正向差分公式的简单镜像,除了奇数导数(即,y’,y " '等),其中符号必须相反。
一阶导数在x0处的四点正向差分公式为
在这里插入图片描述
逆向差分公式为
在这里插入图片描述
“两点边值问题的解决方案包括把x的范围分裂到n个相等的部分,每个宽度h。n = 4,如果给定的边界条件,x = A和x = B,令ξ= x0 + ih, i = 1, 2,……,其中x0 = A, xn = B。
在每个点i = 1,2,…n−1处,微分方程以有限差分形式表示。如果微分方程是线性的,这将导致n−1个联立线性方程,在未知值yi, i = 1,2,…,n−1,其中yi表示在xi处的解。细分得越多,解的细节和精度就越高,但必须解决的联立方程也就越多。

计算实例

给定y’’ = 3x + 4y,边界条件y(0) = 0, y(1) = 1,利用h = 0.2有限差分求解0≤x≤1范围内的方程。
在这里插入图片描述
首先将微分方程写成有限差分形式。选择二阶导数公式。通常使用最低阶中心差分形式,除非有特殊的情况去使用较不准确的正向或逆向差分形式,因此
在这里插入图片描述
微分方程可以写成
在这里插入图片描述
求解域被分割成5条相等的条带,每条宽度h = 0.2。
然后将有限差分方程写在每一个需要解的网格点上。需要时引入已知的边界条件,得到下表所示的四个方程。
这些(非对称)方程可以用线性方程求解中的任何合适的程序求解。第二个表将数值解与精确解进行了比较
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
显然,有限差分解的精度可以通过在0≤x≤1范围内进行更多的细分来进一步提高,但代价是求解更多的方程。
上个例子显示了一个问题,那就是如果使用了y "的高阶有限差分表示。例如,如果对y’‘使用五点中心差分公式,那么为了表示y1’‘和y4’’,就需要y在解域之外的值。为了解这个系统,还需要更多的信息,因为未知数要比方程多。
在解域之外引入点(至少是暂时引入点)的要求经常会碰到,并且可以通过采取合并适当的边界条件来解决,如下一个示例所示。
考虑一个边值问题
在这里插入图片描述
在这种情况下,y (B)是未知的,所以微分方程的有限差分需要写在x = B,即使使用最简单的中心差分公式y”,相应的“解决方案”在x5,将如下图所示。在这种情况下,我们有5个未知数,但只有4个方程。
在这里插入图片描述
第五个方程来自导数边界条件,它也可以写成有限差分形式,即使用中心差分
在这里插入图片描述

计算实例

给定x2y’’ + 2xy’−2y = x2,边界条件y(1) = 1, y’(1.5) =−1。用h = 0.1有限差分求解1≤x≤1.5范围内的方程。
微分方程以有限差分形式,对两个导数项使用中心差分写成如下
在这里插入图片描述
并应用于5个需要解的x值,如下图所示。
得到的方程如下表所示。从下图可以看出,第五个方程在解域外引入了第六个未知数y6 = y(1.6)。中心差分形式的导数边界条件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用于提供第六个方程。
这六个线性方程的解,连同精确解,给出在下表中
在这里插入图片描述
在这里插入图片描述
本节给出的有限差分解在网格点相对较少的情况下表现得相当好。但并不会总是这种情况,特别是当导数在解域中发生突然的变化时。在没有精确解可供比较的情况下,建议使用两个或三个不同层次的解域来解决问题。解对网格尺寸参数h的灵敏度往往表明解的精度。
从我们的角度来看,应该使h足够小,以达到所需的精度,但不能小于必要的值,因为这会导致过度大的方程组。

打靶法

打靶法试图像解决初值问题一样解决边值问题。考虑下面的二阶方程
在这里插入图片描述
在一个打靶法中,将解决一系列的初值问题的形式
在这里插入图片描述
通过有条不紊地改变初始梯度ai,我们最终可以在x = B处得到一个足够接近所需边值yB的解。有几种不同的策略来收敛所需的解,这些方法类似于寻找非线性代数方程的根。
这里描述的方法如下图所示是选择两个初始梯度y ’ 0 (A) = a0和y ’ 1 (A) = a1,通过一步法之后,得到y0(B) = y0和y1 (B) = y₁分别在所需的边界条件yB的两边,即,y0 < yB < y1(或y1< yB < y0)。
在这里插入图片描述
通过线性插值,给出了初始梯度的改进估计
在这里插入图片描述
从而得出y(B) = y∗。
根据下面的测试,其中一个初始梯度被∗取代,如果
在这里插入图片描述
然后用y代替y0和a代替a0
或者用y代替y1和a代替a1
在整个迭代过程中,我们的目标是保持一个高估目标边界条件的初始梯度,以及一个低估目标边界条件的初始梯度。随着迭代的进行,y∗趋于目标值,当根据准则满足收敛容差时,计算停止
在这里插入图片描述
迭代过程本质上就是之前描述的“假位置法”。详情可见试位法求解非线性方程

程序如下

程序计算的二阶常微分方程为
在这里插入图片描述

import numpy as np
a0=np.zeros((2))
k0=np.zeros((2))
k1=np.zeros((2))
k2=np.zeros((2))
k3=np.zeros((2))
y=np.zeros((2))
nsteps=5;xa=0.0;ya=0.0;xb=1.0;yb=1.0
a0[:]=(0.0,1.0)
tol=0.0001;limit=25
y0=np.zeros((nsteps+1,2))
ystar=np.zeros((nsteps+1))
print('--二阶常微分方程的打靶法--')
h=(xb-xa)/nsteps
def f74(x,y):
    f74=np.zeros((2))
    f74[0]=y[1]
    f74[1]=3.0*x**2+4.0*y[0]
    return f74
for j in range(1,3):
    x=xa;y[0]=ya;y[1]=a0[j-1]
    for i in range(0,nsteps+1):
        y0[i,j-1]=y[0]
        k0=h*f74(x,y);k1=h*f74(x+h/2.0,y+k0/2.0)
        k2=h*f74(x+h/2.0,y+k1/2.0);k3=h*f74(x+h,y+k2)
        y=y+(k0+2.0*k1+2.0*k2+k3)/6.0;x=x+h
if (y0[nsteps,0]-yb)*(y0[nsteps,1]-yb)>0:
    print('尝试一个新梯度')
iters=0
while(True):
    iters=iters+1
    astar=a0[0]+(yb-y0[nsteps,0])*(a0[1]-a0[0])/(y0[nsteps,1]-y0[nsteps,0])
    x=xa;y[0]=ya;y[1]=astar
    for i in range(0,nsteps+1):
        ystar[i]=y[0]
        k0=h*f74(x,y);k1=h*f74(x+h/2.0,y+k0/2.0)
        k2=h*f74(x+h/2.0,y+k1/2.0);k3=h*f74(x+h,y+k2)
        y=y+(k0+2.0*k1+2.0*k2+k3)/6.0;x=x+h
    if (abs(ystar[nsteps]-yb)/yb)<tol:
        print(' x              y')
        for i in range(0,nsteps+1):
            print('{:9.5e}'.format(xa+i*h),end='  ')
            print('{:9.5e}'.format(ystar[i]))
        print('迭代到收敛次数',iters)
        break
    if (ystar[nsteps]-yb)*(y0[nsteps,0]-yb)>0:
        y0[:,0]=ystar;a0[0]=astar
    else:
        y0[:,1]=ystar;a0[1]=astar

        

终端输出结果如下
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/seventonight/article/details/117221579

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan