MATLAB求解常微分方程数值解

合集下载

重要:MATLAB常微分方程(组)数值解法

重要:MATLAB常微分方程(组)数值解法

Matlab常微分方程求解问题分类
边值问题:
初值问题:
• 定解附加条件在自变量 的一端
• 一般形式为: y' f (x, y)
y(a)
y0
• 初值问题的数值解法一 般采用步进法,如 Runge-Kutta法
➢ 在自变量两端均给定附加 条件
y' f (x, y)
➢ 一般形式:y(a)y1, y(b)y2
1.根据常微分方程要求的求解精度与速度要求
求解初值问题:
y
'
y
2x y
y ( 0 ) 1
(0x1)
比较ode45和ode23的求解精度和速度
ode45和ode23的比较-1
function xODE clear all clc
format long
y0 = 1; [x1,y1] = ode45(@f,[0,1],y0); [x2,y2] = ode23(@f,[0,1],y0); plot(x1,y1,'k-',x2,y2,'b--') xlabel('x') ylabel('y')
rD = k(3)*C(2)-k(5)*C(4);
rE = k(4)*C(3)+k(5)*C(4);
% Mass balances dCdt = [rA; rB; rC; rD; rE];
三个串联的CSTR等温反应器(例4-3)
function IsothermCSTRs clear all clc CA0 = 1.8; % kmol/m^3 CA10 = 0.4; % kmol/m^3 CA20 = 0.2; % kmol/m^3 CA30 = 0.1; % kmol/m^3 k = 0.5; % 1/min tau = 2; stoptime = 2.9; % min [t,y] = ode45(@Equations,[0 stoptime],[CA10 CA20 CA30],[],k,CA0,tau); disp(' Results:') disp(' t CA1 CA2 CA3') disp([t,y]) plot(t,y(:,1),'k--',t,y(:,2),'b:',t,y(:,3),'r-') legend('CA_1','CA_2','CA_3') xlabel('Time (min)') ylabel('Concentration') % -----------------------------------------------------------------function dydt = Equations(t,y,k,CA0,tau) CA1 = y(1); CA2 = y(2); CA3 = y(3); dCA1dt = (CA0-CA1)/tau - k*CA1; dCA2dt = (CA1-CA2)/tau - k*CA2; dCA3dt = (CA2-CA3)/tau - k*CA3; dydt = [dCA1dt; dCA2dt; dCA3dt];

第八章 基于MATLAB的科学计算—常微分方程数值解法

第八章 基于MATLAB的科学计算—常微分方程数值解法

科学计算—理论、方法及其基于MATLAB 的程序实现与分析微分方程(组)数值解法§1 常微分方程初值问题的数值解法微分方程(组)是科学研究和工程应用中最常用的数学模型之一。

如揭示质点运动规律的Newton 第二定律:()()()⎪⎩⎪⎨⎧'='==000022x t x x t x t F dt xd m (1) 和刻画回路电流或电压变化规律的基尔霍夫回路定律等,但是,只有一些简单的和特殊的常微分方程及常微分方程组,可以求得用公式给出的所谓“解析解”或“公式解”,如一阶线性微分方程的初值问题:()()00y y t f ay dtdy=+= (2) 的解为:()()()τττd f e y e t y tt a at ⎰-+=00 (3)但是,绝大多数在实际中遇到的常微分方程和常微分方程组得不到“解析解”,因此,基于如下的事实:1、绝大多数的常微分方程和常微分方程组得不到(有限形式的)解析解;2、实际应用中往往只需要知道常微分方程(组)的解在(人们所关心的)某些点处的函数值(可以是满足一定精度要求的近似值);如果只需要常微分方程(组)的解在某些点处的函数值,则没有必要非得通过求得公式解,然后再计算出函数值不可,事实上,我们可以采用下面将介绍的常微分方程(组)的初值问题的数值解法,就可以达到这一目的。

一般的一阶常微分方程(组)的初值问题是指如下的一阶常微分方程(组)的定解问题:()()000,y t y t t t y t F dtdyf=≤≤= (7)其中()()()()⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=t y t y t y t y n 21 (8)()()()()⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=y t f y t f y t f y t F n ,,,,21 (9)常微分方程(组)的初值问题通常是对一动态过程(动态系统、动力系统)演化规律的描述,求解常微分方程(组)的初值问题就是要了解和掌握动态过程演化规律。

matlab 二阶常微分方程数值求解函数

matlab 二阶常微分方程数值求解函数

matlab 二阶常微分方程数值求解函数【最新版】目录1.Matlab 二阶常微分方程数值求解函数概述2.二阶常微分方程的一般形式3.Matlab 中用于数值求解二阶常微分方程的函数4.数值求解的步骤5.结论正文Matlab 二阶常微分方程数值求解函数概述二阶常微分方程是指具有以下形式的微分方程:a * y"" + b * y" + c * y = f(x)。

其中,a、b、c 为常数,y 是函数,x 是自变量,f(x) 是已知函数。

求解这类微分方程对于许多实际问题具有重要意义,如物理、生物学、经济学等领域。

Matlab 作为一种广泛应用于科学计算的语言,提供了丰富的函数库用于数值求解二阶常微分方程。

