MATlAB 数值求解ODE方程
重要: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解二阶偏微分方程
<div align="center">一、Matlab求解二阶偏微分方程(ODE)的基本步骤</div>1. 数学模型:首先要确定求解的方程是哪一类的偏微分方程(ODE),然后建立其对应的数学模型,使其符合这类微分方程的形式;2. 确定边界条件:确定迭代范围$[a,b]$,边界条件函数 $y(a)=\alpha$ 、$y(b)=\beta$;3. 写出Matlab程序:在该类ODE中,通常会有某一种常用的数值求解方法,一般使用微分方程求解器(ODE),如ode45等;4. 获得实际结果:开始编写Matlab程序,完成参差和参数的输入以后,可以运行Matlab程序,然后求得结果,再用图像表示出来。
<div align="center">二、具体求解</div>$$\frac{d^2y}{dx^2}+y=6sin(2x)$$微分方程为二阶常微分方程,求解条件如下:$[a,b]=[0,\pi], y(0)=1,y(\pi)=3.$(1)Matlab函数表达式首先建立与二阶非齐次线性常微分方程相符合的数学模型,其Matlab函数表达式为$$ f(x,y,y')=\frac{dy}{dx}-y'-6sin2x $$其中,$y=y(x)$;(2)函数程序在Matlab中,定义函数程序 $myode.m$ ,此程序返回右端函数 $f(x,y,y')$ 的值表达式,程序内容如下。
```MATLAB% 右端函数程序function dy=myode(x,y)dy=[y(2);-y(2)-6*sin(2*x)];end```(3)调用Matlab函数olvede45调用Matlab函数 solvede45 求解二阶ODN,程序内容如下:```MATLAB% 主程序求解% maxstep表示分裂的步长大小% Tolerence表示误差,控制求解精度Maxstep=0.25;Tolerence=1e-4;a=0;b=pi;y0=[1;0];[x,y] = ode45('myode',[a,b],y0,options);```(4)结果展示输入参数之后,运行Matlab程序,得到如下图:![](../images/matlab_2_diff.png)此图为$y(x)$随$x$变化的曲线,可以看出,二阶偏微分的求解结果满足了边界条件,即$y(0)=1,y(\pi)=3$ ,如图中红色圆点所示。
ODE问题解析解及数值解的matlab实现
龙源期刊网 ODE问题解析解及数值解的matlab实现作者:于丽妮来源:《电脑知识与技术》2012年第14期利用数学手段研究自然现象和社会现象或解决工程技术问题,如揭示质点运动规律的Newton第二定律和刻画回路电流或电压变化规律的基尔霍夫回路定律等。
一般先要建立数学模型,再对数学模型进行简化和求解,然后结合实际问题对结果进行分析和讨论。
数学模型中最常见的表达方式,是包含自变量和未知函数以及未知函数导数的的函数方程。
即微分方程,通常包括常微分方程(ODE)和偏微分方程(PDE)。
ODE是常微分方程的英文缩写,即ordinary diffrential equation,如果在微分方程中,自变量的个数只有一个,这就是ODE方程,例如形如F(x,y,y’,y")=0的方程就是一个二阶ODE方程。
对于常微分方程来说,能够求出解析解的是有限的,即不能通过等式左右同时积分求不定积分的方法求出,特别是高阶方程和偏微分方程,有的解还需要用插值方法继续计算,因此用解析法来求微分方程的数值解有时是不适宜的。
但是在给定条件下,可以求出常微分方程的数值解来逼近数值解,以完成对模型的研究。
这就要求我们必须研究微分方程的解法,既要研究微分方程的解析解法(精确解),更要研究微分方程的数值解法(近似解)。
ODE问题通常是对一动态过程(动态系统、动力系统)演化规律的描述,求解ODE问题就是要了解和掌握动态过程演化规律。
本文主要研究ODE问题解析解及数值解的matlab实现。
微分方程是一门实用性很强的学科,对于理论研究以及生活实际提出的微分方程问题,能够求出解析解的方程是有限的,因此将计算机应用到求微分方程解的问题是必要的。
本文详细介绍了常微分方程中解析解及数值解解法的理论基础,并用matlab加以实现。
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_常微分方程数值解法
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. 基本概念在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求微分方程数值解是一种常用的数学计算方法。
在实际工程和科学研究中,许多问题都可以用微分方程来描述,但是解析解往往难以求得,因此需要用数值方法求解微分方程。
求解微分方程的数值方法有很多种,其中比较常用的是欧拉法和龙格-库塔法。
欧拉法是一种基本的数值方法,它采用离散化的方法将微分方程转化为差分方程,然后通过迭代来求出数值解。
欧拉法的具体步骤是:首先将自变量和因变量离散化,然后利用微分方程的定义式将微分方程转化为差分方程,最后通过迭代求出数值解。
欧拉法的优点是简单易懂,但是精度较低,容易产生误差。
龙格-库塔法是一种高阶数值方法,它将微分方程转化为一系列的差分方程,并采用递推的方法求解数值解。
龙格-库塔法的优点是精度高,收敛速度快,适用于求解复杂的微分方程。
但是龙格-库塔法的计算量较大,需要进行多次计算,计算时间较长。
在使用matlab求解微分方程时,可以直接调用matlab中的ode 函数来求解微分方程。
ode函数是matlab中内置的求解微分方程的函数,它支持多种数值方法,包括欧拉法和龙格-库塔法等。
使用ode函数可以简化求解微分方程的过程,提高计算效率。
在使用ode函数求解微分方程时,需要先定义微分方程的函数表达式,然后将函数表达式作为参数传入ode函数中。
ode函数会自动选择合适的数值方法来求解微分方程,并返回数值解。
通过调整ode函数的参数,可以进一步提高求解微分方程的精度和计算效率。
除了ode函数外,matlab中还有很多其他的数值计算函数,如dsolve函数、pdepe函数等,它们可以用来求解不同类型的微分方程。
在实际应用中,需要根据具体问题选择合适的数值方法和函数来求解微分方程。
利用matlab求解微分方程数值解是一种常用的数学计算方法,可以通过调用matlab中的内置函数来实现。
在选择数值方法和函数时需要考虑精度和计算效率等因素,以便更好地解决实际问题。
Matlab ode函数 微分方程的数值解
odefun是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名
tspan是区间[t0 tf]或者一系列散点[t0,t1,...,tf]
y0是初始值向量《Simulink与信号处理》
T返回列向量的时间点
Y返回对应T的求解列向量
[T,Y] = ode45(odefun,tspan,y0,options)
options是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等
[T,Y,TE,YE,IE] =ode45(odefun,tspan,y0,options)
在设置了事件参数后的对应输出
TE事件发生时间
YE事件解决时间
IE The index i of the event functionthat vanishes.
sol =ode45(odefun,[t0 tf],y0...)
sol结构体输出结果
编辑本段
示例
求解一阶常微分方程
odefun=@(t,y) (y+3*t)/t^2; %定义函数
tspan=[1 4]; %求解区间
y0=-2; %初值
[t,y]=ode45(odefun,tspan,y0);plot(t,y) %作图
title('t^2y''=y+3t,y(1)=-2,1<t<4') legend('t^2y''=y+3t')
xlabel('t')
ylabel('y')=y+3*t','y(1)=-2')
matlab迭龙格库塔法解常微分方程
一、介绍迭龙格-库塔法(Runge-Kutta method)是一种数值求解常微分方程(ODE)的常用方法。
它是由卡尔·迭龙格(Carl Runge)和马丁·威尔黑尔姆·库塔(Wilhelm Kutta)在20世纪初提出的,该方法以两位数值分析家的名字来命名。
二、简单描述迭龙格-库塔法是通过数值逼近的方式,来计算常微分方程的近似解。
它是一种显式求解方法,适用于解非线性常微分方程和具有较大阶数的常微分方程。
三、数学原理迭龙格-库塔法主要是通过将微分方程转化为差分方程,利用数值解的方式来逼近微分方程的解。
它是一种显式方法,通过不断迭代得到下一个时间步的近似解。
四、matlab中的应用在matlab中,可以使用ode45函数来调用迭龙格-库塔法求解常微分方程。
ode45函数是matlab中集成的一个函数,通过调用ode45函数,可以直接求解常微分方程的数值解。
五、实例演示下面通过一个简单的例子来演示如何使用matlab中的ode45函数来求解常微分方程。
我们考虑一个简单的一阶常微分方程:dy/dt = -y初始条件为y(0) = 1。
在matlab中,可以通过以下代码来求解该微分方程:```定义微分方程的函数function dydt = myode(t, y)dydt = -y;调用ode45函数求解[t, y] = ode45(myode, [0, 5], 1);plot(t, y);```运行以上代码,即可得到微分方程的数值解,并通过绘图来展示解的变化。
六、总结迭龙格-库塔法是一种常用的数值解常微分方程的方法,它在matlab中有较为方便的调用方式。
通过ode45函数,可以快速求解常微分方程的数值解,并通过绘图来展示结果。
希望本篇文章对读者有所帮助,谢谢阅读。
七、应用场景和优势在实际应用中,迭龙格-库塔法广泛应用于各种科学和工程领域,如物理学、化学、生物学、经济学等。
matlab第6章ode
1 L 0
u
i
状态方程以两个状态元件 i和uo作状态变量 21
+S
i
ui
D
-
dT
L
+
C u0 R
-
0
L
di dt
u0
i
C
d u0
dt
u0
R
T
(2)当S=off:时间长度为: (1-d)*T:
di dt
u0
L
du0
dt
i C
u0
RC
22
S=OFF
u
•
i
•
0
0
1 C
1
1. ode23
在MATLAB中,函数ode23采用2-3阶龙格-库塔法 求解微分方程。
[t,y]=ode23(odefun,tspan,y0) [t,y]=ode23(odefun,tspan,y0,options) odefun:定义微分方程的形式y’=f(t,y) tspan=[t0,tfinal]:表示微分方程的积分限从t0(始值) 到tfinal(终值),该积分限也可以是一些离散的点。 y0:初始状态列向量 options:积分参数,包括‘RelTol’(相对误差)和 ‘AbsTol’(绝对误差),可省略。
IR Vi
L C UC
12
(1)分析:根据电路分析,可以得出微分方程
RI(t) VL(t) VC (t) Vi (t)
I(t) C dVC (t) dt
VL (t)
L
dI(t) dt
LC
d
2VC (t) dt 2
dI(t) L dt RI(t) VC (t) Vi (t)
LC
常微分方程初值问题的MATLAB解法
1用Matlab 求常微分方程(ODE)的初值问题(IVP)本节考虑一阶常微分方程000(,) ()u f t u t t Tu t u '=<≤⎧⎨=⎩ (1.1)的数值求解问题,包括算法公式及编程问题。
对一阶常微分方程组的初值问题010111120221220200120()(,,,,)(,,,,)() (,,,,)()m mm m m m m u t u u f t u u u u f t u u u u t u t t T u f t u u u u t u ⎧='=⎧⎪⎪'==⎪⎪<≤⎨⎨⎪⎪⎪⎪'==⎩⎩ (1.2)可以通过引入列向量0,,u u f化成类似(1.1)的形式000(,) ()u f t u t t Tu t u ⎧'=<≤⎪⎨=⎪⎩(1.3)其中1101122202120012()()(,,,,)()()(,,,,)(),,(,)()()(,,,,)m m m m mm u t u t f t u u u u t u t f t u u u u t u f t u u t u t f t u u u ⎛⎫⎛⎫⎛⎫⎪ ⎪ ⎪ ⎪ ⎪ ⎪=== ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭ (1.4)另外一个高阶常微分方程的初值问题()(1)0(1)(1)000000(,,,,,) (),(),,()m m m m u f t u u u u t t Tu t u u t u u t u ---'''⎫=<≤⎪⎬''===⎪⎭(1.5)也可以通过变换(1)123,,,,m m u u u u u u u u -'''==== 化成维微分方程组:1223112(,,,,)m mmm u u u u u uu f t u u u -'=⎧⎪'=⎪⎪⎨⎪'=⎪'=⎪⎩(1.6)我们在设计算法时通常先对一维一阶常微分方程(1.1)进行,然后再将这个算法写成适合求解(1.3)的向量形式,并以向量形式来进行编程。
matlab的ode函数
matlab的ode函数在MATLAB中,ODE函数(ordinary differential equation)用于求解常微分方程(ordinary differential equations,ODEs)的数值解。
ODE函数在MATLAB的“ode”命令下调用,有多种不同类型的ODE求解器可供选择。
ODE函数的语法如下:[t, y] = ode45(odefun, tspan, y0)其中- “ode45”是一种常用的ODE求解器,可以用于求解非刚性的一阶或高阶常微分方程。
- “odefun”是一个函数句柄,表示待求解的ODE,其形式为dy/dt= f(t, y)。
该函数需要接受两个输入参数:自变量t和因变量y,并输出对应的导数值。
- “tspan”是一个包含两个元素的向量,表示自变量t的范围。
-“y0”是一个包含初始条件的列向量,表示因变量y在自变量t的初始值。
ODE函数的输出包括两个变量:- “t”是一个列向量,表示自变量t的离散值。
这些值等距地分布在tspan范围内。
-“y”是一个矩阵,每一列代表因变量y在相应t值处的数值解。
除了ode45之外,MATLAB还提供了其他常用的ODE求解器,包括ode23、ode113、ode15s、ode23s等。
这些求解器根据不同的算法和精度要求进行了优化,可根据具体问题的特点选择适当的求解器。
在使用ODE函数时,需要定义一个ODE函数句柄,作为输入参数传递给ODE求解器。
此函数句柄需要编写对应的ODE方程,并确保正确地输入输出导数值。
以下是一个示例ODE函数的编写过程:function dydt = myODE(t, y)dydt = 2 * y; % 示例ODE:dy/dt = 2*y然后,可以调用ODE求解器来求解该ODE:这将返回自变量t的离散值和对应的因变量y的数值解。
通过使用ODE函数,用户可以方便地在MATLAB环境中求解常微分方程,并获取其数值解。
常微分方程(ODEs)的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 为例介绍如何将之变换成一个一阶显式常微分方程组。
dsolve在matlab中的作用
dsolve在matlab中的作用dsolve在matlab中的作用一、简介dsolve是matlab中的一个函数,用于求解常微分方程(ODE)或偏微分方程(PDE)。
通过使用dsolve函数,可以得到给定微分方程的解析解或数值解。
该函数提供了一种快速且准确地求解微分方程的方法,可以应用于各种科学和工程领域。
二、常微分方程(ODE)的求解1. 一阶常微分方程的求解dsolve函数可以用来求解形如dy/dx=f(x,y)的一阶常微分方程。
其中,f(x,y)是已知函数。
通过输入这个微分方程到dsolve函数中,可以得到该微分方程的解析解。
考虑以下一阶常微分方程:dy/dx = x^2 + y^2。
为了求解这个微分方程,我们可以使用以下代码:```syms x y;eqn = diff(y,x) == x^2 + y^2;sol = dsolve(eqn);```在上述代码中,首先定义了符号变量x和y,并使用diff函数定义了待求导数dy/dx。
然后将该表达式与等式右侧的函数x^2 + y^2进行比较,并将结果赋给eqn变量。
通过调用dsolve函数并传递eqn作为参数,可以得到这个一阶常微分方程的解析解。
2. 高阶常微分方程的求解除了一阶常微分方程,dsolve函数还可以用于求解高阶常微分方程。
考虑以下二阶常微分方程:d^2y/dx^2 + 2*dy/dx + y = 0。
为了求解这个微分方程,可以使用以下代码:```syms x y;eqn = diff(y,x,2) + 2*diff(y,x) + y == 0;sol = dsolve(eqn);```在上述代码中,首先定义了符号变量x和y,并使用diff函数定义了待求导数d^2y/dx^2和dy/dx。
然后将这两个表达式与等式右侧的函数进行比较,并将结果赋给eqn变量。
通过调用dsolve函数并传递eqn作为参数,可以得到这个二阶常微分方程的解析解。
常微分方程的数值解的matlab命令实现方法
常微分方程的数值解的matlab命令实现方法常微分方程的数值解在 MATLAB 中可以通过 ode 函数或 dsolve 函数进行求解。
其中,ode 函数可以求解一阶常微分方程,而 dsolve 函数可以求解二阶及以上的常微分方程。
下面是具体的实现方法:1. 一阶常微分方程的求解对于一阶常微分方程,可以使用 ode 函数求解。
假设我们要求解的常微分方程为:dx/dt = f(x, t)可以使用以下命令进行求解:y0 = [a, 0]; % 初值条件tspan = [0, 20]; % 时间区间[t, y] = ode45(@(t, y) odefun(t, y, a), tspan, y0); % 求解其中,odefun 函数用于定义常微分方程的解,它是一个自定义函数,其形式可以为:dy/dt = f(t, y)其中,dy 是 y 的求导,f(t, y) 是常微分方程的系数矩阵。
在 MATLAB 中,可以使用 dy[] 函数来计算 y 的求导,例如:dy = dy[](t, y);最后,使用 ode45 函数求解常微分方程的解,其中 tspan 是时间区间,y0 是初值条件。
2. 二阶常微分方程的求解对于二阶常微分方程,可以使用 dsolve 函数求解。
假设我们要求解的二阶常微分方程为:d2y/dt2 + p(t)dyy/dt + q(t)dy/dt + r(t)y = 0可以使用以下命令进行求解:syms t pqr;y0 = [a1, a2, a3]; % 初值条件[t, y] = dsolve(@(t, y) dy0(t, y), t, y0); % 求解其中,dy0 函数用于定义二阶常微分方程的解,其形式可以为:d2y/dt2 + p(t)dyy/dt + q(t)dy/dt + r(t)y = 0其中,d2y/dt2 是 y 的二阶求导,其它项是 y 的求导。
在 MATLAB 中,可以使用 dy0[] 函数来计算 y 的二阶求导。
8.5.2MATLAB中的实用ODE求解器
即计算出t =0.2时的数值解为:y ̃1(0.2)=1.32,y ̃2(0.2)=0.6 .容易验证此问题的准确解为:y 1(t )=4e −t −3e −2t , y 2(t )=−4e −t +6e −2t . 因此t =0.2时的准确解为y 1(0.2)=1.264, y 2(0.2)=0.747,与数值解相差不大.在常微分方程组的求解过程中,也要注意数值解法的稳定性. 以方程组(8.70)为例,考虑欧拉法的稳定性,计算公式为:y n+1=y n + Ay n =(I + A )y n ,假设y n 存在扰动δn ,则由它引起y n+1的误差为:δn+1=(I + A )δn ,要使δn+1的大小不超过δn ,或者随着n 的增大误差不会发散为无穷大,则要求矩阵I + A 的特征值均不超过1,即谱半径 ρ(I + A )≤1 . (8.73) 也就是说,对矩阵A 的任一个特征值λi ,都应满足|1+ λi |≤1 . (8.74)这给出了用欧拉法求解常微分方程组(8.70)保证稳定的充要条件. 一般特征值λi 为复数,则λi 在复平面的稳定区域如图8-7所示,注意它与描述欧拉法求解模型问题稳定区域的图8-2是几乎一样的. 更进一步,若特征值λi 为实数,则得到稳定性对步长的限制条件:≤−2λi .根据这个要求看例8.13,由于两个特征值分别为-1和-2,欧拉法的步长应满足 ≤−2−2=1,采用h=0.1是满足稳定性要求的.对更一般的常微分方程组,上述分析仍然有效,只需将λi 看成是雅可比矩阵J f 的特征值,然后根据具体方法求解单个常微分方程模型问题时的稳定性要求,可确定步长的稳定区间.8.5.2 Matlab 中的实用ODE 求解器Matlab 软件包含了多个实用的常微分方程初值问题求解器,例如我们前面提到的ode23命令(8.3.4小节). 表8-9列出了这些命令,并简要说明了它们的特点. 实际上,这些求解器分成两类. 前三个为显格式方法,为了保证计算的稳定性对某些问题效率很低(这类问题称为“刚性问题”);后四个为隐格式方法,稳定性对步长的限制较小,因此适合于求解“刚性问题”.表8-9 Matlab 中求解常微分方程初值问题的命令函数名 内部算法说明ode23 显格式,单步法,采用BS23算法的自动变步长R-K 方法 对于精度要求不高的情况,效率好于ode45 ode45 显格式,单步法,包含一个4阶和5阶公式的自动变步长R-K 方法一般情况下,首先尝试使用它来求解 ode113 显格式,多步法,采用变阶数的Adams-Bashforth-Moulton 预测校正公式 适合于精度要求高或计算f 函数代价高的情况 ode15s隐格式,多步法,采用变阶数的NDF 或BDF 公式适合于刚性问题Re( λi )Im( λi )-1 0图8-7 欧拉法解常微分方程组的稳定区域.ode23s 隐格式,单步法,采用改进的2阶Rosenbrock 公式 在精度要求不高的情况,效率可能好于ode15s ode23t 隐格式,单步法,采用基于“自由”插值基函数实现的梯形法精度要求不高的适度刚性问题ode23tb隐格式,单步法,采用两级隐式R-K 方法适用情况类似于ode23s下面简要说明,什么样的常微分方程初值问题是“刚性问题”?定义8.5:若一个常微分方程初值问题,其准确解函数随时间变化缓慢,但经过其附近点(且满足原微分方程)的解是随时间变化很快的函数,则这类问题称为刚性问题(stiff problem ).刚性问题可能是单个常微分方程,也可能是常微分方程组. 在求解刚性问题时,由于准确解附近的解变化很快,所以实际计算中必须采用很小的步长,才能防止数值解过大地偏离准确解. 实际上,刚性问题反映的是求解过程的计算效率问题,它可以通过数值解法的稳定性分析来解释,即由于稳定性要求使得步长必须很小. 一般采用显式方法求解刚性问题计算效率很低,而采用无条件稳定或稳定区间很大的隐式方法时,可取较大的步长. 例8.14 (刚性问题): 考虑常微分方程初值问题:{y ′=−100y +100t +101,t ≥0y (0)=1.01假设步长h=0.1, 使用欧拉法进行求解的结果列于表8-10中.表8-10 例8.14的计算结果t 0.0 0.1 0.2 0.3 0.4 准确解 1.01 1.100000 1.200000 1.300000 1.400000 欧拉法 1.01 1.01 2.01 -5.99 67.0 向后欧拉法1.011.1009091.2000831.3000081.400001该微分方程的通解为y (t )=1+t +c ∙e −100t ,将初值代入得到原问题的准确解为:y (t )=1+t +0.01e −100t .在表8-10中也列出了准确解. 通过对比看出,欧拉法的解严重偏离准确解. 事实上,准确解的曲线如图8-8所示,是变化非常缓慢的,但由于通解中包含项e −100t ,附近的解变化很快,所以一旦数值解稍稍偏离准确解,采用局部斜率的显式方法就会使误差迅速放大. 本例题就是一个典型的刚性问题.作为对比,我们也采用向后欧拉法进行求解,步长也取h=0.1, 结果列于表8-10的最后一行. 从中看出,向后欧拉法的结果准确得多.从算法稳定的角度看,本问题的雅可比矩阵J f =−100,其特征值也就是−100,因此为保证稳定欧拉法的步长应满足 ≤−2−100=0.02. 上面计算中没有满足此条件,才出现不稳定的情况. 对于这种刚性问题,用欧拉法等显格式方法求解,必须采用很小的步长才能保证准确,因此效率很低. 而向后欧拉法等隐格式方法稳定区间大,因此很适合求解刚性问题.从上述例子看出,刚性问题实际上就是不适合使用显式方法求解、或显式方法效率很低的问题. 了解到这一点,可指导我们选择使用合适的ODE 求解器. 下面通过几个例子说明图8-8 刚性问题(例8.14)的准确解.Matlab 中有关命令的使用.例8.15 (火焰燃烧问题): BS23算法的作者,L. Shampine 提出过一个描述火焰燃烧的微分方程,刻画点燃一根火柴时火焰半径迅速增大的动态过程. 假设y (t )为火焰半径,半径增大的速度应该与净供应的氧气量成正比,后者等于表面供应的氧气减去内部消耗的氧气,分别与y 2和y 3成正比. 根据上述分析,采用适当的单位,可得到如下的常微分方程:{y ′=y 2−y 3,t ≥0y (0)=η,其中η为初始的火焰半径,取η=0.0001,求y (t )的变化曲线.Matlab 中任何一种ODE 求解器都有3个必需的输入参数,即f 函数、求解时间范围、和y 函数的初始值. 定义函数有多种方法,对本例可采用简单的inline 命令:>> f= inline('y^2-y^3', 't','y');它说明了f 是关于t 和y 的二元函数. 假设求解时间范围为[0, 15000], 则使用ode45求解器的命令为:>> ode45(f, [0, 15000], 0.0001);在不加返回值的情况下,ODE 求解器自动画出y (t )的变化曲线,并标记出计算过程中的节点. 上述命令生成的y (t )函数曲线如图8-9所示. 从图中看出,在t =10000时,火焰半径迅速增大并达到一个稳定的值,这与现实情况相符,这种稳定状态表明火焰内部燃烧耗费的氧气和其表面现存的氧气达到了一种平衡.从图8-9还可以看出,这是一个刚性问题,在y (t )达到稳定值1后,仍然需要很小的步长,导致计算效率很低. 采用刚性求解器ode23s 重新计算此例,得到的结果如图8-10所示. 从中可以看出,刚性求解器所需的计算步数少得多,而且通过统计计算时间发现,ode23s 求解该问题的时间大约是ode45的1/6.例8.16 (常微分方程组): 用Matlab 中的ode23命令求解例8.11中的常微分方程组,假设F(t,y,y′ (t) )/m =6t , 初始值为y 1(0)=0,y 2(0)=1 .[解] 待求解的常微分方程组为:{y 1′=y 2y 2′=6t. 为了定义向量函数f (t,y ), 使用Matlab 中的.m 文件.function ydot = ffun(t,y);图8-10 用ode23s 求解例8.15.图8-11 用ode23s 求解例8.16得到的两条解函数曲线.y 1(t) y 2(t)图8-9 用ode45求解例8.15.放大图ydot= [y(2); 6*t]; %列向量 然后假设时间范围为[0, 1], 求解的命令如下:>> ode23(@ffun, [0, 1], [0; 1]);注意函数名前的“@”符号,而最后一个参数是初始值,这里是一个列向量. 得到解曲线如图8-11所示. 本题有解析解,为y 1(t )=t 3+t, y 2(t )=3t 2+1 ,它与数值解是吻合的.从这个例子可以看出,用Matlab 求解常微分方程组和求解单个常微分方程没有多大区别,只需将使用到的一些量设为向量即可.除了上述介绍的功能,Matlab 的ODE 求解器还可以自定义计算的节点和步长,并且在输入参数中增加options 参数,可灵活地设置误差控制、输出、事件、定义雅可比矩阵、隐式常微分方程等功能. 这些功能通过单独的odeset 命令来实现. 而采用标准的命令格式:[T,Y] = solver(odefun,tspan,y0,options) 还可以返回离散的时间点T 和对应的未知函数值Y . 关于这些功能的详细介绍,请感兴趣的读者查询Matlab 的联机帮助文档.应用实例:洛伦兹吸引子一. 问题背景世界上对常微分方程研究最广泛的领域之一是洛伦茨吸引子(Lorenz attractor ),它最先由美国MIT 大学的数学家和气象学家Edward Lorenz 在1963年提出. Lorenz 提出的方程是大气流体动力学的一个简化模型,它模拟大气的对流,可用于长期天气预报. Lorenz 方程是一个常微分方程组,可写成:y ′=Ay ,其中y =,y 1(t)y 2(t)y 3(t)-T ,而A =[−β0y 20−σσ−y 2ρ1] . 解的第一个分量y 1(t)和大气的对流相关,而另外两个分量分别与温度的水平和竖直变化相关. 参数σ称为普兰特数,ρ是规范化的瑞利数,β和模拟区域的几何形状相关.由于矩阵A 中有两个元素是y 2和−y 2,看起来简单的Lorenz 方程是一个非线性常微分方程,没有解析解. Lorenz 用数值方法对其进行求解,揭示了解函数y(t)的奇特性质,它是最早发现的混沌现象之一. 二. 吸引子的位置Lorenz 方程组中没有随机的因素,因此解y(t)完全由上面的参数和初始条件确定. 数值仿真的结果表明,当这些参数取某些值时,三维空间中y(t)的轨迹混乱地在两个点(吸引子)之间往返,有界但无周期,不收敛也不自交(如图(A), (B)). 这是一种“混沌”现象. 而对于参数的另外一些值,解可能会收敛于一个固定点,发散到无穷远或周期性振荡.图(B)显示的是随时间t 的变化,y 2和y 3构成的相位投影图,其中明显地看到有两个奇异吸引子,它们其实是常微分方程的两个固定点(或不动点). 为了求这两个吸引子的位置,需考虑初始值y(t 0)为何值时Ay (t 0)=O .y 1 y 2 y 3 t 图(A) 解函数随时间变化图。
matalb解ode方程组
Matlab解ODE方程组简介ODE(Ordinary Differential Equation)方程组是描述自然界中许多现象的重要数学工具。
Matlab作为一种强大的科学计算软件,提供了解决ODE方程组的功能和工具。
本文将介绍如何使用Matlab解ODE方程组,并提供一些实际问题的例子。
ODE方程组的定义ODE方程组是由多个常微分方程构成的一组方程,通常形式如下:dy1/dt = f1(t, y1, y2, ..., yn)dy2/dt = f2(t, y1, y2, ..., yn)...dyn/dt = fn(t, y1, y2, ..., yn)其中,y1, y2, …, yn是未知函数,t是自变量,f1, f2, …, fn是已知函数。
Matlab解ODE方程组的函数在Matlab中,可以使用ode45或其他相关函数来求解ODE方程组。
其中,ode45是一种常用的求解非刚性(non-stiff)ODE问题的函数。
ode45函数的基本用法[t, Y] = ode45(@fun, tspan, Y0)•@fun: 定义了ODE方程组中各个未知函数对应的函数句柄。
•tspan: 定义了自变量t的取值范围,通常为一个包含起始时间和结束时间的向量。
•Y0: 定义了初始条件,即未知函数在起始时间点的值。
•t: 是一个列向量,表示自变量t的取值点。
•Y: 是一个矩阵,每一列表示对应未知函数在不同时间点上的取值。
示例问题下面通过几个具体问题来演示如何使用Matlab解ODE方程组。
示例1:简谐振动考虑一个简谐振动的ODE方程组:d2y/dt^2 + k/m * y = 0其中,y(t)是振动的位移函数,k是弹性系数,m是质量。
首先需要将二阶微分方程转化为一阶方程组。
令z = dy/dt,则原方程可以改写为:dz/dt = -k/m * ydy/dt = z定义相应的函数句柄:function dydt = fun(t, Y, k, m)y = Y(1);z = Y(2);dydt = [z; -k/m * y];end然后指定初始条件和求解范围,并调用ode45函数进行求解:k = 1;m = 1;Y0 = [0; 1]; % 初始位移为0,初始速度为1tspan = [0 10]; % 求解范围从0到10[t, Y] = ode45(@(t, Y) fun(t, Y, k, m), tspan, Y0);最后,可以绘制位移随时间变化的图像:plot(t, Y(:, 1))xlabel('时间')ylabel('位移')title('简谐振动')示例2:化学反应动力学考虑一个简单的化学反应动力学模型:dy1/dt = -k1 * y1dy2/dt = k1 * y1 - k2 * y2其中,y1和y2分别表示反应物和生成物的浓度,k1和k2是反应速率常数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pk = xk + hf (tk, xk), tk+1 = tk + h, h
xk+1 = xk + 2 [f (tk, xk) + f (tk+1, pk)] .
4
1.3 Matlab Builtin ODE Solvers
In addition there are many other methods for approximating solutions to ordinary differential equations, but due to a lack of time left in the semester I will just introduce you to Matlabs built-in Runge-Kutta solver ode45 and show you how it works.
s1 = f (tk, xk)
h
h
s2 = f tk + 2 , xk + 2 s1
xk+1 = xk + hs2
tk&s obtained as follows: First we replace the approximation x(t + h) − x(t)
next section. They are all of higher order than Euler’s method.
1.2 Modified Euler’s Methods
Once again we consider (1) and apply the fundamental theorem of calculus to get
t2
t2
f (t, x(t)) dt = x (t) dt = x(t2) − x(t1).
t1
t1
This implies that
t2
x(t2) = x(t1) + f (t, x(t)) dt.
t1
Now we consider two possible ways to approximate the integral on the right above.
x (t) = e−1/2 t2 .
We build the m-file eul1d.m and save it to disk (use cd T:\ to change to the T drive)
% Euler’s method 1 clear all defn=inline(’-t*x’,’t’,’x’); a=0; b=5; N=100; xa=1; h=(b-a)/N; t=a+h*(0:N); LT=length(t); x(1)=xa;
−tx(t)
x (t) =
, x(0) = 1, x (0) = 1, on 0 < t < 5.
(x (t)2 + 1)
Now we build an m-file eul2d.m to solve the problem.
clear % Euler’s method 2d clear defn=inline(’[y;-t*x/(y^2+1)]’,’t’,’x’,’y’); a=0; b=5; N=200; h=(b-a)/N; t=a+h*(0:N); LT=length(t); xa=1; xpa=1; w(:,1)=[xa;xpa];
x = f (t, x), t ∈ (a, b)
(1)
x(a) = xa
(2)
we observe that defining tj = a + hj, for j = 0, 1, 2, · · · , N where h = (b − a)/N we have
x(tj+1) − h
x(tj )
≈
f (tj, x(tj)).
for j=2:LT w(:,j)=w(:,j-1)+h*defn(t(j-1),w(1,j-1),w(2,j-1));
end x=w(1,:); plot(t,x,’LineWidth’,2)
grid on 2
We plot the result of executing this Matlab code in the following figure.
x = f (t, x, x ), t ∈ [a, b]
x(a) = xa x (a) = xpa
If we set y = x , then the sxstem can be written as
d dt
x y
=
y f (t, x, y)
x(a) = xa
y(a) = xpa
The numerical approximation can now be carrried out just as above. As we have already mentioned it is very difficult to find exact solutions to most interesting problems. The next example is a second order initial value problem. Consider
Math 4330 Sec. 1, Matlab Assignment # 4 , April 26, 2006 Name
1 Numerical Solution of ODEs Using Matlab
1.1 Euler’s Method
Euler’s one step method is undoubtedly the simplest method for approximating the solution to an ordinary differential equation. It goes something like this: Given a first order initial value problem
The basic syntax for using ode45 is the following
[t,x] = ode45(’xdot’,tspan,x0)
where xdot.m is a function file containing the the right hand side of the differential equation, tspan is a vector of time values at which you want to obtain the solution and x0 is the initial condition.
x (t) = h
3
by the more accurate approximation (see the figure)
h x(t + h) − x(t)
x t+ =
2
h
Then we apply Taylor’s formula of order one
g(ξ) = g(a) + g (a)(ξ − a) + O(((ξ − a)2),
xj+1 = xj + f (tj, xj), j = 0, 2, · · · , (N − 1).
As an example let us consider the IVP
x (t) = −tx(t), x(0) = 1 on 0 < t < 5.
The exact solution is given by
The Midpoint Rule:
The midpoint method uses Euler to step halfway across the interval, evaluates the function at this
intermediate point, then uses that slope to take the actual step.
2
2
2
h
h
h
x(t + h) ≈ x(t) + f t + , x(t) + f (t, x(t)) .
2
2
2
The Trapezoid Rule: For the trapezoid rule we approximate the integral with step size h = t2 − t1 using
h x(t2) ≈ x(t1) + 2 [f (t1, x(t1)) + f (t2, x(t2))].
Unfortunately, we do not know x(t2) on the right side, so we use, for example, Euler’s method to approximate it: x(t2) ≈ x(t1) + hf (t1, x(t1)). We thus obtain a numerical procedure by denoting x(tk) by yk for each k and setting
for j=2:LT x(j)=x(j-1)+h*defn(t(j-1),x(j-1));
end xact_sol=exp(-t.^2/2); plot(t,x,’b’,t,xact_sol,’r--’,’LineWidth’,2)
Execute the file in the Workspace by typing the first name of the file without the .m extension. We plot the result of executing this Matlab code, on 0 ≤ t ≤ 5 with initial condition x(0) = 1, in the following figure.