matlab欧拉法解常微分方程
MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程

姓名:樊元君学号:02 日期:一、实验目的掌握MATLAB语言、C/C++语言编写计算程序的方法、掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。
掌握使用MATLAB程序求解常微分方程问题的方法。
:二、实验内容1、分别写出改进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。
实验中以下列数据验证程序的正确性。
求,步长h=。
*2、实验注意事项的精确解为,通过调整步长,观察结果的精度的变化^)三、程序流程图:●改进欧拉格式流程图:~|●四阶龙格库塔流程图:]四、源程序:●改进后欧拉格式程序源代码:function [] = GJOL(h,x0,y0,X,Y)format longh=input('h=');…x0=input('x0=');y0=input('y0=');disp('输入的范围是:');X=input('X=');Y=input('Y=');n=round((Y-X)/h);\i=1;x1=0;yp=0;yc=0;for i=1:1:nx1=x0+h;yp=y0+h*(-x0*(y0)^2);%yp=y0+h*(y0-2*x0/y0);%·yc=y0+h*(-x1*(yp)^2);%yc=y0+h*(yp-2*x1/yp);%y1=(yp+yc)/2;x0=x1;y0=y1;y=2/(1+x0^2);%y=sqrt(1+2*x0);%fprintf('结果=%.3f,%.8f,%.8f\n',x1,y1,y);:endend●四阶龙格库塔程序源代码:function [] = LGKT(h,x0,y0,X,Y)。
format longh=input('h=');x0=input('x0=');y0=input('y0=');disp('输入的范围是:');"X=input('X=');Y=input('Y=');n=round((Y-X)/h);i=1;x1=0;k1=0;k2=0;k3=0;k4=0;for i=1:1:n~x1=x0+h;k1=-x0*y0^2;%k1=y0-2*x0/y0;%k2=(-(x0+h/2)*(y0+h/2*k1)^2);%k2=(y0+h/2*k1)-2*(x0+h/2)/(y0+h/2*k1);% k3=(-(x0+h/2)*(y0+h/2*k2)^2);%k3=(y0+h/2*k2)-2*(x0+h/2)/(y0+h/2*k2);% k4=(-(x1)*(y0+h*k3)^2);%k4=(y0+h*k3)-2*(x1)/(y0+h*k3);%…y1=y0+h/6*(k1+2*k2+2*k3+k4);%y1=y0+h/6*(k1+2*k2+2*k3+k4);%x0=x1;y0=y1;y=2/(1+x0^2);%y=sqrt(1+2*x0);%fprintf('结果=%.3f,%.7f,%.7f\n',x1,y1,y);end·end*五、运行结果:改进欧拉格式结果:;}四阶龙格库塔结果:步长分别为:和时,不同结果显示验证了步长减少,对于精度的提高起到很大作用,有效数字位数明显增加。
欧拉法(euler)求解常微分方程的matlab程序及案例

欧拉法(euler)求解常微分方程的matlab程序及案例欧拉方法是最初用于求解常微分方程的数值方法之一,它是一种显式的一步法,具有易于实施的优点,特别适合初学者使用。
本文将介绍欧拉法的原理和使用MATLAB求解常微分方程的具体方法,同时给出一个简单的实例进行说明。
一、欧拉法原理考虑一个一阶常微分方程y'=f(t,y),欧拉法的基本思想是将时间步长Δt均分成n个小步长,从y(t0)开始依次计算每个时刻的值,得到一列估计值y1, y2, …, yn。
欧拉法的计算公式为:(1)y1=y(t0+Δt)=y(t0)+Δtf(t0, y0)(2)y2=y(t0+2Δt)=y(t0+Δt)+Δtf(t0+Δt, y1)(3)yn=y(t0+nΔt)=y(t0+(n-1)Δt)+Δtf(t0+(n-1)Δt, yn-1)可以看出,欧拉法的核心在于利用已知的t和y计算f(t,y),从而获得y的逼近值。
但是需要注意的是,步长Δt越小,计算所需的时间和内存就越多,而精度却并不一定提高。
因此在实际应用中需要结合具体问题选择合适的步长。
二、MATLAB求解常微分方程的具体方法(1)定义常微分方程我们以一个简单的例子开始,考虑求解y'=1-y,y(0)=0.5在[0,1]区间内的积分。
首先定义匿名函数dydt,将其传到ode45中求解:dydt=@(t,y)1-y;[t,y]=ode45(dydt,[0 1],0.5);plot(t,y,'-o')运行以上代码可以得到结果,其中plot函数用于绘制图像。
但是,由于求解过程中计算机执行到ode45函数时可能需要很长时间,因此需要更快捷的方法。
(2)利用欧拉法求解方程欧拉法求解方程首先需要定义步长Δt,这里设Δt为0.1。
定义起始值y=[0.5]、时间向量t=0:Δt:1,然后计算列向量y的估计值:t=0:0.1:1;y=zeros(size(t));y(1)=0.5;for n=1:length(t)-1y(n+1)=y(n)+0.1*(1-y(n));endplot(t,y,'-o')以上代码的执行结果与前面的ode45方法相同,但是速度更快。
MATLAB常微分方程的数值解法