二阶常微分方程的一般形式在 Matlab 中,二阶常微分方程的一般形式可以表示为:y"" + p(x) * y" + q(x) * y = r(x)其中,p(x)、q(x) 和 r(x) 是已知函数,y 是待求解的函数。

Matlab 中用于数值求解二阶常微分方程的函数Matlab 提供了多个函数用于数值求解二阶常微分方程,如 ode45、ode23、ode113 等。

这些函数的用法及参数如下:- ode45:该函数是四阶龙格库塔法(RK45)的实现,适用于大多数情况。

其用法为:解 = ode45(函数句柄,[a, b], [c, d], e, [f, g])其中,函数句柄是一个函数句柄,它接受自变量 x 和时间 t 作为参数,并返回因变量 y。

a 和 b 分别是函数 y 的第一个和第二个导数。

c 和 d 分别是函数 y 的第三个和第四个导数。

e 是初始条件。

f 和g 是边界条件。

- ode23:该函数是二阶龙格库塔法(RK23)的实现,适用于某些特殊情况。

其用法与 ode45 类似。

- ode113:该函数是十一阶龙格库塔法(RK113)的实现,适用于要求高精度解的情况。

matlab中ode23的使用示例

matlab中ode23的使用示例

在MATLAB中,ode23函数是用于求解常微分方程(ODE)的数值解法之一。

它采用二阶或三阶Runge-Kutta算法进行求解。

以下是ode23函数的使用示例:
假设我们要求解以下常微分方程:
dy/dt = y - t^2 + 1
初始条件是y(0) = 0.5,求解区间为[0, 2]。

在MATLAB中,首先需要编写一个函数来描述这个常微分方程。

可以创建一个名为"odeFunc.m"的函数文件,包含以下内容:
matlab
function dy = odeFunc(t, y)
dy = y - t^2 + 1;
end
然后,在MATLAB命令窗口或脚本文件中,使用ode23函数来求解该常微分方程。

示例代码如下:
matlab
% 定义求解区间、初始条件和ODE函数
tspan = [0, 2];
y0 = 0.5;
odeFunc = @odeFunc;
% 使用ode23函数求解ODE
[t, y] = ode23(odeFunc, tspan, y0);
% 绘制结果图形
plot(t, y);
xlabel('Time (t)');
ylabel('Solution (y)');
title('Solution of ODE using ode23');
运行上述代码后,MATLAB将会计算并返回在指定求解区间内的常微分方程数值解,并将结果绘制成图形。

图形中的x轴表示时间(t),y轴表示解(y)。

matlab_常微分方程数值解法

matlab_常微分方程数值解法
d2x 2x2 0
dt 2
简朴问题可以求得解析解,多数实际问题靠数值求解 。
第4页
一阶常微分方程(ODE )初值问题 : ODE :Ordinary Differential Equation
dy
f
(x,
y)
dx
x0 x xn
y(x0 ) y0
数值解法就是求y(x)在某些分立旳节点 xn 上旳近似值 yn,用以近似y(xn)
x0
y0
x1 f y(x), x dx
x0
x2 f y(x), x dx
x1
y(x1) f y(x1), x1 h
第17页
同样,在[x0,xn+1] ,积分采用矩形近似,得:
y(xn1) y0
f xn1
x0
y(x), x dx
y(xn ) f y(xn ), xn h
yn y(xn )
第5页
2、欧拉近似办法
2.1 简朴欧拉(L.Euler, 1707-1783)办法。
dy
dx
f
(y, x)
y(x0 ) y0
欧拉数值算法就是由初值通过递推求解,递推求解
就是从初值开始,后一种函数值由前一种函数值得到。核 心是构造递推公式。
y0 y1 y2 yn
第6页
i 1,2,...
第36页
没有一种算法可以有效地解决所有旳 ODE 问题,因此 MATLAB 提供了多种ODE函数。
函数 ODE类
特点
阐明

ode45
非刚性 单步法;4,5 阶 R-K 措施;合计 大部分场合旳首选措施
截断误差为 (△x)3
ode23
非刚性 单步法;2,3 阶 R-K 措施;合计 使用于精度较低旳情形

MATLAB常微分方程数值解——欧拉法、改进的欧拉法与四阶龙格库塔方法

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. 基本概念在MATLAB中,可以使用ode45函数来对常微分方程进行数值求解。

ode45是一种常用的Runge-Kutta法,它可以自适应地选取步长,并且具有较高的数值精度。

使用ode45函数可以方便地对各种类型的常微分方程进行求解,包括一阶、高阶、常系数和变系数的微分方程。

2. 函数调用要使用ode45函数进行常微分方程的数值求解,需要按照以下格式进行函数调用:[t, y] = ode45(odefun, tspan, y0)其中,odefun表示用于描述微分方程的函数,tspan表示求解的时间跨度,y0表示初值条件,t和y分别表示求解得到的时间序列和对应的解向量。

3. 示例演示为了更好地理解如何使用ode45函数进行常微分方程的数值求解,下面我们以一个具体的例子来进行演示。

考虑如下的一阶常微分方程:dy/dt = -2*y其中,y(0) = 1。

