精华内容
下载资源
问答
  • 二阶微分方程数值解法
    千次阅读
    2021-04-23 17:43:20

    (2)).*y(1)+0.0001*(1-y(2)).^2; dy2dx = -1e4*dy1dx + 3000*(1-y(2)).^2; f = [dy1dx; dy2dx]; 高阶微分方程odefile的编写求解: ......

    Runge-Kutta法是常微分方程的一种经典解法 ? MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn?1 ? yn ? h 6 (k1 ? 2k2 ? 2k3 ? k4 ) k1 ? f (......

    Runge-Kutta法是常微分方程的一种经典解法 ? MATLAB 对应命令:ode45 四阶Runge-Kutta公式 h yn ?1 ? yn ? (k1 ? 2k 2 ? 2k3 ? k 4 ) 6 k1 ? ...

    ODE) 初值问题---给出初始值 边值问题---给出边界条件 与初值常微分方程解算有关的指令 ode23 ode45 ode113 ode23t ode15s ode23s ode23tb 一.解ODE的基......

    (tn1) 方法 的近似值 yn1 时只用到 tn , yn ,是自开始 Runge-Kutta法是常微分方程的一种经典解法 MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn1 yn h......

    (tn1) 的近似值 yn1 时只用到 tn , yn ,是自开始方法 Runge-Kutta法是常微分方程的一种经典解法 MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn1 yn h ......

    [dy1dx; dy2dx]; 高阶微分方程odefile的编写 求解: y&q...

    t ? 10 s 这是一个二阶微分方程组,可以引进变量 x 2 ? t ? ? x1 ? t ? ,由此 ODE 可以化成如下形式 本文参考 薛定宇《控制系统计算机辅助设计——......

    《MATLAB 语言及应用》 大作业姓名: 学号: 学院: 班级: 题目编号: 2013 年 10 月 13 4 阶 Runge-Kutta 法求解一阶常微分方程。一、 Runge-Kutta 法的数学......

    《MATLAB 语言及应用》 大作业姓名: 学号: 学院: 班级: 题目编号: 2013 年 10 月 13 4 阶 Runge-Kutta 法求解一阶常微分方程。一、 Runge-Kutta ......

    能熟练使用 dsolve 函数解析求解常微分方程; 3. 能熟练运用 ode45、ode15s 求解器分别数值求解非刚性和刚性常微分方程; 4. 学习用求解器来绘制相图的方法。 二......

    用字符串表示常微分方程,自变量缺省时为t,导数用 D表示微分。y的2阶导数用D2y表示,依此类推。 如何调用? [T,Y,TE,YE,IE]=solver('odefun',tspan,y0,......

    4.解微分方程的 MATLAB 命令 MATLAB 中主要用 dsolve 求符号解析解,ode45,ode23,ode15s 求数值解。 s=dsolve(‘方程 1’, ‘方程 2’,…,’初始条件 1’......

    常微分方程数值解 二、初值问题求解函数 2. 函数介绍函数 ode45 ode23 问题类型 精确度 非刚性 非刚性 中等 低 说明 采用算法为4-5阶Runge-Kutta法,大多数 ......

    ode15s 短 ode23tb 刚性 梯形算法;低精度 当精度较低时,计算 时间比 ode15s 短 说明:ode23、ode45 就是极其常用得用来求解非刚性得标准形式得一阶微分 方程......

    ode45 是极其常用的用来求解非刚性的标准形式的一阶微分 方程(组)的初值问题的解的 Matlab 常用程序,其中: ode23 采用龙格-库塔 2 阶算法,用 3 阶公式作误差......

    2.3. Euler 法实用性 从图可以看出来一阶方法精确度非常差,基本上是无法用到实际工程中的,因此显式和 隐式 Euler 法只是提供一种对微分方程求解的思想。从图......

    解增长 解衰减解振荡 29 MATLAB求常微分方程数值解的函数基于龙格-库塔法, MATLAB求常微分方程数值解 的函数,一般调用格式为: [t,y]=ode23('fname',tspan,......

    Matlab解微分方程 除了上述的已知ODE外,还须有起始条件 y0=y(x0)才能解方程式,即是在x=x0时, y(x)=y0。上述各个方程式 的解析解 (analytical solution) ......

    用Matlab求常微分方程的数值解 [t,x]=solver(’f’,ts,x0,options)自变 量值 函数 值 ode45 ode23 ode113 ode15s ode23s 由待解 方程写 成的m文件名......

    更多相关内容
  • 二阶微分方程数学ME373-书 该存储库包含由教授的“ ME 373,机械工程方法”课程的电子教科书。 该课程的目录描述为 解决代表性机械工程问题的解析和数值方法。 课程学习目标是: 在本课程结束时,学生将能够: 用...
  • 本文归纳常见常微分方程的解析解解法以及基于Python的微分方程数值解算例实现。 如果没有出现意外,本文将不包含解法的推导过程。 常微分方程的解析解 考虑常微分方程的解析解法,我们一般可以将其归纳为如下几类: ...

    常微分方程的解析解(方法归纳)以及基于Python的微分方程数值解算例实现

    本文归纳常见常微分方程的解析解解法以及基于Python的微分方程数值解算例实现。

    常微分方程的解析解

    考虑常微分方程的解析解法,我们一般可以将其归纳为如下几类:

    1. 可分离变量的微分方程(一阶)
    2. 一阶齐次(非齐次)线性微分方程(一阶)
    3. 二阶常系数微分方程(二阶)
    4. 高阶常系数微分方程( n n n阶)

    可分离变量的微分方程(一阶)

    这类微分方程可以变形成如下形式:
    f ( x ) d x = g ( y ) d y f(x)dx=g(y)dy f(x)dx=g(y)dy
    两边同时积分即可解出函数,难点主要在于不定积分,是最简单的微分方程。

    某些方程看似不可分离变量,但是经过换元之后,其实还是可分离变量的,不要被这种方程迷惑。


    一阶齐次(非齐次)线性微分方程(一阶)

    形如
    d y d x + P ( x ) y = Q ( x ) \frac{dy}{dx}+P(x)y=Q(x) dxdy+P(x)y=Q(x)
    的方程叫做一阶线性微分方程,若 Q ( x ) Q(x) Q(x)为0,则方程齐次,否则称为非齐次。

    解法: (直接套公式)
    y ( x ) = e − ∫ P ( x ) d x ( ∫ e ∫ P ( x ) d x Q ( x ) d x + C ) y(x)=e^{-\int{P(x)}dx}(\int{e^{\int{P(x)dx}}Q(x)}dx+C) y(x)=eP(x)dx(eP(x)dxQ(x)dx+C)

    伯努利方程
    形如
    d y d x + P ( x ) y = Q ( x ) y n , n ∈ R , n ≠ 1 \frac{dy}{dx}+P(x)y=Q(x)y^{n},n\in\mathbb{R},n\ne1 dxdy+P(x)y=Q(x)yn,nR,n=1
    的方程称为伯努利方程,这种方程可以通过以下步骤化为一阶线性微分方程:
    y − n d y d x + P ( x ) y 1 − n = Q ( x ) y^{-n}\frac{dy}{dx}+P(x)y^{1-n}=Q(x) yndxdy+P(x)y1n=Q(x)
    1 1 − n ⋅ d y 1 − n d x + P ( x ) y 1 − n = Q ( x ) \frac{1}{1-n}·\frac{dy^{1-n}}{dx}+P(x)y^{1-n}=Q(x) 1n1dxdy1n+P(x)y1n=Q(x)
    y 1 − n = u y^{1-n}=u y1n=u, 方程两边同时乘以 1 − n 1−n 1n,得到
    d u d x + ( 1 − n ) P ( x ) u = ( 1 − n ) Q ( x ) \frac{du}{dx}+(1-n)P(x)u=(1-n)Q(x) dxdu+(1n)P(x)u=(1n)Q(x)
    d u d x + P ′ ( x ) u = Q ′ ( x ) \frac{du}{dx}+P'(x)u=Q'(x) dxdu+P(x)u=Q(x).
    这就将伯努利方程归结为可以套公式的一阶线性微分方程。


    二阶常系数微分方程(二阶)

    形如
    y ′ ′ + p y ′ + q y = f ( x ) y''+py'+qy=f(x) y+py+qy=f(x)
    的方程称为二阶常系数微分方程,若 f ( x ) ≡ 0 f(x)\equiv0 f(x)0,则方程称为齐次的,反之称为非齐次的。以下默认方程是非齐次的。

    求解此类方程分两步:

    1. 求出齐次通解
    2. 求出非齐次特解

    原方程的解=齐次通解+非齐次特解

    • 齐次通解的求法

    首先假设 f ( x ) ≡ 0 f(x)\equiv0 f(x)0.用特征方程法,写出对应的特征方程并且求解:
    λ 2 + p λ + q = 0 \lambda^2+p\lambda+q=0 λ2+pλ+q=0
    解的情况分为以下三种:

    情况一:方程有两个不同的实数解

    假设两个实数解分别是 λ 1 、 λ 2 \lambda_1、\lambda_2 λ1λ2, 此时方程的通解是
    Y ( x ) = C 1 e λ 1 x + C 2 e λ 2 x Y(x)=C_{1}e^{\lambda_1x}+C_{2}e^{\lambda_2x} Y(x)=C1eλ1x+C2eλ2x
    情况二:方程有一个二重解
    假设该解等于 λ \lambda λ,此时方程的通解是
    Y ( x ) = ( C 1 + C 2 x ) e λ x Y(x)=(C_{1}+C_{2}x)e^{\lambda x} Y(x)=(C1+C2x)eλx
    情况三:方程有一对共轭复解
    假设这对解是 α ± i β \alpha\pm i\beta α±iβ, 此时方程的通解是
    Y ( x ) = e α x ( C 1 c o s ( β x ) + C 2 s i n ( β x ) ) Y(x)=e^{\alpha x}(C_{1}cos(\beta x)+C_{2}sin(\beta x)) Y(x)=eαx(C1cos(βx)+C2sin(βx))

    • 非齐次特解的求法

    对于 f ( x ) f(x) f(x) 和特征根的情况,对特解的情况做如下归纳:

    1. f ( x ) = P m ( x ) f(x)=P_{m}(x) f(x)=Pm(x),其中 P m ( x ) P_{m}(x) Pm(x) 表示 x x x 的最高次数为 m m m 的多项式。

      若0不是方程特征解

      则方程有特解 y ∗ = Q m ( x ) y^{*}=Q_{m}(x) y=Qm(x)

      若0是方程的单特征解

      则方程有特解 y ∗ = x Q m ( x ) y^{*}=xQ_{m}(x) y=xQm(x)

      若0是方程的二重特征解

      则方程有特解 y ∗ = x 2 Q m ( x ) y^{*}=x^{2}Q_{m}(x) y=x2Qm(x)

      其中 Q m ( x ) = b 0 + b 1 x + … + b m x m Q_{m}(x)=b_{0}+b_{1}x+…+b_{m}x^{m} Qm(x)=b0+b1x++bmxm, b i ( i = 0 , 1 , … , m ) b_{i}(i = 0,1,…,m) bi(i=0,1,,m)是需要带回原方程来确定的系数。

    2. f ( x ) = e α x P m ( x ) f(x)=e^{\alpha x}P_{m}(x) f(x)=eαxPm(x)

      α \alpha α 不是方程特征解

      则方程有特解 y ∗ = e α x Q m ( x ) y^{*}=e^{\alpha x}Q_{m}(x) y=eαxQm(x)

      α \alpha α 是方程的单特征解

      则方程有特解 y ∗ = x e α x Q m ( x ) y^{*}=xe^{\alpha x}Q_{m}(x) y=xeαxQm(x)

      α \alpha α 是方程的二重特征解

      则方程有特解 y ∗ = x 2 e α x Q m ( x ) y^{*}=x^2e^{\alpha x}Q_{m}(x) y=x2eαxQm(x)

    3. $f(x)=e^{\alpha x}(a_{1}cos(\beta x)+a_{2}sin(\beta x)) $

      α ± i β \alpha\pm i\beta α±iβ 不是特征解

      则方程有特解 y ∗ = e α x ( A 1 c o s ( β x ) + A 2 s i n ( β x ) ) y^{*}=e^{\alpha x}(A_{1}cos(\beta x)+A_{2}sin(\beta x)) y=eαx(A1cos(βx)+A2sin(βx))

      α ± i β \alpha\pm i\beta α±iβ 是特征解

      则方程有特解 y ∗ = x e α x ( A 1 c o s ( β x ) + A 2 s i n ( β x ) ) y^{*}=xe^{\alpha x}(A_{1}cos(\beta x)+A_{2}sin(\beta x)) y=xeαx(A1cos(βx)+A2sin(βx))

      其中 A 1 、 A 2 A_{1}、A_{2} A1A2 是需要带回原方程来确定的系数。


    高阶常系数微分方程(n阶)

    形如
    y ( n ) + p 1 y ( n − 1 ) + . . . + p n − 1 y ′ + p n y = f ( x ) y^{(n)}+p_{1}y^{(n-1)}+...+p_{n-1}y'+p_{n}y=f(x) y(n)+p1y(n1)+...+pn1y+pny=f(x)
    的方程叫做高阶常系数微分方程,若 f ( x ) ≡ 0 f(x)\equiv0 f(x)0,则方程是齐次的,否则是非齐次的。下面默认方程是非齐次的。

    求解此类方程分两步:

    1. 求出齐次通解
    2. 求出非齐次特解

    原方程的解=齐次通解+非齐次特解

    • 齐次通解的求法(参考二阶常系数微分方程解法)
    • 非齐次特解的求法(参考二阶常系数微分方程解法)

    算例

    考虑带有第三类边界条件的二阶常系数微分方程边值问题
    { y ′ ′ ( x ) + 2 y ′ ( x ) − 3 y ( x ) = 3 x + 1 , x ∈ [ 1 , 2 ] y ′ ( 1 ) − y ( 1 ) = 1 , y ′ ( 2 ) − y ( 2 ) = − 4. \left\{ \begin{aligned} y''(x)+2y'(x)-3y(x) & = 3x+1, & x\in [1,2]\\ y'(1)-y(1) & = 1,\\ y'(2)-y(2) & = -4. \end{aligned} \right. y(x)+2y(x)3y(x)y(1)y(1)y(2)y(2)=3x+1,=1,=4.x[1,2]

    1. 求出上述两点边值问题的解析解;
    2. 通过有限差分方法算出其数值解;(取 h = 1 5 h=\frac{1}{5} h=51)并计算误差、绘图、输出 1.0 , 1.2 , 1.4 , 1.6 , 1.8 , 2.0 1.0,1.2,1.4,1.6,1.8,2.0 1.0,1.2,1.4,1.6,1.8,2.0处的数值解.

    问题一:两点边值问题的解析解

    由于此方程是非齐次的,故求解此类方程分两步:

    1. 求出齐次通解
    2. 求出非齐次特解

    原方程的解=齐次通解+非齐次特解

    • 齐次通解的求法

    首先假设 y ′ ′ ( x ) + 2 y ′ ( x ) − 3 y ( x ) ≡ 0 y''(x)+2y'(x)-3y(x)\equiv0 y(x)+2y(x)3y(x)0. 用特征方程法,写出对应的特征方程
    λ 2 + 2 λ − 3 = 0 \lambda^2+2\lambda-3=0 λ2+2λ3=0
    求解得到两个不同的实数特征根: λ 1 = 1 , λ 2 = − 3 \lambda_1=1,\lambda_2=-3 λ1=1,λ2=3.

    此时方程的齐次通解是
    y ( x ) = C 1 e λ 1 x + C 2 e λ 2 x y(x)=C_{1}e^{\lambda_1x}+C_{2}e^{\lambda_2x} y(x)=C1eλ1x+C2eλ2x

    • 非齐次特解的求法

    由于 λ 1 ≠ 0 , λ 2 ≠ 0 \lambda_1\ne0,\lambda_2\ne0 λ1=0,λ2=0. 所以非齐次特解形式为
    y ∗ = a x + b y^{*}=ax+b y=ax+b
    将上式代入控制方程有
    2 a − 3 a x − 3 b = 3 x + 1 2a-3ax-3b=3x+1 2a3ax3b=3x+1
    求解得: a = b = − 1 a=b=-1 a=b=1, 即非齐次特解为 y ∗ = − x − 1 y^{*}=-x-1 y=x1.

    原方程的解=齐次通解+非齐次特解

    于是,原方程的全解为
    y ( x ) = C 1 e x + C 2 e − 3 x − x − 1 y(x)=C_{1}e^{x}+C_{2}e^{-3x}-x-1 y(x)=C1ex+C2e3xx1
    因为该问题给出的是第三类边界条件,故需要求解的导函数
    y ′ ( x ) = C 1 e x − 3 C 2 e − 3 x − 1 y'(x)=C_{1}e^{x}-3C_{2}e^{-3x}-1 y(x)=C1ex3C2e3x1
    且有
    { y ( 1 ) = C 1 e + C 2 e − 3 − 2 y ′ ( 1 ) = C 1 e − 3 C 2 e − 3 − 1 y ( 2 ) = C 1 e 2 + C 2 e − 6 − 3 y ′ ( 2 ) = C 1 e 2 − 3 C 2 e − 6 − 1 \left\{ \begin{aligned} y(1)&=C_1e+C_2e^{-3}-2\\ y'(1)&=C_1e-3C_2e^{-3}-1\\ y(2)&=C_1e^2+C_2e^{-6}-3\\ y'(2)&=C_1e^2-3C_2e^{-6}-1 \end{aligned} \right. y(1)y(1)y(2)y(2)=C1e+C2e32=C1e3C2e31=C1e2+C2e63=C1e23C2e61
    将以上各式代入边界条件
    { y ′ ( 1 ) − y ( 1 ) = − 4 C 2 e − 3 + 1 = 1 y ′ ( 2 ) + y ( 2 ) = 2 C 1 e 2 − 2 C 2 e − 6 − 4 = − 4 \left\{ \begin{aligned} y'(1)-y(1)&=-4C_2e^{-3}+1=1\\ y'(2)+y(2)&=2C_1e^2-2C_2e^{-6}-4=-4 \end{aligned} \right. {y(1)y(1)y(2)+y(2)=4C2e3+1=1=2C1e22C2e64=4
    解此方程组可得: C 1 = C 2 = 0 C_1=C_2=0 C1=C2=0.

    综上所述,原两点边值问题的解为
    y = − x − 1 y=-x-1 y=x1

    常微分方程的数值解

    一般二阶线性常微分方程边值问题的差分法

    对一般的二阶微分方程边值问题
    { y ′ ′ ( x ) + p ( x ) y ′ ( x ) + q ( x ) y ( x ) = f ( x ) , a < x < b a 1 y ( a ) + a 2 y ′ ( a ) = a β 1 y ( b ) + β 2 y ′ ( b ) = β \left\{\begin{array}{l} y^{\prime \prime}(x)+p(x) y^{\prime}(x)+q(x) y(x)=f(x), \quad a<x<b \\ a_{1} y(a)+a_{2} y^{\prime}(a)=a \\ \beta_{1} y(b)+\beta_{2} y^{\prime}(b)=\beta \end{array}\right. y(x)+p(x)y(x)+q(x)y(x)=f(x),a<x<ba1y(a)+a2y(a)=aβ1y(b)+β2y(b)=β
    假定其解存在唯一,
    为求解的近似值, 类似于前面的做法,

    1. 把区间 I = [ a , b ] N I=[a, b] N I=[a,b]N 等分, 即得到区间 I = [ a , b ] I=[a, b] I=[a,b] 的一个网格剖分:
      a = x 0 < x 1 < ⋯ < x N − 1 < x N = b a=x_{0}<x_{1}<\cdots<x_{N-1}<x_{N}=b a=x0<x1<<xN1<xN=b
      其中分点 x i = a + i h ( i = 0 , 1 , ⋯   , N ) x_{i}=a+i h(i=0,1, \cdots, N) xi=a+ih(i=0,1,,N), 步长 h = b − a N h=\frac{b-a}{N} h=Nba.

    2. 对式中的二阶导数仍用数值微分公式
      y ′ ′ ( x i ) = y ( x i + 1 ) − 2 y ( x i ) + y ( x i − 1 ) h 2 − h 2 12 y ( 4 ) ( ξ i ) , x i − 1 < ξ i < x i y^{\prime \prime}\left(x_{i}\right)=\frac{y\left(x_{i+1}\right)-2 y\left(x_{i}\right)+y\left(x_{i-1}\right)}{h^{2}}-\frac{h^{2}}{12} y^{(4)}\left(\xi_{i}\right), \quad x_{i-1}<\xi_{i}<x_{i} y(xi)=h2y(xi+1)2y(xi)+y(xi1)12h2y(4)(ξi),xi1<ξi<xi
      代替,而对一阶导数,为了保证略去的逼近误差为 O ( h 2 ) O(h^2) O(h2),则用 3 点数值微分公式;另外为了保证内插,在 2 个端点所用的 3 点数值微分公式与内网格点所用的公式不同,即
      { y ′ ( x i ) = y ( x i + 1 ) − y ( x i − 1 ) 2 h − h 2 6 y ′ ′ ′ ( ξ i ) , x i − 1 < ξ i < x i , i = 1 , 2 , ⋯   , N − 1 y ′ ( x 0 ) = − 3 y ( x 0 ) + 4 y ( x 1 ) − y ( x 2 ) 2 h + h 2 3 y ′ ′ ′ ( ξ 0 ) , x 0 < ξ 0 < x 2 , y ′ ( x N ) = y ( x N − 2 ) − 4 y ( x N − 1 ) + 3 y ( x N ) 2 h + h 2 3 y ′ ′ ′ ( ξ N ) , x N − 2 < ξ N < x N \left\{\begin{array}{l} y^{\prime}\left(x_{i}\right)=\frac{y\left(x_{i+1}\right)-y\left(x_{i-1}\right)}{2 h}-\frac{h^{2}}{6} y^{\prime \prime \prime}\left(\xi_{i}\right), \quad x_{i-1}<\xi_{i}<x_{i}, \quad i=1,2, \cdots, N-1 \\ y^{\prime}\left(x_{0}\right)=\frac{-3 y\left(x_{0}\right)+4 y\left(x_{1}\right)-y\left(x_{2}\right)}{2 h}+\frac{h^{2}}{3} y^{\prime \prime \prime}\left(\xi_{0}\right), \quad x_{0}<\xi_{0}<x_{2}, \\ y^{\prime}\left(x_{N}\right)=\frac{y\left(x_{N-2}\right)-4 y\left(x_{N-1}\right)+3 y\left(x_{N}\right)}{2 h}+\frac{h^{2}}{3} y^{\prime \prime \prime}\left(\xi_{N}\right), \quad x_{N-2}<\xi_{N}<x_{N} \end{array}\right. y(xi)=2hy(xi+1)y(xi1)6h2y(ξi),xi1<ξi<xi,i=1,2,,N1y(x0)=2h3y(x0)+4y(x1)y(x2)+3h2y(ξ0),x0<ξ0<x2,y(xN)=2hy(xN2)4y(xN1)+3y(xN)+3h2y(ξN),xN2<ξN<xN
      略去误差,并用 y ( x i ) y(x_i) y(xi) 的近似值 y i y_i yi 代替 y ( x i ) y(x_i) y(xi), p i = p ( x i ) , q i = q ( x i ) , f i = f ( x i ) p_i=p(x_i),q_i=q(x_i),f_i=f(x_i) pi=p(xi),qi=q(xi),fi=f(xi) 便得到差分方程组
      { 1 h 2 ( y i − 1 − 2 y i + y i + 1 ) + p i 2 h ( y i + 1 − y i − 1 ) + q 1 y i = f i , i = 1 , 2 , ⋯   , N − 1 a 1 y 0 + a 2 2 h ( − 3 y 0 + 4 y 1 − y 2 ) = α β 1 y N + β 2 2 h ( y N − 2 − 4 y N − 1 + 3 y N ) = β \left\{\begin{array}{l} \frac{1}{h^{2}}\left(y_{i-1}-2 y_{i}+y_{i+1}\right)+\frac{p_{i}}{2 h}\left(y_{i+1}-y_{i-1}\right)+q_{1} y_{i}=f_{i}, \quad i=1,2, \cdots, N-1 \\ a_{1} y_{0}+\frac{a_{2}}{2 h}\left(-3 y_{0}+4 y_{1}-y_{2}\right)=\alpha \\ \beta_{1} y_{N}+\frac{\beta_{2}}{2 h}\left(y_{N-2}-4 y_{N-1}+3 y_{N}\right)=\beta \end{array}\right. h21(yi12yi+yi+1)+2hpi(yi+1yi1)+q1yi=fi,i=1,2,,N1a1y0+2ha2(3y0+4y1y2)=αβ1yN+2hβ2(yN24yN1+3yN)=β
      其中 q i = q ( x i ) , p i = p ( x i ) , f i = f ( x i ) , i = 1 , 2 , ⋯   , N − 1 , y i q_{i}=q\left(x_{i}\right), p_{i}=p\left(x_{i}\right), f_{i}=f\left(x_{i}\right), i=1,2, \cdots, N-1, y_{i} qi=q(xi),pi=p(xi),fi=f(xi),i=1,2,,N1,yi y ( x i ) y\left(x_{i}\right) y(xi) 的近似值. 整理得
      { ( 2 h α 1 − 3 α 2 ) y 0 + 4 α 2 y 1 − α 2 y 2 = 2 h α ( 2 − h p i ) y i − 1 − 2 ( 2 − h 2 q i ) y i + ( 2 + h p i ) y i + 1 = 2 h 2 f i , i = 1 , 2 , ⋯   , N − 1 β 2 y N − 2 − 4 β 2 y N − 1 + ( 3 β 2 + 2 h β 1 ) y N = 2 h β \left\{\begin{array}{l}\left(2 h \alpha_{1}-3 \alpha_{2}\right) y_{0}+4 \alpha_{2} y_{1}-\alpha_{2} y_{2}=2 h \alpha \\ \left(2-h p_{i}\right) y_{i-1}-2\left(2-h^{2} q_{i}\right) y_{i}+\left(2+h p_{i}\right) y_{i+1}=2 h^{2} f_{i}, \quad i=1,2, \cdots, N-1 \\ \beta_{2} y_{N-2}-4 \beta_{2} y_{N-1}+\left(3 \beta_{2}+2 h \beta_{1}\right) y_{N}=2 h \beta\end{array}\right. (2hα13α2)y0+4α2y1α2y2=2hα(2hpi)yi12(2h2qi)yi+(2+hpi)yi+1=2h2fi,i=1,2,,N1β2yN24β2yN1+(3β2+2hβ1)yN=2hβ
      特别地, 若 α 1 = 1 , α 2 = 0 , β 1 = 1 , β 2 = 0 \alpha_{1}=1, \alpha_{2}=0, \beta_{1}=1, \beta_{2}=0 α1=1,α2=0,β1=1,β2=0, 则原问题中的边界条件是第一类边值条件: y ( a ) = α , y ( b ) = β y(a)=\alpha, y(b)=\beta y(a)=α,y(b)=β; 此时方程组为
      { − 2 ( 2 − h 2 q 1 ) y 1 + ( 2 + h p 1 ) y 2 = 2 h 2 f 1 − ( 2 − h p 1 ) α , ( 2 − h p i ) y i − 1 − 2 ( 2 − h 2 q 1 ) y i + ( 2 + h p i ) y i + 1 = 2 h 2 f i , i = 2 , 3 , ⋯   , N − 2 ( 2 − h p N − 1 ) y N − 2 − 2 ( 2 − h 2 q N − 1 ) y N − 1 = 2 h 2 f N − 1 − ( 2 + h p N − 1 ) β \left\{\begin{array}{l} -2\left(2-h^{2} q_{1}\right) y_{1}+\left(2+h p_{1}\right) y_{2}=2 h^{2} f_{1}-\left(2-h p_{1}\right) \alpha, \\ \left(2-h p_{i}\right) y_{i-1}-2\left(2-h^{2} q_{1}\right) y_{i}+\left(2+h p_{i}\right) y_{i+1}=2 h^{2} f_{i}, \quad i=2,3, \cdots, N-2 \\ \left(2-h p_{N-1}\right) y_{N-2}-2\left(2-h^{2} q_{N-1}\right) y_{N-1}=2 h^{2} f_{N-1}-\left(2+h p_{N-1}\right) \beta \end{array}\right. 2(2h2q1)y1+(2+hp1)y2=2h2f1(2hp1)α,(2hpi)yi12(2h2q1)yi+(2+hpi)yi+1=2h2fi,i=2,3,,N2(2hpN1)yN22(2h2qN1)yN1=2h2fN1(2+hpN1)β
      以上方程组是三对角方程组,用解三对角方程组的追赶法求解差分方程组,便得边值问题的差分解 .

    3. 讨论差分方程组的解是否收敛到原微分方程的解,估计误差. 这里就不再详细介绍.


    数值算例

    考虑带有第三类边界条件的二阶常系数微分方程边值问题
    { y ′ ′ ( x ) + 2 y ′ ( x ) − 3 y ( x ) = 3 x + 1 , x ∈ [ 1 , 2 ] y ′ ( 1 ) − y ( 1 ) = 1 , y ′ ( 2 ) − y ( 2 ) = − 4. \left\{ \begin{aligned} y''(x)+2y'(x)-3y(x) & = 3x+1, & x\in [1,2]\\ y'(1)-y(1) & = 1,\\ y'(2)-y(2) & = -4. \end{aligned} \right. y(x)+2y(x)3y(x)y(1)y(1)y(2)y(2)=3x+1,=1,=4.x[1,2]

    1. 求出上述两点边值问题的解析解;
    2. 通过有限差分方法算出其数值解;(取 h = 1 5 h=\frac{1}{5} h=51)并计算误差、绘图、输出 1.0 , 1.2 , 1.4 , 1.6 , 1.8 , 2.0 1.0,1.2,1.4,1.6,1.8,2.0 1.0,1.2,1.4,1.6,1.8,2.0处的数值解.

    问题二:有限差分方法算出其数值解及误差
    对于原问题,取步长h=0.2,用有限差分求其近似解,并将结果与精确解y(x)=-x-1进行比较.

    解:
    因为
    N = 2 − 1 h = 5 , p ( x ) = 2 , q ( x ) = − 3 , f ( x ) = 3 x + 1 N=\frac{2-1}{h}=5,p(x)=2,q(x)=-3,f(x)=3x+1 N=h21=5,p(x)=2,q(x)=3,f(x)=3x+1
    α 1 = − 1 , α 2 = 1 , α = 1 \alpha_1=-1,\alpha_2=1,\alpha=1 α1=1,α2=1,α=1
    β 1 = 1 , β 2 = 1 , β = − 4 \beta_1=1,\beta_2=1,\beta=-4 β1=1,β2=1,β=4
    代入上述差分方程组公式得到差分格式
    { ( − 2 h − 3 ) y 0 + 4 y 1 − y 2 = 2 h ( 2 − 2 h ) y i − 1 − 2 ( 2 + 3 h 2 ) y i + ( 2 + 2 h ) y i + 1 = 2 h 2 f i , i = 1 , 2 , ⋯   , N − 1 y N − 2 − 4 y N − 1 + ( 3 + 2 h ) y N = − 8 h \left\{\begin{array}{l} \left(-2h-3\right) y_{0}+4 y_{1}- y_{2}=2h \\ \left(2-2h\right) y_{i-1}-2\left(2+3h^{2} \right) y_{i}+\left(2+2h\right) y_{i+1}=2h^2f_i, \quad i=1,2, \cdots, N-1 \\ y_{N-2}-4 y_{N-1}+\left(3 + 2h\right) y_{N}=-8h\end{array}\right. (2h3)y0+4y1y2=2h(22h)yi12(2+3h2)yi+(2+2h)yi+1=2h2fi,i=1,2,,N1yN24yN1+(3+2h)yN=8h
    化简得
    { ( − 2 h − 3 ) y 0 + 4 y 1 + ( − 1 ) y 2 = 2 h ( 2 − 2 h ) y i − 1 + ( − 4 − 6 h 2 ) y i + ( 2 + 2 h ) y i + 1 = 2 h 2 f i , i = 1 , 2 , ⋯   , N − 1 y N − 2 + ( − 4 ) y N − 1 + ( 3 + 2 h ) y N = − 8 h \left\{\begin{array}{l} \left(-2h-3\right) y_{0}+4 y_{1}+(-1) y_{2}=2h \\ \left(2-2h\right) y_{i-1}+\left(-4-6h^{2} \right) y_{i}+\left(2+2h\right) y_{i+1}=2h^2f_i, \quad i=1,2, \cdots, N-1 \\ y_{N-2}+(-4) y_{N-1}+\left(3 + 2h\right) y_{N}=-8h\end{array}\right. (2h3)y0+4y1+(1)y2=2h(22h)yi1+(46h2)yi+(2+2h)yi+1=2h2fi,i=1,2,,N1yN2+(4)yN1+(3+2h)yN=8h
    写成矩阵形式
    [ − 2 h − 3 4 − 1 2 − 2 h − 4 − 6 h 2 2 + 2 h 2 − 2 h − 4 − 6 h 2 2 + 2 h ⋱ ⋱ ⋱ 2 − 2 h − 4 − 6 h 2 2 + 2 h 2 − 2 h − 4 − 6 h 2 2 + 2 h 1 − 4 3 + 2 h ] [ y 0 y 1 y 2 ⋮ y N − 2 y N − 1 y N ] = [ 2 h 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f N − 2 2 h 2 f N − 1 − 8 h ] \left[ \begin{matrix} -2h-3 & 4 & -1 & & & & \\ 2-2h & -4-6h^2 & 2+2h & & & & \\ & 2-2h & -4-6h^2 & 2+2h & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & 2-2h & -4-6h^2 & 2+2h \\ & & & & 2-2h & -4-6h^2 & 2+2h \\ & & & & 1 & -4 & 3+2h \end{matrix} \right] \left[ \begin{matrix} y_0\\ y_1 \\ y_2 \\ \vdots \\ y_{N-2} \\ y_{N-1} \\ y_{N} \end{matrix} \right]=\left[ \begin{matrix} 2h \\ 2h^2f_1 \\ 2h^2f_2 \\ \vdots \\ 2h^2f_{N-2} \\ 2h^2f_{N-1} \\ -8h \end{matrix} \right] 2h322h446h222h12+2h46h22+2h22h46h222h12+2h46h242+2h3+2hy0y1y2yN2yN1yN=2h2h2f12h2f22h2fN22h2fN18h

    A = [ − 2 h − 3 4 − 1 2 − 2 h − 4 − 6 h 2 2 + 2 h 2 − 2 h − 4 − 6 h 2 2 + 2 h ⋱ ⋱ ⋱ 2 − 2 h − 4 − 6 h 2 2 + 2 h 2 − 2 h − 4 − 6 h 2 2 + 2 h 1 − 4 3 + 2 h ] , Y = [ y 0 y 1 y 2 ⋮ y N − 2 y N − 1 y N ] , b = [ 2 h 2 h 2 f 1 2 h 2 f 2 ⋮ 2 h 2 f N − 2 2 h 2 f N − 1 − 8 h ] A=\left[ \begin{matrix} -2h-3 & 4 & -1 & & & & \\ 2-2h & -4-6h^2 & 2+2h & & & & \\ & 2-2h & -4-6h^2 & 2+2h & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & 2-2h & -4-6h^2 & 2+2h \\ & & & & 2-2h & -4-6h^2 & 2+2h \\ & & & & 1 & -4 & 3+2h \end{matrix} \right] , Y=\left[ \begin{matrix} y_0\\ y_1 \\ y_2 \\ \vdots \\ y_{N-2} \\ y_{N-1} \\ y_{N} \end{matrix}\right] , b=\left[ \begin{matrix} 2h \\ 2h^2f_1 \\ 2h^2f_2 \\ \vdots \\ 2h^2f_{N-2} \\ 2h^2f_{N-1} \\ -8h \end{matrix} \right] A=2h322h446h222h12+2h46h22+2h22h46h222h12+2h46h242+2h3+2h,Y=y0y1y2yN2yN1yN,b=2h2h2f12h2f22h2fN22h2fN18h
    得到代数方程
    A Y = b AY=b AY=b
    使用解三对角方程组的追赶法求解此差分方程组,得到差分解 Y Y Y.


    二阶线性常系数微分方程边值问题的差分法Python代码

    先以将区间划分为5份( h = 0.2 h=0.2 h=0.2)为例,求出数值解

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # 准备工作
    def initial(L, R, NS):
        x = np.linspace(L, R, NS + 1)
        h = (R - L) / NS
        return x, h
    
    
    # 右端函数f
    def f(x):
        return 3 * x + 1
    
    
    # 解方程
    def solve(NS):
        # 矩阵A
        A1 = np.array([-2 * h - 3] + [b] * (NS - 1) + [3 + 2 * h])
        # print("A1",A1)
        A2 = np.array([a] * (NS - 1) + [-4])
        # print("A2", A2)
        A3 = np.array([4] + [c] * (NS - 1))
        # print("A3", A3)
        A4 = np.array([-1] + [0] * (NS - 2))
        # print("A4", A4)
        A5 = np.array([0] * (NS - 2) + [1])
        # print("A5", A5)
        A = np.diag(A1) + np.diag(A2, -1) + np.diag(A3, 1) + np.diag(A4, 2) + np.diag(A5, -2)
        # print("A", A)
        # 矩阵b
        br = 2 * h ** 2 * f(x) + np.array(
            [2 * h - 2 * h ** 2 * f(x[0])] + [0] * (NS - 1) + [-8 * h + 2 * h ** 2 * f(x[NS])])
        uh = np.linalg.solve(A, br)
        return uh
    
    
    L = 1.0
    R = 2.0
    NS = 5
    
    x, h = initial(L, R, NS)
    a = 2 - 2 * h
    b = -4 - 6 * h ** 2
    c = 2 + 2 * h
    uh = solve(NS)
    print("h=%f时数值解\n" % h, uh)
    

    结果:

    h=0.200000时数值解
     [-1.48151709 -1.56543883 -1.6245972  -1.6531625  -1.64418896 -1.58929215]
    

    是不是解出数值解就完事了呢?当然不是。我们可以将问题的差分格式解与问题的真解进行比较,以得到解的可靠性。通过数学计算我们得到问题的真解为 u ( x ) = − x − 1 u ( x ) = -x-1 u(x)=x1,现用范数来衡量误差的大小:

    # 真解函数
    def ture_u(x):
        ture_u = -x - 1
        return ture_u
    
    
    t_u = ture_u(x)
    print("h=%f时真解\n" % h, 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('L_∞(最大模)范数下的误差', ee)
    print('L_2(平方和)范数下的误差', e0)
    

    结果:

    h=0.200000时真解
     [-2.  -2.2 -2.4 -2.6 -2.8 -3. ]
    L_∞(最大模)范数下的误差 1.4107078471946164
    L_2(平方和)范数下的误差 1.0483548020308784
    

    接下来绘图比较 h = 0.2 h=0.2 h=0.2 时数值解与真解的差距:

    # 绘图比较
    plt.figure()
    plt.plot(x, uh, label='Numerical solution')
    plt.plot(x, t_u, label='Exact solution')
    plt.title("solution")
    plt.legend()
    plt.show()
    

    结果:
    Figure_1
    哎呀呀! 根据输出显示的误差,发现此时数值解的求解效果令人难以接受, L ∞ L_∞ L(最大模)范数下的误差高达1.41,从图像也能看出数值解与解析解不仅相差甚远,甚至连曲线走势都不太一致.(数值解为一条曲线,解析解为直线)

    此处首先认为解析解或者查分格式计算错了,休息了一晚上起来重新推导了一遍后并未发现明显错误. 后来在玩GTA的时候忽然想起导师之前提到过步长会影响数值解稳定性···,于是重新编写程序,修改步长后发现确实如此.

    将区间划分为 N = 1280 N=1280 N=1280 份, 即 h = 0.000781 h=0.000781 h=0.000781 时.

    结果:

    h=0.000781时数值解
     [-1.99798816 -1.99876784 -1.99954751 ... -2.99297729 -2.99375427
     -2.99453125]
    h=0.000781时真解
     [-2.         -2.00078125 -2.0015625  ... -2.9984375  -2.99921875
     -3.        ]
    L_∞(最大模)范数下的误差 0.005468750663166322
    L_2(平方和)范数下的误差 0.0035976563635910903
    

    绘图比较 h = 0.000781 h=0.000781 h=0.000781 时数值解与真解的差距:
    Figure_1
    可以看到此时已经具有较高精度, 若还未达到需求精度, 可通过缩短步长 h h h 继续提高精度.

    最后,我们还可以从数学的角度分析所采用的差分格式的一些性质。因为差分格式的误差为 O ( h 2 ) O(h^2) O(h2), 所以理论上来说网格每加密一倍,与真解的误差大致会缩小到原来的 1 4 \frac{1}{4} 41. 下讨论网格加密时的变化:

    # 误差与网格关系讨论
    N = [5, 10, 20, 40, 80, 160, 320, 640, 1280, 2560]
    print("网格密度加倍时误差变化情况")
    for i in range(len(N)):
        NS = N[i]
        x, h = initial(L, R, NS)
        a = 2 - 2 * h
        b = -4 - 6 * h ** 2
        c = 2 + 2 * h
        uh = solve(NS)
        t_u = ture_u(x)
        ee, e0 = err(t_u, uh)
        print('步长h=%f' % h, end='\t')
        print('最大模误差=%f' % ee)
    

    结果:

    网格密度加倍时误差变化情况
    步长h=0.200000	最大模误差=1.410708
    步长h=0.100000	最大模误差=0.701417
    步长h=0.050000	最大模误差=0.350182
    步长h=0.025000	最大模误差=0.175023
    步长h=0.012500	最大模误差=0.087503
    步长h=0.006250	最大模误差=0.043750
    步长h=0.003125	最大模误差=0.021875
    步长h=0.001563	最大模误差=0.010938
    步长h=0.000781	最大模误差=0.005469
    步长h=0.000391	最大模误差=0.002734
    

    完整代码

    # 开发者:    Leo 刘
    # 开发环境: macOs Big Sur
    # 开发时间: 2021/10/5 6:51 下午
    # 邮箱  : 517093978@qq.com
    # @Software: PyCharm
    # ----------------------------------------------------------------------------------------------------------
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # 准备工作
    def initial(L, R, NS):
        x = np.linspace(L, R, NS + 1)
        h = (R - L) / NS
        return x, h
    
    
    # 右端函数f
    def f(x):
        return 3 * x + 1
    
    
    # 解方程
    def solve(NS):
        # 矩阵A
        A1 = np.array([-2 * h - 3] + [b] * (NS - 1) + [3 + 2 * h])
        # print("A1",A1)
        A2 = np.array([a] * (NS - 1) + [-4])
        # print("A2", A2)
        A3 = np.array([4] + [c] * (NS - 1))
        # print("A3", A3)
        A4 = np.array([-1] + [0] * (NS - 2))
        # print("A4", A4)
        A5 = np.array([0] * (NS - 2) + [1])
        # print("A5", A5)
        A = np.diag(A1) + np.diag(A2, -1) + np.diag(A3, 1) + np.diag(A4, 2) + np.diag(A5, -2)
        # print("A", A)
        # 矩阵b
        br = 2 * h ** 2 * f(x) + np.array(
            [2 * h - 2 * h ** 2 * f(x[0])] + [0] * (NS - 1) + [-8 * h + 2 * h ** 2 * f(x[NS])])
        uh = np.linalg.solve(A, br)
        return uh
    
    
    L = 1.0
    R = 2.0
    NS = 1280
    
    x, h = initial(L, R, NS)
    a = 2 - 2 * h
    b = -4 - 6 * h ** 2
    c = 2 + 2 * h
    uh = solve(NS)
    print("h=%f时数值解\n" % h, uh)
    
    
    # 真解函数
    def ture_u(x):
        ture_u = -x - 1
        return ture_u
    
    
    t_u = ture_u(x)
    print("h=%f时真解\n" % h, 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('L_∞(最大模)范数下的误差', ee)
    print('L_2(平方和)范数下的误差', e0)
    
    # 绘图比较
    plt.figure()
    plt.plot(x, uh, label='Numerical solution')
    plt.plot(x, t_u, label='Exact solution')
    plt.title("solution")
    plt.legend()
    plt.show()
    
    # 误差与网格关系讨论
    N = [5, 10, 20, 40, 80, 160, 320, 640, 1280, 2560]
    print("网格密度加倍时误差变化情况")
    for i in range(len(N)):
        NS = N[i]
        x, h = initial(L, R, NS)
        a = 2 - 2 * h
        b = -4 - 6 * h ** 2
        c = 2 + 2 * h
        uh = solve(NS)
        t_u = ture_u(x)
        ee, e0 = err(t_u, uh)
        print('步长h=%f' % h, end='\t')
        print('最大模误差=%f' % ee)
        
    

    数值算例来源: 《微分方程数值解》-M.Ran

    展开全文
  • 微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。一.有限差分方法有限差分方法(Finite Difference Methods)是数值模拟...
    8e8cc43d6ee27d48ae573d731b678e3c.png

    偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。

    一.有限差分方法

    有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区域剖分和差商代替导数两个过程。

    具体地,首先将求解区域划分为差分网格,用有限个网格节点代替连续的求解区域。其次,利用Taylor级数展开等方法将偏微分方程中的导数项在网格节点上用函数值的差商代替来进行离散,从而建立以网格节点上的值为未知量的代数方程组。

    该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念直观,表达简单,是发展较早且比较成熟的数值方法。差商代替导数后的格式称为有限差分格式,从格式的精度来考虑,有一阶格式、二阶格式和高阶格式。从差分的空间离散形式来考虑,有中心格式和迎风格式。对于瞬态方程,考虑时间方向的离散,有显格式、隐格式、交替显隐格式等。

    目前常见的差分格式,主要是以上几种格式的组合,不同的组合构成不同的差分格式。差分方法主要适用于结构网格,网格的步长一般根据问题模型和Courant稳定条件来决定。

    二.有限元方法

    有限元方法(Finite Element Methods)的基础是变分原理和分片多项式插值。该方法的构造过程包括以下三个步骤。

    首先,利用变分原理得到偏微分方程的弱形式(利用泛函分析的知识将求解空间扩大)。其次,将计算区域划分为有限个互不重叠的单元(三角形、四边形、四面体、六面体等)。再次,在每个单元内选择合适的节点作为求解函数的插值点,将偏微分方程中的变量改写成由各变量或其导数的节点值与所选用的分片插值基函数组成的线性表达式,得到微分方程的离散形式。利用插值函数的局部支集性质及数值积分可以得到未知量的代数方程组。

    有限元方法有较完善的理论基础,具有求解区域灵活(复杂区域)、单元类型灵活(适于结构网格和非结构网格)、程序代码通用(数值模拟软件多数基于有限元方法)等特点。有限元方法最早应用于结构力学,随着计算机的发展已经渗透到计算物理、流体力学等各个数值模拟领域的广泛应用中。

    根据所采用的检验函数(虚位移函数)和插值函数的不同,有限元方法也分为多种计算格式。从检验函数的选择来说,有配置法、最小二乘法和伽辽金法,从计算单元网格的形状来划分,有三角形网格、四边形网格和多边形网格,从插值函数的精度来划分,又分为线性插值函数和高次插值函数等。不同的组合同样构成不同的有限元计算格式。对于有限元方法,其基本思路和解题步骤可归纳为

    • 建立积分方程,根据变分原理或方程余量与检验函数正交化原理,建立与微分方程初边值问题等价的积分表达式,这是有限元法的出发点。
    • 区域单元剖分,根据求解区域的形状及实际问题的物理特点,将区域剖分为若干相互连接、不重叠的单元。区域单元划分是采用有限元方法的前处理过程,要给出计算单元和节点进行编号相互之间的关系、节点的位置坐标,同时还需要列出问题的自然边界和本质边界的节点序号和相应的边界值。
    • 确定单元基函数,根据单元中节点数目及对近似解精度的要求,选择满足一定插值条件的插值函数作为单元基函数。有限元方法中的基函数是在单元中选取的,由于各单元具有规则的几何形状,在选取基函数时可遵循一定的法则。
    • 单元分析:将各个单元中的求解函数用单元基函数的线性组合表达式进行逼近;再将近似函数代入积分方程,并对单元区域进行积分,可获得含有待定系数(即单元中各节点的函数值)的代数方程组,称为单元有限元方程。
    • 总体合成:在得出单元有限元方程之后,将区域中所有单元有限元方程按一定法则进行累加,形成总体有限元方程。
    • 边界条件的处理:一般边界条件有三种形式,分为本质边界条件(Dirichlet边界条件)、自然边界条件(Neumann边界条件)、混合边界条件(Cauchy边界条件)。对于自然边界条件,一般在积分表达式中可自动得到满足。对于本质边界条件和混合边界条件,需按一定法则对总体有限元方程进行修正满足。
    • 解有限元方程:根据边界条件修正的总体有限元方程组,采用适当的代数方程组求解器,可求得各节点的函数值。

    三.有限体积法

    有限体积法(Finite Volume Methods)又称为控制体积法。其基本思路是:将计算区域划分为一系列互不重叠的控制体,并使每个网格点周围有一个控制体;将待求解的微分方程对每一个控制体积积分,便得出一组离散方程。

    该方法的未知量为网格点上的函数值。为了求出控制体积的积分,须假定函数值在网格点控制体边界上的变化规律。从积分区域的选取方法看来,有限体积法属于有限元方法中检验函数取分片常数插值的子区域法;从未知量的近似方法看来,有限体积法属于采用局部近似的离散方法。

    有限体积法的基本思路易于理解,能够保持物理量在控制体上的守恒性质,也即离散方程保持了微分方程物理量在控制体满足某种守恒原理的物理意义。这是有限体积法吸引人的优点。此外,在有限体积法中,插值函数只用于计算控制体积的积分,因此可以对微分方程中不同的项采取不同的插值函数。

    三者各有所长

    有限差分方法直观,理论成熟,精度可选。但是不规则区域处理繁琐,虽然网格生成可以使FDM应用于不规则区域,但是对区域的连续性和解的光滑性等要求较高。使用FDM的好处在于易于编程。

    有限元方法适合处理复杂区域,精度可选,程序代码具有较强的通用性,适于大规模编程开发和计算。有限体积法适于流体计算,可以应用于非结构网格,适于并行。但是精度最高达到二阶。FVM的优势正逐渐显现出来,FVM在应力应变、高频电磁场方面的特殊的优点正在被人重视。

    三者间的区别

    FVM和FDM在精度和守恒性方面的差别

    FVM由积分方程离散,而FDM方法由微分方程直接离散,前者的精度不但取决于积分时的精度,还取决于对导数处理时的精度,一般总体最高具有二阶精度;后者的精度不涉及积分,而是借助Taylor展开利用差商代替导数,可以具有较高阶的精度。前者对于守恒型方程保持守恒性质,而后者不一定具有守恒性。

    FVM和FEM的区别

    有限元在复杂区域的适应性对有限体积是相同的,而有限容积的守恒性,物理概念明显的这些特点,有限元是没有的。但是有限体积方法在精度方面与有限元方法还有些差距。

    FEM和FDM的区别

    有限元方法在适应复杂求解区域和对解的光滑性要求上要优于有限差分法,但是在编程和实现上,有限差分方法在效率上占有一定的优势。

    展开全文
  • MATLAB 求解微分方程x=dsolve('Dx=r*(1-x/xm)*x','x(0)=x0','t')x=xm/(1+exp(-r*t)*(xm-x0)/x0)用matlab求解这个微分方程:dx/dt=36.86+xx=dsolve('Dx=36.86+x')x=-1843/50+exp(t)*C1单摆微分方程求解:x''+(g/l)sin...

    MATLAB 求解微分方程

    x=dsolve('Dx=r*(1-x/xm)*x','x(0)=x0','t')x=xm/(1+exp(-r*t)*(xm-x0)/x0)

    用matlab求解这个微分方程:dx/dt=36.86+x

    x=dsolve('Dx=36.86+x')x=-1843/50+exp(t)*C1

    单摆微分方程求解:x''+(g/l)sin(x)=0,用Matlab求解,

    1.这段程序基本没有什么错误,只是在最后调用ode45求解时候,格式有点错误,修改一下就能运行了:[t,x]=ode45(@Pendel_DGL,[0,4],[pi/2,0])2. 在编程时

    MATLAB 求解微分方程数值解

    结果:代码:clearallclcf=@(x,y)([y(2);   0.357*y(1)-0.1905*y(1)*y(2)]);[x,Y]=ode45(f,[0100]

    求解二阶微分方程

    ∵齐次方程y''-6y'+9y=0的特征方程是r²-6r+9=0,则r=3(二重根)∴此齐次方程的通解是y=(C1x+C2)e^(3x)(C1,C2是积分常数)∵设原方程的解为y=(Ax

    用Matlab编程求解 二阶微分方程:4*d^2y(t)/dt^2+y(t)=dx(t)/d(t)-0.5x(t)

    MATLAB提供了dsolve命令可以用于对符号常微分方程进行求解.语法:dsolve(‘eq’,’con’,’v’)%求解微分方程dsolve(‘eq1,eq2…’,’con1,con2…’,’v1

    利用MATLAB求解微分方程初值问题

    朋友,要根据初值积分对dM/dt积分求得M,才能求解M(t)=0或t(M)=0.solver(积分函数,积分时间,初值,设置)也是这样的数学方法.[时间,解]=solver(积分函数,积分时间,初值)

    matlab求解微分方程并画图

    symstv=dsolve('Dv=(190.708-90.64*v^2)/47.27','v(0)=0','t');t=0:0.00001:0.002;v=eval(v);plot(t,v)使用这样

    MATLAB 求解微分方程的错误

    看了看,运行了一下确实出问题 原因是在用ode数值求解时,x并不是1:0.01:3均匀分散的 解决方法:1.在画解析解和欧拉解时横轴用x的转置;在画数值解时横轴用x,已运行成功2.

    matlab求解微分方程的问题

    我运行的>>symsaknNzz1>>z=dsolve('Dx=a*x*(N-x)','t')z1=dsolve('Dx=a*x*(n-x)','t')结果:z=N0N/(exp(-N*(C3+a*t

    matlab ode45 求解二阶常微分方程

    functiontest()[t,y]=ode45(@func1,[0,1],[0;0;1;2;2;2]);figure(1);clf;plot(t,y);legend('x','y','z','dx

    matlab里的ode45求解二阶微分方程问题!

    新的matlab版本好像不鼓励采用global了.你的全局变量有点多了,哈哈.简单例子:m=2;[t,y]=ode45(@(t,x)f1(t,x,m),[0,10],[2])functiondy=f1

    matlab怎么求解偏微分方程

    Matlab偏微分方程工具箱应用简介1.概述本文只给出该工具箱的函数列表,读者应先具备偏微分方程的基本知识,然后根据本文列出的函数查阅Matlab的帮助,便可掌握该工具箱的使用.2.偏微分方程算法函数

    matlab 求解一阶偏微分方程

    i是虚数单位?那个1/3γ(u*v)中*是什么符号

    用matlab求解二阶微分方程数值解,程序出现错误,求大神指点

    1、把G=1/3*((5*Pp-2*P1)/(P1-2*Pp)-P1*c1^2/Pp*cp^2);改成G=1/3*((5*Pp-2*P1)/(P1+2*Pp)-P1*c1^2/(Pp*cp^2));表

    matlab 矩阵微分方程求解

    最常用的就是广义特征向量基础矩阵解方法.你要一个思路,我给一个2维情况的例子,其中特解x(t0)=x0的理解和如何使用都有,你看看是否够用.. Matlab下二维的例子:再问:嗯,这个不错,

    用MATLAB求解9阶微分方程用什么函数可以

    不管多少阶都可以用ode45,注意把高阶化成一阶即可,比如一个9阶微分方程可化为9个一阶方程,具体方法可网上找,很简单的

    matlab数值解法求解二阶微分方程 ODE45函数

    因为你x=0时2/x是无穷大呀,然后y'又是0,然后(2/x)y'就是nan了,所以后面算的全是nan了.

    用matlab方程求解微分方程

    y=dsolve('2000*Dy-(0.08-y*0.08)','y(0)=0','t')y=1-exp(-1/25000*t)即:C(t)=1-exp(-1/25000*t)

    展开全文
  • 【Mark下】三个微分公式三元函数,二阶或者更高阶的微分非线性方程利用Finite Difference Method展开,在利用牛顿迭代的方法,解方程,其下是考虑到电脑无法存储大量举阵情况下的分布解法。如果是N mesh grids,可以...
  • 数值分析复习,包含抛物型方程的差分方法、差分格式的稳定性和收敛性、双曲型方程的差分方法、椭圆型方程的差分方法
  • 微分方程数值解法 --------本章节总体逻辑: --------以下为各部分具体知识点: 一、引言 1.1 背景 1、原因 2、常见方法 3、相关概念 1.2 基本思想 二、改进的 EulerEulerEuler 方法和 TaylorTaylorTaylor 展开...
  • 二阶常系数线性微分方程其一般形式, y'' +p y' + qy = f(x) ① 可以写成 => (y' + λ1 * y)' + λ2(y' + λ1 * y) = f(x) (λ1 + λ2 = p , λ1 * λ2 = q) 令 u = (y' + λ1 ...
  • 引入首先用高数知识求解非齐次常系数微分方程image.png再利用信号与系统中冲激响应求解验证image.png利用MATLAB求解验证y=dsolve('D2y+3*Dy+2*y=exp(-t)','y(0)=1','Dy(0)=2','t')得出结果:y =(t - 2 exp(-t) + 3) ...
  • 掌握求解常微分方程的欧拉法,Runge-Kutta方法(二阶的预估校正法,经典的四阶R-K法) 3实验原理 4实验内容 1)实验方案 方案一:用欧拉法,预估校正法,经典的四阶龙格库塔方法求解下列ODE问题:...
  •  11.4 微分方程组的数值解 397  11.4.1 Euler方法 397  11.4.2 经典四阶Runge-Kutta方法 398  11.4.3 高阶方程组的求解 399  11.5 刚性方程组的数值解 401  11.5.1 梯形公式 401  11.5.2 隐式Runge-Kutta方法...
  • 微分方程数值解法 图1 图2 图3 图4 微分方程计算的相平面图 求解的时域图 在求解上面的微分方程的时候,使用的方法是 公式 。具体求解过程可以参考MATLAB的帮助文档和参考书 [4]。 带阻尼的单摆 下面来看看带阻尼的...
  • 基于Matlab的偏微分方程数值计算.pdf
  • 博主在这段时间将不断更新有限差分法在偏微分方程中的应用,并以python为工具讲解三类偏微分方程的有限差分法实现。 直通链接: ...将一个问题转化为微分方程后,如何得到尽可能逼近真解的数值解,是我们...
  • 微分方程数值解法的matlab程序

    千次阅读 2020-09-24 16:11:45
    微分方程数值解法的matlab程序 欧拉法 clear clc syms x y f=2*x; a=0; b=10; y0=0; h=0.1; n=(b-a)/h+1; xx=zeros(n,1); yy=zeros(n,1); for i=1:n xx(i)=a+h*(i-1); end yy=zeros(n,1); yy(1)=y0; for i=2:n yy...
  • 1 二阶线性微分方程边值问题的 MATLAB 求解* 云 文 在 ( 包头师范学院 数学科学学院,内蒙古 包头 014030) 摘 要: 本文给出二阶线性微分方程边值问题数值算法的 MATLAB 实现,并举例进行了求解仿真及与解 析解的...
  • 第三部分内容主要是非线性的各种玩意儿,比如一个非线性的方程怎么解、一个非线性的函数曲线怎么拟合、一个积分怎么算、一个微分方程怎么求数值解:非线性方程怎么解:简单迭代法、Newton迭代法、多根区间上的单根/...
  • w摘 要本文主要研究二阶微分方程边值问题的数值解法。对线性边值问题,我们总结了两类常用的数值方法,即打靶法和有限差分方法,对每种方法都列出了详细的计算步骤和Matlab程序代码,通过具体的算例对这两类方法的...
  • 机器之心原创作者:蒋思源微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的...
  • Python小白的数学建模课-11.偏微分方程数值解法

    千次阅读 多人点赞 2021-08-17 14:10:06
    本文采用有限差分法求解偏微分方程,通过案例讲解一维平流方程、一维热传导方程、二维双曲方程、二维抛物方程和二维椭圆方程等常见类型的偏微分方程数值解法,给出了全部例程和运行结果。。 欢迎关注『Python小白...
  • 本科数学二维椭圆方程的MATLAB解法开题报告范文 题目名称 二维椭圆方程的MATLAB解法 一选题的目的 偏微分方程有着广泛的实际背景是很多重要的物理力学等学 科中的基本方程对于广大应用工作者来说使用MATLAB工具箱 ...
  • 二阶椭圆偏微分方程实例求解(附matlab代码).docx 《微分方程数值解法》期中作业实验报告二阶椭圆偏微分方程第一边值问题姓名:学号:班级:2013年11月19日1二阶椭圆偏微分方程第一边值问题摘要对于解二阶椭圆偏微分...
  • 【数学】二阶非齐次微分方程解法

    万次阅读 多人点赞 2018-05-18 14:58:48
    不要嘲笑我,我百度经验搬过来的二阶常系数线性非齐次方程的形式如下2基本求解思路如下,我们先要有一个总的思路用于解题3难点:对于特解的求法END一.特解求法一:待定系数法1优点:简单易懂,不易错缺点:计算量...
  • 接到一个任务,要用四阶龙格库塔求解一个微分方程。虽然是计算机人,面对数学系的内容不能怕,果断下了个挑战书。
  • 二阶常系数微分方程求解步骤

    千次阅读 2021-09-19 14:11:00
    数学基本知识:二阶常系数线性微分方程求解方法。 全解=通解+特解; y′′+p(x)y′+q(x)y=f(x)y^{''}+p(x)y^{'}+q(x)y=f(x)y′′+p(x)y′+q(x)y=f(x) 通解的形式 构造函数的解 C1e1λx+C2e2λxC_1e^{\lambda...
  • 2阶偏微分方程的3种基本类型 2阶偏微分方程的3中基本类型有:椭圆型,双曲线型,抛物线型。 首先,关于的2阶偏微分方程的一般形式为, 这里的是与相关的函数。 根据与2阶偏微分项相关的系数,通过使用判...
  • 边值问题Matlab可用BVP4C命令,但感觉比较麻烦,下面用1stOpt求解,很简单快捷:CODE:Constant Pey=9.73, Nox=8.05, uxuy=3, bd=1, cx1e=2.3,b1=309.7,b2=2832.5, a1=27.8,a2=2.15,a3=-0.84,a4=0.935;...
  • 包含椭圆,抛物线,双曲线偏微分方程数值解法,隐式格式,显示格式等,应用于大学偏微分方程数值解报告的撰写
  • 微分方程数值解法主要包括两大类:有限差分法和有限单元法。这里主要介绍有限单元法。 However,对于一个只学过微积分和矩阵论的工科生来说,要了解有限元法的数学原理还是有些困难,所以这里重点是介绍有限元法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 977
精华内容 390
热门标签
关键字:

二阶微分方程数值解法