MATLAB常微分⽅程的数值解法MATLAB常微分⽅程的数值解法⼀、实验⽬的科学技术中常常要求解常微分⽅程的定解问题,所谓数值解法就是求未知函数在⼀系列离散点处的近似值。
⼆、实验原理三、实验程序1. 尤拉公式程序四、实验内容选⼀可求解的常微分⽅程的定解问题,分别⽤以上1, 4两种⽅法求出未知函数在节点处的近似值,并对所求结果与分析解的(数值或图形)结果进⾏⽐较。
五、解答1. 程序求解初值问题取n=10源程序:euler23.m:function [A1,A2,B1,B2,C1,C2]=euler23(a,b,n,y0)%欧拉法解⼀阶常微分⽅程%初始条件y0h = (b-a)/n; %步长h%区域的左边界a%区域的右边界bx = a:h:b;m=length(x);%前向欧拉法y = y0;for i=2:my(i)=y(i-1)+h*oula(x(i-1),y(i-1));A1(i)=x(i);A2(i)=y(i);endplot(x,y,'r-');hold on;%改进欧拉法y = y0;for i=2:my(i)=y(i-1)+h/2*( oula(x(i-1),y(i-1))+oula(x(i),y(i-1))+h*(oula(x(i-1),x(i-1))));B1(i)=x(i);B2(i)=y(i);endplot(x,y,'m-');hold on;%欧拉两步公式y=y0;y(2)=y(1)+h*oula(x(1),y(1));for i=2:m-1y(i+1)=y(i-1)+2*h*oula(x(i),y(i));C1(i)=x(i);C2(i)=y(i);endplot(x,y,'b-');hold on;%精确解⽤作图xx = x;f = dsolve('Dy=-3*y+8*x-7','y(0)=1','x');%求出解析解y = subs(f,xx); %将xx代⼊解析解,得到解析解对应的数值plot(xx,y,'k--');legend('前向欧拉法','改进欧拉法','欧拉两步法','解析解');oula.m:function f=oula(x,y)f=-3*y+8*x-7;2. 运算结果A1,A2为前向欧拉法在节点处的近似值,B1,B2为改进的欧拉法在节点处的近似值,C1,C2为欧拉公式法在节点处的近似值。
MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法

MATLAB常微分⽅程数值解——欧拉法、改进的欧拉法与四阶龙格库塔⽅法MATLAB常微分⽅程数值解作者:凯鲁嘎吉 - 博客园1.⼀阶常微分⽅程初值问题2.欧拉法3.改进的欧拉法4.四阶龙格库塔⽅法5.例题⽤欧拉法,改进的欧拉法及4阶经典Runge-Kutta⽅法在不同步长下计算初值问题。
步长分别为0.2,0.4,1.0.matlab程序:function z=f(x,y)z=-y*(1+x*y);function R_K(h)%欧拉法y=1;fprintf('欧拉法:x=%f, y=%f\n',0,1);for i=1:1/hx=(i-1)*h;K=f(x,y);y=y+h*K;fprintf('欧拉法:x=%f, y=%f\n',x+h,y);endfprintf('\n');%改进的欧拉法y=1;fprintf('改进的欧拉法:x=%f, y=%f\n',0,1);for i=1:1/hx=(i-1)*h;K1=f(x,y);K2=f(x+h,y+h*K1);y=y+(h/2)*(K1+K2);fprintf('改进的欧拉法:x=%f, y=%f\n',x+h,y);endfprintf('\n');%龙格库塔⽅法y=1;fprintf('龙格库塔法:x=%f, y=%f\n',0,1);for i=1:1/hx=(i-1)*h;K1=f(x,y);K2=f(x+h/2,y+(h/2)*K1);K3=f(x+h/2,y+(h/2)*K2);K4=f(x+h,y+h*K3);y=y+(h/6)*(K1+2*K2+2*K3+K4);fprintf('龙格库塔法:x=%f, y=%f\n',x+h,y);end结果:>> R_K(0.2)欧拉法:x=0.000000, y=1.000000欧拉法:x=0.200000, y=0.800000欧拉法:x=0.400000, y=0.614400欧拉法:x=0.600000, y=0.461321欧拉法:x=0.800000, y=0.343519欧拉法:x=1.000000, y=0.255934改进的欧拉法:x=0.000000, y=1.000000改进的欧拉法:x=0.200000, y=0.807200改进的欧拉法:x=0.400000, y=0.636118改进的欧拉法:x=0.600000, y=0.495044改进的欧拉法:x=0.800000, y=0.383419改进的欧拉法:x=1.000000, y=0.296974龙格库塔法:x=0.000000, y=1.000000龙格库塔法:x=0.200000, y=0.804636龙格库塔法:x=0.400000, y=0.631465龙格库塔法:x=0.600000, y=0.489198龙格库塔法:x=0.800000, y=0.377225龙格库塔法:x=1.000000, y=0.291009>> R_K(0.4)欧拉法:x=0.000000, y=1.000000欧拉法:x=0.400000, y=0.600000欧拉法:x=0.800000, y=0.302400改进的欧拉法:x=0.000000, y=1.000000改进的欧拉法:x=0.400000, y=0.651200改进的欧拉法:x=0.800000, y=0.405782龙格库塔法:x=0.000000, y=1.000000龙格库塔法:x=0.400000, y=0.631625龙格库塔法:x=0.800000, y=0.377556>> R_K(1)欧拉法:x=0.000000, y=1.000000欧拉法:x=1.000000, y=0.000000改进的欧拉法:x=0.000000, y=1.000000改进的欧拉法:x=1.000000, y=0.500000龙格库塔法:x=0.000000, y=1.000000龙格库塔法:x=1.000000, y=0.303395注意:在步长h为0.4时,要将for i=1:1/h改为for i=1:0.8/h。
matlab用欧拉法求解常微分方程