我们可以编写一个描述微分方程的函数odefun:function dydt = odefun(t, y)dydt = -2*y;按照上述的函数调用格式,使用ode45函数进行求解:tspan = [0 10];y0 = 1;[t, y] = ode45(odefun, tspan, y0);绘制出解曲线:plot(t, y);4. 高级用法除了基本的函数调用方式外,MATLAB中还提供了更多高级的方法来对常微分方程进行数值求解。

可以通过设定选项参数来控制数值求解的精度和稳定性,并且还可以对刚性微分方程进行求解。

5. 性能优化在实际工程应用中,常常需要对大规模的常微分方程进行数值求解。

用MATLAB求解微分方程

用MATLAB求解微分方程
用MATLAB求解微分方程
1. 微分方程的解析解
求微分方程(组)的解析解命令:
dsolve(‘方程1’, ‘方程2’,…‘方程n’, ‘初始条件’, ‘自变量’)
结 果:u = tan(t-c)
解 输入命令:dsolve('Du=1+u^2','t')
STEP2
STEP1
解 输入命令: y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')
导弹追踪问题
设位于坐标原点的甲舰向位于x轴上点A(1, 0)处的乙舰发射导弹,导弹头始终对准乙舰.如果乙舰以最大的速度v0(是常数)沿平行于y轴的直线行驶,导弹的速度是5v0,求导弹运行的曲线方程.又乙舰行驶多远时,导弹将它击中? 解法一(解析法)
由(1),(2)消去t整理得模型:
解法二(数值解)
结 果 为:x = (c1-c2+c3+c2e -3t-c3e-3t)e2t y = -c1e-4t+c2e-4t+c2e-3t-c3e-3t+c1-c2+c3)e2t z = (-c1e-4t+c2e-4t+c1-c2+c3)e2t
2、取t0=0,tf=12,输入命令: [T,Y]=ode45('rigid',[0 12],[0 1 1]); plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+')
3、结果如图
图中,y1的图形为实线,y2的图形为“*”线,y3的图形为“+”线.

matlab中的微分方程的数值积分

matlab中的微分方程的数值积分

MATLAB是一种流行的数学软件,用于解决各种数学问题,包括微分方程的数值积分。

微分方程是许多科学和工程问题的数学描述方式,通过数值积分可以得到微分方程的数值解。

本文将介绍在MATLAB中如何进行微分方程的数值积分,以及一些相关的技巧和注意事项。

一、MATLAB中微分方程的数值积分的基本方法1. 常微分方程的数值积分在MATLAB中,常微分方程的数值积分可以使用ode45函数来实现。

ode45是一种常用的数值积分函数,它使用4阶和5阶Runge-Kutta 方法来求解常微分方程。

用户只需要将微分方程表示为函数的形式,并且提供初值条件,ode45就可以自动进行数值积分,并得到微分方程的数值解。

2. 偏微分方程的数值积分对于偏微分方程的数值积分,在MATLAB中可以使用pdepe函数来实现。

pdepe可以求解具有定解条件的一维和二维偏微分方程,用户只需要提供偏微分方程的形式和边界条件,pdepe就可以进行数值积分,并得到偏微分方程的数值解。

二、在MATLAB中进行微分方程数值积分的注意事项1. 数值积分的精度和稳定性在进行微分方程的数值积分时,需要注意数值积分的精度和稳定性。

如果数值积分的精度不够,可能会导致数值解的误差过大;如果数值积分的稳定性差,可能会导致数值解发散。

在选择数值积分方法时,需要根据具体的微分方程来选择合适的数值积分方法,以保证数值解的精度和稳定性。

2. 初值条件的选择初值条件对微分方程的数值解有很大的影响,因此在进行微分方程的数值积分时,需要选择合适的初值条件。

通常可以通过对微分方程进行分析,或者通过试验求解来确定合适的初值条件。

3. 数值积分的时间步长在进行微分方程的数值积分时,需要选择合适的时间步长,以保证数值积分的稳定性和效率。

选择时间步长时,可以通过试验求解来确定合适的时间步长,以得到最优的数值解。

三、MATLAB中微分方程数值积分的实例以下通过一个简单的例子来演示在MATLAB中如何进行微分方程的数值积分。

二阶常微分方程matlab的数值解和解析解分析总报告

二阶常微分方程matlab的数值解和解析解分析总报告

