精华内容
下载资源
问答
  • 微分方程初值问题的数值解法的比较,孙坤,任亮,本文主要讨论了满足某种初值问题的微分方程的数值解法。把数值解法分为单步法和多步法两种, 并列举了常用的单步法: 如欧拉法、龙�
  • 常微分方程初值问题的欧拉方法及其改进的欧拉方法的Matlab实现,纪秀浩,,欧拉(Euler)方法及改进的欧拉方法是解决常微分方程初值问题常用的数值解法,但Matlab的工具箱中没有Euler方法的功能函数。本文在简要介
  • 数值分析(数值计算) 数学建模 实验报告 matlab程序
  • 用指数型格式解对流扩散方程的初值问题,数值计算结果精确
  • 分别给出了常系数非齐次线性微分方程组和常系数非齐次线性差分方程组在给定的初始条件下的求解公式。
  • 该算法用Runge-Kutta 法解初值问题。a,b—求解区间的左右端点,y 0 —初 值,步长选用h。依次由公式计算出K1,K2,K3,K4 的值并计算出出每步的y(n)。 同时每算依次就更新依次t(n)的取值,最终输出t i 和y
  • 讨论了求解二阶线性常微分方程初值问题的差分法,给出了边界条件的2种处理方法,并对数值结果与理论计算结果进行了比较。
  • 常微分方程的初值问题
  • 常态和偏微分方程的时频解通常被认为是一种无效的方法。 与有限差分方法相比,时域的相关扩展被认为会导致许多数值运算... 对于MHD方程,证明了有利的子域缩放,这表明有效解决例如流体力学和MHD中高级初值问题的潜力。
  • 采用欧拉法、改进欧拉法、龙格库塔法(经典RK法)求解常微分方程初值问题的自编MATLAB代码。所有函数均独立成文件便于移植。代码的使用结合一个具体题目说明,题目来源为浙江大学数值计算方法作业。
  • 解决离散测地线的初值问题
  • 常微分方程初值问题数值解法的比较.pdf
  • 计算方法 凌永祥 第六章8题 Runge—Kutta计算初值问题
  • 注重算法与程序实现,强调理论知识与程序设计的紧密结合,既有理论性,也有实用性,对每个...配有大量图形,侧重从几何含义的角度直观地说明问题;最后一章是与所学内容紧密结合的上机实验与指导;附录有部分习题答案。
  • 此书是计算数学领域中常微分方程初值问题的最基本的书,全英文的教材,对研究生的深入学习起到很好的作用。
  • 用连续性方法和精妙的先验估计式证明了在二维空间中一类具混合阶型非线性项的广义 Zakharov系统柯西 问题整体光滑解的唯一性。
  • 8程序包含两种方法,四阶显式Runge-Kutta法和隐式Runge-Kutta法。代码清晰,注释简明,方便数值分析学习使用。
  • 本文用积分估计和不动点原理证明了一类广义Kuramoto-Sivashinsky型方程初值问题光淆整体解的存在唯一性,并在不同情况下讨论了解的破裂性,并给出了导致破裂性的充分条件。
  • 数值计算求初值问题

    2021-01-13 06:14:24
    %这是三种直接求解初值问题的方法 end sol1=[p3(2) p3(1)];sol2=[p3(2) p3(1)];sol3=[p3(2) p3(1)];p4=[p3(1) p3(2)];p5=[p3(1) p3(2)];p6=[p3(1) p3(2)];B1=[-6 -6];B2=[-6 -6 -6];B3=[-6]; for j=2:length(t)-1 ...

    求几个函数,看课件上,老师推导下面这个函数,注意f(tn,phin)=dphi(tn)/dt(n),乘一个M之后,Mdphi(tn)/dt(n)=B(tn)phi(tn)+C(tn), B和C的值可以参考老师课件上给的案例,还有要注意给的B的值,是[B(tn),B(tn+1)],还是[B(tn+1),B(tn)]

    function [LHS,RHS] = OST(theta,timestep,M,B,C,sol)
    LHS=M-theta*timestep*B(1);%[B(tn+1),B(tn)]
    RHS=(M+(1-theta)*timestep*B(2))*sol+timestep*(theta*C(1)+(1-theta)*C(2));
    end

    根据老师推导的函数方法,同理可以推出其他的函数表达式

    function [LHS,RHS] = AB2(timestep,M,B,C,sol)
    LHS=M;
    RHS=(M+3/2*timestep*B(1))*sol(1)+timestep/2*(3*C(1)-B(2)*sol(2)-C(2));%[B(tn),B(tn-1)],
    end
    function [LHS,RHS] = AM3(timestep,M,B,C,sol)
    LHS=M-5/12*timestep*B(1);
    RHS=(M+2/3*timestep*B(2))*sol(1)+timestep/12*(5*C(1)+8*C(2)-B(3)*sol(2)-C(3));
    end
    function [LHS,RHS] = BDF2(timestep,M,B,C,sol)
    LHS=3/2*M-timestep*B;
    RHS=2*M*sol(1)-1/2*M*sol(2)+timestep*C;
    end
    clear;
    te=0:0.01:2;t=0:0.1:2;p1(1)=0;p2(1)=0;p3(1)=0;dt=0.1;p=exp(-5*te).*(te.*te-2*te+2)-2*exp(-6*te);M=1;C=t.*t.*exp(-5*t);%te和p是原函数的值
    
    for i=1:length(t)-1%要求出所有的值,到i+1就是所有的值
        p1(i+1)=p1(i)+dt*(t(i)*t(i)*exp(-5*t(i))-6*p1(i));
        p2(i+1)=(p2(i)+dt*t(i+1)*t(i+1)*exp(-5*t(i+1)))/(1+6*dt);%注意这边要得到化简,i+1放一边
        p3(i+1)=(p3(i)+1/2*dt*(t(i+1)*t(i+1)*exp(-5*t(i+1))+t(i)*t(i)*exp(-5*t(i))-6*p3(i)))/(1+1/2*dt*6);%这是三种直接求解初值问题的方法
    end
    sol1=[p3(2) p3(1)];sol2=[p3(2) p3(1)];sol3=[p3(2) p3(1)];p4=[p3(1) p3(2)];p5=[p3(1) p3(2)];p6=[p3(1) p3(2)];B1=[-6 -6];B2=[-6 -6 -6];B3=[-6];
    for j=2:length(t)-1
        [L1,R1]=AB2(dt,1,B1,[C(j),C(j-1)],sol1);
        [L2,R2]=AM3(dt,1,B2,[C(j+1),C(j),C(j-1)],sol2);
        [L3,R3]=BDF2(dt,1,B3,[C(j+1)],sol3);
        p4(j+1)=L1\R1;p5(j+1)=L2\R2;p6(j+1)=L3\R3;
        sol1=[p4(j+1),p4(j)];
        sol2=[p5(j+1),p5(j)];
        sol3=[p6(j+1),p6(j)];
    end
    
    plot(t,p1,'LineWidth',2),hold on
    plot(t,p2,'LineWidth',2),hold on
    plot(t,p3,'LineWidth',2),hold on
    plot(t,p4,'LineWidth',2),hold on
    plot(t,p5,'LineWidth',2),hold on
    plot(t,p6,'LineWidth',2),hold on
    plot(te,p,'k--','LineWidth',2),hold on
    axis([0 2 0 5*10^-3])
    legend('Euler Expl.','Euler Impl.','Trapez','AB2','AM3','BDF2','exakt')
    

     

    展开全文
  • 用萨马尔斯基格式解对流扩散方程的初值问题,数值计算结果精确
  • 常微分方程初值问题数值解法问题一、一阶常微分方程初值问题的有限差分方法与误差分析二、向前Euler法及误差分析1.向前Euler法2.误差分析3.后退Euler法三、改进欧拉公式四、龙格—库塔方法 问题 一阶常微分方程的...

    问题

    一阶常微分方程的初值问题:
    y ′ = f ( x , y ) y^{'}=f(x,y) y=f(x,y)
    y ( x 0 ) = y 0 y(x_0)=y_0 y(x0)=y0
    定理一
    设f在区域 D = ( x , y ) ∣ a ≤ x ≤ b , y ∈ R D={(x,y)|a\leq x\leq b,y\in R} D=(x,y)axb,yR上连续,关于y满足 ∣ f ( x , y 1 ) − f ( x , y 2 ) ∣ ≤ L ∣ y 1 − y 2 ∣ , ∀ x 0 ∈ [ a , b ] , y 0 ∈ R |f(x,y_1)-f(x,y_2)|\leq L|y_1-y_2|,\forall x_0\in[a,b],y_0\in R f(x,y1)f(x,y2)Ly1y2,x0[a,b],y0R(这条件叫做Lipschitz条件)常微分方程的初值问题存在唯一的连续可微解 y ( x ) y(x) y(x)

    一、一阶常微分方程初值问题的有限差分方法与误差分析

    只有一些特殊的常微分方程能求解析解,实际问题中主要靠数值解,所谓数值解法,就是寻求解y(x)在一系列离散节点 x 0 < x 1 < x 2 . . . . . . x_0<x_1<x_2...... x0<x1<x2......上的近似值 y 0 , y 1 , y 2 . . . . . . y_0,y_1,y_2...... y0,y1,y2......
    整体截断误差
    g i = ∣ y i − y ( x i ) ∣ g_i=|y_i-y(x_i)| gi=yiy(xi)
    其中 y ( x i ) y(x_i) y(xi)就是我们的精确解, y i y_i yi就是给定计算格式(迭代公式,初值是精确值)之后所计算出来的数值解。
    局部截断误差
    e i = ∣ y ( x i + 1 ) − w i + 1 ∣ e_i=|y(x_{i+1})-w_{i+1}| ei=y(xi+1)wi+1
    其中 w i + 1 w_{i+1} wi+1初值为 y ( x i ) y(x_i) y(xi) 时迭代出的数值解
    对于某种方法,局部截断误差满足 e i = O ( h p + 1 ) e_i=O(h^{p+1}) ei=O(hp+1),则称该方法具有p阶精度。

    二、向前Euler法及误差分析

    1.向前Euler法

    先设步长相等,大小为h,对常微分方程 y ′ = f ( x , y ) y^{'}=f(x,y) y=f(x,y)中的倒数用均差近似,即
    y ( x i + 1 ) − y ( x i ) h ≈ y ′ = f ( x i , y ( x i ) ) \frac{y(x_{i+1})-y(x_i)}{h}\approx y^{'}=f(x_i,y(x_i)) hy(xi+1)y(xi)y=f(xi,y(xi))
    若初值已知,利用迭代格式
    { y 0 = y ( x 0 ) y i + 1 = y i + h f ( x i , y i ) \begin{cases} y_0=y(x_0)\\ y_{i+1}=y_i+hf(x_i,y_i) \end{cases} {y0=y(x0)yi+1=yi+hf(xi,yi)
    可逐次算出 y 1 , y 2 . . . . . y_1,y_2..... y1,y2.....

    2.误差分析

    对于精确值做泰勒展开式
    y ( x i + 1 ) = y ( x i ) + h y ′ ( x i ) + h 2 2 y ′ ′ ( c ) y(x_{i+1})=y(x_i)+hy^{'}(x_i)+\frac{h^2}{2}y^{''}(c) y(xi+1)=y(xi)+hy(xi)+2h2y(c)其中 c ∈ ( x i , x i + 1 ) c \in(x_i,x_{i+1}) c(xi,xi+1),其中 y ′ ( x i ) = f ( x i , y ( x i ) ) y^{'}(x_i)=f(x_i,y(x_i)) y(xi)=f(xi,y(xi))
    对于欧拉法的迭代格式,由局部截断误差定义可得
    y i + 1 = y ( x i ) + h y ′ ( x i ) y_{i+1}=y(x_i)+hy^{'}(x_i) yi+1=y(xi)+hy(xi)
    局部截断误差 e i = h 2 2 y ′ ′ ( c ) e_i=\frac{h^2}{2}y^{''}(c) ei=2h2y(c)

    3.后退Euler法

    通过利用均差近似倒数 y ′ ( x i + 1 ) y^{'}(x_{i+1}) y(xi+1)

    y ( x i + 1 ) − y ( x i ) h ≈ y ′ ( x i + 1 ) = f ( x i + 1 , y ( x i + 1 ) ) \frac{y(x_{i+1})-y(x_i)}{h}\approx y^{'}(x_{i+1})=f(x_{i+1},y(x_{i+1})) hy(xi+1)y(xi)y(xi+1)=f(xi+1,y(xi+1))
    因此后退欧拉法的递推公式为
    y i + 1 = y i + h f ( x i + 1 , y i + 1 ) y_{i+1}=y_i+hf(x_{i+1},y_{i+1}) yi+1=yi+hf(xi+1,yi+1)(1式)

    相比欧拉法,后退欧拉法的递推公式并不能直接进行计算,而需要解方程,即此公式是隐式的,而欧拉法的递推公式是可以直接计算的,即为显式的。隐式方程通常用迭代法求解,而迭代过程的实质是逐步隐式化。
    { y i + 1 0 = y i + h f ( x i , y i ) y i + 1 1 = y i + h f ( x i , y i + 1 0 ) . . . . . . y i + 1 k + 1 = y i + h f ( x i , y i + 1 k ) ( 2 式 ) \begin{cases} y_{i+1}^{0}=y_i+hf(x_i,y_i)\\ y_{i+1}^{1}=y_i+hf(x_i,y_{i+1}^{0}) \\ ......\\ y_{i+1}^{k+1}=y_i+hf(x_i,y_{i+1}^{k}) (2式) \end{cases} yi+10=yi+hf(xi,yi)yi+11=yi+hf(xi,yi+10)......yi+1k+1=yi+hf(xi,yi+1k)2
    由于f(x,y)满足Lipschitz条件,利用(1)式减去(2)式得到
    ∣ y i + 1 k + 1 − y i + 1 ∣ = h ( f ( x i , y i + 1 k ) − h f ( x i + 1 , y i + 1 ) ) ≤ h L ∣ y i + 1 k − y i + 1 ∣ |y_{i+1}^{k+1}-y_{i+1}|=h(f(x_i,y_{i+1}^{k})-hf(x_{i+1},y_{i+1}))\leq hL|y_{i+1}^{k}-y_{i+1}| yi+1k+1yi+1=h(f(xi,yi+1k)hf(xi+1,yi+1))hLyi+1kyi+1
    h L < 1 hL<1 hL<1则迭代法收敛到解 y i + 1 y_{i+1} yi+1

    三、改进欧拉公式

    补充:梯形方法
    y i + 1 = y i + h 2 ( f ( x i + 1 , y i + 1 ) + f ( x i , y i ) ) y_{i+1}=y_i+\frac{h}{2}(f(x_{i+1},y_{i+1})+f(x_{i},y_{i})) yi+1=yi+2h(f(xi+1,yi+1)+f(xi,yi))

    先用欧拉法求得一个初步的近似值 y ‾ i + 1 \overline{y}_{i+1} yi+1,称为预报值,然后用它替代梯形法右端的 y i + 1 y_{i+1} yi+1,得到左端校正值 y i + 1 {y}_{i+1} yi+1,可以校正n次,但是改进欧拉法中,我们只校正一次,这样建立的预报-校正系统称为改进的欧拉格式:
    { y ‾ i + 1 = y i + h f ( x i , y i ) y i + 1 = y i + h 2 ( f ( x i + 1 , y ‾ i + 1 ) + f ( x i , y i ) ) \begin{cases} \overline{y}_{i+1}=y_i+hf(x_i,y_i)\\ y_{i+1}=y_i+\frac{h}{2}(f(x_{i+1},\overline{y}_{i+1})+f(x_{i},y_{i})) \end{cases} {yi+1=yi+hf(xi,yi)yi+1=yi+2h(f(xi+1,yi+1)+f(xi,yi))
    也可以写成下面一个形式:
    { y p = y n + h f ( x n , y n ) y c = y n + h f ( x n , y p ) y n + 1 = 1 2 ( y p + y c ) \begin{cases} {y}_{p}=y_n+hf(x_n,y_n)\\ {y}_{c}=y_n+hf(x_n,y_p)\\ y_{n+1}=\frac{1}{2}(y_p+y_c) \end{cases} yp=yn+hf(xn,yn)yc=yn+hf(xn,yp)yn+1=21(yp+yc)

    四、单步法局部截断误差与阶

    初值问题 y ′ = f ( x , y ) y^{'}=f(x,y) y=f(x,y) y ( x 0 ) = y 0 y(x_0)=y_0 y(x0)=y0的单步法可用一般形式表示为
    y n + 1 = y n + h φ ( x n , y n , y n + 1 , h ) y_{n+1}=y_{n}+h\varphi(x_n,y_n,y_{n+1},h) yn+1=yn+hφ(xnynyn+1h)
    其中 φ ( x n , y n , y n + 1 , h ) \varphi(x_n,y_n,y_{n+1},h) φ(xnynyn+1h)称为增量函数
    显式单步法的表示形式
    y n + 1 = y n + h φ ( x n , y n , h ) y_{n+1}=y_{n}+h\varphi(x_n,y_n,h) yn+1=yn+hφ(xnynh)
    例如:对欧拉法 φ ( x n , y n , h ) = f ( x , y ) \varphi(x_n,y_n,h)=f(x,y) φ(xnynh)=f(x,y)
    对于显式单步法的局部截断误差
    T n + 1 = y ( x n + 1 ) − y ( x n ) − h φ ( x n , y ( x n ) , h ) T_{n+1}=y(x_{n+1})-y(x_{n})-h\varphi(x_n,y(x_n),h) Tn+1=y(xn+1)y(xn)hφ(xny(xn)h)

    五、龙格—库塔方法

    1.定义

    对于方程 y ′ = f ( x , y ) y^{'}=f(x,y) y=f(x,y)的等价积分形式

    y ( x n + 1 ) − y ( x n ) = ∫ x n x n + 1 f ( x , y ( x ) )   d x y(x_{n+1})-y(x_{n})=\int_{x_{n}}^{x_{n+1}} {f(x,y(x))} \ dx y(xn+1)y(xn)=xnxn+1f(x,y(x)) dx

    方程右端可用求积公式表示为
    ∫ x n x n + 1 f ( x , y ( x ) )   d x ≈ h ∑ i = 1 r c i f ( x n + λ i h , y ( x n + λ i h ) ) \int_{x_{n}}^{x_{n+1}} {f(x,y(x))} \ dx \approx h\sum_{i=1}^rc_if(x_n+\lambda_ih,y(x_n+\lambda_ih)) xnxn+1f(x,y(x)) dxhi=1rcif(xn+λih,y(xn+λih))
    一般来说点数r越多精度越高,上式右端相当于增量函数 φ ( x n , y n , h ) \varphi(x_n,y_n,h) φ(xnynh),为了得到便于计算的显示方法,将公式表示为
    y n + 1 = y n + h φ ( x n , y n , h ) y_{n+1}=y_n+h\varphi(x_n,y_n,h) yn+1=yn+hφ(xn,yn,h)
    其中
    φ ( x n , y n , h ) = ∑ i = 1 n c i K i \varphi(x_n,y_n,h)=\sum_{i=1}^n c_iK_i φ(xn,yn,h)=i=1nciKi
    K 1 = f ( x n , y n ) K_1=f(x_n,y_n) K1=f(xn,yn)
    K 2 = f ( x n + λ 2 h , y n + h u 21 K 1 ) , λ 2 = h K_2=f(x_n+\lambda_2h,y_n+hu_{21}K_1),\lambda_2=h K2=f(xn+λ2h,yn+hu21K1)λ2=h

    K i = f ( x n + λ i h , y n + h × ∑ j = 1 i − 1 u i j K j ) , λ i = ∑ j = 1 i − 1 u i j K_i=f(x_n+\lambda_ih,y_n+h\times \sum_{j=1}^{i-1} u_{ij}K_j),\lambda_i=\sum_{j=1}^{i-1} u_{ij} Ki=f(xn+λih,yn+h×j=1i1uijKj)λi=j=1i1uij
    将此方法称为龙格库r级塔显示方法

    2.常用的龙格库塔方法

    常用二阶显式龙格库塔方法
    y n + 1 = y n + h K 2 y_{n+1}=y_n+hK_2 yn+1=yn+hK2
    K 1 = f ( x n , y n ) K_1=f(x_n,y_n) K1=f(xn,yn)
    K 2 = f ( x n + h 2 , y n + h 2 K 1 ) K_2=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_1) K2=f(xn+2h,yn+2hK1)
    常用三阶
    y n + 1 = y n + h 6 ( K 1 + c 2 K 2 ) y_{n+1}=y_n+\frac{h}{6}(K_1+c2K_2) yn+1=yn+6h(K1+c2K2)
    K 1 = f ( x n , y n ) K_1=f(x_n,y_n) K1=f(xn,yn)
    K 2 = f ( x n + h 2 , y n + h 2 K 1 ) K_2=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_1) K2=f(xn+2h,yn+2hK1)
    K 3 = f ( x n + h , y n − h K 1 + 2 h K 2 ) K_3=f(x_n+h,y_n-hK_1+2hK_2) K3=f(xn+h,ynhK1+2hK2)
    常用四阶(记下来,要考,哈哈哈,matlab计算内核所在)
    y n + 1 = y n + h 6 ( K 1 + 2 K 2 + 2 K 3 + K 4 ) y_{n+1}=y_n+\frac{h}{6}(K_1+2K_2+2K_3+K_4) yn+1=yn+6h(K1+2K2+2K3+K4)
    K 1 = f ( x n , y n ) K_1=f(x_n,y_n) K1=f(xn,yn)
    K 2 = f ( x n + h 2 , y n + h 2 K 1 ) K_2=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_1) K2=f(xn+2h,yn+2hK1)
    K 3 = f ( x n + h 2 , y n + h 2 K 2 ) K_3=f(x_n+\frac{h}{2},y_n+\frac{h}{2}K_2) K3=f(xn+2h,yn+2hK2)
    K 4 = f ( x n + h , y n + h K 3 ) K_4=f(x_n+h,y_n+hK_3) K4=f(xn+h,yn+hK3)

    六、单步法的收敛性与稳定性

    1.收敛性与相容性

    定义:若一种数值方法(如单步法)对于固定的 x n = x 0 + n h x_n=x_0+nh xn=x0+nh,当 h → 0 h\rightarrow 0 h0 ,有 y n = y ( x n ) y_n=y(x_n) yn=y(xn),则称该方法收敛。
    定理:假设单步法具有p阶精度,且增量函数 φ ( x , y , h ) \varphi(x,y,h) φ(xyh)满足利普希茨条件
    ∣ φ ( x , y , h ) − φ ( x , y ‾ , h ) ∣ ≤ L φ ∣ y − y ‾ ∣ |\varphi(x,y,h)-\varphi(x,\overline{y},h)|\leq L_{\varphi}|y-\overline{y}| φ(xyh)φ(xyh)Lφyy
    又设初值准确,则其整体截断误差
    y ( x n ) − y n = O ( h p ) y(x_n)-y_n=O(h^p) y(xn)yn=O(hp)
    定义:若单步法 y n + 1 = y n + h φ ( x n , y n , h ) y_{n+1}=y_n+h{\varphi(x_n,y_n,h)} yn+1=yn+hφ(xn,yn,h)的增量函数满足 φ ( x , y , 0 ) = f ( x , y ) \varphi(x,y,0)=f(x,y) φ(x,y,0)=f(x,y),则称单步法与初值问题相容(前述的单步法是用了泰勒展开式略去高阶项近似,有用求积公式离散得到的数值方法,相容性指数值方法逼近微分方程,在 h → 0 h\rightarrow0 h0时,可得到 y ′ ( x ) = f ( x , y ) y^{'}(x)=f(x,y) y(x)=f(x,y)

    2.绝对稳定性与绝对稳定域

    定义:若一种数值方法在节点值 y n y_n yn上大小扰动为 δ \delta δ,于以后的节点值 y m ( m > n ) y_m(m>n) ym(m>n)上产生的偏差均不超过 δ \delta δ,则称该方法是稳定的
    定义:对于模型方程 y ′ = λ y y^{'}=\lambda y y=λy,使用单步法解模型方程 y n + 1 = E ( λ h ) y n y_{n+1}=E(\lambda h)y_n yn+1=E(λh)yn,若得到 ∣ E ( h λ ) ∣ < 1 |E(h\lambda )|<1 E(hλ)<1,则称该方法是绝对稳定的(以此可以来确定步长)。
    常用:对于四阶龙格库塔方法: − 2.78 < h λ < 0 -2.78<h\lambda<0 2.78<hλ<0,即 0 < h < − 2.78 / λ 0<h<-2.78/\lambda 0<h<2.78/λ

    展开全文
  • 我们的重点是开发和实施新的两步混合方法,用于直接求解一般的二阶常微分方程。 在该方法的开发中,采用幂级数作为基础函数,并且将出现的方程组微分系统并置在所有电网和离网点。 所得方程在选定点处插值。...
  • 它包括以下程序:Euler 方法、改进或修改的 Euler 方法和 Runge-Krutta 方法。 RK 方法包括一阶(欧拉法)、二阶... *图片由 Dennis Zill 和 Michael Cullen 在他们的书中提供:具有边界值问题的微分方程(第 7 版)*
  • 一阶微分方程的初值问题的matlab求解
  • 欧拉法、改进的欧拉法、龙格-库塔法求解初值问题

    万次阅读 多人点赞 2019-10-14 16:37:48
    求解初值问题简介前期准备欧拉法改进的欧拉法龙格-库塔法三级三阶显式Kutta公式三级四阶显式Heun公式四级四阶显式Kutta公式四级四阶显式Gill公式 简介 通过求解简单的初值问题: {dudx=f(x,u)(1)u(x0)=u0(2) \begin{...

    简介

    通过求解简单的初值问题:
    { d u d x = f ( x , u ) ( 1 ) u ( x 0 ) = u 0 ( 2 ) \begin{cases} \dfrac{du}{dx}=f(x,u)&&&&&&(1)\\ u(x_0)=u_0&&&&&&(2) \end{cases} dxdu=f(x,u)u(x0)=u0(1)(2)
    引入欧拉法、改进的欧拉法、龙格-库塔法等。

    前期准备

    数值解法的基本思想就是先对 x x x u ( x ) u(x) u(x)在区间 [ x 0 , ∞ ) [x_0,\infty) [x0,)上进行离散化,然后构造递推公式,再进一步得到 u ( x ) u(x) u(x)在这些位置的近似取值。

    • 取定步长 h h h,令 x n = x 0 + n h ( n = ± 1 , ± 2 , ⋯   ) x_n=x_0+nh(n=\pm1,\pm2,\cdots) xn=x0+nh(n=±1,±2,)
    • 得到离散的位置: x 1 , x 2 , ⋯   , x n , ⋯ x_1,x_2,\cdots,x_n,\cdots x1,x2,,xn,
    • u ( x ) u(x) u(x)在这些点精确取值为: u ( x 1 ) , u ( x 2 ) , ⋯   , u ( x n ) , ⋯ u(x_1),u(x_2),\cdots,u(x_n),\cdots u(x1),u(x2),,u(xn),
    • 利用数值解法得到的这些点的近似取值,记为 u 1 , u 2 , ⋯   , u n , ⋯ u_1,u_2,\cdots,u_n,\cdots u1,u2,,un,

    欧拉法

    欧拉法的核心就是将导数近似为差商。
    将导数近似为向前差商,则有:
    d u d x ∣ x = x n ≈ u ( x n + 1 ) − u ( x n ) h \left.\dfrac{du}{dx}\right|_{x=x_n} \approx \frac{u(x_{n+1})-u(x_n)}{h} dxdux=xnhu(xn+1)u(xn)
    代入(1)式,有:
    u ( x n + 1 ) = y ( x n ) + h f ( x n , u ( x n ) ) u(x_{n+1})=y(x_{n})+hf(x_n,u(x_n)) u(xn+1)=y(xn)+hf(xn,u(xn))
    u n + 1 u_{n+1} un+1 u n u_n un代替 u ( x n + 1 ) u(x_{n+1}) u(xn+1) u ( x n ) u(x_n) u(xn),得:
    u n + 1 = u n + h f ( x n , u n ) u_{n+1}=u_{n}+hf(x_n,u_n) un+1=un+hf(xn,un)
    因此,若知道 u 0 u_0 u0我们就可以递归出 u 1 , u 2 , ⋯ u_1,u_2,\cdots u1,u2,
    如果将导数近似为向后差商:
    d u d x ∣ x = x n ≈ u ( x n ) − u ( x n − 1 ) h \left.\dfrac{du}{dx}\right|_{x=x_n} \approx \frac{u(x_{n})-u(x_{n-1})}{h} dxdux=xnhu(xn)u(xn1)
    类似的,就可以得到:
    u n − 1 = u n − h f ( x n , u n ) u_{n-1}=u_{n}-hf(x_n,u_n) un1=unhf(xn,un)
    这样,若知道 u 0 u_0 u0我们就可以递归出 u − 1 , u − 2 , ⋯ u_{-1},u_{-2},\cdots u1,u2,

    改进的欧拉法

    ( 1 ) (1) (1)式在 [ x n , x n + 1 ] [x_n,x_{n+1}] [xn,xn+1]上积分,可得:
    u ( x n + 1 ) = u ( x n ) + ∫ x n x n + 1 f ( x , u ) d x u(x_{n+1})=u(x_{n})+\int^{x_{n+1}}_{x_n}f(x,u)dx u(xn+1)=u(xn)+xnxn+1f(x,u)dx
    其中, n = 0 , 1 , ⋯ n=0,1,\cdots n=0,1,。用不同方式来近似上式的积分运算,就会得到不同的递推公式。若使用左端点计算矩形面积并取近似:
    ∫ x n x n + 1 f ( x , u ) d x ≈ h f ( x n + 1 , u ( x n + 1 ) ) \int^{x_{n+1}}_{x_n}f(x,u)dx\approx hf(x_{n+1},u(x_{n+1})) xnxn+1f(x,u)dxhf(xn+1,u(xn+1))
    代入上式得:
    u n + 1 = u n + h f ( x n , u n ) u_{n+1}=u_{n}+hf(x_{n},u_{n}) un+1=un+hf(xn,un)
    若使用梯形的面积做近似:
    ∫ x n x n + 1 f ( x , y ) d x ≈ h 2 [ f ( x n , u ( x n ) ) + f ( x n + 1 , u ( x n + 1 ) ) ] \int^{x_{n+1}}_{x_n}f(x,y)dx\approx\frac{h}{2}[f(x_{n},u(x_{n}))+f(x_{n+1},u(x_{n+1}))] xnxn+1f(x,y)dx2h[f(xn,u(xn))+f(xn+1,u(xn+1))]
    得到:
    u n + 1 = u n + h 2 [ f ( x n , u n ) + f ( x n + 1 , u n + 1 ) ] u_{n+1}=u_{n}+\frac{h}{2}[f(x_{n},u_{n})+f(x_{n+1},u_{n+1})] un+1=un+2h[f(xn,un)+f(xn+1,un+1)]
    欧拉法虽然精度偏低,但它是显式的,可直接得到结果。而梯形公式是隐式的,虽然精度较高,却无法通过一步计算得到结果,若用迭代法计算,运算量较大。综合这两种方法,可以相得益彰:先用显式格式却低精度的欧拉法计算得到一个粗略的预测值 u ˉ n + 1 \bar{u}_{n+1} uˉn+1,再将这个预测值代入梯形公式进行修正,得到较高精度的结果 u n + 1 u_{n+1} un+1
    { u ˉ n + 1 = u n + h f ( x n , u n ) u n + 1 = u n + h 2 [ f ( x n , u n ) + f ( x n + 1 , u ˉ n + 1 ) ] \begin{cases} \bar{u}_{n+1}=u_{n}+hf(x_{n},u_{n})\\ u_{n+1}=u_n+\dfrac{h}{2}[f(x_{n},u_{n})+f(x_{n+1},\bar{u}_{n+1})] \end{cases} uˉn+1=un+hf(xn,un)un+1=un+2h[f(xn,un)+f(xn+1,uˉn+1)]

    龙格-库塔法

    将以上两种方法分别写成如下形式:
    { u n + 1 = u n + h K 1 K 1 = f ( x n , u n ) \begin{cases} u_{n+1}=u_{n}+hK_1\\ K_1=f(x_{n},u_{n}) \end{cases} {un+1=un+hK1K1=f(xn,un)
    { u n + 1 = u n + h 2 ( K 1 + K 2 ) K 1 = f ( x n , u n ) K 2 = f ( x n + h , u n + K 1 ) \begin{cases} u_{n+1}=u_{n}+\dfrac{h}{2}(K_1+K_2)\\ K_1=f(x_{n},u_{n})\\ K_2=f(x_{n}+h,u_{n}+K_1) \end{cases} un+1=un+2h(K1+K2)K1=f(xn,un)K2=f(xn+h,un+K1)
    上述方法都是通过 f ( x , u ) f(x,u) f(x,u)在不同位置的线性组合来计算 u n + 1 u_{n+1} un+1的值,所考虑的位置越多,精度也越高。类似的,就得到龙格-库塔法的思想:如果用 f ( x , u ) f(x,u) f(x,u)在更多位置的线性组合来构造递推公式,将会得到更高的精度。
    这样,递推公式将有如下形式:
    { u n + 1 = u n + h ∑ i = 1 r R i K i K 1 = f ( x n , u n ) K i = f ( x n + a i h , u n + ∑ j = 1 i − 1 b i j K j ) , i = 2 , 3 , ⋯   , r \begin{cases} u_{n+1}=u_{n}+h\sum\limits_{i=1}^{r} R_i K_i\\ K_1=f(x_{n},u_{n})\\ K_i=f(x_{n}+a_i h,u_{n}+\sum\limits_{j=1}^{i-1} b_{ij} K_j), i=2,3,\cdots,r \end{cases} un+1=un+hi=1rRiKiK1=f(xn,un)Ki=f(xn+aih,un+j=1i1bijKj),i=2,3,,r
    其中, R i , a i , b i j R_{i},a_i,b_{ij} Ri,ai,bij为待定常数。(利用 T a y l o r Taylor Taylor展开就可以确定待定系数)

    标准四阶显式Kutta公式

    { y n + 1 = y n + h 6 ( K 1 + 4 K 2 + K 3 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 2 h , y n + 1 2 h K 1 ) , K 3 = f ( x n + h , y n − h K 1 + 2 h K 2 ) ; \begin{cases} y_{n+1}=y_n+\dfrac{h}{6}(K_1+4K_2+K_3),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{2}h,y_n+\frac{1}{2}h K_1),\\ K_3=f(x_n+h,y_n-h K_1+2h K_2); \end{cases} yn+1=yn+6h(K1+4K2+K3),K1=f(xn,yn),K2=f(xn+21h,yn+21hK1),K3=f(xn+h,ynhK1+2hK2);

    三级三阶显式公式

    { y n + 1 = y n + h 4 ( K 1 + 3 K 3 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 3 h , y n + 1 3 h K 1 ) , K 3 = f ( x n + 2 3 h , y n + 2 3 h K 2 ) ; \begin{cases} y_{n+1}=y_n+\dfrac{h}{4}(K_1+3K_3),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{3}h,y_n+\frac{1}{3}h K_1),\\ K_3=f(x_n+\frac{2}{3}h,y_n+\frac{2}{3}h K_2); \end{cases} yn+1=yn+4h(K1+3K3),K1=f(xn,yn),K2=f(xn+31h,yn+31hK1),K3=f(xn+32h,yn+32hK2);

    四级四阶显式Kutta公式

    { y n + 1 = y n + h 8 ( K 1 + 3 K 2 + 3 K 3 + K 4 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 3 h , y n + 1 3 h K 1 ) , K 3 = f ( x n + 2 3 h , y n − 2 3 h K 1 + h K 2 ) , K 4 = f ( x n + h , y n + h K 1 − h K 2 + h K 3 ) ; \begin{cases} y_{n+1}=y_n+\frac{h}{8}(K_1+3K_2+3K_3+K_4),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{3}h,y_n+\frac{1}{3}h K_1),\\ K_3=f(x_n+\frac{2}{3}h,y_n-\frac{2}{3}h K_1+h K_2),\\ K_4=f(x_n+h,y_n+h K_1-h K_2+h K_3); \end{cases} yn+1=yn+8h(K1+3K2+3K3+K4),K1=f(xn,yn),K2=f(xn+31h,yn+31hK1),K3=f(xn+32h,yn32hK1+hK2),K4=f(xn+h,yn+hK1hK2+hK3);

    四级四阶显式Gill公式

    { y n + 1 = y n + h 6 ( K 1 + ( 2 − 2 ) K 2 + ( 2 + 2 ) K 3 + K 4 ) , K 1 = f ( x n , y n ) , K 2 = f ( x n + 1 2 h , y n + 1 2 h K 1 ) , K 3 = f ( x n + 1 2 h , y n + 2 − 1 2 h K 1 + ( 1 − 2 2 ) h K 2 ) , K 4 = f ( x n + h , y n − 2 2 h K 2 + ( 1 + 2 2 ) h K 3 ) ; \begin{cases} y_{n+1}=y_n+\frac{h}{6}(K_1+(2-\sqrt{2})K_2+(2+\sqrt{2})K_3+K_4),\\ K_1=f(x_n,y_n),\\ K_2=f(x_n+\frac{1}{2}h,y_n+\frac{1}{2}h K_1),\\ K_3=f(x_n+\frac{1}{2}h,y_n+\frac{\sqrt{2}-1}{2}h K_1+(1-\frac{\sqrt{2}}{2})h K_2),\\ K_4=f(x_n+h,y_n-\frac{\sqrt{2}}{2}h K_2+(1+\frac{\sqrt{2}}{2})h K_3); \end{cases} yn+1=yn+6h(K1+(22 )K2+(2+2 )K3+K4),K1=f(xn,yn),K2=f(xn+21h,yn+21hK1),K3=f(xn+21h,yn+22 1hK1+(122 )hK2),K4=f(xn+h,yn22 hK2+(1+22 )hK3);

    示例

    求解常微分方程:
    { d y d x = x 3 − y x , y ( 1 ) = 2 5 . \begin{cases} \dfrac{dy}{dx}=x^3-\dfrac{y}{x},\\ y(1)=\dfrac{2}{5}. \end{cases} dxdy=x3xy,y(1)=52.
    要求步长为 h = 0.1 h=0.1 h=0.1,其中,精确解为
    y = 1 5 x 4 + 1 5 x . y=\frac{1}{5}x^4+\frac{1}{5x}. y=51x4+5x1.

    MATLAB代码

    clear all,close all,clc
    f=@(x,y)x^3-y/x;
    h=0.1;
    %% Euler method
    x=[1:h:2];
    N=size(x,2)-1;
    y1=[2/5,zeros(1,N)];
    for n=1:N
        y1(n+1)=y1(n)+h*f(x(n),y1(n));
    end
    %% Improved Euler method
    y2=[2/5,zeros(1,N)];
    for n=1:N
        y2(n+1)=y2(n)+h*f(x(n),y2(n));
        y2(n+1)=y2(n)+h/2*(f(x(n),y2(n))+f(x(n+1),y2(n+1)));
    end
    %% Standard fourth-order explicit Kutta formula
    y3=[2/5,zeros(1,N)];
    for n=1:N
        K1=f(x(n),y3(n));
        K2=f(x(n)+1/2*h,y3(n)+1/2*h*K1);
        K3=f(x(n)+h,y3(n)-h*K1+2*h*K2);
        y3(n+1)=y3(n)+h/6*(K1+4*K2+K3);
    end
    %% Three-level three-order explicit formula
    y4=[2/5,zeros(1,N)];
    for n=1:N
        K1=f(x(n),y4(n));
        K2=f(x(n)+1/3*h,y4(n)+1/3*h*K1);
        K3=f(x(n)+2/3*h,y4(n)+2/3*h*K2);
        y4(n+1)=y4(n)+h/4*(K1+3*K3);
    end
    %% Fourth-level fourth-order explicit Kutta formula
    y5=[2/5,zeros(1,N)];
    for n=1:N
        K1=f(x(n),y5(n));
        K2=f(x(n)+1/3*h,y5(n)+1/3*h*K1);
        K3=f(x(n)+2/3*h,y5(n)-1/3*h*K1+h*K2);
        K4=f(x(n)+h,y5(n)+h*K1-h*K2+h*K3);
        y5(n+1)=y5(n)+h/8*(K1+3*K2+3*K3+K4);
    end
    %% Fourth-level fourth-order explicit Gill formula
    y6=[2/5,zeros(1,N)];
    for n=1:N
        K1=f(x(n),y6(n));
        K2=f(x(n)+1/2*h,y6(n)+1/2*h*K1);
        K3=f(x(n)+1/2*h,y6(n)+(sqrt(2)/2-0.5)*h*K1+(1-sqrt(2)/2)*h*K2);
        K4=f(x(n)+h,y6(n)-sqrt(2)/2*h*K2+(1+sqrt(2)/2)*h*K3);
        y6(n+1)=y6(n)+h/6*(K1+(2-sqrt(2))*K2+(2+sqrt(2))*K3+K4);
    end
    y=1/5*x.^4+1./(5*x);  %  Exact solution
    
    plot(x,y,'k',x,y1,'xr',x,y2,'ob','Markersize',10,'LineWidth',1.5)
    axis([1 2.1 0 4.5]),xlabel x,ylabel u
    legend('Exact','Euler','Improved Euler')
    
    %plot(x,y,'k',x,y3,'*r',x,y4,'+b',x,y5,'-y',x,y6,'or','Markersize',10,'LineWidth',1.5)
    %axis([1 2.1 0 6]),xlabel x,ylabel u,set(gca,'Fontsize',18)
    %legend('Exact','34Kutta','33kutta','44Kutta','44Gill')
    
    

    结果

    在这里插入图片描述

    展开全文
  • 关于初值问题的解 实例 代码 #include<iostream> using namespace std; double h; double x[100],y[100]; double f(double x0, double y0) { return -2*x0/y0 + y0; } void Eluer() { for(int i=1;i&...

    介绍

    关于初值问题的解
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    实例

    在这里插入图片描述在这里插入图片描述

    代码

    #include<iostream>
    using namespace std;
    
    double h;
    double x[100],y[100];
    
    double f(double x0, double y0)
    {
    	return -2*x0/y0 + y0;	
    }
    
    void Eluer()
    {
    	for(int i=1;i<10;i++)
    	{
    		y[i] = y[i-1] + h*f(x[i-1],y[i-1]);
    		cout<<x[i]<<" "<<y[i]<<endl;
    	}
    }
    
    int main()
    {
    	cout<<"输入迭代的步长:"<<endl;
    	cin>>h;
    	cout<<"输入初始值x,y"<<endl;
    	cin>>x[0]>>y[0];
    	for(int i=1;i<10;i++)  x[i] = x[0] + i*h;
    //	for(int i=1;i<10;i++)  cout<<x[i]<<" ";cout<<endl; 
    	Eluer();
    	return 0;
    }
    

    结果(解与实例中对应 ):
    在这里插入图片描述

    Euler 改进算法

    在这里插入图片描述

    实例

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    代码

    #include<iostream>
    using namespace std;
    
    double h;
    double x[100],y[100],c[100];
    
    double f(double x0, double y0)
    {
    	return -2*x0/y0 + y0;	
    }
    
    void Eluer()
    {
    	for(int i=1;i<10;i++)
    	{
    		c[i] = y[i-1] + h*f(x[i-1],y[i-1]);
    		y[i] = y[i-1] + h/2*(f(x[i-1],y[i-1])+f(x[i],c[i]));
    		cout<<x[i]<<" "<<y[i]<<endl;
    	}
    }
    
    int main()
    {
    	cout<<"输入迭代的步长:"<<endl;
    	cin>>h;
    	cout<<"输入初始值x,y"<<endl;
    	cin>>x[0]>>y[0];
    	for(int i=1;i<10;i++)  x[i] = x[0] + i*h;
    //	for(int i=1;i<10;i++)  cout<<x[i]<<" ";cout<<endl; 
    	Eluer();
    	return 0;
    }
    

    结果(解与实例中对应 ):
    在这里插入图片描述

    展开全文
  • {y′=y−y2x​y(0)=1​ x∈[0,2] \mathbf{x} \in[0,2] x∈[0,2] 初值问题的解(小数点后保留8位小数),取h = 0.05. 【作业要求】: 将各种方法求出的解连同精确解使用同一个表格进行数据比较; 画出精确解(见教材...
  • 在本说明中,我们考虑一些与数值积分方法的准确性和稳定性有关的基本问题,这些问题遵循一阶和二阶初值问题(IVP)的解决方案。 其中包括有关多种解决方案,多步方法,初始值扰动的影响以及在二阶问题中减慢和推进...
  • 一般力学初值问题的广义变分原理的研究,是一个相当重要的研究领域。它不仅在有限元素法和其他近似 计算方法中得到广泛应用,而且可以方便地求得一般力学初值问题的精确解。首先,明确了一般力学初值问题的基 本方程,...
  • 针对非线性常微分方程定解问题以及非线性常微分方程奇异摄动初值问题的诸多研究,指出一类三阶非线性奇摄动初值问题存在套层解.通过理论分析证实解的边界层项的指数性质,使用微分不等式和比较定理,揭示了问题解的套层...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,126
精华内容 38,050
关键字:

初值问题