matlab用欧拉法求解常微分方程在数学和科学领域中,常微分方程是一种非常有用的工具,用于描述许多自然和物理现象。
MATLAB是一种强大的数学软件,可以用来解决许多数学问题。
本文将介绍如何使用欧拉法在MATLAB中求解常微分方程。
欧拉法是一种基本的数值方法,用于近似解决微积分方程问题。
该方法使用离散时间步长,将微积分方程转换成差分方程,并不断迭代求解。
欧拉法的实现非常简单,因此它很适合初学者。
下面是使用欧拉法在MATLAB中求解常微分方程的步骤:1. 定义常微分方程以 y' = -0.5y + 3sin(t) 为例,我们先定义常微分方程。
在MATLAB中,可以使用 anonymous functions 实现:dydt = @(t,y) -0.5*y + 3*sin(t);2. 定义时间范围和时间步长我们需要定义时间范围和时间步长,以便在一定时间范围内求解差分方程。
在这个例子中,我们定义时间范围为 0 到 10,并定义时间步长为 0.1:tspan = [0 10];h = 0.1;3. 定义初始条件我们需要定义初始条件,即 y(0) 的值。
在这个例子中,我们假设 y(0) = 1:y0 = 1;4. 求解差分方程现在我们可以使用欧拉法求解差分方程了。
在MATLAB中,可以使用 odeEuler 函数(需要自己编写):[t,y] = odeEuler(dydt,tspan,y0,h);5. 可视化结果最后,我们可以将结果可视化,以便更好地理解求解过程。
在这个例子中,我们可以用 plot 函数将求解结果绘制出来:plot(t,y)xlabel('Time')ylabel('y(t)')title('Solution of y'' = -0.5y + 3sin(t) using Euler''s method')以上就是使用欧拉法在MATLAB中求解常微分方程的基本步骤。
euler方法求解常微分方程matlab

euler方法求解常微分方程matlab以euler方法求解常微分方程matlab常微分方程是数学中的重要分支之一,它描述了自然界和工程中的许多现象和过程。
求解常微分方程的方法有很多,其中一种常用的方法是欧拉方法。
欧拉方法是一种数值解常微分方程的方法,它通过将微分方程转化为差分方程,从而得到近似解。
在matlab中,我们可以使用欧拉方法来求解常微分方程。
下面我们将以一个具体的例子来说明如何使用matlab来求解常微分方程。
假设我们要求解的常微分方程是一阶线性常微分方程:dy/dx = f(x, y)其中f(x, y)是已知的函数。
我们需要给定一个初始条件y(x0) = y0,其中x0和y0是已知的常数。
我们需要定义函数f(x, y)。
在matlab中,我们可以使用匿名函数来定义函数。
例如,如果我们要求解的常微分方程是dy/dx = x^2 + y,那么我们可以定义函数f(x, y)如下:f = @(x, y) x^2 + y接下来,我们需要定义初始条件x0和y0。
假设x0 = 0,y0 = 1,我们可以定义初始条件如下:x0 = 0;y0 = 1;然后,我们需要定义步长h,即每一步的增量。
步长h越小,求解的结果越精确,但计算量也会增加。
在matlab中,我们可以使用input函数来让用户输入步长h。
例如,我们可以这样定义步长h:h = input('请输入步长h:');接下来,我们需要定义求解的区间。
假设我们要求解的区间是0到1,我们可以定义区间如下:a = 0;b = 1;然后,我们需要计算步数n。
步数n可以通过区间长度除以步长h 来得到。
在matlab中,我们可以使用ceil函数来向上取整。
例如,我们可以这样计算步数n:n = ceil((b - a) / h);接下来,我们需要定义一个数组x和一个数组y,用来存储每一步的计算结果。
我们可以使用zeros函数来创建这两个数组,并将初始条件存储在数组中。
matlab求解超大量常微分方程

matlab求解超大量常微分方程使用MATLAB求解超大量常微分方程随着科学技术的不断发展和应用领域的扩大,我们经常需要解决超大量常微分方程的问题。
常微分方程是描述自然界中变化规律的一种重要数学工具,广泛应用于物理、生物、经济等领域。
然而,当问题规模非常庞大时,传统的解析方法往往难以满足计算需求。
在这种情况下,使用MATLAB进行数值求解成为一种较为有效的方法。
MATLAB是一种强大的科学计算软件,具有丰富的数值计算函数库和友好的编程环境,可以帮助我们高效地求解超大量常微分方程。
下面我们将以一个具体的例子来说明MATLAB求解超大量常微分方程的过程和方法。
假设我们需要求解一个包含1000个未知函数的常微分方程组。
首先,我们需要定义这个方程组。
在MATLAB中,我们可以使用符号运算工具箱来创建符号变量和符号表达式,从而建立方程组的描述。
具体的代码如下:```matlabsyms x1 x2 (x1000)f1 = ... % 第一个未知函数的表达式f2 = ... % 第二个未知函数的表达式...f1000 = ... % 第1000个未知函数的表达式eqns = [f1 == 0, f2 == 0, ..., f1000 == 0]; % 构建方程组```接下来,我们需要选择合适的数值方法来求解这个方程组。
MATLAB 提供了多种数值求解方法,如欧拉法、龙格-库塔法、变步长法等。
根据问题的特点和求解的要求,我们可以选择合适的数值方法。
在这里,我们选择MATLAB中的ode45函数来求解方程组。
ode45函数是一种常用的自适应步长的龙格-库塔法求解器,可以较好地适应不同的求解情况。
具体的代码如下:```matlaboptions = odeset('MaxStep', 0.01); % 设置最大步长[t, sol] = ode45(@(t, x) eval(subs(eqns)), [tstart, tend], x0, options); % 求解方程组```其中,options是一个结构体,用于设置数值求解器的参数。
matlab heun法