2013-6-14
(1)通解随初始条件变化情况 Ex1: a=2,b=3,c=1,y(0)=0;y'(0)=0,w=1
Ex2: a=2,b=3,c=1,y(0)=2;y'(0)=0,w=1
Ex3: a=2,b=3,c=1,y(0)=2;y'(0)=4,w=1
(2)通解随a,b,c变化情况 Ex1: a=2,b=3,c=1,y(0)=0;y'(0)=0,w=1
?讨论思路1通解随初始条件变化情况2通解随abc变化情况b24ac0两个不同的实根b24ac0两个相同的重根b24ac0两个不同的复数根3通解随w变化情况1
Matቤተ መጻሕፍቲ ባይዱab解二阶常微分方程
方程:a*y''(t)+b*y'(t)+c=sin(wt) 求解:1.解析解 2.数值解(欧拉方法) 目的:1.比较两种求解方式的拟合情况 2.通解随w变化的规律
Ex4: a=-2,b=3,c=1,y(0)=0;y'(0)=0,w=1
Ex5: a=2,b=-3,c=1,y(0)=0;y'(0)=0,w=1
Ex6: a=2,b=3,c=-1,y(0)=2y'(0)=1,w=1
b^2-4ac=0情况
2013-6-14
EX: a=2 ,b=2*sqrt(2) ,c=1,y(0)=0;y'(0)=0,w=1
2013-6-14
2013-6-14
2013-6-14
b^2-4ac<0情况
2013-6-14
(3).b^2-4ac<0 EX:a=4,b=-1,c=2,y(0)=0;y'(0)=0,w=1
EX:a=4,b=1,c=2,y(0)=3,y'(0)=0,w=1

matlab实例讲解欧拉法求解微分方程

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中使用欧拉法求解微分方程是非常简单而直观的。

常微分方程(ODEs)的MATLAB数值解法

常微分方程(ODEs)的MATLAB数值解法
打造最优秀、专业和权威的 Matlab 技术交流平台!
Matlab 中常微分方程数值解法讲解©
作者:dynamic 时间:2008.12.10 版权:All Rights Reserved By
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ Matlab Sky 联盟----打造最优秀、专业和权威的 Matlab 技术交流平台! 网址: /com/org/net 邮箱:matlabsky@ QQ 群:23830382 40510634 16233891(满了)
然而现实总是残酷的,有时方程偏偏是隐式的,没法写成上面的样子,不用担心 Matlab 早就为我们想到了,这 个留在后面的隐式微分方程数值求解中再详细讲解!
step2.为每一阶微分式选择状态变量,最高阶除外
x1 = x, x2 = x ', x3 = x '', L, xm = x ( m −1) xm+1 = y, xm+1 = y ', xm + 2 = y '',L , xm + n = y ( n−1)
4
打造最优秀、专业和权威的 Matlab 技术交流平台!
2.微分方程转换
好, 上面我们把 Matlab 中的常微分方程(ODE)的解算器讲解的差不多了, 下面我们就具体开始介绍如何使用上面 的知识吧! 现实总是残酷的,要得到就必须先付出,不可能所有的 ODE 一拿来就可以直接使用,因此,在使用 ODE 解算 器之前,我们需要做的第一步,也是最重要的一步就是将微分方程组化成 Matlab 可接受的标准形式! 如果 ODEs 由一个或多个高阶微分方程给出,则我们应先将其变换成一阶显式常微分方程组! 下面我们以两个高阶微分方程构成的 ODEs 为例介绍如何将之变换成一个一阶显式常微分方程组。

matlab微分方程常用数值解法

matlab微分方程常用数值解法

一、概述Matlab作为一种常用的科学计算软件,在微分方程的数值解法领域具有广泛的应用。

微分方程是描述自然现象中变化规律的数学工具,而数值解法则是指使用计算机进行近似求解微分方程的方法。

在Matlab 中,有多种常用的数值解法可以用来求解微分方程,例如欧拉法、改进的欧拉法、四阶龙格-库塔法等。

本文将对这些数值解法进行介绍和比较,以帮助读者更好地理解和应用微分方程求解数值方法。

二、欧拉法欧拉法是微分方程的最简单的数值解法之一,它通过离散化微分方程进行近似求解。

具体而言,对于一阶常微分方程dy/dx=f(x,y),可以利用欧拉法进行数值解。

欧拉法的基本思想是将自变量x的增量Δx分成n个小区间,然后根据微分方程的数值近似公式y(x+Δx)=y(x)+f(x,y)Δx对每个小区间进行迭代计算。

欧拉法的优点是简单易实现,但由于它是一阶的数值方法,因此对于某些微分方程求解效果可能不够准确。

三、改进的欧拉法改进的欧拉法是对欧拉法的一种改进,它通过在每个小区间内使用平均斜率来提高求解的精度。

具体而言,对于微分方程dy/dx=f(x,y),改进的欧拉法可以通过以下迭代公式进行数值求解:y(x+Δx)=y(x)+Δx/2[f(x,y)+f(x+Δx,y+Δx*f(x,y))]改进的欧拉法相比于欧拉法具有更高的数值精度,但计算量也相对增加。

四、四阶龙格-库塔法四阶龙格-库塔法是一种常用的数值微分方程求解方法,它通过四次迭代计算来获得微分方程的数值解。

具体而言,对于微分方程dy/dx=f(x,y),四阶龙格-库塔法可以用以下公式进行数值求解:k1=f(x,y)k2=f(x+Δx/2,y+Δx/2*k1)k3=f(x+Δx/2,y+Δx/2*k2)k4=f(x+Δx,y+Δx*k3)y(x+Δx)=y(x)+Δx/6*(k1+2*k2+2*k3+k4)四阶龙格-库塔法相比于欧拉法和改进的欧拉法具有更高的数值精度和稳定性,但计算量也相对较大。

常微分方程数值求解 MATLAB 求解

