精华内容
下载资源
问答
  • 对于难解的常微分方程,使用matlab求数值解 分两个m文件,一个为调用指令,一个为原函数 可以根据自己的所求方程不同适当修改代码求解 每一步都有注释,一边看注释一边体会才是提升的最好办法
  • MATLAB源程序代码分享:MATLAB实现欧拉法求解常微分方程
  • MATLAB源程序代码分享:MATLAB实现改进的欧拉法求解常微分方程
  • 该脚本使用欧拉近似来表示,通过逐点绘制,以函数 f (y, t) 为特征的数值给定的一阶微分方程的解。 注意:函数可以是线性的,甚至可以是非线性的,这表明了该方法的效率。 警告:请选择一个接近 0 的 h 值,例如取 h...
  • Euler 法求解常微分方 阿达姆斯预测校正方法求解常微分方程数值解改进的欧拉法求解常微分方程龙格库塔方法求解常微分方程数值解
  • 欧拉法求解常微分方程(c++)

    千次阅读 2019-10-01 05:37:01
    #include<iostream> #include<iomanip> usingnamespacestd; intmain() { doublex,y,h;//,x为对应的每一步x的值,其中y为对应的每一步y的值 x=0;//对x赋初值 y=1;//...
    欧拉法求解常微分方程(c++)

    #include<iostream>

    #include < iomanip>

    using namespace std;

    int main()

       

    {

          double x, y, h;      //x为对应的每一步x的值,其中y为对应的每一步y的值

          x = 0;      //x赋初值

          y = 1;      //y赋初值

          h = 0.1;      //步长设置为0.1

          

          cout << setiosflags(ios::left);

          cout << setw(20) << "y的计算值";

          cout << setw(20) << "y的理论值";

          cout << setw(20) << "x的值";

          cout << setw(20) << "误差" << endl;

          cout << setw(20) << y;

          cout << setw(20) << y;

          cout << setw(20) << x;

          cout << setw(20) << 0 << endl;

          

          for (int i = 0; i < 10; i++)

          {

                y = y + h*(y - (2 * x / y));      //迭代得到y的新值

                cout << setw(20) << y;      //输出y的新值

                x += h;      //迭代得到最新的x

                cout << setw(20) << sqrtf(1 + 2 * x);      //计算y的理论值

                cout << setw(20) << x;      //输出x的新值

                cout << setw(20) << y - sqrtf(1 + 2 * x) << endl;      //计算误差

          }

          return 0;

    }

    运行结果:

    欧拉法求解常微分方程(c++)

    转载于:https://www.cnblogs.com/liusuanyatong/p/11259925.html

    展开全文
  • %改进欧拉法求解常微分方程数值解 %初始条件 %dy/dx=f(x) %y(x0)=y0 clc;clear; f=@(x,y)1/x+1/y;%方程 x=[];y=[];%初值 x(1)=1;y(1)=1; num=100;%迭代次数 a=1;b=50;%自变量区间 h=(b-a)/(num-1); for i=2:num x(i...

    最近开始将平时的作业整理上传,欢迎交流。

    %改进欧拉法求解常微分方程数值解
    %初始条件
    %dy/dx=f(x)
    %y(x0)=y0
    clc;clear;
    f=@(x,y)1/x+1/y;%方程
    x=[];y=[];%初值
    x(1)=1;y(1)=1;
    num=100;%迭代次数
    a=1;b=50;%自变量区间
    h=(b-a)/(num-1);
    for i=2:num
        x(i)=x(i-1)+h;
    end
    for i=2:num
        y(i)=y(i-1)+h*f(x(i-1),y(i-1));
        y(i)=y(i-1)+h*(f(x(i),y(i))+f(x(i-1),y(i-1)))/2;
    end
    scatter(x,y,10);
    
    
    
    

    在这里插入图片描述

    展开全文
  • 那么显式欧拉法的迭代步骤如下:(注意,显式欧拉法不是求解y(x)y(x)y(x)的,而是求解一系列的点(xi,yi)(x_i,y_i)(xi​,yi​),这些和真实函数中的点非常接近。) 其思想如下: 我们要解形如y′=f(x,y)y'=f(x,y)y′...

    我们求解的微分方程对象是如下这样的,左边是导数,右边是 f ( x , y ) f(x,y) f(x,y)。例如:
    在这里插入图片描述
    那么显式欧拉法的迭代步骤如下:(注意,显式欧拉法不是求解 y ( x ) y(x) y(x)的,而是求解一系列的点 ( x i , y i ) (x_i,y_i) (xi,yi),这些和真实函数中的点非常接近。

    其思想如下:
    在这里插入图片描述
    我们要解形如 y ′ = f ( x , y ) y'=f(x,y) y=f(x,y)这样的微分方程。

    上如揭示了其奥秘。

    一般你自己做微分方程的题的时候,我们都有初值,例如 y ( 1 ) = 1 y(1)=1 y(1)=1,那么在我们这里就令 x 0 = 1 , y 0 = 1 x_0=1,y_0=1 x0=1,y0=1。然后你随便确定一个 h h h,得到 x 1 = x 0 + h x_1=x_0+h x1=x0+h,计算一下这个点的函数值 y y y,即计算 y ( x 1 ) y(x_1) y(x1),记为 y 1 y_1 y1

    但是没这么容易计算,所以我们来一个近似。

    y 1 = y 0 + h f ( x 0 , y 0 ) y_1=y0+hf(x_0,y_0) y1=y0+hf(x0,y0),从而我们得到了 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)

    当然啦,有人问这个迭代式子是怎么来的,首先你要明白,给定真实曲线上的一点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),其切线斜率为 f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0),为什么?因为微分方程告诉你了, y ′ = f ( x , y ) y'=f(x,y) y=f(x,y),左边不就是导数吗?所以等于右边。

    你再看看图,就知道了,那个 y 1 y_1 y1是近似的,并不是真正的 y ( x 1 ) y(x_1) y(x1),然后你再看看那个更新式子,就应该明白我是如何近似计算 y ( x 1 ) y(x_1) y(x1)了,以直代曲嘛。

    一般,我们可以通过减小 h h h来减小误差,那么两者就更加接近了。


    我们回到开头这个问题,用这个方法来求解一下,看一下效果怎么样。

    在这里插入图片描述
    这个方程我们可以求得真实函数为:
    在这里插入图片描述
    我们比较一下,用上述显式欧拉法得到的一系列点和真实函数的差别,为了效果好一点,我们取 h = 0.01 h=0.01 h=0.01,从 x 0 = 0 x_0=0 x0=0,一直计算到 x = 1 x=1 x=1,也就是计算100个点,看能不能模拟出[0,1]区间上的真实函数。

    h=0.01
    x0=0
    y0=0.5
    x_last=1
    y=[]
    x=[]
    x.append(x0)
    y.append(y0)
    nowx=x0
    while(x0<x_last):
        y0=y0+h*(-50*y0+50*x0*x0+2*x0)
        y.append(y0)
        x0=x0+h
        x.append(x0)
    
    
    ##绘制图像
    testx=np.linspace(0,1,101)
    testy=0.5*np.power(np.e,-50*testx)+testx*testx
    figure=plt.figure(figsize=(20,8),dpi=80)
    plt.plot(testx,testy,label="true")
    plt.plot(x,y,label="h=0.01")
    plt.legend()
    

    在这里插入图片描述

    发现,当h比较小的,效果还是不错的。

    展开全文
  • 分别用欧拉公式和改进的欧拉公式方法解决RC回路问题,虽然改进的欧拉公式迭代关系更加地复杂,但是稳定性高于欧拉公式。欧拉法常微分方程 分析报告
  • 子区间欧拉方法 };   double f(double t, double x) // 源函数 {  return x*(1 -  exp (t)) / (1 +  exp (t)); }   double exact(double t) // 真实解 {  return 12 *  exp ...

     摘自《c++和面向对象数值计算》,代码简洁明快,采用类进行封装实现代码,增强代码的重用性,通过继承可实现代码的重用,采用函数指针,通用性增强,在函数改变时只需要单独改变函数部分的代码,无需对所有代码进行重写,对其中代码稍加改动,源代码有缺陷,没有释放内存,会造成内存泄露,在构造函数当中,将源代码的在函数体中赋值,改为列表赋值,可以稍微提高代码的执行效率。 

    #include<iostream>

    #include <cmath>

    #include <algorithm>

    using namespace std;

       

    class ode

    {

          double tini;      //初始时间

          double ison;      //初始解

          double tend;      //结束时间

          double(*sfn)(double t, double x);      //源函数,此处采用函数指针的方式,更具通用性

    public:

          ode(double t0, double x0, double T, double(*f)(double, double)) :      //类的构造函数

                tini(t0), ison(x0), tend(T), sfn(f){}

          double* euler(int n) const;            //n子区间欧拉方法

    };

       

    double f(double t, double x)      //源函数

    {

          return x*(1 - exp(t)) / (1 + exp(t));

    }

       

    double exact(double t)      //真实解

    {

          return 12 * exp(t) / pow(1 + exp(t), 2);

    }

       

    int main()

    {

          ode exmp(0, 3, 2, f);      //x(0)=3,T=2

          double* soln = exmp.euler(100);            //100个子区间

          double norm = 0;

          double h = 2.0 / 100;      //计算步长

          for (int k = 1; k <= 100; k++)

                norm = max(norm, fabs(exact(k*h) - soln[k]));

          cout << "max norm of error by euler's method = "

                << norm << endl;

          delete[] soln;

          return 0;

    }

       

    double* ode::euler(int n) const            //显式欧拉方法

    {

          double* x = new double[n + 1];      //近似解

          double h = (tend - tini) / n;      //步长

          x[0] = ison;            //初始解

          for (int k = 0; k < n; k++)

                x[k + 1] = x[k] + h*sfn(tini + k*h, x[k]);

          return x;

    }
     

    转载于:https://www.cnblogs.com/liusuanyatong/p/11259909.html

    展开全文
  • 用Eular常微分方程组的数值解,使用了细胞数组,代码简洁,除注释外的有效代码只有二十行左右。(几年前上传的程序了,当时要20积分,现在为大家降到5个积分)
  • #include<iostream> #include<iomanip> using namespacestd; intmain() { double x,y,yn,h,temp; x=0;//对x赋初值 y=1;//对y赋初值 h=0.1;...
  • 主要介绍了python中sympy库求常微分方程的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 欧拉法常微分方程

    2018-10-14 11:47:52
    除MATLAB系统的求解工具外,欧拉法求解常微分方程的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) 常微分方程 ...
  • 采用欧拉法、改进欧拉法、龙格库塔法(经典RK法)求解常微分方程初值问题的自编MATLAB代码。所有函数均独立成文件便于移植。代码的使用结合一个具体题目说明,题目来源为浙江大学数值计算方法作业。
  • 用改进欧拉法求一阶常微分方程的数值解,计算结果精确
  • fprintf('x%d = %f y%d = %f\n', i, x, i, y) end main.m clc clear Euler1(0, 1, 1, 10) C语言 #include #include double f(double x, double y){ //微分方程右端函数 return (y - 2 * x / y); } void Euler...
  • 结果如图,当[x1,y1]=euler(f,0,1/3,1,20)时,函数值很大,求解错误。 ![图片说明](https://img-ask.csdn.net/upload/202006/13/1592032393_549155.jpg) 当[x1,y1]=euler(f,0,1/3,0.3,20)时,近似正确 问题原题...
  • 姓名樊元君 学号2012200902 日期2012.11.06 一实验目的 掌握MATLA语言C/C++语言编写计算程序的方法掌握改进欧拉法与四阶 龙格-库塔求解一阶常微分方程的初值问题掌握使用 MATLA程序求解常微分方 程问题的方法 二实验...
  • 欧拉法求解微分方程

    千次阅读 2020-11-30 09:21:11
    欧拉法求解微分方程组的原理 设有微分方程: dx(t)dt=f(x) \frac{dx(t)}{dt} = f(x) dtdx(t)​=f(x) x(t0)=x0x(t_0)=x_0x(t0​)=x0​已知。 我们对上述方程进行积分,积分区域为t0,t1,Δt=t1−t0t_0,t_1,\Delta t = ...
  • 本程序使用改进的欧拉算法解常微分方程f(x,y)=y-2x/y,初值为1,使用者可根据自己需要进行修改
  • 常微分方程初值问题的欧拉方法及其改进的欧拉方法的Matlab实现,纪秀浩,,欧拉(Euler)方法及改进的欧拉方法是解决常微分方程初值问题常用的数值解法,但Matlab的工具箱中没有Euler方法的功能函数。本文在简要介
  • [数值分析]改进欧拉格式解常微分方程的初值问题 欧拉方法yn+1 = yn +hf(xn,yn) 是一种显式算法,计算量小,但精度很低。梯形方法yn+1 = yn + h / 2 *[f(xn,yn) + f(xn+1,yn+1)] 虽然提高了精度,但它是一种隐式算法...
  • 用隐式欧拉法求一阶常微分方程的数值解,数值计算,计算结果精确
  • 欧拉法微分方程

    2015-12-16 21:16:26
    欧拉法常微分方程的MATLAB程序。
  • 欧拉法求解微分方程c语言 1)多项式评估 (1) Polynomial Evaluation) We all know what polynomial equations are and it is one of the common problems given to the beginners when they first start learning C. ...
  • 欧拉法常微分方程的数值解法的一种,其基本思想是迭代。其中分为前进的EULER法、后退的EULER法、改进的EULER法。所谓迭代,就是逐次替代,最后求出所要求的解,并达到一定的精度。误差可以很容易地计算出来。 非...
  • 首先给出改进的Euler的公式: 然后对算法进行分析,在数值书上171面上的例3,题目是{ y'=-y+x+1, y(0)=1}第一个是变化率:dy/dx,取h=0.1,计算至x=0.5: 书上给出的解答: 显然: f(x,y)=x-y+1, a=x0=0,b=0.5,y0=1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 836
精华内容 334
关键字:

欧拉法求解常微分方程