matlab heun法Heun法是一种数值求解常微分方程的方法,也称为改进的欧拉法或者梯形法。
它是一种显式的Runge-Kutta方法,用于求解一阶常微分方程初值问题。
在MATLAB中,可以使用Heun法来数值求解常微分方程。
Heun法的基本思想是通过使用梯形法来估计下一个时间步长的值。
首先,利用当前的状态估计下一个时间步长的斜率,然后利用这个斜率来计算下一个时间步长的值。
具体来说,Heun法的迭代步骤如下:1. 根据当前的状态计算出当前的斜率。
2. 利用当前的斜率来估计下一个时间步长的状态。
3. 根据下一个时间步长的状态计算出下一个时间步长的斜率。
4. 利用下一个时间步长的斜率来计算出真正的下一个时间步长的状态。
在MATLAB中,可以使用ode45函数来实现Heun法。
该函数可以接受一个指定的微分方程函数和初始条件,并返回在指定时间范围内的数值解。
具体来说,可以使用MATLAB代码类似于下面这样来实现Heun法:matlab.function dydt = myODE(t, y)。
dydt = % 指定的微分方程。
end.tspan = % 时间范围。
y0 = % 初始条件。
[t, y] = ode45(@myODE, tspan, y0);在这个例子中,myODE函数是指定的微分方程函数,tspan是时间范围,y0是初始条件。
通过调用ode45函数,可以得到在指定时间范围内的数值解。
总之,Heun法是一种常用的数值求解常微分方程的方法,在MATLAB中可以使用ode45函数来实现。
通过合理选择微分方程函数和初始条件,可以得到准确的数值解。
数学建模2-常微分方程的MATLAB解法

常微分方程的MATLAB解法一、数值解法原理1.欧拉方法精度不高,采用改进的Euler方法:①梯形公式:②改进Euler法:2.龙格-库塔(Runge-Kutta)方法①二阶:可表示为:又所以②四阶:3.线性多步法二、初值问题的MATLAB解法和符号解1.MATLAB数值解(1) MATLAB数值解非刚性常微分方程:①对简单的一阶方程初值问题:编写函数如下:function [x,y]=eulerpro(fun,x0,xfinal,y0,n); if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;y1=y(i)+h*feval(fun,x(i),y(i));y2=y(i)+h*feval(fun,x(i+1),y1);y(i+1)=(y1+y2)/2;end②ode23,ode45(采用四五阶RK方法,首选),ode113的使用四阶RK方法函数代码:function [x,y]=rk4pro(fun,x0,xfinal,y0,n);if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;k1=feval(fun,x(i),y(i));k2=feval(fun,x(i)+h/2,y(i)+h*k1/2);k3=feval(fun,x(i)+h/2,y(i)+h*k2/2);k4=feval(fun,x(i)+h,y(i)+h*k3);y(i+1)=y(i)+h*(k1+2*k2+2*k3+k4)/6;end刚性常微分方程:ode15s,ode23s,ode23t,ode23tb,用法与上面类似。
高阶微分方程的解法:2.常微分方程的解析解:(1)无初边值条件:(2)有初边值条件:(3)求解常微分方程组:(4)求解线性常微分方程组:①一阶齐此线性微分方程组②非齐次线性微分方程组(5)边值问题的MATLAB解法调用bvp4c函数求解一般地,bvp4c的调用格式如下:sol=bvp4c(@odefun,@bcfun,solinit,options,p1,p2,…); 函数odefun的格式为yprime=odefun(x,y,p1,p2, …);函数bcfun的格式为res=bcfun(ya,yb, p1,p2, …);初始猜测结构solinit有两个域:solinit.x提供初始猜测的x 值,排列顺序从左到右排列,其中solinit.x(1)和solinit.x(end)分别为a 和b 。
matlab实例讲解欧拉法求解微分方程

欧拉法是数值分析中常用的一种方法,用于求解常微分方程的数值解。
在MATLAB中,可以通过编写相应的代码来实现欧拉法求解微分方程。
下面我们将通过具体的实例来讲解MATLAB中如何使用欧拉法求解微分方程。
我们要了解欧拉法的基本原理。
欧拉法是一种通过迭代逼近微分方程解的方法,它基于微分方程的定义,通过离散化的方法逼近微分方程的解。
其基本思想是利用微分方程的导数定义,将微分方程以差分形式进行逼近。
具体而言,欧拉法通过将微分方程转化为差分方程的形式,然后通过迭代逼近得到微分方程的数值解。
接下来,我们通过一个具体的实例来讲解MATLAB中如何使用欧拉法求解微分方程。
假设我们要求解以下的一阶常微分方程:(1) dy/dx = x + y(2) y(0) = 1现在我们来编写MATLAB代码来实现欧拉法求解这个微分方程。
我们需要确定微分方程的迭代步长和迭代范围。
假设我们将x的范围取为0到10,步长为0.1。
接下来,我们可以编写MATLAB代码如下:```matlab欧拉法求解微分方程 dy/dx = x + y定义迭代步长和范围h = 0.1;x = 0:h:10;初始化y值y = zeros(1,length(x));y(1) = 1;使用欧拉法迭代求解for i = 1:(length(x)-1)y(i+1) = y(i) + h * (x(i) + y(i));end绘制图像plot(x,y,'-o');xlabel('x');ylabel('y');title('欧拉法求解微分方程 dy/dx = x + y');```在这段MATLAB代码中,我们首先定义了迭代的步长和范围,并初始化了微分方程的初始值y(0) = 1。
然后通过for循环使用欧拉法进行迭代求解微分方程,最后绘制出了微分方程的数值解的图像。
通过以上的实例讲解,我们可以看到,在MATLAB中使用欧拉法求解微分方程是非常简单而直观的。
第六章 MATLAB教程常微分方程的数值解