常微分方程数值求解 MATLAB 求解
8
dsolve 举例
例:[x,y]=dsolve('Dx+5*x=0', 'Dy-3*y=0', ...
'x(0)=1', 'y(0)=1', 't') sol = dsolve('Dx+5*x=0', 'Dy-3*y=0', ...
'x(0)=1', 'y(0)=1', 't') 这里返回的 sol 是一个 结构类型 的数据 sol.x % 查看解函数 x(t) sol.y % 查看解函数 y(t)
常微分方程数值求解
—— MATLAB 求解
Matlab 解初值问题函数
用 Maltab自带函数 解初值问题
求解析解:dsolve
求数值解:
ode45、ode23、 ode113、ode23t、ode15s、 ode23s、ode23tb
2
符号求解
符号求解
dsolve
3
dsolve 求解析解
如果省略自变量,则默认自变量为 t
dsolve('Dy=2*x','x'); % dy/dx = 2x
dsolve('Dy=2*x');
% dy/dt = 2x
若找不到解析解,则提出警告,并返回空解。
5
dsolve 的使用
使用符号方程
导数:diff,如 diff(y),diff(y,2) 等号:== 必须声明应变量与自变量!
求解析解:dsolve
y=dsolve('eq1','eq2', ... ,'cond1','cond2', ... ,'v')

欧拉法(euler)求解常微分方程的matlab程序及案例

