欧拉前进法(matlab)_欧拉向前法 matlab程序 _欧拉向前法 matlab程序

       谢谢大家对欧拉前进法(matlab)问题集合的提问。作为一个对此领域感兴趣的人,我期待着和大家分享我的见解和解答各个问题,希望能对大家有所帮助。

1.请用Euler和Matlab函数ode23求解下列微分方程

2.matlab编程问题利用欧拉方法求常微分方程近似数值解

3.关于matlab编程的问题

欧拉前进法(matlab)_欧拉向前法 matlab程序

请用Euler和Matlab函数ode23求解下列微分方程

       1--欧拉法

       t=0;

       h=0.02;

       y(1)=10;

       for i=2:100000000

        y(i)=y(i-1)+0.02*h*(1-0.001*y(i-1))*y(i-1);

        if i*h>=20

        break;

        end

       end

       2-----ode23

       先创建

       function dy=dfun(t,y)

       dy=0.02*(1-0.001*y)*y;

       再编写

       [t,y]=ode23(@dfun,[0 120],10);

       plot(t,y)

matlab编程问题利用欧拉方法求常微分方程近似数值解

       3.6.2

       龙格-

       库塔方法

       改进的欧拉法比欧拉法精度高的原因在于,它在确定平均斜率时,多取了一个点的斜

       率值。这样,如果我们在[Xi,X(i+1)]上多取几个点的斜率值,然后对它们作线性组合得到平均

       斜率,则有可能构造出精度更高的计算方法。这就是龙格-库塔法的基本思想。龙格-库塔

       法可看作是欧拉法思想的提高,属于精度较高的单步法。

       龙格-库塔法是求解常微分方程初值问题的最重要的方法之一。MATLAB中提供了几

       个采用龙格-库塔法来求解常微分方程的函数,即ode23,ode45,ode113

       ,ode23s

       ,ode15s

       等,其中最常用的函数是

       ode23(

       二三阶龙格-库塔函数)和ode45(

       四五阶龙格-库塔函数),

       下面分别对它们进行介绍。

       1

       .二三阶龙格-

       库塔函数(ode23)

       函数

       ode23

       的调用格式如下:

       (1)

       [T,Y]=ODE23('F',TSPAN,Y0)

       输入参数中的'F'

       是一个字符串,表示微分方程的形

       式,也可以是

       f

       (x

       ,

       y

       )的M

       文件。TSPAN=[T0

       TFINAL]表示积分区间,Y0表示初始条件。

       函数

       ode23

       表示在初始条件

       Y0下从

       T0到TFINAL

       对微分方程

       '(,)

       yFty

       =

       进行积分。函数

       F(T,

       Y)

       必须返回一列向量,两个输出参数是列向量

       T

       与矩阵

       Y,其中向量

       T

       包含估计响应

       的积分点,而矩阵

       Y

       的行数与向量

       T

       的长度相等。向量

       T

       中的积分点不是等间距的,这是

       为了保持所需的相对精度,而改变了积分算法的步长。为了获得在确定点T0,T1,

       "的解,

       TSPAN=[T0

       T1

       TFINAL]

       。需要注意的是:TSPAN中的点必须是单调递增或单调递减的。

       (2)

       [T,Y]=ODE23('F',TSPAN,Y0,OPTIONS)

       其中,参数

       options

       为积分参数,它可由函

       数ODESET

       来设置。Options参数最常用的是相对误差‘RelTol’(

       默认值是

       1e-3)和绝对误差

       ‘AbsTol’(默认值是

       1e-6),其他参数同上。

       (3)

       [T,Y]=ODE23('F',TSPAN,Y0,OPTIONS,P1,P2,…)

       参数P1,P2,

       …可直接输入到函数

       F

       中去.如

       F(T,Y,FLAG,P1,P2,…)。如果参数

       OPTIONS为空,则输入

       OPTIONS=[

       ]。也可

       以在

       ODE文件中(可参阅

       ODEFILE函数)指明参数

       TSPAN、Y0和OPTIONS的值。如果参

       数TSPAN

       或Y0

       是空,则ODE23函数通过调用ODE文件[TSPAN,

       Y0,

       OPTIONS]

       =

       F([

       ],[

       ],

       'init

       ')来获得

       ODE23函数没有被提供的自变量值。如果获得的自变量表示空,则函

       数ODE23会忽略,此时为

       ODE23('F')。

       (4)

       [T,Y,TE,YE,IE]=ODE23('F',TSPAN,Y0,OPTIONS)

       此时要求在参数

       options

       中的事

       件属性设为'on'

       ,ODE文件必须被标记,以便

       P(T,Y,'events')

       能返回合适的信息,详细可参

       阅函数

       ODEFILE。输出参数中的

       TE是一个列向量,矩阵

       YE的行与列向量

       TE中元素相

       对应,向量

       IE

       表示解的索引。

       2

       .四五阶龙格-

       库塔函数(ode45)

       函数

       ode45

       的调用格式同

       ode23

       相同,其差别在于内部算法不同。如果'F'

       为向量函数,

       则ode23

       和ode45

       也可用来解微分方程组。

       例3.47

       分别用二三阶龙格-库塔法和四五阶龙格-库塔法解常微分方程的初值问题:

       解:先将微分方程写成自定义函数

       exam2fun.m

       function

       f=exam2fun

       (x,y)

       f=-y-x*y.^2;

       f=f(:);

       然后在命令窗口输入以下语句:

       >>

       [x1,y1]=ode23('exam2fun',[0:0.1:1],1)

       x1

       =

       0

       0.1000

       0.2000

       0.3000

       0.4000

       0.5000

       0.6000

       0.7000

       0.8000

       0.9000

       1.0000

       y1

       =

       1.0000

       0.9006

       0.8046

       0.7144

       0.6314

       0.5563

       0.4892

       0.4296

       0.3772

       0.3312

       0.2910

       >>

       [x2,y2]=ode45('exam2fun',[0:0.1:1],1)

       x2

       =

       0

       0.1000

       0.2000

       0.3000

       0.4000

       0.5000

       0.6000

       0.7000

       0.8000

       0.9000

       1.0000

       y2

       =

       1.0000

       0.9006

       0.8046

       0.7144

       0.6315

       0.5563

       0.4892

       0.4296

       0.3772

       0.3312

       0.2910

关于matlab编程的问题

       %欧拉法解一阶常微分方程

       %?y'=xy^(1/3)

       f?=?inline('x*y^(1/3)','x','y');

       figure;?hold?on;

       for?h?=?[0.1?0.05?0.01]%三个步长

       xleft?=?1;?%区域的左边界

       xright?=?5;?%区域的右边界

       xx?=?xleft:h:xright;%一系列离散的点

       n?=?length(xx);%点的个数

       y0?=?1;

       Euler?=?y0;

       for?i?=?2:n

Euler(i)=Euler(i-1)+h*f(xx(i-1),Euler(i-1));

       end

       plot(xx,Euler,'LineWidth',2);

       end

       %精确解

       y?=?((xx.^2+2)/3).^(3/2);

       plot(xx,y,'r','LineWidth',2);

       grid?on;

       下面是我对这道题思路:

       1:

        对于第一题的微分方程组在matlab中输入[f,g]=dsolve('Df=exp(f*sin(t)+g)','Dg=exp(g*cos(t))+f','t')答案是 Explicit solution could not be found,即没有解析解,因此只能求其近似解,也就是数值解。

        求解微分方程的数值解需要知道“函数的初值”“自变量的范围”,即f(0)=?,g(0)=?,变量t的取值范围是多少,然后迭代运算,得到在给定定义域内的近似值。

       2:

       差分法也就是我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其中h是设定的迭代步长,若精度要求不高,一般可取0.01。在定义区间内迭代求解即可。

       龙哥库塔法一般用于高精度的求解,即高阶精度的改进欧拉法。

       常用的是四阶龙哥库塔:

       编程语言如下:

       y(i+1)=y(i)+h*(k1+2*K2+2*k3+k4)/6;

       k1=f(xi,yi)

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

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

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

       设置终止条件迭代求解。

       思想就是这样,代码如下:

       %% 龙哥库塔or欧拉法求解微分方程

       t=0:0.01:3; %自变量范围

       f = [];

       g = [];

       f(1) = 0.1; %f初值

       g(1) = 1; %g初值

       h=0.001;

       for i=1:length(t)

        %% 欧拉法

       % f(i+1) =f(i)+h*(exp(f(i)*sin(t(i)))+g(i));

       % g(i+1) =g(i)+h*(exp(g(i)*cos(t(i)))+f(i));

        %% 龙哥库塔

        kf1 = exp(f(i)*sin(t(i)))+g(i);

        kf2 = exp((f(i)+kf1*h/2)*sin(t(i)+h/2))+g(i);

        kf3 = exp((f(i)+kf2*h/2)*sin(t(i)+h/2))+g(i);

        kf4 = exp((f(i)+kf3*h)*sin(t(i)+h))+g(i);

        f(i+1) = f(i) + h*(kf1+2*kf2+2*kf3+kf4)/6;

        kg1 = exp(f(i)*cos(t(i)))+f(i);

        kg2 = exp((f(i)+kg1*h/2)*cos(t(i)+h/2))+f(i);

        kg3 = exp((f(i)+kg2*h/2)*cos(t(i)+h/2))+f(i);

        kg4 = exp((f(i)+kg3*h)*cos(t(i)+h))+f(i);

        g(i+1) = g(i) + h*(kg1+2*kg2+2*kg3+kg4)/6;

       end

       figure(1)

       plot(t,f(1:length(t)),t,g(1:length(t)));

       legend('f函数','g函数')

       好了,今天关于欧拉前进法(matlab)就到这里了。希望大家对欧拉前进法(matlab)有更深入的了解,同时也希望这个话题欧拉前进法(matlab)的解答可以帮助到大家。