精华内容
下载资源
问答
  • 常微分方程数值解法的应用
    2021-04-18 03:00:10

    matlab 常微分方程数值解法 源程序代码

    所属分类:其他

    开发工具:matlab

    文件大小:16KB

    下载次数:41

    上传日期:2019-02-13 11:03:29

    上 传 者:XWLYF

    说明:  11.1 Euler方法 380

    11.1.1 Euler公式的推导 380

    11.1.2 Euler方法的改进 383

    11.2 Runge-Kutta方法 385

    11.2.1 二阶Runge-Kutta方法 385

    11.2.2 三阶Runge-Kutta方法 388

    11.2.3 四阶Runge-Kutta方法 390

    11.2.4 隐式Runge-Kutta方法 391

    11.3 线性多步法 392

    11.3.1 Adams外推公式 392

    11.3.2 Adams内插公式 394

    11.3.3 Adams预测校正公式 395

    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方法 402

    11.5.3 Adams隐式公式 403

    11.6 边值问题的数值解 405

    11.6.1 打靶法 405

    11.6.2 差分法 409

    11.7 MATLAB自带函数应用 411

    11.7.1 ode系列函数 411

    11.7.2 bvp系列函数 414

    11.8 应用案例 416

    (numerical methods for ordinary differential equations)

    文件列表:[举报垃圾]

    CH11, 0 , 2019-02-13

    CH11\adamscoef.m, 395 , 2017-05-20

    CH11\addallnum.m, 63 , 2017-02-27

    CH11\addrownum.m, 898 , 2017-02-14

    CH11\dpendulum.m, 3386 , 2017-05-20

    CH11\euler_trape.m, 815 , 2017-05-20

    CH11\example11_9.m, 405 , 2017-05-20

    CH11\lindiff.m, 795 , 2017-05-20

    CH11\linsht.m, 604 , 2017-05-20

    CH11\nlinsht.m, 628 , 2017-05-20

    CH11\odes_AM.m, 1025 , 2017-05-20

    CH11\odes_euler.m, 512 , 2017-05-20

    CH11\odes_imrk4.m, 1037 , 2017-05-20

    CH11\odes_rk4.m, 767 , 2017-05-20

    CH11\odes_trape.m, 796 , 2017-05-20

    CH11\ode_AB.m, 888 , 2017-05-20

    CH11\ode_ABM.m, 1083 , 2017-05-20

    CH11\ode_AM.m, 1251 , 2017-05-20

    CH11\ode_euler.m, 543 , 2017-05-20

    CH11\ode_imeuler.m, 778 , 2017-05-20

    CH11\ode_imrk4.m, 1070 , 2017-05-20

    CH11\ode_rk2.m, 716 , 2017-05-20

    CH11\ode_rk3.m, 994 , 2017-05-20

    CH11\ode_rk4.m, 771 , 2017-05-20

    CH11\spendulum.m, 1666 , 2017-05-20

    近期下载者:

    相关文件:

    收藏者:

    更多相关内容
  • 7-常微分方程数值解法.ppt
  • 数值计算PPT教案
  • 但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于一般形式的微分方程,一般很难用解析方法求出精确解,只能用数值方法求解。而在具体求解微分方程中,一般来说是条件是 KaTeX parse ...

    在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程。但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于一般形式的微分方程,一般很难用解析方法求出精确解,只能用数值方法求解。该系列主要介绍一些常用的常微分方程的数值解法,主要包括:

    这个系列后面文章会用到前面文章的理论和技术,所以建议按照顺序查看。

    简介

    而在具体求解微分方程中,一般来说给定的条件是
    { x ′ ( t ) = f ( t , x ( t ) ) , a ≤ t ≤ b x ( t 0 ) = x 0 \begin{cases} \mathbf{x}^{\prime}(t)=f(t, \mathbf{x}(t)), \quad a \leq t \leq b \\ \mathbf{x}({t_0}) = x_0 \end{cases} {x(t)=f(t,x(t)),atbx(t0)=x0
    即给定微分方程以及原方程在初始点的值,求原方程在某个 t t t下的 x ( t ) x(t) x(t)原方程的值,这类问题就是(一阶)常微分方程初值求解问题。
    (这里不对常微分方程或者偏微分方程等概念,以及求解微分方程的其他条件如边界条件情况做详细介绍,需要了解的话可以自己google,不影响本系列介绍。)

    解法介绍

    一般来说,(一阶)常微分方程数值解法基本思想是:
    在区间 [ a , b ] [a, b] [a,b]中插入一系列间隔相同为 Δ t \Delta t Δt的离散点
    a ≤ t 0 < t 1 < ⋯ < t i < ⋯ < t n − 1 < t n ≤ b a \leq t_0 < t_1< \cdots < t_i < \cdots < t_{n-1} < t_n \leq b at0<t1<<ti<<tn1<tnb
    常微分方程的数值解法的目的就是在给定合适初始值前提下,建立求解 x ( t ) x(t) x(t)的近似值 x t x_t xt的递推方式,这样求得 x ( t ) x(t) x(t)在各个离散点的近似值。
    给定一个具体的时间间隔 Δ t \Delta_t Δt,可以把该方程转换成差分方程
    x ( t + Δ t ) = x ( t ) + ∫ τ ∈ [ t , t + Δ t ] f ( τ , x ( τ ) ) d τ , a ≤ t ≤ b , (1) \mathbf{x}(t+\Delta t)=\mathbf{x}(t)+\int_{\tau \in [t, t+\Delta t]} f(\tau, \mathbf{x}(\tau)) d \tau, \quad a \leq t \leq b, \tag{1} x(t+Δt)=x(t)+τ[t,t+Δt]f(τ,x(τ))dτ,atb,(1)
    这样利用之前说的离散点可以把 t t t离散化,那么 t i = a + i Δ t t_{i}=a+i \Delta t ti=a+iΔt以及 x i ≈ x ( t i ) \mathbf{x}_{i} \approx \mathbf{x}(t_{i}) xix(ti),所以上面公式 ( 2 ) (2) (2)也可以写成
    x ( t i + 1 ) ≈ x i + 1 = x i + ∫ τ ∈ [ a + i Δ t , a + ( i + 1 ) Δ t ] f ( τ , x ( τ ) ) d τ , (2) \mathbf{x}(t_{i+1}) \approx x_{i+1}=\mathbf{x}_{i}+\int_{\tau \in [a+i \Delta t, a+(i+1) \Delta t]} f(\tau, \mathbf{x}(\tau)) d \tau, \tag{2} x(ti+1)xi+1=xi+τ[a+iΔt,a+(i+1)Δt]f(τ,x(τ))dτ,(2)

    截断误差

    上节介绍常微分方程的数值解法就是利用初值和离散点获得近似值 x t x_t xt,但是和真实值 x ( t ) x(t) x(t)之前还是存在误差,即
    e i = x i − x ( t i ) , (3) \boldsymbol{e}_i = x_i - \mathbf{x}(t_i), \tag{3} ei=xix(ti),(3)
    e i \boldsymbol{e}_i ei则表示该数值解法在离散点 t i t_i ti处的局部截断误差。局部截断误差在一定程度上反应了该数值解法的精度。
    一般来说常用泰勒展开式来计算讨论局部截断误差,后面具体方法会给出具体的对应的截断误差的讨论。这里简单给出定义:
    如果数值解法的局部截断误差为 e i = O ( Δ t P + 1 ) \boldsymbol{e}_i = \boldsymbol{O}(\Delta t^{P+1}) ei=O(ΔtP+1),则称该解法具有P阶精度或P阶解法

    这里 O ( Δ t P + 1 ) \boldsymbol{O}(\Delta t^{P+1}) O(ΔtP+1)为泰勒展开式的余项

    展开全文
  • ODE&PDE数值方法答案,含很多经典例题及其详解,有需要可以下载。
  • 研究生课程《应用数值分析》结课了,使用python简单记录了下常微分方程数值解法。向前欧拉法{ y i + 1 = y i + h i f ( x i , y i ) y 0 = y ( a ) \left \{ \begin{array}{lr} y_{i+1}=y_i+h_i f(x_i,y_i) \\ y_0=y...

    研究生课程《应用数值分析》结课了,使用python简单记录了下常微分方程数值解法。

    向前欧拉法

    { y i + 1 = y i + h i f ( x i , y i ) y 0 = y ( a ) \left \{ \begin{array}{lr} y_{i+1}=y_i+h_i f(x_i,y_i) \\ y_0=y(a) \end{array} \right .{yi+1​=yi​+hi​f(xi​,yi​)y0​=y(a)​

    from pylab import *

    import warnings

    warnings.filterwarnings('ignore')

    求解初值问题

    { y ′ = x − y + 1 0 ≤ x ≤ 1 y ( 0 ) = 1 \left \{ \begin{array}{lr} y'=x-y+1 & 0\leq x \leq 1 \\ y(0)=1 \end{array} \right .{y′=x−y+1y(0)=1​0≤x≤1

    该微分方程的精确解为:y = x + e x p ( − x ) y=x+exp(-x)y=x+exp(−x)

    def f(t,y):

    '''

    求解的微分方程,

    '''

    return t-y+1

    def euler_forward(f,a=0,b=1,ya=1,h=0.1,verbose=True):

    '''向前欧拉法

    Args

    ----------

    f: callable function

    需要求解的函数

    a: float

    求解区间起始值

    b:float

    求解区间终止值

    ya:float

    起始条件,ya=y(a)

    h:float

    求解步长(区间[a,b]n等分)

    verbose:logical,default is True

    显示迭代结果

    Returns

    ----------

    res:list like

    返回向前欧拉发求解的结果

    '''

    # i = 0

    res = []

    xi = a

    yi = ya

    while xi<=b: # 在求解区间范围

    y = yi + h*f(xi,yi)

    if verbose:

    print('xi:{:.2f}, yi:{:.6f}'.format(xi,yi))

    res.append(y)

    xi, yi = xi+h, y

    return res

    res = euler_forward(f,a=0,b=1,ya=1,h=0.1,verbose=True)

    xi:0.00, yi:1.000000

    xi:0.10, yi:1.000000

    xi:0.20, yi:1.010000

    xi:0.30, yi:1.029000

    xi:0.40, yi:1.056100

    xi:0.50, yi:1.090490

    xi:0.60, yi:1.131441

    xi:0.70, yi:1.178297

    xi:0.80, yi:1.230467

    xi:0.90, yi:1.287420

    xi:1.00, yi:1.348678

    龙格库塔(Runge-Kutta methods)

    三阶龙格库塔法

    { y i + 1 = y i + 1 6 ( k 1 + 2 k 2 + k 3 ) k 1 = h f ( x i , y i ) k 2 = h f ( x i + 1 2 h , y i + 1 2 k 1 ) k 3 = h f ( x i + h , y i − k 1 + 2 k 2 ) y 0 = y ( a ) , i = 0 , 1 , ⋯ &ThinSpace; , n − 1 \left \{ \begin{array}{lr} y_{i+1}=y_i+\frac{1}{6}(k_1+2k_2+k_3) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_1) & \\ k_3 = hf(x_i+h,y_i-k_1+2k_2) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end{array} \right .⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​yi+1​=yi​+61​(k1​+2k2​+k3​)k1​=hf(xi​,yi​)k2​=hf(xi​+21​h,yi​+21​k1​)k3​=hf(xi​+h,yi​−k1​+2k2​)y0​=y(a),i=0,1,⋯,n−1​​

    四阶龙格库塔法

    { y i + 1 = y i + 1 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = h f ( x i , y i ) k 2 = h f ( x i + 1 2 h , y i + 1 2 k 1 ) k 3 = h f ( x i + 1 2 h , y i + 1 2 k 2 ) k 4 = h f ( x i + h , y i + k 3 ) y 0 = y ( a ) , i = 0 , 1 , ⋯ &ThinSpace; , n − 1 \left \{ \begin{array}{lr} y_{i+1}=y_i+\frac{1}{6}(k_1+2k_2+2k_3+k_4) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_1) & \\ k_3 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_2) & \\ k_4 = hf(x_i+h,y_i+k_3) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end{array} \right .⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​yi+1​=yi​+61​(k1​+2k2​+2k3​+k4​)k1​=hf(xi​,yi​)k2​=hf(xi​+21​h,yi​+21​k1​)k3​=hf(xi​+21​h,yi​+21​k2​)k4​=hf(xi​+h,yi​+k3​)y0​=y(a),i=0,1,⋯,n−1​​

    def runge_kutta(f,a=0,b=1,ya=1,h=0.1,verbose=True):

    '''四阶龙格库塔法

    Args

    ----------

    f: callable function

    需要求解的函数

    a: float

    求解区间起始值

    b:float

    求解区间终止值

    ya:float

    起始条件,ya=y(a)

    h:float

    求解步长(区间[a,b]n等分)

    verbose:logical,default is True

    显示迭代结果

    Returns

    ----------

    res:list like

    返回向前欧拉发求解的结果

    '''

    res = []

    xi = a

    yi = ya

    while xi <= b: # 在求解区间范围

    k1 = h * f(xi, yi)

    k2 = h * f(xi + h/2, yi + k1/2)

    k3 = h * f(xi + h/2, yi + k2/2)

    k4 = h * f(xi + h, yi + k3)

    y = yi + 1/6 * (k1 + 2*k2 + 2*k3 + k4)

    if verbose:

    print('xi:{:.2f}, yi:{:.10f}'.format(xi,yi))

    res.append(y)

    xi, yi = xi+h, y

    return res

    res = runge_kutta(f,a=0,b=1,ya=1,h=0.1,verbose=True)

    xi:0.00, yi:1.0000000000

    xi:0.10, yi:1.0048375000

    xi:0.20, yi:1.0187309014

    xi:0.30, yi:1.0408184220

    xi:0.40, yi:1.0703202889

    xi:0.50, yi:1.1065309344

    xi:0.60, yi:1.1488119344

    xi:0.70, yi:1.1965856187

    xi:0.80, yi:1.2493292897

    xi:0.90, yi:1.3065699912

    xi:1.00, yi:1.3678797744

    改进欧拉法

    { y p = y i + h f ( x i , y i ) y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i , y p ) ] i = 0 , 1 , ⋯ &ThinSpace; , n − 1 y 0 = y ( a ) \left \{ \begin{array}{lr} y_p=y_i+hf(x_i,y_i) & \\ y_{i+1} = y_i+\frac{h}{2}[f(x_i,y_i)+f(x_i,y_p)] &i=0,1,\cdots ,n-1 \\ y_0=y(a) \\ \end{array} \right .⎩⎨⎧​yp​=yi​+hf(xi​,yi​)yi+1​=yi​+2h​[f(xi​,yi​)+f(xi​,yp​)]y0​=y(a)​i=0,1,⋯,n−1​

    求解初值问题

    { y ′ = − y ( 0 ≤ x ≤ 1 ) y ( 0 ) = 1 \left \{ \begin{array}{lr} y'=-y &(0 \leq x \leq 1) \\ y(0)=1 \\ \end{array} \right .{y′=−yy(0)=1​(0≤x≤1)

    精确解为y = e x p ( − x ) y=exp(-x)y=exp(−x)

    def f(t,y):

    '''

    精确解为y=exp(-x)

    '''

    return -y

    def improved_euler(f,a=0,b=1,ya=1,h=0.1,verbose=True):

    '''改进欧拉法

    Args

    ----------

    f: callable function

    需要求解的函数

    a: float

    求解区间起始值

    b:float

    求解区间终止值

    ya:float

    起始条件,ya=y(a)

    h:float

    求解步长(区间[a,b]n等分)

    verbose:logical,default is True

    显示迭代结果

    Returns

    ----------

    res:list like

    返回向前欧拉发求解的结果

    '''

    res = []

    xi = a

    yi = ya

    while xi <= b: # 在求解区间范围

    yp = yi + h*f(xi, yi)

    y = yi + h/2 * (f(xi, yi) + f(xi, yp))

    if verbose:

    print('xi:{:.2f}, yi:{:.6f}'.format(xi,yi))

    res.append(y)

    xi, yi = xi+h, y

    return res

    res = improved_euler(f,a=0,b=1,ya=1,h=0.1,verbose=True)

    xi:0.00, yi:1.000000

    xi:0.10, yi:0.905000

    xi:0.20, yi:0.819025

    xi:0.30, yi:0.741218

    xi:0.40, yi:0.670802

    xi:0.50, yi:0.607076

    xi:0.60, yi:0.549404

    xi:0.70, yi:0.497210

    xi:0.80, yi:0.449975

    xi:0.90, yi:0.407228

    xi:1.00, yi:0.368541

    展开全文
  • 常微分方程数值解法及其应用,欧拉算法、改进欧拉算法
  •  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方法...
  • 常微分的几种解法应用 常微分方程的初值问题 欧拉方法 龙格-库塔方法
  • 2.3 常微分方程组的数值解法 知识要点 常微分方程初值问题---ode45,0de23 常微分方程边值问题---bvp4c 微分方程在化工模型中的应用 间歇反应器的计算 活塞流反应器的计算 全混流反应器的动态模拟 定态一维热传导问题...
  • 博主在这段时间将不断更新有限差分法在偏微分方程中的应用,并以python为工具讲解三类偏微分方程的有限差分法实现。 直通链接: ... 未完待续 有限差分法的引入与介绍 ========== 微分方程(model)是描述现实...

    博主在这段时间将不断更新用微分方程数值解的一些理论和算法问题,并以python为工具写一些算法实现。在理论这块课本上已经够详细与专业了,那就写的简单易懂一点吧ƪ(˘⌣˘)ʃ

    直通链接:
    常微分方程系列:
    【微分方程数值解】常微分方程(一)欧拉方法和改进欧拉方法(附python算例,封装类)
    偏微分方程系列:
    python与有限差分法(二)弦平衡问题(两点边值问题)内容梳理、算法求解与数值分析.
    未完待续…

    1.微分方程的种类

    恩格斯是这样来定义数学的:“数学是研究现实世界的量的关系与空间形式的科学 。”现实世界的东西一定程度上来说可以用数学上的方程来表示。

    但在现实世界中,类似x^2 -x +1 =0这样的方程能对应的现实问题基本没有。大多数问题的数学建模是和所研究对象的变化率有关系的,例如弹性棉坐垫的弹力涉及到对位移的变化率,热的传导涉及到对时间的变化率。这个“变化率”在数学里的定义就是导数,所以就有了一类涉及到导数来描述问题的这类方程,这就是微分方程。理论上来说只要一个物体的状态在变化,它的变化过程都是可以用微分方程描述刻画的。

    微分方程(model)是描述未知函数及其导数关系的方程。

    如果现在建立了一个方程,它本身的状态是没有任何约束和说明的。但是我们知道,大部分研究都应该要有一个初始值:400米赛跑有起跑点和赛道,不是大家从各个地方乱跑400米就完了;研究导弹轨迹有初始坐标,在地上发射和山上发射是不一样的。。。这就是对研究对象的状态做一个事先的“约束与说明”。

    又例如由弦的平衡方程导出的两点边值问题可以由下偏微分方程刻画:

    u x x = f , a < x < b u_{xx}=f ,a<x<b uxx=f,a<x<b
    u ( a ) = α , u ( b ) = β u(a)=\alpha,u(b)=\beta u(a)=α,u(b)=β

    这个方程就给出了u在a处和b处空间的约束。同理,对时间也可以进行约束和说明。

    初值问题:约束调节涉及到时间
    边值问题:约束条件涉及到边界。根据对边界的约束不同又可以细分为很多种,以后在讲到。

    再进一步,若所研究对象同时和多个自变量相关,那么这个对象的变化率自然也有多个,这时候方程涉及到“偏导数”,也就有了偏微分方程:

    常微分方程(ODE)是指微分方程的自变量只有一个的方程。
    偏微分方程(PDE)相比常微分方程其自变量存在两个或以上,也就是说方程所要求解的是一个多元函数,刻画的是未知函数及其偏导数的关系。

    偏微分方程中二阶最为典型常见,有椭圆形、抛物型、双曲型三种,下给出这三种偏微分方程最简形式:

    • 椭圆型方程
      u x x + u y y = f ( x , y ) u_{xx}+u_{yy}=f(x,y) uxx+uyy=f(x,y)
    • 抛物型方程
      u t = a u x x u_t=au_{xx} ut=auxx
    • 双曲型方程
      u t t = a 2 u x x u_{tt}=a^2u_{xx} utt=a2uxx

    注1:二阶微分方程中也存在混合问题,在不同区域为不同的方程类型,这里不做讨论
    注2:椭圆方程不含时间变量只含空间变量,而抛物和双曲既含时间变量也含空间变量

    2.用数值解的目的

    假设前面的一切工作:建模、约束都准备好了,但是对于一个给定的微分方程,只有极少数的情况能直接获得其解析解,也就是说要直接通过数学手段求解这些微分方程是很困难的,所以就有了数值方法这一求解手段,这就是计算数学专业所干的。

    我们在用数值方法求解微分方程时,由于计算机不能处理连续的数学方程,所以在用计算机处理问题时,必须先将一个无限的连续问题通过一些特殊的方法离散化,使之成有限形式的线性代数方程组,再将这个线性代数方程组交给计算机求解以达到我们的目的。

    常微分方程的数值解法

    • 欧拉法。由此思想衍生出后退欧拉法和改进欧拉法
    • 龙格库塔方法。

    偏微分方程的数值解法

    • 有限差分法(FDM,finite difference method)。偏微分方程数值解法中理论、思想都最好理解的方法,本质是用差商刻画偏导数。重点在差分格式的选择。系列会在专栏里更新
    • 有限元法(FEM,finite element method)。理论体系已经基本完善,学习需要一定的理论准备工作。此方法广泛应用在工程领域,是机械产品动、静、热特性分析的重要手段。在国内由冯康前辈开创。待更新
    • 有限体积法:和有限元法有些类似。待更新
    • 谱方法。

    3.如何衡量一种数值方法的优良?

    衡量一个数值方法得到的解好不好,一是要看它和正确解的逼近程度,差太多了自然不行,这个“差的多”在数学里有一套度量的方法;另外一个要看他的运算时间,要是有方法A能一分钟算对,方法B算一天算对,那B当然要拿出去枪毙了。

    对数值方法来说可以用【解的对】和【解的快】两个词来衡量其优劣。

    “解的对”是数值解方法的前提,如果得到的解不是收敛于真解的,那数值解得到的结果毫无意义,建立在数值解方法理论不出错的前提才能再讨论算法速度。

    • 收敛性讨论:考虑算法在数学理论上是否正确,能否收敛于真解。这种【是否收敛】以及【收敛的好与坏】一般用范数来估计。
    • 稳定性讨论:在出现一个小的“干扰”的情况下,这个小干扰带来的影响是否会扩大?讨论这个小干扰是必要的,因为类似截断、四舍五入这类方法一定会带来小干扰(也就是误差,因为丢掉了一些东西),这个小干扰本身并不大但是一定会产生,并且如果这个干扰还会扩大的话(例如运算涉及到迭代),他就会对结果产生巨大的影响。 稳定性一般在需要迭代的时候要讨论。如果不稳定,那么这个小干扰会随着迭代的过程越来越大。

    “解的快”考虑收敛的速度、算法的复杂度。两种方法的结果一样,当然是算的越快的方法越好。

    3.1 如何在程序中验证算法的“对”与“快”?主要有以下几种方法。
    • 图像:通过matplotlib绘图看看数值解是否趋于真解。算法理论得到的解是否正确和绘图对比之间是可以相互验证的。
    • 数值表:通过数值解与对应位置真解的差可以刻画收敛速度or收敛阶。同样,算法理论的收敛阶和该数值表是可以相互验证的。
    • 实际算法运行的时长比较
    3.2 如何对数值解进行优化?
    • 从数学理论的角度:一般来说提高精度的代价是提高复杂度,可以考虑如何在不损耗太多精度的情况下,降低复杂度(例如非常多次的迭代运算就是复杂度高的体现)。典型例子是后退欧拉法向改进欧拉法的过渡。
    • 从程序的角度:降低代码逻辑层面的运算量

    4.将会用到的python库

    • numpy:科学计算的基础包。提供了高效的数组(array)对象
    • SciPy:是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解等问题。
    • pandas:使python成为强大数据分析工具的重要因素之一,提供了精细的索引功能来进行选取数据子集的操作。
    • Matplotlib:最流行的绘制数据图表的python库
    • fealpy :湘潭大学魏华祎老师开发的有限元法开源库。国内的开源有限元程序做的非常少。feon有限元库为python2.7,不知道更新没有。科研且想用python,魏老师的fealpy是最好的选择,工业计算可能还是不合适。

    如果这篇文章对你有帮助,欢迎点赞关注~(///)

    展开全文
  • 有些常微分方程可用一些技巧,如分离变量法,积分因子法,常数变异法,降阶法等可化为可积分的方程而求得解析解.线性常微分方程的解满足叠加原理,从而他们的求解可归结为求一个特解和相应齐次微分方程的通解.一阶变系数...
  • matlab在常微分方程数值解中的应用.docx MATLAB在常微分方程数值解中的应用摘要】许多现实问题都可以通过微分方程的形式进行表示,传统解微分方程的方法【有近似分析解法、表解法和图解法,这些方法需对其进行大量的...
  • 常微分方程数值解法及仿真

    热门讨论 2010-01-07 23:40:30
    三、 一阶常微分方程组的数值解法 2 四、 仿真算例 4 仿真1 应用欧拉法 4 仿真2 应用二阶龙格-库塔法 5 仿真3 应用四阶龙格-库塔法 6 附录 Matlab程序 7 1. 欧拉法程序 7 2. 二阶龙格-库塔法程序 8 3. 四阶龙格-库塔...
  • 第三部分内容主要是非线性的各种玩意儿,比如一个非线性的方程怎么解、一个非线性的函数曲线怎么拟合、一个积分怎么算、一个微分方程怎么求数值解:非线性方程怎么解:简单迭代法、Newton迭代法、多根区间上的单根/...
  • 常微分方程数值求解及python实现,包括欧拉公式的理论推导以及相应的python实现代码
  • 中值法简介 在惯性导航以及VIO等实际问题中利用IMU...[常微分方程数值解法系列一] 常微分方程 [常微分方程数值解法系列二] 欧拉法 [常微分方程数值解法系列三] 中值法 [常微分方程数值解法系列四] 龙格-库塔(R
  • 常微分方程的初值问题 欧拉方法 龙格-库塔方法
  • 机器之心原创作者:蒋思源微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的...
  • manlab软件应用试验题目专业 序号 姓名 日期实验3 常微分方程数值解【实验目的】1.掌握用MATLAB求微分方程初值问题数值解的方法;2.通过实例学习微分方程模型解决简化的实际问题;3.了解欧拉方法和龙格库塔方法的...
  • Python小白的数学建模课-11.偏微分方程数值解法

    千次阅读 多人点赞 2021-08-17 14:10:06
    本文采用有限差分法求解偏微分方程,通过案例讲解一维平流方程、一维热传导方程、二维双曲方程、二维抛物方程和二维椭圆方程等常见类型的偏微分方程数值解法,给出了全部例程和运行结果。。 欢迎关注『Python小白...
  • 和Matlab应用有关的,具体介绍常微分方程的使用和解法,原理性介绍,帮助理解。
  • 含有未知数的导数(或微分)的方程成为微分方程,其又分为常微分方程和偏微分方程两类。第七章开始我们讲述了Euler方法及其改进。起初显式欧拉公式之后又冒出来一个隐式欧拉公式就令我十分头大(后者依赖于前者,且...
  • 欧拉法简介几何意义证明泰勒展开近似求导近似积分近似几种欧拉方式向前欧拉公式向后欧拉公式梯形公式改进欧拉法截断误差...该系列主要介绍一些常用的常微分方程数值解法,主要包括: [常微分方程数值解法系列一]
  • 龙格-库塔法简介 在惯性导航以及VIO等实际问题中利用IMU...[常微分方程数值解法系列一] 常微分方程 [常微分方程数值解法系列二] 欧拉法 [常微分方程数值解法系列三] 中值法 [常微分方程数值解法系列四] 龙格-库
  • 常微分方程解法求解系列博文: 常微分方程解法 (一): 常微分方程的离散化 :差商近似导数、数值积分方法、Taylor 多项式近似 常微分方程解法 (二): 欧拉(Euler)方法 常微分方程解法 (三): 龙格—库塔...
  • 所谓数值解法,就是设法将常微分方程离散化,建立差分方程,给出解在一些离散点上的近似值.问题 7.1 一阶常微分方程初值问题的一般形式{y′=f(x,y),a⩽x⩽by(a)=α\begin{equation} \left \{ \begin{aligned} & y'=f(x,...

空空如也

空空如也

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

常微分方程数值解法的应用