欧拉法(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的方程。

第12章 MATLAB常微分方程(组)数值求解方程与方程组的数值解

第12章 MATLAB常微分方程(组)数值求解方程与方程组的数值解
基于修正的二阶Rosenbrock公式。由于是 单步解算器,当精度要求不高时,它效率 可能会高于ode15s。它可以解决一些
ode15s求解起来效率不太高的刚性问题。
ode23t可以用来求解微分代数方程。
ode23tb 刚性

当方程是刚性的,并且求解要求精度不高
时可以使用。
2020/6/19
© 吴鹏, MATLAB从零到进阶.
常微分方程数值解
【例12.4-1】的结果图:
方 法 1计 算 结 果 图 1
方 法 2计 算 结 果 图 1
方 法 3计 算 结 果 图 1
0.8
0.8
0.8
0.6
0.6
0.6
0.4
0.4
0.4
0.2
0.2
0.2
0
0
0
-0.2
-0.4 0
2020/6/19
y1(t)
-0.2
y2(t)
y3(t)
-0.4
在某段时间区间内的变化来看。非刚性问题变化相对缓 慢,而刚性问题在某段时间内会发生剧烈变化,即很短 的时间内,解的变化巨大。对于刚性问题不适合用 ode45来求解,如果硬要用ode45来求解的话,达到指定 精度所耗费的时间往往会非常长 。
2020/6/19
© 吴鹏, MATLAB从零到进阶.
二、 非刚性问题举例
这些函数可以求解非刚性问题,刚性问题,隐式
微分方程,微分代数方程等初值问题,也可以求解 延迟微分方程,以及边值问题等。
2020/6/19
© 吴鹏, MATLAB从零到进阶.
二、初值问题求解函数
常微分方程数值解
1. 提供的函数
ode23, ode45, ode113, ode15s, ode23s, ode23t, ode23tb,这些函数统一 的调用格式如下:

matlab算法-求解微分方程数值解和解析解

matlab算法-求解微分方程数值解和解析解

MATLAB是一种用于数学计算、工程和科学应用程序开发的高级技术计算语言和交互式环境。

它被广泛应用于各种领域,尤其在工程和科学领域中被用于解决复杂的数学问题。

微分方程是许多工程和科学问题的基本数学描述,求解微分方程的数值解和解析解是MATLAB算法的一个重要应用。

1. 求解微分方程数值解在MATLAB中,可以使用各种数值方法来求解微分方程的数值解。

其中,常见的方法包括欧拉法、改进的欧拉法、四阶龙格-库塔法等。

这些数值方法可以通过编写MATLAB脚本来实现,从而得到微分方程的近似数值解。

以常微分方程为例,可以使用ode45函数来求解微分方程的数值解。

该函数是MATLAB中用于求解常微分方程初值问题的快速、鲁棒的数值方法,可以有效地得到微分方程的数值解。

2. 求解微分方程解析解除了求解微分方程的数值解外,MATLAB还可以用于求解微分方程的解析解。

对于一些特定类型的微分方程,可以使用符号计算工具箱中的函数来求解微分方程的解析解。

通过符号计算工具箱,可以对微分方程进行符号化处理,从而得到微分方程的解析解。

这对于研究微分方程的性质和特点非常有帮助,也有助于理论分析和验证数值解的准确性。

3. MATLAB算法应用举例在实际工程和科学应用中,MATLAB算法求解微分方程问题非常常见。

在控制系统设计中,经常需要对系统的动态特性进行分析和设计,这通常涉及到微分方程的建模和求解。

通过MATLAB算法,可以对系统的微分方程进行数值求解,从而得到系统的响应曲线和动态特性。

另外,在物理学、生物学、经济学等领域的建模和仿真中,也经常需要用到MATLAB算法来求解微分方程问题。

4. MATLAB算法优势相比于其他数学软件和编程语言,MATLAB在求解微分方程问题上具有明显的优势。

MATLAB提供了丰富的数值方法和工具,能够方便地对各种微分方程进行数值求解。

MATLAB具有直观的交互式界面和强大的绘图功能,能够直观地展示微分方程的数值解和解析解,有利于分析和理解问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用MATLAB求解常微分方程数值解目录1. 内容简介 (1)2. Euler Method(欧拉法)求解 (1). 显式Euler法和隐式Euler法 (2). 梯形公式和改进Euler法 (3). Euler法实用性 (5)3. Runge-Kutta Method(龙格库塔法)求解 (6). Runge-Kutta基本原理 (6). MATLAB中使用Runge-Kutta法的函数 (8)4. 使用MATLAB求解常微分方程 (8). 使用ode45函数求解非刚性常微分方程 (8). 刚性常微分方程 (9)5. 总结 (10)参考文献 (11)附录 (12)1. 显式Euler法数值求解 (12)2. 改进Euler法数值求解 (12)3. 四阶四级Runge-Kutta法数值求解 (13)4. 使用ode45求解 (14)1.内容简介把《高等工程数学》看了一遍,增加对数学内容的了解,对其中数值解法比较感兴趣,这大概是因为在其它各方面的学习和研究中经常会遇到数值解法的问题。

理解模型然后列出微分方程,却对着方程无从下手,无法得出精确结果实在是让人难受的一件事情。

实际问题中更多遇到的是利用数值法求解偏微分方程问题,但考虑到先从常微分方程下手更为简单有效率,所以本文只研究常微分方程的数值解法。

把一个工程实际问题弄出精确结果远比弄清楚各种细枝末节更有意思,因此文章中不追求非常严格地证明,而是偏向如何利用工具实际求解出常微分方程的数值解,力求将课程上所学的知识真正地运用到实际方程的求解中去,在以后遇到微分方程的时候能够熟练运用MATLAB得到能够在工程上运用的结果。

文中求解过程中用到MATLAB进行数值求解,主要目的是弄清楚各个函数本质上是如何对常微分方程进行求解的,对各种方法进行MATLAB编程求解,并将求得的数值解与精确解对比,其中源程序在附录中。

最后考察MATLAB中各个函数的适用范围,当遇到实际工程问题时能够正确地得到问题的数值解。

2.Euler Method(欧拉法)求解Euler法求解常微分方程主要包括3种形式,即显式Euler法、隐式Euler法、梯形公式法,本节内容分别介绍这3种方法的具体内容,并在最后对3种方法精度进行对比,讨论Euler法的实用性。

本节考虑实际初值问题使用解析法,对方程两边同乘以得到下式两边同时求积分并采用分部积分得到解析解:本节后面将对此方程进行求解,并与精确解进行对比,分析Euler的可行性。

2.1.显式Euler法和隐式Euler法显式和隐式Euler法都属于一阶方法,显式Euler法的迭代公式简单,如下所示:对过上述公式对式进行迭代,其中步长,计算之间的数值,迭代求解的MATLAB程序见附录,能够得出精确解和数值解的图像,如图所示。

图显式Euler法精确解和数值解图像从图中可以看出,显式Euler法在斜率很大的时候存在非常大的误差。

本质上是Euler 法只计算了每一步差值中的一阶部分,由Taylor级数可知:当公式中的二阶导数较大时就会产生明显的偏差,同时迭代过程中由于使用到上一部的结果,误差会在迭代中传播,因此这种Euler法在实际中是无法使用的,但是却给求解微分方程数值解提供了好的开始。

另外一种Euler法是隐式Euler法,其迭代公式是,它并没有解决上面所说的问题,同时它的计算更加繁琐,对于无法化简成显示迭代的公式时还需要用迭代法求解非线性方程。

为了解决上面的方法,就需要提高迭代公式中计算差值的阶数,下面介绍了梯形法和改进Euler法,它们都是二阶方法。

2.2.梯形公式和改进Euler法梯形公式以及改进Euler法都属于二阶方法,下面证明它是二阶方法,使用两次Taylor 公式,将和展开:将得到从上式可以看出,梯形法的局部截断误差的主要部分是,是关于步长的三次式,这说明了梯形法取到了差值中的二次项,因此梯形法是二阶方法。

从上面可以得到梯形的迭代公式:但是上式并不容易计算,因为上式中的为带求量,当无法化成显式形式时,需要对上式进行迭代求解。

因此梯形公式不易通过计算机编程求解,实际上改进的Euler法更容易求解。

改进Euler法迭代公式先通过显式Euler法求出一个估计值,通过这个估计值来计算,然后方程就变成了显式方程,从而可以得到修正值,改进Euler法更适合计算机编写程序,同样解决初值问题,详细MATLAB程序见附录2,得到的对比图像如图所示。

图改进Euler法精确解与数值解对比由于改进Euler法用来求解的并不是精确解,所以得到的导数会有一定误差,因此改进Euler法的实际局部截断误差不仅仅是。

2.3.Euler法实用性从图可以看出来一阶方法精确度非常差,基本上是无法用到实际工程中的,因此显式和隐式Euler法只是提供一种对微分方程求解的思想。

从图中得到的数值解相对图已经有了明显的改善,但是对于精度要求较高的工程问题,梯形法和改进Euler法这样的二阶方法同样是不满足要求的。

但通过这两个方法,了解到提高方法取差值中的更高阶数项能够达到提高精度的目的,后面内容中的Runge-Kutta法就是由此思想而来。

将细节部分放大更能够看出两种方法的精度,如图所示(左图是Euler法,右图是改进Euler法)。

图两种方法细节部分3.Runge-Kutta Method(龙格库塔法)求解这一节的目的是弄清楚Runge-Kutta法(后面简称R-K法)的基本原理,并弄清楚MATLAB 中ode系列适合解决哪一种工程问题,希望达到的目的对于任何一个工程上提出的常微分方程问题都能够利用MATLAB求得误差在能够接受范围内的数值解。

3.1.Runge-Kutta基本原理MATLAB中使用R-K法的函数有ode23和ode45,其中ode是ordinary differential equation的缩写,其中ode23表示使用的是2阶3级R-K法,ode45使用的是4阶5级R-K 法。

将局部截断误差表示如下式:将上式中的方法称作阶级Runge-Kutta法。

其中:下面将构造出四阶四级经典R-K法,并通过MATLAB编程实现对初值问题求解。

四级四阶R-K法的本质是用四项级数来取得Taylor展开的前面四阶项,局部截断误差首项是步长的五次方,即:从上述表达式中可以看出,实际上R-K法是希望通过线性组合来近似Taylor公式中的阶导数组合,这样能够避免求解函数的阶导数,从而大量减小了计算量。

实际计算中将用来表示,则利用二元Taylor公式展开,舍去,并将同次数项系数相等,得到经典四阶四级R-K法的公式:上面从一阶到二阶的数值求法让误差有很大的改观,利用上述公式写出四阶四级的MATLABA程序(见附录3),得到的图像如图所示,图中解析解和数值解基本上重叠了,并且在处的误差已经小于了,而显式Euler法的误差为数量级,二阶改进Euler法误差在数量级。

图四阶四级R-K法数值解和精确解对比3.2.MATLAB中使用Runge-Kutta法的函数MATLAB中利用R-K法求解常微分方程的函数主要是ode45,它用来求解非刚性常微分方程,是工程计算中首选函数。

另外的ode23是2阶3级R-K法函数,它可以用来求解轻微刚性方程,其精度相对较低,但是效率较高。

它们都是显式的R-K法,另外一个函数式ode23tb,它是隐式的R-K法可以用来求解非刚性的常微分方程。

4.使用MATLAB求解常微分方程MATLAB中求解常微分方程共有7个函数,表4-1列举出它们的使用范围以及简介。

表4-1 MATLAB中求解常微分方程函数通过表4-1了解到,当遇到一个常微分方程问题,首先使用ode45对其进行求解,如果求解非常慢或者无法求解,那么问题很可能是刚性问题,需要使用ode15s进行求解。

对于精度要求非常高的问题可使用ode113尝试进行求解,对于其他的刚性问题,需要具体研究使用哪一个函数。

4.1.使用ode45函数求解非刚性常微分方程ode45函数实现了变步长四阶五级Runge-Kutta-Felhberg算法(简称RKF法)。

调用格式如下所示。

公式中是函数的句柄,是求解区间的起点和终点,是初始值,后面的都是各种控制求解细节的选项。

其中的可以是匿名函数、子函数、嵌套函数、单独M文件等形式。

实际上ode45能够求解常微分方程组,其中的使用状态变量表示方法,左侧是各个状态变量的导数,右侧是方程。

ode45可以解决高阶常微分方程的数值求解问题,基本思想是将高阶通过变量替换变成低阶,然后列成下面所示的微分方程组,然后进行求解。

对于处置初值问题,使用MATLAB求解(代码见附录4)如图所示,其精度与上面自己编写的程序差不多,在处的误差小于。

图使用ode45求解细节4.2.刚性常微分方程如上所述,ode45函数能够求解的是非刚性问题,而刚性(stiff)问题使用ode45求解会产生求解缓慢,或者完全无法求解的情况,这种情况可以判断这个方程是刚性的。

可以考虑使用ode23或者ode23s函数进行求解。

刚性常微分方程指的是其特征根相差很大,但似乎没有非常有效判断一个方程是刚性还是非刚性的办法,需要实际求解的时候通过不同的函数进行求解比较。

5.总结文本主要研究了如何求常微分方程的数值解,从开始的一阶显式Euler法,到四阶R-K 法,精度提高了很多。

同时通过编写MATLAB代码来对具体初值问题进行求解,对课本上将的机制有了更加深入的了解,对具体算法过程有了深入的认识,从中学到了很多。

另外文中总结了MATLAB中求解常微分方程数值解函数的用法,在面对不同的工程问题的时候,怎样去挑选正确的函数来求解具体问题,更多的是学会了如何去解决实际问题。

实际问题中更多是由偏微分方程进行描述的,由于时间和个人数学水平原因,文中没有对偏微分方程数值求解进行研究,这是文章的不足,有待在后续的学习当中对其进行解决。

参考文献[1]于寅.高等工程数学[M].武汉:华中科技大学出版社.2012[2]李红.数值分析(第2版)[M].武汉:华中科技大学出版社.2010[3]胡建伟,汤怀民.微分方程数值方法(第二版)[M].北京:科学出版社.2007[4]薛定宇,陈阳泉.高等应用数学问题的MATLAB求解(第二版)[M].北京:清华大学出版社.2008附录1.显式Euler法数值求解clear,clc %y1中存储0~5中的数值解 y2中存储-5~0中的数值解dyx=@(x,y) (-2*y-4*x); %方程右边函数fx=@(x) (exp(-2*x)-2*x+1); %解析解y1(1)=2;y2(1)=2;h = ;i=2;for x=0:h:5-hy1(i)=y1(i-1)+h*dyx(x,y1(i-1));i =i +1;endi=2;for x=0:-h:-5+hy2(i) = y2(i-1)-h*dyx(x,y2(i-1));i=i+1;endx=-5:h:5;y=fx(x);ye=[fliplr(y2(2:end)) 2 y1(2:end)];plot(x,y,x,ye,'--');legend('\fontsize{12}\fontname{楷体}精确解',...'\fontsize{12}\fontname{楷体}数值解','interpreter','latex'); text(x(8)+,y(8),'$\leftarrowe^{-2x}-2x+1$','interpreter','latex','fontsize',15);2.改进Euler法数值求解clear,clc %y1中存储0~5中的数值解 y2中存储-5~0中的数值解dyx=@(x,y) (-2*y-4*x); %方程右边函数fx=@(x) (exp(-2*x)-2*x+1); %解析解y1(1)=2;y2(1)=2;yy1(1)=2;yy2(1)=2; %yy1和yy2中存储的为估计值h = ;i=2;for x=0:h:5-hyy1(i)=y1(i-1)+h*dyx(x,y1(i-1));yy1(i)=dyx(x+h,yy1(i));y1(i)=y1(i-1)+h/2*(dyx(x,y1(i-1))+yy1(i));i =i +1;endi=2;for x=0:-h:-5+hyy2(i) = y2(i-1)-h*dyx(x,y2(i-1));yy2(i) = dyx(x-h,yy2(i));y2(i) =y2(i-1)-h/2*(dyx(x,y2(i-1))+yy2(i));i=i+1;endx=-5:h:5;y=fx(x);ye=[fliplr(y2(2:end)) 2 y1(2:end)];plot(x,y,x,ye,'--');set(gcf,'color','white');legend('\fontsize{12}\fontname{楷体}精确解',...'\fontsize{12}\fontname{楷体}数值解','interpreter','latex'); text(x(8)+,y(8),'$\leftarrowe^{-2x}-2x+1$','interpreter','latex','fontsize',15);3.四阶四级Runge-Kutta法数值求解clear,clc %y1中存储0~5中的数值解 y2中存储-5~0中的数值解dyx=@(x,y) (-2*y-4*x); %方程右边函数,即f(x,y)fx=@(x) (exp(-2*x)-2*x+1); %解析解y1(1)=2;y2(1)=2;h = ;i=2;for x=0:h:5-hk1=dyx(x,y1(i-1));k2=dyx(x+h/2,y1(i-1)+h/2*k1);k3=dyx(x+h/2,y1(i-1)+h/2*k2);k4=dyx(x+h,y1(i-1)+h*k3);y1(i)=y1(i-1)+h/6*(k1+2*k2+2*k3+k4);i =i +1;endi=2;for x=0:-h:-5+hk1=dyx(x,y2(i-1));k2=dyx(x-h/2,y2(i-1)-h/2*k1);k3=dyx(x-h/2,y2(i-1)-h/2*k2);k4=dyx(x-h,y2(i-1)-h*k3);y2(i)=y2(i-1)-h/6*(k1+2*k2+2*k3+k4);i=i+1;endx=-5:h:5;y=fx(x);ye=[fliplr(y2(2:end)) 2 y1(2:end)];subplot(1,2,1);plot(x,y,x,ye,'--');set(gcf,'color','white');legend('\fontsize{12}\fontname{楷体}精确解',...'\fontsize{12}\fontname{楷体}数值解','interpreter','latex'); hold on;subplot(1,2,2);plot(x,y,x,ye,'--');legend('\fontsize{12}\fontname{楷体}精确解',...'\fontsize{12}\fontname{楷体}数值解','interpreter','latex'); axis([-5 ]);4.使用ode45求解dyx=@(x,y) (-2*y-4*x); %方程右边函数fx=@(x) (exp(-2*x)-2*x+1); %解析解[xx,yy]=ode45(dyx,[0 5],2);[xxx,yyy]=ode45(dyx,[0 -5],2),x=-5::5;y=fx(x);sx=[flipud(xxx) xx];sy=[flipud(yyy) yy];subplot(1,2,1);plot(x,y,sx,sy,'--');subplot(1,2,2);plot(x,y,sx,sy,'--');set(gcf,'color','white');axis([-5 ]);。

相关文档
最新文档