0
-1
-2
-3
0
5
10
15
20
25
30
35
40
45
50
例3 x′ = y, y′ = 0.2 y sin t
(1)转化方程。
H=[0,100] t = 0, x = 0, y = 2
(2)建立文件,设文件名为dzdt03.m。 function dz=f(t,z) a=-0.2;
1.5 2
dz(1)=z(2);
(3)调用求解。 H=[0.1,30];z0=[0;0;0]; [t,z]=ode45('dzdt01',H,z0); plot(t,z(:,1),'m-')
1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 x 10
5
plot(t,z(:,1),'m-')
0
5
10
15
20
25
30
例2 y′′ c(1 y 2 ) y′ + y = 0 H=[0,50] t = 0, y = 2, y′ = 1
30 20 10 0
dz(3)=c*z(2)-z(3)-z(1)*z(2); dz=[dz(1);dz(2);dz(3)]; (3)调用求解。
-10 -20 -30 20 10 60 0 -10 -20 -20 0 40 20
H=[0,80];z0=[0;0;0.222/10^15]; [t,z]=ode23('dzdt05',H,z0); plot3(z(:,1),z(:,2),z(:,3),'m-')
第六章 常微分方程的数值解
常见的近似数值求解方法有欧拉 折线法、阿当姆斯法、龙格-库塔 法与吉尔法。 不受方程类型的限制,可以求任 何形状常微分方程的特解,但求 出的解只能是数值的解函数。
有效独立法 matlab

有效独立法 matlab
MATLAB是一种非常强大的数学软件,广泛应用于工程、科学和
数学领域。
在MATLAB中,独立法通常指的是一种用于解决微分方程
的数值方法。
独立法也被称为Euler法或者前进欧拉法,它是一种
基本的数值积分方法,用于求解常微分方程的初值问题。
独立法的基本思想是通过离散化微分方程,将微分方程转化为
差分方程,然后通过迭代的方式逐步逼近微分方程的解。
具体来说,对于给定的微分方程dy/dx=f(x,y),初始条件y(x0)=y0,独立法通
过以下迭代公式进行计算,y(x0+h) = y(x0) + hf(x0, y0),其中
h是步长。
这个公式直观地表示了在点(x0, y0)处的斜率f(x0, y0)
与步长h的乘积,即为下一个点的增量,通过不断迭代可以逼近微
分方程的解。
在MATLAB中,可以使用独立法来求解常微分方程的数值解。
通
过编写MATLAB脚本或者函数,可以实现独立法的迭代计算过程。
MATLAB提供了丰富的数值计算和绘图函数,可以方便地进行独立法
的实现和结果可视化。
此外,MATLAB还提供了一些内置的数值积分
函数,如ode45等,可以更方便地求解微分方程的数值解。
总之,独立法是一种常用的数值方法,用于求解微分方程的数值解,在MATLAB中可以方便地实现并得到结果。
当然,在使用独立法时需要注意选择合适的步长以及对数值误差进行控制,以获得准确的数值解。
MATLAB数值分析实验五(欧拉法,荣格-库塔法解常微分方程)

佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 常微分方程问题初值问题数值解法 专业班级 姓 名 学 号 指导教师 陈剑 成 绩 日 期一. 实验目的1、理解如何在计算机上实现用Euler 法、改进Euler 法、Runge -Kutta 算法求一阶常微分方程初值问题⎩⎨⎧=∈='1)(],[),,()(y a y b a x y x f x y 的数值解。
2、利用图形直观分析近似解和准确解之间的误差。
二、实验要求(1) 按照题目要求完成实验内容; (2) 写出相应的Matlab 程序;(3) 给出实验结果(可以用表格展示实验结果); (4) 分析和讨论实验结果并提出可能的优化实验。
(5) 写出实验报告。
三、实验步骤1、用Matlab 编写解常微分方程初值问题的Euler 法、改进Euler 法和经典的四阶Runge-Kutta 法。
2、给定初值问题⎪⎩⎪⎨⎧=≤≤-=;1)1(,21,1')1(2y x xy x y⎪⎩⎪⎨⎧=≤≤++-=31)0(10,25050')2(2y x x x y y 要求:(a )用Euler 法和改进的Euler 法(步长均取h=0.05)及经典的四阶Runge-Kutta 法(h=0.1)求(1)的数值解,并打印)10,....2,1,0(1.01=+=i i x 的值。
(b) 用经典的四阶Runge-Kutta 方法解(2),步长分别取h=0.1, 0.05,0.025,计算并打印)10,....2,1,0(1.0==i i x 个点的值,与准确解25031)(x e x y x +=-比较,并列表写出在x=0.2,0.5,0.8处,对于不同步长h 下的误差,讨论同一节点处,误差随步长的变化规律。
(c )用Matlab 绘图函数绘制(2)的精确解和近似解的图形。
四、实验结果 %Euler.mfunction y = Euler(x0,xn,y0,h) %Euler 法解方程f_xy ; %x0,y0为初始条件; %x0,xn 为求值区间; %h 为步长; %求区间个数: n = (xn-x0)/h;%矩阵x 存储n+1个节点: x = [x0:h:xn]';%矩阵y 存储节点处的值: y = [y0;zeros(n,1)];%矩阵y_存储节点处导数值: y_(1)= f_xy(x0,y0); y_ = [y_(1);zeros(n,1)];%进行迭代(欧拉法迭代;求导数): for i = 2:n+1y (i) = y(i-1)+h*y_(i-1); y_(i) = f_xy(x(i),y(i)); end%Imp_Euler.mfunction y = Imp_Euler(x0,xn,y0,h)%改进的Euler法解方程f_xy;%x0,y0为初始条件;%x0,xn为求值区间;%h为步长;%求区间个数:n = (xn-x0)/h;%矩阵x存储n+1个节点:x = [x0:h:xn]';%矩阵y存储节点处的值:y = [y0;zeros(n,1)];%矩阵y_存储节点处导数值:y_(1)= f_xy(x0,y0);y_ = [y_(1);zeros(n,1)];%使用改进Euler法求值(欧拉法求近似;近似点导数;梯形校正;求导):for i = 2:n+1y_l = y(i-1) + h*y_(i-1);y_l = f_xy(x(i),y_l);y(i) = y(i-1) + (h/2)*(y_(i-1)+y_l);y_(i)= f_xy(x(i),y(i));end%R_Kutta4.mfunction y = R_Kutta4(x0,xn,y0,h)%Runger_Kutta法解方程f_xy;%x0,y0为初始条件;%x0,xn为求值区间;%h为步长;%求区间个数:n = (xn-x0)/h;%矩阵x存储n+1个节点:x = [x0:h:xn]';%矩阵y存储节点处的值:y = [y0;zeros(n,1)];%矩阵k1,k2,k3,k4存储各节点(中点)数值:k1(1)= f_xy(x0,y0);k1 = [k1(1);zeros(n,1)];k2(1)= f_xy(x0+h/2,y0+h*k1(1)/2);k2 = [k2(1);zeros(n,1)];k3(1)= f_xy(x0+h/2,y0+h*k2(1)/2);k3 = [k3(1);zeros(n,1)];k4(1)= f_xy(x0+h,y0+h*k3(1));k4 = [k4(1);zeros(n,1)];for i= 2:n+1y(i) = y(i-1)+(h/6)*(k1(i-1)+2*k2(i-1)+2*k3(i-1)+k4(i-1));k1(i)= f_xy(x(i),y(i));k2(i)= f_xy(x(i)+h/2,y(i)+h*k1(i)/2);k3(i)= f_xy(x(i)+h/2,y(i)+h*k2(i)/2);k4(i)= f_xy(x(i)+h,y(i)+h*k3(i));end(a):%f_xy.mfunction y_=f_xy(x,y)%求解第五次作业第一题的点(x,y)处的导数;y_ = 1/(x^2) - y/x;%run521.mclc,clear;x0 = 1;xn = 2;h = 0.05;y0 = 1;%便于显示出x,与y对应:x = [x0:h:xn]';y = Euler(x0,xn,y0,h);YE =[x,y];y = Imp_Euler(x0,xn,y0,h); YIE= [x,y];h = 0.1;x = [x0:h:xn]';y = R_Kutta4(x0,xn,y0,h); YRK= [x,y];(b): %f_xy.mfunction y_=f_xy(x,y) %求第二个方程的导数: y_ = -50*y+50*(x^2)+2*x;%run522.mclc,clear; x0 = 0; xn = 1; y0 = 1/3; %步长0.1: h = 0.1; x = [x0:h:xn]';y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y1 = [x,y,y_r];%步长0.05: h = 0.05; x = [x0:h:xn]';y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y2 = [x,y,y_r]; %步长0.025: h = 0.025; x = [x0:h:xn]';y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y3 = [x,y,y_r];五、讨论分析(a)从结果可以看出使用RK 方法,步长较大但是结果也更加精确; (b)分析求值结果的误差,可以发现当步长取0.1时,误差是超级大的(10^8数量级),但是当步长缩小一半取0.05时,误差就很小了,再缩小一半,误差就更小了。
欧拉法求解微分方程组matlab

欧拉法是一种常用的数值方法,用于求解微分方程组。
以下是一个简单的 MATLAB 代码示例,用于使用欧拉法求解微分方程组。
假设我们有一个微分方程组的形式为 dy/dt = f(t, y),其中y 是我们要求解的变量,t 是时间,f 是给定的函数。
```matlab% 定义初始值和步长tspan = [0, 10]; % 时间范围y0 = [1, 0]; % 初始值h = 0.01; % 步长% 定义微分方程组dydt = @(t, y) [y[2]; -y[1]]; % y' = y[2], -y[1]% 使用欧拉法求解微分方程组y = ode45(dydt, tspan, y0);% 输出结果figure;plot(tspan(1), y(:, 1), 'r', tspan(2), y(:, 1), 'b'); xlabel('t');ylabel('y');legend('欧拉法', '解析解');```在上述代码中,我们使用了 MATLAB 的 `ode45` 函数来求解微分方程组。
该函数基于数值积分方法(四阶龙格-库塔方法)求解微分方程。
我们需要传递三个参数给 `ode45`:微分方程的匿名函数(使用 MATLAB 的符号计算功能定义),时间范围 `tspan` 和初始值 `y0`。
欧拉法的实现是将微分方程的右侧看作一个常数,直接在每个时间步长上使用初始值进行线性插值。
注意,这只是一个简单的示例,实际情况可能需要根据具体的问题进行调整。
例如,可能需要调整步长或时间范围,以获得更好的数值解。
此外,对于复杂的微分方程组,可能需要使用更高级的数值方法或解析解方法。
MATLAB Euler法解常微分方程

Euler 法解常微分方程Euler 法解常微分方程算法:Step 1 分别取积分上限、积分下限、步长Step 2计算h n n +=判断b n ≤是否成立,成立转到Step 3,否则继续进行Step 4 Step 3 计算),(1n n n n y x hf y y +=+Step 4 ),(1n n n n y x hf y y +=+Euler 法解常微分方程算程序:function euler2(fun,y0,A,h)%fun--y'%y0---初值%A----x 取值范围%a----x 左区间端点值%b----x 右区间端点值%h----给定步长x=min(A);b=max(A);y=y0;while x<b-hb=y;y=y+h*feval(fun,x,b)x=x+h;end例:用Euler 法计算下列初值问题(取步长h=0.2))6.00(1)0('2≤≤⎩⎨⎧=--=x y xy y y 输入:fun=inline('-y-x*y^2')euler2(fun,1,[0 0.6],0.2)得到:y =0.8000y =0.6144y =0.4613指导教师: 年 月 日改进Euelr 法解常微分方程改进Euler 法解常微分方程算法:Step 1 分别取积分上限、积分下限、步长Step 2 取一个以h 为步长,a ,b 分别为左右端点的矩阵Step 3 (1)做显性Euler 预测),(1n n i i y x hf y y +=+(2)将1+i y 带入(),([2h 11++++=i i i i i x f y x f y y Step 4计算h n n +=判断b n ≤是否成立,成立返回Step 5 )],(),([2h 111+++++=i i i i i i y x f y x f y y 改进Euler 法解常微分方程算程序:function gaijineuler2(fun,y0,A,h)%fun--y'%y0---初值%A----x 取值范围%a----x 左区间端点值%b----x 右区间端点值%h----给定步长a=min(A);b=max(A);x=a:h:b;y(1)=y0;for i=1:length(x)-1w1=feval(fun,x(i),y(i));y(i+1)=y(i)+h*w1;w2=feval(fun,x(i+1),y(i+1));y(i+1)=y(i)+h*(w1+w2)/2;endx=x'y=y'例:用改进Euler 法计算下列初值问题(取步长h=0.25))50(2)0('2≤≤⎩⎨⎧=-=x y xy y 输入:fun=inline('-x*y^2')gaijineuler2(fun,2,[0 5],0.25)得到:x =0.25000.50000.75001.00001.25001.50001.75002.00002.25002.50002.75003.00003.25003.50003.75004.00004.25004.50004.75005.0000y =2.00001.87501.59391.28241.00960.79320.62820.50370.40970.33790.28240.23890.20430.17650.15380.13520.11960.10660.09550.08610.0779指导教师:年月日。
解微分方程欧拉法RK法及其MATLAB实例

解微分方程的欧拉法,龙格-库塔法及其MATLAB简单实例欧拉方法(Euler method)用以对给定初值的常微分方程(即初值问题)求解分为前进EULER法、后退EULER法、改进的EULER法。
缺点:欧拉法简单地取切线的端点作为下一步的起点进行计算,当步数增多时,误差会因积累而越来越大。
因此欧拉格式一般不用于实际计算。
改进欧拉格式:为提高精度,需要在欧拉格式的基础上进行改进。
采用区间两端的斜率的平均值作为直线方程的斜率。
改进欧拉法的精度为二阶。
算法为:微分方程的本质特征是方程中含有导数项,数值解法的第一步就是设法消除其导数值。
对于常微分方程:?x∈[a,b]y(a) = y0可以将区间[a,b]分成n段,那么方程在第xi点有y'(xi) = f(xi,y(xi)),再用向前差商近似代替导数则为:在这里,h是步长,即相邻两个结点间的距离。
因此可以根据xi点和yi点的数值计算出yi+1来:i=0,1,2,L这就是向前欧拉格式。
改进的欧拉公式:将向前欧拉公式中的导数f(xi,yi)改为微元两端导数的平均,即上式便是梯形的欧拉公式。
可见,上式是隐式格式,需要迭代求解。
为了便于求解,使用改进的欧拉公式:数值分析中,龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。
实际上,龙格-库塔法是欧拉方法的一种推广,向前欧拉公式将导数项简单取为f(xn,yn),而改进的欧拉公式将导数项取为两端导数的平均。
龙格-库塔方法的基本思想:在区间[xn,xn+1]内多取几个点,将他们的斜率加权平均,作为导数的近似。
龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4”或者就是“龙格库塔法”。
令初值问题表述如下。
则,对于该问题的RK4由如下方程给出:其中这样,下一个值(y n+1)由现在的值(y n)加上时间间隔(h)和一个估算的斜率的乘积决定。
该斜率是以下斜率的加权平均:k1是时间段开始时的斜率;k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn + h/2的值;k3也是中点的斜率,但是这次采用斜率k2决定y值;k4是时间段终点的斜率,其y值用k3决定。
matlab 欧拉法误差

欧拉法是一种简单的数值积分方法,用于求解常微分方程的近似解。
然而,欧拉法是一种基本的数值方法,其误差较大。
在MATLAB 中,可以使用`ode45` 函数来求解常微分方程,该函数使用改进的欧拉法(也称为四阶-五阶龙格-库塔法)进行数值积分。
`ode45` 函数使用自适应步长控制,可以在每个步骤中自动调整步长,以减小误差。
在MATLAB 中,可以使用`abserr` 参数来设置允许的最大绝对误差。
如果`abserr` 参数设置为非零值,则`ode45` 函数将使用自适应步长控制来减小误差,并返回满足误差要求的解。
如果设置
`abserr` 为0,则函数将使用固定的步长进行计算,可能不会返回满足误差要求的解。
在某些情况下,可能无法通过自适应步长控制来减小误差。
在这种情况下,可以使用`rel容差` 参数来设置允许的最大相对误差。
如果`rel容差` 参数设置为非零值,则`ode45` 函数将使用自适应步长控制来减小误差,并返回满足误差要求的解。
如果设置`rel容差` 为0,则函数将使用固定的步长进行计算,可能不会返回满足误差要求的解。
总而言之,为了减小欧拉法的误差,建议使用MATLAB 中的
`ode45` 函数,并设置适当的`abserr` 和`rel容差` 参数。
欧拉法(euler)求解常微分方程的matlab程序及案例

欧拉法(euler)求解常微分方程的matlab程序及案例欧拉法是一种常见的求解常微分方程的数值解法,在MATLAB中可以通过编写简单的程序实现。
本文将介绍欧拉法的MATLAB程序及应用案例。
首先,让我们考虑以下的常微分方程:dy/dx = f(x, y)其中y是关于x的函数,f是已知的函数。
我们可以通过欧拉法求解该方程。
欧拉法的基本思想是将区间[x0, xn]分成n等份,然后用以下式子计算y的值:y(i+1) = y(i) + h*f(x(i), y(i))其中h是步长,x(i)和y(i)分别表示当前的x和y值,y(i+1)表示下一个y值。
通过重复上述计算,欧拉法可以求出y在x=n处的值。
下面是欧拉法的MATLAB程序:% 默认参数x0 = 0; % 初始值xn = 1; % 终止值y0 = 1; % 初始y值h = 0.1; % 步长f = @(x, y) -y; % 函数n = (xn - x0) / h; % 时间步数x = x0; % 初始x值y = y0; % 初始y值for i = 1:ny = y + h * f(x, y);x = x + h;enddisp(['y在x = ', num2str(xn), '处的值为:',num2str(y)]);在上述程序中,我们定义了默认的初始值、终止值、初始y值和函数。
程序中的n表示时间步数,x和y分别表示当前的x和y值。
通过for循环,欧拉法可以重复计算y的值,并最终求出y在x=n处的值。
下面是一个用欧拉法求解dy/dx = -y的应用案例:% 默认参数x0 = 0; % 初始值xn = 5; % 终止值y0 = 1; % 初始y值h = 0.1; % 步长f = @(x, y) -y; % 函数n = (xn - x0) / h; % 时间步数x = x0; % 初始x值y = y0; % 初始y值% 初始化结果数组result = zeros(n + 1, 2);result(1,:) = [x0 y0];for i = 1:ny = y + h * f(x, y);x = x + h;% 保存结果result(i + 1,:) = [x y];end% 绘制图形plot(result(:,1), result(:,2), '-o');xlabel('x');ylabel('y');title('欧拉法求解dy/dx=-y');在上述案例中,我们使用默认的参数,求解dy/dx=-y的方程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab欧拉法解常微分方程
matlab欧拉法解常微分方程
欧拉法是解决微分方程数值计算的一种基本方法,是通过估算函数图
像的变化来得到函数的近似值。
而matlab是一种强大的数值计算软件,也能轻易地实现欧拉法解常微分方程的计算。
步骤一:选择解题模型
选择合适的数学模型很重要。
对于已经给定的微分方程,需要将它化
为标准的形式。
例如,我们有如下的微分方程:
y’ = 2y - 3,y(0) = 1
将其化为标准的形式:dy/dx = 2y -3 将初始值y(0) = 1带入。
步骤二:确定计算步长
确定计算步长h。
步长的大小与计算精度有直接关系,步长太小,计算量将很大,而精度较高;步长太大,精度较低。
步长的计算公式为:
h = (b-a)/n
其中,a和b是区间限制,n是初始步数。
步骤三:使用欧拉法求解微分方程
根据欧拉法的公式,假设在t时刻函数y的值是y(t),求在下一个时
刻t+h如何估算y值,公式为:
y(t+h) = y(t)+ h * y'(t)
将y'(t)=2y-3代入上式,得:
y(t+h) = y(t)+ h* (2y(t)-3)
接下来,根据初始值y(0) = 1,带入计算步长可得出一系列的近似值。
步骤四:绘制函数图像
对于计算结果,应绘制出函数的近似图像。
通过matlab绘制y(x)的图像,也可以通过计算的数据进行近似曲线的绘制。
步骤五:测试计算结果
通过计算结果与初始值进行比较,看算法是否正确和有效。
也可以将步长不同的计算结果进行比较,判断精度和计算效率的高低。
欧拉法解常微分方程在matlab中的使用,相较于手工计算,更具有高效、准确、方便的优势。
正因如此,在各类数学、物理、工程等领域中都有着广泛的应用。