精华内容
下载资源
问答
  • matlab常微分方程常微分方程组的求解-matlab常微分方程常微分方程组的求解.pdf matlab常微分方程常微分方程组的求解
  • 常微分方程求解

    2014-11-05 15:22:53
    C++求解常微分方程的原始代码,使用牛顿法逼近
  • 主要内容 数值求解常微分方程组函数概述 非刚性/刚性常微分方程问题求解 隐式微分方程组求解 微分代数方程(DAE)与延迟微分方程(DDE)求解 边值问题求解 ;第一节数值求解常微分方程组函数概述;一 概述;二初值问题求解...
  • 为研究求解常微分方程的近似解问题,采用理论分析和实例分析的方法,将常微分方程的求近似解问题转化为遗传算法的函数优化问题,借助Matlab遗传算法工具箱实现对常微分方程求解,并以室内温度摆动问题进行实例分析....
  • 用于求解线性和非线性代数方程组和常微分方程组,也可以进行数据拟合
  • 在Julia中实现的各种基本的常微分方程求解器。 始终强烈欢迎请求请求来修复错误,添加求解器或其他任何方法! 项目现状 不推荐使用此项目,而推荐使用及其ODE求解器 。 该库处于“维护模式”,这意味着每个Julia...
  • 数值分析(数值计算) 数学建模 实验报告 matlab程序
  • 常微分方程解法

    2018-01-12 10:31:37
    解法
  • 关于求解常微分方程数值解的讲义,内容十分详细,含有许多实用的例子
  • matlab优化常微分方程代码关于这个仓库 这个简单的MATLAB代码是使用四阶Runge-Kutta方法对一阶常微分方程dy / dx = func(x,y)进行数值求解的方法。 由于其简单性,您可以轻松地对其进行修改或将其与其他代码组合...
  • 一阶常微分方程的五种解法,和二阶常微分方程的快速求解方法,方便快速回忆,根据山师老师的讲义,非常简单易推导的解法
  • 该书是常微分方程基础理论、基本方法和数学软件的系统应用相结合的教材。 它保持了当前通用教材中理论系统相对完整,方法与技巧多样化的特点,突出了从问题出发引导、发现解决问题的途径,进而导出重要的概念、命题...
  • 利用 MATLAB 求解常微分方程数值解 目录 1. 内容简介 把高等工程数学看了一遍增加对数学内容的了解对其中数值解法比较感兴趣 这大概是因为在其它各方面的学习和研究中经常会遇到数值解法的问题理解模型然后列出 微分...
  • 对于难解的常微分方程,使用matlab求数值解 分两个m文件,一个为调用指令,一个为原函数 可以根据自己的所求方程不同适当修改代码求解 每一步都有注释,一边看注释一边体会才是提升的最好办法
  • 采用欧拉法、改进欧拉法、龙格库塔法(经典RK法)求解常微分方程初值问题的自编MATLAB代码。所有函数均独立成文件便于移植。代码的使用结合一个具体题目说明,题目来源为浙江大学数值计算方法作业。
  • 一阶线性常微分方程解法

    万次阅读 2018-04-28 16:32:46
    一阶线性常微分方程求解 一阶线性常微分方程u构造

    一阶线性常微分方程求解

    这里写图片描述

    一阶线性常微分方程u构造

    这里写图片描述

    展开全文
  • 采用van Genu chten模型,将描述土壤水分运动的Richards方程(为偏微分方程)在空间上半离散后得到常微分方程组,借助于该求解求解。针对以含水率θ为变量的Richards方程进行了试验,常微分方程求解采用CVODE...
  • 常微分方程求解程序,可直接替换参数,可y用于复制动态方程的求解和仿真
  • 概率matlab经典代码Tensorflow常微分方程求解器 建立的程式库可复制为所建立的程式库,完全在Tensorflow Eager Execution上执行。 该代码库的所有功劳都为重新实现提供了良好的基础。 与PyTorch代码库相似,该库提供...
  • 对于常微分方程的初值问题 {dydt=f(t,y),t∈[a,b]y(a)=y0(1) \left\{ \begin{array}{l} \frac{{dy}}{{dt}} = f(t,y),t \in \left[ {a,b} \right]\\ ...定义一个ODEsolver类来使用各种方法求解常微分方程,使用待

    IVP问题

    对于常微分方程的初值问题
    { d y d t = f ( t , y ) , t ∈ [ a , b ] y ( a ) = y 0 (1) \left\{ \begin{array}{l} \frac{{dy}}{{dt}} = f(t,y),t \in \left[ {a,b} \right]\\ y\left( a \right) = {y_0} \end{array} \right.\tag{1} {dtdy=f(t,y),t[a,b]y(a)=y0(1)
    有以下解的存在性、唯一性定理:

    假设 f ( t , y ) f(t,y) f(t,y)定义在集合 [ a , b ] × [ α , β ] [a,b]\times[\alpha,\beta] [a,b]×[α,β]并且初值 α < y 0 < β \alpha<y_0<\beta α<y0<β,函数对于变量 y y y是Lipschitz连续,则在 a a a b b b之间存在 c c c,使得初值问题
    { d y d t = f ( t , y ) , t ∈ [ a , b ] y ( a ) = y 0 t ∈ [ a , c ] (2) \left\{ \begin{array}{l} \frac{{dy}}{{dt}} = f(t,y),t \in \left[ {a,b} \right]\\ y\left( a \right) = {y_0}\\ t\in[a,c] \end{array} \right.\tag{2} dtdy=f(t,y),t[a,b]y(a)=y0t[a,c](2)
    有唯一解 y ( t ) y(t) y(t)。而且,如果 f f f [ a , b ] × [ − ∞ , + ∞ ] [a,b]\times[-\infty,+\infty] [a,b]×[,+]上是Lipschitz连续,则其在 [ a , b ] [a,b] [a,b]上存在唯一解。

    定义一个ODEsolver类来使用各种方法求解常微分方程,使用待求解的函数和初始值来初始化该类:

    class ODEsolver:
        def __init__(self,fun,t0,y0):
            self.fun=fun
            self.t0=t0
            self.y0=y0
    

    Euler显式格式

    Euler方法为:
    { w 0 = y 0 w i + 1 = w i + h f ( t i , w i ) (2) \left\{ \begin{array}{l} {w_0} = {y_0}\\ {w_{i + 1}} = {w_i} + hf\left( {{t_i},{w_i}} \right) \end{array} \right.\tag{2} {w0=y0wi+1=wi+hf(ti,wi)(2)
    代码为:

        def eulersolver(self,tend,step=None):
            if step is None:
                step=(tend-self.t0)/1e3
            from ArrayTable import ArrayTable
            result=ArrayTable(2,0)
            result.setTableHeader(["$t$","$y(t)$"])
            result.setTableUnit(["/","/"])
            result.append([self.t0,self.y0])
            t=self.t0
            while t<tend:
                ynext=result.table[1].data[-1]+self.fun(t,result.table[1].data[-1])*step
                result.append([t+step,ynext])
                t+=step
            return result
    

    隐式Euler法

    隐式Euler法的原理为:
    { w 0 = y 0 w i + 1 = w i + h f ( t i + 1 , w i + 1 ) (3) \left\{ \begin{array}{l} {w_0} = {y_0}\\ {w_{i + 1}} = {w_i} + hf\left( {{t_{i + 1}},{w_{i + 1}}} \right) \end{array} \right.\tag{3} {w0=y0wi+1=wi+hf(ti+1,wi+1)(3)
    迭代开始前首先要预估一个 w i + 1 w_{i+1} wi+1的初始值,一般有两种选择,使用 w i w_i wi作为初始值或者用显示方法先预估一个值 w i + 1 ′ w_{i+1}' wi+1,这里用预报矫正法来估计其值。

        def implicitEuler(self,tend, step=None):
            if step is None:
                step = (tend - self.t0) / 1e3
            from ArrayTable import ArrayTable
            result = ArrayTable(2, 0)
            result.setTableHeader(["$t$", "$y(t)$"])
            result.setTableUnit(["/", "/"])
            result.append([self.t0, self.y0])
            t = self.t0
            while t<tend:
                temp=self.fun(t,result.table[1].data[-1])
                ynextinit=result.table[1].data[-1]+step/2.*(temp+self.fun(t+step,result.table[1].data[-1] + temp * step))
                def func(w):
                    return result.table[1].data[-1]+step*self.fun(t+step,w)-w
    
                ynext=ynextinit;h=step/10.
                while func(ynext)>1.e-5:
                    ynext-=func(ynext)/((func(ynext+h)-func(ynext-h))/2./h)
                result.append([t + step, ynext])
                t += step
            return result
    

    预报矫正法

    预报矫正法也叫显示梯形法1,预报矫正法的思想是先由当前点的值求出下一点的预报值:
    w i + 1 ′ = w i + h f ( x i , w i ) (3) w_{i + 1}' = {w_i} + hf\left( {{x_i},{w_i}} \right)\tag{3} wi+1=wi+hf(xi,wi)(3)
    再用当前点的值和预报点的值矫正下一个点的预报值:
    { w i + 1 = w i + h f ( t i , w i ) + f ( t i + h , w i + 1 ′ ) 2 w 0 = y 0 (3) \left\{ \begin{array}{l} {w_{i + 1}} = {w_i} + h\frac{{f\left( {{t_i},{w_i}} \right) + f\left( {{t_i} + h,w_{i + 1}'} \right)}}{2}\\ {w_0} = {y_0} \end{array} \right.\tag{3} {wi+1=wi+h2f(ti,wi)+f(ti+h,wi+1)w0=y0(3)
    也可以写作:
    { w 0 = y 0 w i + 1 = w i + h 2 ( f ( t i , w i ) + f ( t i + h , w i + h f ( t i , w i ) ) ) (4) \left\{ \begin{array}{l} {w_0} = {y_0}\\ {w_{i + 1}} = {w_i} + \frac{h}{2}\left( {f\left( {{t_i},{w_i}} \right) + f\left( {{t_i} + h,{w_i} + hf\left( {{t_i},{w_i}} \right)} \right)} \right) \end{array} \right.\tag{4} {w0=y0wi+1=wi+2h(f(ti,wi)+f(ti+h,wi+hf(ti,wi)))(4)

        def forecastCorrection(self, tend, step=None):
            if step is None:
                step = (tend - self.t0) / 1e3
            from ArrayTable import ArrayTable
            result = ArrayTable(2, 0)
            result.setTableHeader(["$t$", "y(t) solved with forecast correction"])
            result.setTableUnit(["/", "/"])
            result.append([self.t0, self.y0])
            t = self.t0
            while t < tend:
                dydt=self.fun(t, result.table[1].data[-1])
                ynextpridict=result.table[1].data[-1] + dydt * step
                ynext=result.table[1].data[-1]+step/2.*(dydt+self.fun(t+step,ynextpridict))
                result.append([t + step, ynext])
                t += step
            return result
    

    4阶龙格-库塔方法(RK4)

    { w i + 1 = w i + h 6 ( s 1 + 2 s 2 + 2 s 3 + s 4 ) s 1 = f ( t i , w i ) s 2 = f ( t i + h 2 , w i + h 2 s 1 ) s 3 = f ( t i + h 2 , w i + h 2 s 2 ) s 4 = f ( t i + h , w i + h s 3 ) w 0 = y 0 \left\{ \begin{array}{l} {w_{i + 1}} = {w_i} + \frac{h}{6}\left( {{s_1} + 2{s_2} + 2{s_3} + {s_4}} \right)\\ {s_1} = f\left( {{t_i},{w_i}} \right)\\ {s_2} = f\left( {{t_i} + \frac{h}{2},{w_i} + \frac{h}{2}{s_1}} \right)\\ {s_3} = f\left( {{t_i} + \frac{h}{2},{w_i} + \frac{h}{2}{s_2}} \right)\\ {s_4} = f\left( {{t_i} + h,{w_i} + h{s_3}} \right)\\ {w_0} = {y_0} \end{array} \right. wi+1=wi+6h(s1+2s2+2s3+s4)s1=f(ti,wi)s2=f(ti+2h,wi+2hs1)s3=f(ti+2h,wi+2hs2)s4=f(ti+h,wi+hs3)w0=y0

        def Rungekutta4(self, tend, step=None):
            if step is None:
                step = (tend - self.t0) / 1e3
            from ArrayTable import ArrayTable
            result = ArrayTable(2, 0)
            result.setTableHeader(["$t$", "y(t) solved with runge kutta 4"])
            result.setTableUnit(["/", "/"])
            result.append([self.t0, self.y0])
            t = self.t0
            while t < tend:
                s1=self.fun(t,result.table[1].data[-1])
                s2=self.fun(t+step/2.,result.table[1].data[-1]+step/2.*s1)
                s3=self.fun(t+step/2.,result.table[1].data[-1]+step/2.*s2)
                s4=self.fun(t+step,result.table[1].data[-1]+step*s3)
                ynext=result.table[1].data[-1]+step/6.*(s1+2*s2+2*s3+s4)
                result.append([t + step, ynext])
                t += step
            return result
    

    结果展示

    下图展示了使用不同方法求解
    { d y d t = y e t y ( 0 ) = 1 \left\{ \begin{array}{l} \frac{{dy}}{{dt}} = y{e^t}\\ y\left( 0 \right) = 1 \end{array} \right. {dtdy=yety(0)=1
    的结果,其中隐式欧拉方采用的步长为0.01,由于步长较大的原因,导致全局截断误差较大。
    在这里插入图片描述

    常微分方程与最优化问题的转化

    变分法

    先将方程齐次化,令 z ( t ) = y ( t ) − y 0 z(t)=y(t)-y_0 z(t)=y(t)y0,则初值问题化为:
    { d z d t = f ( t , z + y 0 ) , t ∈ [ a , b ] z ( a ) = 0 \left\{ \begin{array}{l} \frac{{dz}}{{dt}} = f\left( {t,z + {y_0}} \right),t \in \left[ {a,b} \right]\\ z\left( a \right) = 0 \end{array} \right. {dtdz=f(t,z+y0),t[a,b]z(a)=0
    化为变分问题:
    ∫ a b ( d z d t − f ( t , z + y 0 ) ) v d t = z v ∣ a b − ∫ a b z d v d t d t − ∫ a b f ( t , z + y 0 ) v d t = z ( b ) v ( b ) − ∫ a b z d v d t d t − ∫ a b f ( t , z + y 0 ) v d t = 0 \begin{array}{l} \int_a^b {\left( {\frac{{dz}}{{dt}} - f\left( {t,z + {y_0}} \right)} \right)vdt} \\ = zv|_a^b - \int_a^b {z\frac{{dv}}{{dt}}dt - \int_a^b {f\left( {t,z + {y_0}} \right)vdt} } \\ = z\left( b \right)v\left( b \right) - \int_a^b {z\frac{{dv}}{{dt}}dt} - \int_a^b {f\left( {t,z + {y_0}} \right)vdt} = 0 \end{array} ab(dtdzf(t,z+y0))vdt=zvababzdtdvdtabf(t,z+y0)vdt=z(b)v(b)abzdtdvdtabf(t,z+y0)vdt=0
    J ( u ) = u ( b ) 2 − ∫ a b u d u d t d t − ∫ a b f ( t , u + y 0 ) u d t J(u)=u\left( b \right)^2 - \int_a^b {u\frac{{du}}{{dt}}dt} - \int_a^b {f\left( {t,u + {y_0}} \right)udt} J(u)=u(b)2abudtdudtabf(t,u+y0)udt
    求泛函问题:
    { u ∈ S 0 1 , S 0 1 = { v ∣ v ∈ C 1 [ a , b ] , v ( a ) = 0 } J ( u ) ≤ J ( w ) , ∀ w ∈ S 0 1 \left\{ \begin{array}{l} u \in S_0^1,S_0^1 = \left\{ {v|v \in {C^1}\left[ {a,b} \right],v\left( a \right) = 0} \right\}\\ J\left( u \right) \le J\left( w \right),\forall w \in S_0^1 \end{array} \right. {uS01,S01={vvC1[a,b],v(a)=0}J(u)J(w),wS01
    找一个试探函数空间,其基函数为 φ i ( x ) = ( a − t ) t i , i = 0 , 1 , 2 , . . . \varphi_i(x)=(a-t)t^i,i=0,1,2,... φi(x)=(at)ti,i=0,1,2,...

    神经网络解法


    1. Timothy Sauer.数值分析 第2版 中文版[M].北京:机械工业出版社.2020. ↩︎

    展开全文
  • 8.7 常微分方程数值解的若干Matlab函数文件; function [x,y]=euler(f,tspan,y0,n) % 解初值问题 =f(x,y,y(a)=y0 % 使用 n 步的 Euler 法步长 h=(b-a)/h a=tspan(1;b=tspan(2;h=(b-a)/h; x=(a+h:h:b; y(1)=y0+h*feval...
  • 用matlab求解微积分和微分方程———rk4 - 常微分方程RungeKutta法
  • 常微分方程求解方法回顾 文章目录常微分方程求解方法回顾一阶常微分方程(First Order Ordinary Differential Equations)二阶常系数线性微分方程(Second Order Constant Coefficient Linear Equations) 在微分方程中...

    常微分方程求解方法回顾


    在微分方程中,称只有一个自变量函数的微分方程为常微分方程,有两个及以上自变量的微分方程为偏微分方程,给定微分方程及其初始条件,称为 初值问题,给定微分方程及其边界条件,称为 边值问题

    一阶常微分方程(First Order Ordinary Differential Equations)

    • 可分离方程(Separable Equations)的求解
      d y d x = P ( x ) Q ( y ) ∫ d y Q ( y ) = ∫ P ( x ) d x + C (1) \begin{aligned} \frac{d y}{d x} &=P(x) Q(y) \\ \int \frac{d y}{Q(y)} &=\int P(x) d x+C \end{aligned}\tag{1} dxdyQ(y)dy=P(x)Q(y)=P(x)dx+C(1)
    • 一阶线性微分方程(Linear First-Order Equation)的求解:
      对于如下形式的常微分方程:
      y ′ ( x ) + P ( x ) y = Q ( x ) (2) y^{\prime}(x)+P(x) y=Q(x)\tag{2} y(x)+P(x)y=Q(x)(2)
      ​ 如果我们能够找到函数 F ( x ) F(x) F(x),与式(2)相乘能够将式 2 2 2左侧变为 ( F y ) ′ (Fy)^{'} (Fy)的形式,如下:
      F y ′ + F P y = F Q ( F y ) ′ = F y ′ + F ′ y = F Q (3) \begin{array}{c} \begin{aligned} &F y^{\prime}+F P y=F Q \\ &(F y)^{\prime}=F y^{\prime}+F^{\prime} y=F Q \end{aligned} \end{array}\tag{3} Fy+FPy=FQ(Fy)=Fy+Fy=FQ(3)
      ​ 即要求 F ′ = F P F^{'}=FP F=FP,此为可分离方程:
      d F F ( x ) = P ( x ) d x ⇒ ∫ d F F = ∫ P ( x ) d x + C (4) \frac{d F}{F(x)}=P(x) d x \Rightarrow \int \frac{d F}{F}=\int P(x) d x+C\tag{4} F(x)dF=P(x)dxFdF=P(x)dx+C(4)
      ​ 由式(1)解得:
      ln ⁡ F = ∫ P ( x ) d x + C F = A e ∫ P ( x ) d x  choose  A = 1 (5) \begin{aligned} &\ln F=\int P(x) d x+C\\ &F=A \mathrm{e}^{\int P(x) d x} \text { choose }A=1 \end{aligned}\tag{5} lnF=P(x)dx+CF=AeP(x)dx choose A=1(5)
      ​ 将式(5)带入式(2)解得:
      e ∫ P ( x ) d x y ′ + e ∫ P ( x ) d x P ( x ) y = e ∫ P ( x ) d x Q ( x ) ( e ∫ P ( x ) d x y ) ′ = e ∫ P ( x ) d x Q ( x ) y ( x ) = e − ∫ P ( x ) d x { ∫ e x P ( t ) d t Q ( x ) d x + C } (6) \begin{array}{c} \begin{aligned} &\mathrm{e}^{\int P(x) d x} y^{\prime}+\mathrm{e}^{\int P(x) d x} P(x) y=\mathrm{e}^{\int P(x) d x} Q(x) \\ &\left(\mathrm{e}^{\int P(x) d x} y\right)^{\prime}=\mathrm{e}^{\int P(x) d x} Q(x) \\ &\left.y(x)=\mathrm{e}^{-\int P(x) d x\left\{\int \mathrm{e}^{x} P(t) d t\right.} Q(x) d x+C\right\} \end{aligned} \end{array}\tag{6} eP(x)dxy+eP(x)dxP(x)y=eP(x)dxQ(x)(eP(x)dxy)=eP(x)dxQ(x)y(x)=eP(x)dx{exP(t)dtQ(x)dx+C}(6)

    二阶常系数线性微分方程(Second Order Constant Coefficient Linear Equations)

    a y ′ ′ + b y ′ + c y = f ( x ) ay^{''}+by^{'}+cy=f(x) ay+by+cy=f(x)称为二阶线性微分方程,当 f ( x ) = 0 f(x)=0 f(x)=0时,称为二阶常系数线性微分方程(也称二阶齐次线性微分方程),如下:
    L y = a y ′ ′ + b y ′ + c y = 0 (7) L y=a y^{\prime \prime}+b y^{\prime}+c y=0\tag{7} Ly=ay+by+cy=0(7)
    其中 a 、 b 、 c a、b、c abc为实常数,假设 y = e r x y ′ = r e r x y ′ ′ = r 2 e r x y=\mathrm{e}^{r x} \quad y^{\prime}=r \mathrm{e}^{r x} \quad y^{\prime \prime}=r^{2} \mathrm{e}^{r x} y=erxy=rerxy=r2erx,为上式的一个特解,则:
    L y = [ a r 2 + b r + c ] e r x = 0 (8) L y=\left[a r^{2}+b r+c\right] \mathrm{e}^{r x}=0\tag{8} Ly=[ar2+br+c]erx=0(8)
    即有:
    g ( r ) = [ a r 2 + b r + c ] = 0 (9) g(r)=\left[a r^{2}+b r+c\right]=0\tag{9} g(r)=[ar2+br+c]=0(9)
    Δ = b 2 − 4 a c > 0 \Delta=b^2-4ac>0 Δ=b24ac>0时,式(9)有两个不同的解 r 1 , r 2 r_1,r_2 r1,r2,由此得到式(7)的通解:
    y ( x ) = c 1 e r 1 x + c 2 e r 2 x (10) y(x)=c_{1} \mathrm{e}^{r_{1} x}+c_{2} \mathrm{e}^{r_{2} x}\tag{10} y(x)=c1er1x+c2er2x(10)
    Δ = b 2 − 4 a c = 0 \Delta=b^2 - 4ac=0 Δ=b24ac=0时,式(9)有两个相同的解 r 1 = r 2 r_1=r_2 r1=r2,由此得到式(7)的唯一解:
    y ( x ) = e r 1 x (11) y(x)=e^{r_1x}\tag{11} y(x)=er1x(11)
    此时如果我们依旧想要得到两个不同的解,我们可以对唯一解添加一个微小的扰动(perturbation),来得到两个不同的解,如下图所示:

    此时 g ( r ) = a ( r − ( r 1 − ϵ ) ) ( r − ( r 1 + ϵ ) ) = a [ ( r − r 1 ) 2 − ϵ 2 ] ≈ a ( r − r 1 ) 2 g(r)=a\left(r-\left(r_{1}-\epsilon\right)\right)\left(r-\left(r_{1}+\epsilon\right)\right)=a\left[\left(r-r_{1}\right)^{2}-\epsilon^{2}\right] \approx a\left(r-r_{1}\right)^{2} g(r)=a(r(r1ϵ))(r(r1+ϵ))=a[(rr1)2ϵ2]a(rr1)2,即 g ( x ) g(x) g(x)有两个非常接近但不同的跟:
    r = r 1 + ϵ ; r = r 1 − ϵ (12) r=r_1+\epsilon;r=r_1-\epsilon\tag{12} r=r1+ϵ;r=r1ϵ(12)
    即可得到扰动下的通解:
    y ( x ) = c 1 e r 1 x + c 2 e r 2 x (13) y(x)=c_{1} \mathrm{e}^{r_{1} x}+c_{2} \mathrm{e}^{r_{2} x}\tag{13} y(x)=c1er1x+c2er2x(13)
    如下图所示,取 c 1 = 1 2 ϵ = − c 2 c_1=\frac{1}{2\epsilon}=-c_2 c1=2ϵ1=c2,则:
    y ( x , ϵ ) = e ( r 1 + ϵ ) x − e ( r 1 − ϵ ) x 2 ϵ ≈ ∣ ∂ ∂ r e r x ∣ r = r 1 (14) y(x, \epsilon)=\frac{\mathrm{e}^{\left(r_{1}+\epsilon\right) x}-\mathrm{e}^{\left(r_{1}-\epsilon\right) x}}{2 \epsilon} \approx\left|\frac{\partial}{\partial r} \mathrm{e}^{r x}\right|_{r=r_{1}}\tag{14} y(x,ϵ)=2ϵe(r1+ϵ)xe(r1ϵ)xrerxr=r1(14)
    利用洛必达法则(L’Hospital’s Rule),即得:
    y ( x , ϵ ) = e r 1 x ( e ϵ x − e − ϵ x 2 ϵ ) ⟶ ϵ → 0 x e r 1 x = ∣ ∂ ∂ r e r x ∣ r = r 1 (15) y(x, \epsilon)=\mathrm{e}^{r_{1} x}\left(\frac{e^{\epsilon x}-\mathrm{e}^{-\epsilon x}}{2 \epsilon}\right) \stackrel{\epsilon \rightarrow 0}{\longrightarrow} x \mathrm{e}^{r_{1} x}=\left|\frac{\partial}{\partial r} \mathrm{e}^{r x}\right|_{r=r_{1}}\tag{15} y(x,ϵ)=er1x(2ϵeϵxeϵx)ϵ0xer1x=rerxr=r1(15)
    x e r 1 x xe^{r_1x} xer1x也是式(9)的一个解,因此得到式(9)的通解:
    y ( x ) = c 1 e r 1 x + c 2 x e r 1 x (16) y(x)=c_{1} \mathrm{e}^{r_{1} x}+c_{2} x \mathrm{e}^{r_{1} x}\tag{16} y(x)=c1er1x+c2xer1x(16)

    Δ = b 2 − 4 a c < 0 \Delta=b^2-4ac<0 Δ=b24ac<0时,式(9)有复共轭跟(Complex Conjugate Roots):
    r ± = − b 2 a ± i 4 a c − b 2 2 a = λ ± i μ y ( x ) = c 1 e ( λ + i μ ) x + c 2 e ( λ − i μ ) x = e λ x [ A cos ⁡ μ x + B sin ⁡ μ x ] (17) \begin{aligned} r_{\pm} &=-\frac{b}{2 a} \pm \frac{i \sqrt{4 a c-b^{2}}}{2 a}=\lambda \pm i \mu \\ y(x) &=c_{1} \mathrm{e}^{(\lambda+i \mu) x}+c_{2} \mathrm{e}^{(\lambda-i \mu) x} \\ &=\mathrm{e}^{\lambda x}[A \cos \mu x+B \sin \mu x] \end{aligned}\tag{17} r±y(x)=2ab±2ai4acb2 =λ±iμ=c1e(λ+iμ)x+c2e(λiμ)x=eλx[Acosμx+Bsinμx](17)
    参考资料:

    M257_316_2012_Lecture_1

    展开全文
  • 龙格-库塔法常微分方程求解 MATLAB
  • % 模拟一个球从 100 米的高度落下后从楼梯上弹起 米到楼梯上,从 5 米开始。 让楼梯间成为% 由函数 y(x) = 5-floor(x) 定义。 球滚下边缘% 高度为 10 ... % 求解微分方程: [t,y] = SolveOdeWithEvent(odefun, initcon
  • 一、实验目的:熟悉Matlab软件中关于求解常微分方程常微分方程组的各种命令,掌握利用Matlab软件进行常微分方程常微分方程组的求解。?二、相关知识在MATLAB中,由函数dsolve()解决常微分方程(组)的求解问题,其...

    常微分方程和常微分方程组的求解

    ?

    一、实验目的:

    熟悉Matlab软件中关于求解常微分方程和常微分方程组的各种命令,掌握利用Matlab软件进行常微分方程和常微分方程组的求解。

    ?

    二、相关知识

    在MATLAB中,由函数dsolve()解决常微分方程(组)的求解问题,其具体格式如下:

    X=dsolve(‘eqn1’,’eqn2’,…)

    函数dsolve用来解符号常微分方程、方程组,如果没有初始条件,则求出通解,如果有初始条件,则求出特解。

    例1:求解常微分方程的MATLAB程序为:dsolve('Dy=1/(x+y)','x'),注意,系统缺省的自变量为t,因此这里要把自变量写明。

    结果为:-lambertw(-C1*exp(-x-1))-x-1

    其中:Y=lambertw(X)表示函数关系Y*exp(Y)=X。

    例2:求解常微分方程的MATLAB程序为:Y2=dsolve('y*D2y-Dy^2=0’,’x’)

    结果为:

    Y2 =[ exp((x+C2)/C1)]

    [ C2]

    我们看到有两个解,其中一个是常数。

    例3:求常微分方程组通解的MATLAB程序为:

    [X,Y]=dsolve('Dx+5*x+y=exp(t),Dy-x-3*y=exp(2*t)','t')

    例4:求常微分方程组通解的MATLAB程序为:

    [X,Y]=dsolve('Dx+2*x-Dy=10*cos(t),Dx+Dy+2*y=4*exp(-2*t)','x(0)=2','y(0)=0')

    以上这些都是常微分方程的精确解法,也称为常微分方程的符号解。但是,我们知道,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解,在求常微分方程数值解方面,MATLAB具有丰富的函数,我们将其统称为solver,其一般格式为:

    [T,Y]=solver(odefun,tspan,y0)

    该函数表示在区间tspan=[t0,tf]上,用初始条件y0求解显式常微分方程。

    solver为命令ode45,ode23,ode113,ode15s,ode23s,ode23t,ode23tb之一,这些命令各有特点。我们列表说明如下:

    求解器

    ODE类型

    特点

    说明

    ode45

    非刚性

    一步算法,4,5阶Runge-Kutta

    方法累积截断误差

    大部分场合的首选算法

    ode23

    非刚性

    一步算法,2,3阶Runge-Kutta

    方法累积截断误差

    使用于精度较低的情形

    ode113

    非刚性

    多步法,Adams算法,高低精度均可达到

    计算时间比ode45短

    ode23t

    适度刚性

    采用梯形算法

    适度刚性情形

    ode15s

    刚性

    多步法,Gear’s反向

    数值积分,精度中等

    若ode45失效时,

    可尝试使用

    ode23s

    刚性

    一步法,2阶Rosebrock算法,

    低精度。

    当精度较低时,

    计算时间比ode15s短

    odefun为显式常微分方程中的

    tspan为求解区间,要获得问题在其他指定点上的解,则令(要求单调),

    y0初始条件。

    例5:求解常微分方程,,的MATLAB程序如下:fun=inline('-2*y+2*x*x+2*x');[x,y]=ode23(fun,[0,0.5],1)

    结果为:

    x = 0,0.0400,0.0900,0.1400,0.1900,0.2400,0.2900,0.3400,0.3900,0.4400,0.4900,0.5000

    y = 1.0000,0.9247,0.8434,0.7754,0.7199,0.6764,0.6440,0.6222,0.6105,0.6084,0.6154,0.6179

    例6:求解常微分方程的解,并画出解的图形。

    分析:这是一个二阶非线性方程,用现成的方法均不能求解,但我们可以通过下面的变换,将二阶方程化为一阶方程组,即可求解。

    令:,,,则得到:

    接着,编写vdp.m如下:

    function fy=vdp(t,x)

    fy=[x(2);7*(1-x(1)^2)*x(2)-x(1)];

    再编写m文件sy12_6.m如下:

    y0=[1;0]

    [t,x]=ode45(@vdp,[0,40],y0);

    y=x(:,1);dy=x(:,2);

    plot(t,y,t,dy)

    ?

    ?

    三、实验内容

    1.利用MATLAB求常微分方程的初值问题,的解。

    2.利用MATLAB求常微分方程的初值问题,,的解。

    3.利用MATLAB求常微分方程的解。

    4.利用MATLAB求常微分方程组的特解。

    5.求解常微分方程,,,的特解,并做出解函数的曲线图。

    6.完成实验报告。

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

    万次阅读 多人点赞 2019-04-30 10:33:01
    常微分方程解法求解系列博文: 常微分方程解法 (一): 常微分方程的离散化 :差商近似导数、数值积分方法、Taylor 多项式近似 常微分方程解法 (二): 欧拉(Euler)方法 常微分方程解法 (三): 龙格—库塔...
  • 本文是自己写的关于怎样利用MATLAB求解常微分方程数值解的,文中从Euler法讲起,最后总结了常用的odeXX的用法及其原理,其中包含各个函数怎样使用的MATLAB代码
  • 泰勒解常微分方程

    2018-10-14 11:50:27
    除常用的求解方法外,可以在MATLAB里采用泰勒法求解常微分方程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,120
精华内容 4,048
关键字:

常微分方程求解