fortran下欧拉法求解常微分方程(实例)
欧拉法(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方法相同,但是速度更快。
欧拉方程求解微分方程例题

欧拉方程求解微分方程例题
欧拉方程求解微分方程是数学中常用的一种方法,用来求解常微分方程的解。
它是以著名的数学家埃及尔·欧拉(Leonhard Euler)命名的,他是18世纪末期和19世纪初期
最有影响力的数学家之
一。
欧拉方程求解微分方程的基本思想是,令微分方程的右边变为
0,然后解得相应的解。
欧拉方程求解微分方程的步骤如下:首先,将微分方程写成一阶形式,即把微分方程变形为y'=f(x,y)的形式,其中f(x,y)是一个已知函数。
然后,令f(x,y)=
0,得到新的微分方程,再用常规方法求解这个新的微分方程,即求解y'=0的微分方程,得到y=C1的解,其中C1是一个常数。
最后,再把y=C1的解代入原微分方程,得到解析解y=C1+C2x,其中C2也是一个常数,它可以由C1求得。
以下是一个关于欧拉方程求解微分方程的具体例题:求解如下微分方程:y'+2y=x首先,将微分方程变形为y'=f(x,y)的形式,即:y'=x-2y然后,令f(x,y)=
0,得到新的微分方程:x-2y=0
求解这个新的微分方程,得到y=C1的解,其中C1是一
个常数。
最后,将y=C1的解代入原微分方程,得到解析解:
y=C1+C2x其中C2也是一个常数,它可以由C1求得。
以上就是欧拉方程求解微分方程的具体步骤,它是一种非常实用的数学方法,在工程、物理等多个领域都得到广泛应用。
欧拉方程求解微分方程的步骤虽然简单,但它能够为我们提供一种很有效的求解常微分方程的方法,从而节省大量的时间和精力。
欧拉近似方法求常微分方程

欧拉近似方法求常微分方程朱翼1、编程实现以下科学计算算法,并举一例使用之。
“欧拉近似方法求常微分方程”算法说明:欧拉法是简单有效的常微分方程数值解法,欧拉法有多种形式的算法,其中简单欧拉法是一种单步递推算法。
其基本原理为对简单的一阶方程的初值问题:y’=f(x,y)其中y(x0 )=y0欧拉法等同于将函数微分转换为数值微分,由欧拉公式可得y n+1 =y n+hf(x n ,y n)程序代码:function [tout,yout]=myeuler(ypfun,t0,tfinal,y0,tol,trace) %初始化pow=1/3;if nargin<5,tol=1.e-3;endif nargin<6,trace=0;endt=t0;hmax=(tfinal-t)/16;h=hmax/8;y=y0(:);chunk=128;tout=zeros(chunk,1);yout=zeros(chunk,length(y));k=1;tout(k)=t;yout(k,:)=y.';if trace %绘图 clc,t,h,yendwhile (t<tfinal)&(t+h>t) %主循环if t+h>tfinal,h=tfinal-t;end% Compute the slopesf=feval(ypfun,t,y);f=f(:);%估计误差并设定可接受误差delta=norm(h*f,'inf');tau=tol*max(norm(y,'inf'),1.0);%当误差可接受时重写解if delta<=taut=t+h;y=y+h*f;k=k+1;if k>length(tout)tout=[tout;zeros(chunk,1)];yout=[yout;zeros(chunk,length(y))];endtout(k)=t;yout(k,:)=y.';endif tracehome,t,h,yend% Update the step sizeif delta~=0.0h=min(hmax,0.9*h*(tau/delta)^pow);endendif (t<tfinal)dish('Singularity likely.')tendtout=tout(1:k);yout=yout(1:k,:);流程图:用欧拉法求y’=-y+x+1,y(0)=1。
欧拉法解常微分方程

数学与计算科学学院实验报告实验项目名称Eular方法求解一阶常微分方程数值解所属课程名称偏微分方程数值解实验类型验证性实验日期 2015-3-26班级学号姓名成绩一、实验概述:【实验目的】熟练掌握应用显性Eular法和隐式Eular法求解一般一阶常微分方程的近似数值解。
【实验原理】虽然求解常微分方程有各种各样的解析方法,但解析方法只能用来求解一些特殊类型的方程。
求解从实际问题当中归结出来的微分方程主要靠数值解法。
欧拉方法是一类重要的数值解法。
这类方法回避解y(x)的函数表达式,而是寻求它在一系列离散节点上的近似值,相邻的两个节点的间距称作步长。
假定步长为定数。
欧拉方法是一类离散化方法,这类方法将寻求解y(x)的分析问题转化为计算离散值值的代数问题,从而使问题获得了实质性的简化。
然而随之带来的困难是,由于数据量往往很大,差分方法所归结出的可能是个大规模的代数方程组。
【实验环境】1.硬件环境2.2.软件环境MATLAB7.0二、实验内容:【实验结论】A步长h=0.001时进行数据测试。
结果如下:迭代第一次时,结果与方程描述内容相符。
迭代第二次时,结果与方程描述内容基本相符。
迭代三次时,结果与方程描述内容基本相符。
迭代1000次时,模拟结果已经严重脱离事实,故当选择delta为0.001时,该迭代方法不收敛。
时间与个变量直接的变化关系如图所示:从上述图形可以明显看出,在迭代的不断进行时,各变量与时间的变化越来越大,且严重脱离了方程所描述的现实意义。
B.当选择h=0.00000001时,模拟结果如下:迭代第一次,与A中结果相同。
迭代第二次,跌二次迭代结果明显优于一中。
跌三次迭代结果,并未产生误差。
地1000次迭代结果,结果明显是收敛的。
时间与个变量直接的变化关系如图所示:从图中能够清晰看出,当h=0.00000001时,模拟结果与方程所表示的显示意义相吻合。
说明了显性Eualr方法的收敛性是与步长的选择是相关。
微分方程数值解之欧拉法在MATLAB下的应用

科教论坛 !"#!$%&$'(') *+&,-./&$01$21(3$&)%)$$%%(3
微分方程数值解之欧拉法在 J7<97F下的应用
梁春叶4王桥明4孙远通4叶晓艳4曾宝莹
玉林师范学院数学与统计学院!广西玉林!(#+$$$
摘4要微分方程在实际应用中十分广泛涉及领域众多但对于微分方程的数值解的计算仍然有很大挑战 本文着重 对微分方程数值解求解的常用的一类基础方法欧拉法进行在 EH#[HC的应用下的一个简单介绍
求出$ 以下为在 50;"0)中实现!
F8/F68& 6'
+'
Copyright©博看网 . All Rights Reserved.
科教论坛
%I&Fh(J>>& 8'hh63t3i8326% KG&( h+ 8&$'hh( 27, % 8h(FG*H%& %I&F#KG&(' 由此得该方程的精确解为!
科技风 "#"$ 年 % 月
8hFJ/E*J>8& 8' 由此得解析解为!8h67 i63 N6N$' $
)% $) $) )% 使用欧拉法求解#如下! A h%3$% >hu& 6#8' 63t(i63t)% 6h+$!A!$%, % -hFJ9%& 6#)' i$% 8$ h+) 27#9%$GF&$#-' , % >G$& h$!8$& &N$'h8$& &' NA!>& 6& &' #8$& &' ' % %&( 8h63t732)%i63t332$)N632$)N$' 2)%% E*G7& 6#8#pGBp#6#8$#pN@p' *%L%&(& p,6?K7p#p,+*%$p' 运行程序可输出结果为!
常微分方程的数值解法(欧拉法、改进欧拉法、泰勒方法和龙格库塔法)

[例1]用欧拉方法与改进的欧拉方法求初值问题h 的数值解。
在区间[0,1]上取0.1[解]欧拉方法的计算公式为x0=0;y0=1;x(1)=0.1;y(1)=y0+0.1*2*x0/(3*y0^2);for n=1:9x(n+1)=0.1*(n+1);y(n+1)=y(n)+0.1*2*x(n)/(3*y(n)^2);end;xy结果为x =Columns 1 through 80.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 Columns 9 through 100.9000 1.0000y =Columns 1 through 81.0000 1.0067 1.0198 1.0391 1.0638 1.0932 1.1267 1.1634 Columns 9 through 101.2028 1.2443改进的欧拉方法其计算公式为本题的精确解为()y x=x0=0;y0=1;ya(1)=y0+0.1*2*x0/(3*y0^2);y(1)=y0+0.05*(2*x0/(3*y0^2)+2*x0/(3*ya^2));for n=1:9x(n+1)=0.1*(n+1);ya(n+1)=ya(n)+0.1*2*x(n)/(3*ya(n)^2);y(n+1)=y(n)+0.05*(2*x(n)/(3*y(n)^2)+2*x(n+1)/(3*ya(n+1)^2));end;xy结果为x =Columns 1 through 80.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 Columns 9 through 100.9000 1.0000y =Columns 1 through 81.0000 1.0099 1.0261 1.0479 1.0748 1.1059 1.1407 1.1783 Columns 9 through 101.2183 1.2600[例2]用泰勒方法解x=0.1, 0.2, …, 1.0处的数值解,并与精确解进行比较。
常微分方程的数值解法(欧拉法、改进欧拉法、泰勒方法和龙格库塔法)

[例1]用欧拉方法与改进的欧拉方法求初值问题h 的数值解。
在区间[0,1]上取0.1[解]欧拉方法的计算公式为x0=0;y0=1;x(1)=0.1;y(1)=y0+0.1*2*x0/(3*y0^2);for n=1:9x(n+1)=0.1*(n+1);y(n+1)=y(n)+0.1*2*x(n)/(3*y(n)^2);end;xy结果为x =Columns 1 through 80.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 Columns 9 through 100.9000 1.0000y =Columns 1 through 81.0000 1.0067 1.0198 1.0391 1.0638 1.0932 1.1267 1.1634 Columns 9 through 101.2028 1.2443改进的欧拉方法其计算公式为本题的精确解为()y x=x0=0;y0=1;ya(1)=y0+0.1*2*x0/(3*y0^2);y(1)=y0+0.05*(2*x0/(3*y0^2)+2*x0/(3*ya^2));for n=1:9x(n+1)=0.1*(n+1);ya(n+1)=ya(n)+0.1*2*x(n)/(3*ya(n)^2);y(n+1)=y(n)+0.05*(2*x(n)/(3*y(n)^2)+2*x(n+1)/(3*ya(n+1)^2));end;xy结果为x =Columns 1 through 80.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 Columns 9 through 100.9000 1.0000y =Columns 1 through 81.0000 1.0099 1.0261 1.0479 1.0748 1.1059 1.1407 1.1783 Columns 9 through 101.2183 1.2600[例2]用泰勒方法解x=0.1, 0.2, …, 1.0处的数值解,并与精确解进行比较。
matlab编写龙格库塔法或欧拉法求解常微分方程数值解

龙格库塔法(Runge-Kutta method)和欧拉法(Euler's method)是两种常用的数值求解常微分方程的方法。
这里分别给出它们的MATLAB实现:1. 龙格库塔法(Runge-Kutta method):```matlabfunction [y, t] = runge_kutta(f, y0, t0, tf, h)% f: 微分方程函数,输入为[y, t],输出为dy/dt% y0: 初始值% t0: 初始时间% tf: 结束时间% h: 步长N = round((tf - t0) / h); % 计算迭代次数t = zeros(1, N + 1); % 初始化时间向量y = zeros(size(y0), N + 1); % 初始化解向量t(1) = t0;y(:, 1) = y0;for i = 1:Nk1 = h * f(y(:, i), t(i));k2 = h * f(y(:, i) + k1 / 2, t(i) + h / 2);k3 = h * f(y(:, i) + k2 / 2, t(i) + h / 2);k4 = h * f(y(:, i) + k3, t(i) + h);y(:, i + 1) = y(:, i) + (k1 + 2 * k2 + 2 * k3 + k4) / 6;t(i + 1) = t(i) + h;endend```2. 欧拉法(Euler's method):```matlabfunction [y, t] = euler_method(f, y0, t0, tf, h)% f: 微分方程函数,输入为[y, t],输出为dy/dt% y0: 初始值% t0: 初始时间% tf: 结束时间% h: 步长N = round((tf - t0) / h); % 计算迭代次数t = zeros(1, N + 1); % 初始化时间向量y = zeros(size(y0), N + 1); % 初始化解向量t(1) = t0;y(:, 1) = y0;for i = 1:Ny(:, i + 1) = y(:, i) + h * f(y(:, i), t(i));t(i + 1) = t(i) + h;endend```使用这两个函数时,需要定义一个表示微分方程的函数`f`,例如:```matlabfunction dydt = my_ode(y, t)dydt = -y; % 一个简单的一阶线性微分方程:dy/dt = -yend```然后调用相应的求解函数,例如:```matlaby0 = 1; % 初始值t0 = 0; % 初始时间tf = 5; % 结束时间h = 0.1; % 步长[y_rk, t_rk] = runge_kutta(@my_ode, y0, t0, tf, h);[y_euler, t_euler] = euler_method(@my_ode, y0, t0, tf, h);```。