精华内容
下载资源
问答
  • 常微分方程欧拉方程
    千次阅读
    2021-04-20 06:30:04

    一阶常微分方程欧拉法与梯形公式局部截断误差与p阶精度Range

    * 一阶常微分方程 欧拉法与梯形公式 局部截断误差与p阶精度 Range-Kutta公式 常微分方程MATLAB求解 《数值分析》 23 ? ? ? ? ? 例1.一阶常微分方程 求解区域: 0≤ x ≤ 1.5 2/16 解曲线的斜率 转化为方向余弦 例2. Logistic模型 初值条件y(0)=0.2 一阶常微分方程初值问题: 数值方法——取定离散点: x0 < x1 < x2 < ··· < xN 其中, y = y(x) 是未知函数, 右端函数 f(x, y )是已知函数, 初值 y0 是已知数据。 求未知函数 y(x) 在离散点处的近似值 y1, y2, y3, ·····, yN 3/16 ? 4/16 取定步长: h,记 xn = x0 + nh, ( n = 1,2, ···, N ) Euler公式: yn+1 = yn + h f( xn, yn ) 求近似解: y’ = f (x, y) 梯形公式: 左矩形公式 用数值积分方法离散化常微分方程 6/16 ? 预-校方法又称为修正的Euler法,算法如下 k1 = f(xn , yn) , k2 = f( xn+1 , yn+ h k1) , 由梯形公式推出的预-校方法: 7/16 ? 设 yn= y(xn), 称 Rn+1=y(xn+1) - yn+1为局部截断误差. 即 由泰勒公式 Euler公式: yn+1 = yn+ hf (xn, yn) 的局部截断误差 y(xn+1) – yn+1=y(xn) – yn+ O(h2) = O(h2) 9/16 Euler公式的局部截断误差记为: O(h2) 称Euler公式具有1阶精度。 若局部截断误差为: O(h p +1) 则称显式单步法具有 p 阶精度 。 例 3 证明修正的Euler法具有2阶精度 14/16 将预测公式 代入 得 yn+1 = yn + 0.5h[f(xn,yn)+f(xn+1, yn+hf(xn, yn))] f(xn+1, yn+hf(xn, yn))= f(xn+h, yn+hf(xn, yn)) = f (xn, yn)+h[fx’]n + hf(xn,yn) [fy’]n + O(h2) ? 利用台劳展开式 y(xn+1)=y(xn)+hy’(xn)+0.5h2y”(xn)+O(h3) 0.5h[f(xn,yn)+f(xn+1, yn+hf(xn, yn))] =hy’(xn)+0.5h2y”(xn)+ O(h3) 局部截断误差: y(xn+1) – yn+1 = y(xn) – yn =O(h3) 故修正的Euler法具有2阶精度。 11/16 yn+1 = yn + hy’(xn)+0.5h2y”(xn)+ O(h3) 三阶Range-Kutta公式一般形式 yn+1= yn+ h[k1+4k2+k3]/6 k1=f(xn,yn), k2=f(xn+0.5h, yn+0.5hk1) k3=f(xn+h, yn – hk1+2hk2) 四阶Range-Kutta公式一般形式 yn+1= yn+ h[k1+2k2+2k3+k4]/6 k1=f(xn,yn), k2=f(xn+0.5h, yn+0.5hk1) k3=f(xn+0.5h, yn+0.5hk2), k4=f(xn+h, yn+hk3) 12/16 例4 数值实验:几种不同求数值解公式的误差比较 n 10 20 30 40 h 0.2 0.1 0.0667 0.05 RK4 6.862e-005 3.747e-006 7.071e-007 2.186e-007 RK3 0.0012 1.529e-004 4.517e-005 1.906e-005 RK2 0.0123 0.0026 0.0011 5.9612e-004 Euler 0.1059 0.0521 0.0342 0.0256 13/16 *

    更多相关内容
  • 对于难解的常微分方程,使用matlab求数值解 分两个m文件,一个为调用指令,一个为原函数 可以根据自己的所求方程不同适当修改代码求解 每一步都有注释,一边看注释一边体会才是提升的最好办法
  • 通过本次实验,熟悉求解常微分方程初值问题的有关方法和理论,主要是欧拉法、改进欧拉法、四阶龙格库塔法,学会编制这两种方法的计算程序。体会这两种解法的功能、优缺点及适用场合。 解初值问题,并在屏幕上按适当...
  • 可以对常微分方程进行欧拉变换求欧拉解,便于初学者使用
  • 【资源内容】:MATLAB实现欧拉法求解常微分方程组 【代码特点】:参数化编程、参数可方便更改、代码编程思路清晰、注释明细 【适用对象】:工科生、数学专业、信号处理专业学生等
  • 微分方程在实际应用中十分广泛,涉及领域众多,但对于微分方程的数值解的计算仍然有很大挑战。本文着重对微分方程数值解求解的常用的一类基础方法——欧拉法进行在MAILAB的应用下的一个简单介绍。
  • 采用欧拉法、改进欧拉法、龙格库塔法(经典RK法)求解常微分方程初值问题的自编MATLAB代码。所有函数均独立成文件便于移植。代码的使用结合一个具体题目说明,题目来源为浙江大学数值计算方法作业。
  • 摘要:工程计算中常微分方程的欧拉解法存在一定的误差,而实际往往要求其满足一定的精度。以工程中的一个常微分方程为例 , 运用C ++程序对其欧拉解法的误差进行分析
  • Euler 法求解常微分方 阿达姆斯预测校正方法求解常微分方程数值解改进的欧拉法求解常微分方程龙格库塔方法求解常微分方程数值解
  • 常微分方程初值问题的欧拉方法及其改进的欧拉方法的Matlab实现,纪秀浩,,欧拉(Euler)方法及改进的欧拉方法是解决常微分方程初值问题常用的数值解法,但Matlab的工具箱中没有Euler方法的功能函数。本文在简要介
  • 应用matlab软件对常微分方程求解;前沿;一常微分方程组的符号解(4)若边界条件少于方程组的阶数则返回的结果r中会出现任意常数C1C2(6)若没有给定输出参量则在命令窗口显示解列表若该命令找不到解析解则返回一警告信息...
  • 常微分方程数值解:欧拉公式

    千次阅读 2016-01-12 12:15:38
    对于常微分方程初值问题 在求解区间[a,b]上作等距分割的剖分,步长,记。用数值微商的方法,即用差商近似微商数值求解常微分方程。 用向前差商近似 做出y(x)的在x=x0处的一阶向前差商式:  又,于是得到...

    算法原理

    对于常微分方程初值问题


    在求解区间[a,b]上作等距分割的剖分,步长,记。用数值微商的方法,即用差商近似微商数值求解常微分方程。

    用向前差商近似

    做出y(x)的在x=x0处的一阶向前差商式: 


    ,于是得到


    而y(x1)的近似值y1可按

     或 

    求得。类似地,由

     以及 

    得到计算近似值的向前欧拉公式:


    由差商(差分)得到的上述方程称为差分方程。

    由yn直接算出yn+1值的计算格式称为显式格式,向前欧拉公式是显式格式。


    算法流程


    算法代码

    [cpp]  view plain copy
    1.   //欧拉公式代码  
    2. #include<iostream>  
    3. #include<string>  
    4. #include<vector>  
    5. using namespace std;  
    6.   
    7. double f(double x,double y){  
    8.     return -50*y;  
    9. }  
    10.   
    11. vector<double> Euler(double x0,double y0,double h,int N){  
    12.     vector<double> Y(N,0);  
    13.     double x=x0;  
    14.     Y[0]=y0;  
    15.     for(int n=1;n<N;n++){  
    16.         Y[n] = Y[n-1] + h*f(x,Y[n-1]);  
    17.         x += h;  
    18.     }  
    19.     return Y;  
    20. }  
    21.   
    22. int main(){  
    23.     char a='n';  
    24.     do{  
    25.         cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;  
    26.         double h;  
    27.         int N;  
    28.         cin>>h>>N;  
    29.         cout<<"请输入要初始函数点(x0,y0):"<<endl;  
    30.         double x0;  
    31.         double y0;  
    32.         cin>>x0>>y0;  
    33.         vector<double> Y=Euler(x0,y0,h,N+1);  
    34.         cout<<"欧拉格式计算结果为:  "<<endl;  
    35.         for(int i=0;i<N+1;i++){  
    36.             cout<<x0+i*h<<"     "<<Y[i]<<endl;  
    37.         }  
    38.         cout<<"是否要继续?(y/n)"<<endl;  
    39.         cin>>a;  
    40.     }while(a=='y');  
    41.         return 0;  
    42. }  
    43.   
    44.   
    45.   
    46. //改进的欧拉公式  
    47. #include<iostream>  
    48. #include<string>  
    49. #include<vector>  
    50. using namespace std;  
    51.   
    52. double f(double x,double y){  
    53.     return y-(2*x)/y;  
    54. }  
    55.   
    56. vector<double> ImprovedEuler(double x0,double y0,double h,int N){  
    57.     vector<double> Y(N,0);  
    58.     Y[0]=y0;  
    59.     double x=x0;  
    60.     double p=0;  
    61.     double c=0;  
    62.     for(int n=1;n<N;n++){  
    63.         p=Y[n-1]+h*f(x,Y[n-1]);  
    64.         x +=h;  
    65.         c=Y[n-1]+h*f(x,p);  
    66.         Y[n]=(p+c)/2;  
    67.     }  
    68.     return Y;  
    69. }  
    70.   
    71. int main(){  
    72.     char a='n';  
    73.     do{  
    74.         cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;  
    75.         double h;  
    76.         int N;  
    77.         cin>>h>>N;  
    78.         cout<<"请输入要初始函数点(x0,y0):"<<endl;  
    79.         double x0;  
    80.         double y0;  
    81.         cin>>x0>>y0;  
    82.         vector<double> Y=ImprovedEuler(x0,y0,h,N+1);  
    83.         cout<<"欧拉格式计算结果为:  "<<endl;  
    84.         for(int i=0;i<N+1;i++){  
    85.             cout<<x0+i*h<<"     "<<Y[i]<<endl;  
    86.         }  
    87.         cout<<"是否要继续?(y/n)"<<endl;  
    88.         cin>>a;  
    89.     }while(a=='y');  
    90.         return 0;  
    91. }  

    实验过程原始记录

    (1)分别取h=0.05,N=10;h=0.025,N=20;h=0.01,N=50,用显式欧拉方法求解微分方程初值 问题:y’=-50y,y(0)=10

    h=0.05,N=10


    h=0.025,N=20


    h=0.01,N=50


    (2)用改进的欧拉格式计算下列一阶常微分方程初值问题

    其解析解为: 


    实验结果及分析

    1、欧拉公式用以求解常微分方程中的定解问题
    2、可以看出,欧拉公式的精度很低,对于不同的步长求得相同点处的值差距可能很大;而且计算中的误差会累计。但显式欧拉公式取向前差商作为平均斜率,计算简单,且利于编写计算机程序,所以对于一些简单函数仍有很大的价值。
    3、改进的欧拉公式是欧拉方法和梯形方法的综合,也是一种显式算法,计算简单,利于编写程序,与欧拉公式相比大大提高了精度。

    (转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

    展开全文
  • 欧拉法解常微分方程

    2018-10-14 11:47:52
    除MATLAB系统的求解工具外,欧拉法求解常微分方程的MATLAB语言
  • import matplotlib.pyplot as plt import numpy as np y = 1 x = 0 xx = np.random.random(100) yy = np.random.random(100) for i in range (0,100): y = 1.1*y - 0.2*x/y ...plt.title("欧拉") plt.plot(.
    import matplotlib.pyplot as plt
    import numpy as np
    y = 1
    x = 0
    xx = np.random.random(100)
    yy = np.random.random(100)
    for i in range (0,100):
        y = 1.1*y - 0.2*x/y
        x = x + 0.01
        xx[i] = x
        yy[i] = y
    print(xx)
    print(yy)
    plt.title("欧拉")
    plt.plot(xx, yy)
    plt.show()

     

     

    展开全文
  • 计算方法实验实+常微分方程+欧拉法、改进欧拉法、四阶龙格库塔法
  • 它包括以下程序:Euler 方法、改进或修改的 Euler 方法和 Runge-Krutta 方法。 RK 方法包括一阶(欧拉法)、二阶... *图片由 Dennis Zill 和 Michael Cullen 在他们的书中提供:具有边界值问题的微分方程(第 7 版)*
  • 欧拉方法与改进欧拉方法 一、算法原理 对给定微分方程 { y ′ = f ( x , y ) y ( x 0 ) = y 0 (1) \begin{cases} y' = f(x,y)\\ y(x_0) = y_0 \end{cases}\tag{1} {y′=f(x,y)y(x0​)=y0​​(1) 在xn到xn+1上积分,...

    欧拉方法与改进欧拉方法


    一、算法原理

    对给定微分方程
    { y ′ = f ( x , y ) y ( x 0 ) = y 0 (1) \begin{cases} y' = f(x,y)\\ y(x_0) = y_0 \end{cases}\tag{1} {y=f(x,y)y(x0)=y0(1)
    在xn到xn+1上积分,得到

    y n + 1 = y n + ∫ x n x n + 1 f ( t , y ( t ) ) d t (2) y_{n+1} = y_n + \int_{x_n}^{x_{n+1}}f(t,y(t))dt \tag{2} yn+1=yn+xnxn+1f(t,y(t))dt(2)

    如果用左矩形公式做了个(2)式中积分的近似,那可以得到欧拉公式。
    y n + 1 = y n + h f ( x n , y n ) (3) y_{n+1} = y_n +hf(x_n,y_n) \tag{3} yn+1=yn+hf(xn,yn)(3)

    但用左矩形公式,结果当然是不够好的,现用梯形方法替代等式(2)式中积分,得到

    y n + 1 = y n + h 2 ( f ( x n , y n ) + f ( x n + 1 , y n + 1 ) ) (4) y_{n+1} = y_n +\frac{h}{2}(f(x_n,y_n)+f(x_{n+1},y_{n+1}))\tag{4} yn+1=yn+2h(f(xn,yn)+f(xn+1,yn+1))(4)

    可以看到等式右边出现了一项 f ( x n + 1 , y n + 1 ) f(x_{n+1},y_{n+1}) f(xn+1,yn+1),里面也有一项需要求的目标值 y n + 1 y_{n+1} yn+1,为使计算简单,将这一项 f f f里的 y n + 1 y_{n+1} yn+1用旧欧拉方法,也就是(3)式得到的值(避免混淆可以记为 y p y_p yp)代入,上等式的结果记为 y c y_c yc。最终可以采取平均的形式
    { y p = y n + h f ( x n , y n ) y c = y n + h f ( x n + 1 , y p ) y n + 1 = ( y p + y c ) / 2 (5) \begin{cases} y_{p} = y_n +hf(x_n,y_n) \\ y_{c} = y_n +hf(x_{n+1},y_p)\\ y_{n+1} = (y_p +y_c)/2 \end{cases}\tag{5} yp=yn+hf(xn,yn)yc=yn+hf(xn+1,yp)yn+1=(yp+yc)/2(5)

    综上总结,改进欧拉方法就是旧欧拉方法和梯形近似积分的结合。

    二、数值算例

    (题目来源于李庆杨《数值分析》计算实习题)
    给定初值问题
    { y ′ = 1 x 2 − y x , x ∈ [ 1 , 2 ] y ( 1 ) = 1 \begin{cases} y' = \frac{1}{x^2} - \frac{y}{x} , x\in [1,2]\\ y(1) = 1 \end{cases} {y=x21xy,x[1,2]y(1)=1
    用欧拉方法和改进欧拉法(h = 0.05)求 x ∈ [ 1 , 2 ] x \in [1,2] x[1,2]的数值解。

    import sympy as sympy
    
    
    class Euler:    #欧拉算法类
        def __init__(self, h, x0, y0, f ,a,b):        #h为步长,x0和y0为初值,f为微分方程y' = f(x,y),ab为所要计算的区间
            self.h = h
            self.y0 = y0
            self.x0 = x0
            self.n = int((b-a)/h)
            self.f = f
    
        def euler(self):       
            Y = []   #存储y值
            X = []   #存储x值
            Y.append(self.y0)
            X.append(self.x0)
            for i in range(self.n):
                y_euler = Y[i] + self.h*self.f.subs([(x,self.x0),(y,Y[i])])   #欧拉方法值
                self.x0 = self.x0+self.h   #注意这里都要用self.
                Y.append(y_euler)
                X.append(self.x0)
            return X,Y
    
    class ProEuler:    #改进欧拉类
        def __init__(self, h, x0, y0, f ,a,b):        #h为步长,x0和y0为初值,f为微分方程y' = f(x,y),ab为所要计算的区间
            self.h = h
            self.y0 = y0
            self.x0 = x0
            self.n = int((b-a)/h)
            self.f = f
    
        def euler(self):       
            Y = []   #存储y值
            X = []   #存储x值
            Y.append(self.y0)
            X.append(self.x0)
            for i in range(self.n):
                y_euler1 = Y[i] + self.h*self.f.subs([(x,self.x0),(y,Y[i])])   #欧拉方法得到第一个y_n+1值
                self.x0 = self.x0+self.h   #注意这里都要用self.
                y_euler2 = Y[i] + self.h*self.f.subs([(x,self.x0),(y,y_euler1)])   #梯形公式得到第二个y_n+1'的值
                y_pro_euler = (y_euler1+y_euler2)/2    #两者相加平均值,就是改进欧拉方法的结果
                Y.append(y_pro_euler)
                X.append(self.x0)
            return X,Y
    x,y = sympy.symbols("x y")
    f = 1/(x**2)-y/x   #在此修改函数表达式
    t1 = Euler(0.05,1,1,f,1,2)  #欧拉方法实例     
    x1,y1 = t1.euler()
    t2 = ProEuler(0.05,1,1,f,1,2)  #改进欧拉方法实例
    x2,y2 = t2.euler()
    for i in range(len(x1)):
        print("xi:","%.2f"%x2[i], "  y_euler:", "%.7f"%y1[i],"  y_proeuler:","%.7f"%y2[i])
    

    输出结果

    xi: 1.00   y_euler: 1.0000000   y_proeuler: 1.0000000
    xi: 1.05   y_euler: 1.0000000   y_proeuler: 0.9988662
    xi: 1.10   y_euler: 0.9977324   y_proeuler: 0.9957694
    xi: 1.15   y_euler: 0.9937033   y_proeuler: 0.9911415
    xi: 1.20   y_euler: 0.9883060   y_proeuler: 0.9853210
    xi: 1.25   y_euler: 0.9818488   y_proeuler: 0.9785748
    xi: 1.30   y_euler: 0.9745748   y_proeuler: 0.9711148
    xi: 1.35   y_euler: 0.9666770   y_proeuler: 0.9631101
    xi: 1.40   y_euler: 0.9583090   y_proeuler: 0.9546959
    xi: 1.45   y_euler: 0.9495938   y_proeuler: 0.9459812
    xi: 1.50   y_euler: 0.9406304   y_proeuler: 0.9370539
    xi: 1.55   y_euler: 0.9314983   y_proeuler: 0.9279848
    xi: 1.60   y_euler: 0.9222616   y_proeuler: 0.9188316
    xi: 1.65   y_euler: 0.9129722   y_proeuler: 0.9096406
    xi: 1.70   y_euler: 0.9036719   y_proeuler: 0.9004497
    xi: 1.75   y_euler: 0.8943943   y_proeuler: 0.8912892
    xi: 1.80   y_euler: 0.8851667   y_proeuler: 0.8821837
    xi: 1.85   y_euler: 0.8760109   y_proeuler: 0.8731530
    xi: 1.90   y_euler: 0.8669441   y_proeuler: 0.8642129
    xi: 1.95   y_euler: 0.8579802   y_proeuler: 0.8553758
    xi: 2.00   y_euler: 0.8491299   y_proeuler: 0.8466517
    
    展开全文
  • 你投资了100元在某个储蓄账户,存款年利率为 ...假设该账户是连续计息,那么 满足以下常微分方程初值问题: 利用欧拉法或使用ode45求解该常微分方程初值问题,并画出10年内的 函数图像,和该常微分方程精确解比较
  • 原创开发,欧拉法(Euler)求解常微分方程的Matlab程序及案例,内含自定义Matlab函数、丰富的演示实例和详细的说明文档,简单易用。
  • em_欧拉_常微分方程_

    2021-09-30 06:29:25
    利用欧拉方法计算常微分方程,寻找常微分方程的数值解
  • * * 第14讲 数值计算 常微分方程 张建瓴 内容提要 在科学研究和工程教学中会经常遇到常微分方程 只含有一个自变量的微分方程称为常微分方程(Ordinary Differential EquationsODE)它或者没有解析解或者求取解析解的...
  • 第讲高阶系数线性微分方程欧拉方程PPT学习教案.pptx
  • 分别用欧拉公式和改进的欧拉公式方法解决RC回路问题,虽然改进的欧拉公式迭代关系更加地复杂,但是稳定性高于欧拉公式。欧拉法解常微分方程 分析报告
  • 引用B样条插值函数讨论了一阶常微分方程初值问题的数值解,给出一个隐式近似求解公式,并得到此公式的局部截断误差为O(h5),整体截断误差为O(h4)。在此基础上又给出了一个校正显式求解公式,其局部截断误差为O...
  • 但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于一般形式的微分方程,一般很难用解析方法求出精确解,只能用数值方法求解。而在具体求解微分方程中,一般来说是条件是 KaTeX parse ...
  • 常微分方程的解法 (二): 欧拉(Euler)方法

    万次阅读 多人点赞 2019-04-30 09:41:37
    上一节讲了常微分方程的三种离散化 方法:差商近似导数、数值积分、Taylor 多项式近似。 目录 §2 欧拉(Euler)方法 2.1 向前 Euler 公式、向后 Euler 公式 2.2 Euler 方法的误差估计 §3 改进的 Euler 方法 ...
  • 微积分学PPt标准高阶系数线性微分方程欧拉方程PPT学习教案.pptx
  • 数学建模或者matlab课程或者科研编程中经常使用到的常微分数值解法
  • 欧拉法(Euler)求解常微分方程的Matlab程序及案例

    万次阅读 多人点赞 2021-02-27 23:07:56
    概念1) 常微分方程2) 一阶常微分方程3) 微分方程的解析解法和数值解法2. 算法2.1 显式欧拉法2.2 隐式欧拉法2.3 两步欧拉法2.4 改进欧拉法2.5 四种欧拉方法的对比3. 程序4. 案例5. 联系作者 1. 概念 1) 常微分方程 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,822
精华内容 728
关键字:

常微分方程欧拉方程