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-常微分方程

Events
含义 为‘on’时,控制解向量 有效值: 范数的相对误差,使每 on、off 步计算中,满足: 缺省值: norm(e)<=max(RelTol*n off orm(y),AbsTol) 有效值: 为‘on’时,返回相应的 on、off 事件记录
取值
参数设置
属性名 含义 若无输出参量,则solver 将执行下面操作之一: 有效值: 画出解向量中各元素随 odeplot、 时间的变化; odephas2、画出解向量中前两个分 odephas3、量构成的相平面图; odeprint 画出解向量中前三个分 缺省值: 量构成的三维相空间图 odeplot ; 随计算过程,显示解向 量 取值
使用于精度较低 的情形
OD 求解器 E类 Solver 型 非 ode113 刚 性 适 度 ode23t 刚 性 刚 ode15s 性
特点
说明
多步法;Adams算 计算时间比ode45 法;高低精度均可 短 -3~10-6 到10 采用梯形算法 适度刚性情形
多步法;Gear’s反 若ode45失效时, 向数值微分;精度 可尝试使用 中等
• (6)若没有给定输出参量,则在命令窗口显 示解列表。若该命令找不到解析解,则返 回一警告信息,同时返回一空的sym对象。 这时,用户可以用命令ode23或ode45求解 方程组的数值解。
y ′′ = −a y ′ y ( 0) = 1 y ′(π / a ) = 0
2
例1
例2
• >> [u,v] = dsolve('Du=v,Dv=u') u= C1*exp(-t)+C2*exp(t) V= -C1*exp(-t)+C2*exp(t)
第八章 基于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_常微分方程数值解法

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常微分⽅程数值解作者:凯鲁嘎吉 - 博客园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中对常微分方程进行数值求解的快速方法。
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 作为一种功能强大的科学计算软件,提供了丰富的工具箱和函数,用于求解常微分方程。
其中,二阶常微分方程求解函数是其中的重要一部分。
二、二阶常微分方程的数值求解方法1. 常微分方程的基本概念在了解 MATLAB 中的二阶常微分方程数值求解函数之前,首先要明确常微分方程的基本概念。
常微分方程是关于未知函数及其导数的方程,而二阶常微分方程则是包含到二阶导数的方程。
通常情况下,常微分方程不易求解,因此需要借助数值求解方法进行近似求解。
2. MATLAB 中的数值求解函数在 MATLAB 中,有多种数值求解方法可用于求解二阶常微分方程,例如 ODE45、ODE23、ODE113 等。
这些函数可以根据用户输入的微分方程表达式和初始条件,使用不同的数值方法进行求解,得到相应的数值解。
三、使用 MATLAB 数值求解二阶常微分方程的示例考虑一个带有阻尼和弹簧的振动系统,其运动方程为:\[ m\frac {d^2x}{dt^2} + c\frac{dx}{dt} + kx = 0 \]其中,\( m \) 为质量,\( c \) 为阻尼系数,\( k \) 为弹簧刚度。
现在,我们可以使用 MATLAB 中的二阶常微分方程数值求解函数来求解该振动系统的运动方程。
```matlabfunction secondOrderODEExample% 定义常数m = 1; % 质量c = 0.1; % 阻尼系数k = 1; % 弹簧刚度% 定义初始条件x0 = 1; % 初位移v0 = 0; % 初速度% 定义时间范围tspan = [0 10]; % 时间范围% 定义运动方程odefun = @(t,x) [x(2); -c/m*x(2) - k/m*x(1)];% 求解微分方程[t, sol] = ode45(odefun, tspan, [x0 v0]);% 绘制位移随时间变化图figure;plot(t, sol(:,1));xlabel('Time');ylabel('Displacement');title('Displacement vs. Time');end```代码中,我们使用了 MATLAB 中的 ode45 函数来求解给定的二阶常微分方程,并绘制了位移随时间变化的图像。
matlab中的微分方程的数值积分

MATLAB是一种流行的数学软件,用于解决各种数学问题,包括微分方程的数值积分。
微分方程是许多科学和工程问题的数学描述方式,通过数值积分可以得到微分方程的数值解。
本文将介绍在MATLAB中如何进行微分方程的数值积分,以及一些相关的技巧和注意事项。
一、MATLAB中微分方程的数值积分的基本方法1. 常微分方程的数值积分在MATLAB中,常微分方程的数值积分可以使用ode45函数来实现。
ode45是一种常用的数值积分函数,它使用4阶和5阶Runge-Kutta 方法来求解常微分方程。
用户只需要将微分方程表示为函数的形式,并且提供初值条件,ode45就可以自动进行数值积分,并得到微分方程的数值解。
2. 偏微分方程的数值积分对于偏微分方程的数值积分,在MATLAB中可以使用pdepe函数来实现。
pdepe可以求解具有定解条件的一维和二维偏微分方程,用户只需要提供偏微分方程的形式和边界条件,pdepe就可以进行数值积分,并得到偏微分方程的数值解。
二、在MATLAB中进行微分方程数值积分的注意事项1. 数值积分的精度和稳定性在进行微分方程的数值积分时,需要注意数值积分的精度和稳定性。
如果数值积分的精度不够,可能会导致数值解的误差过大;如果数值积分的稳定性差,可能会导致数值解发散。
在选择数值积分方法时,需要根据具体的微分方程来选择合适的数值积分方法,以保证数值解的精度和稳定性。
2. 初值条件的选择初值条件对微分方程的数值解有很大的影响,因此在进行微分方程的数值积分时,需要选择合适的初值条件。
通常可以通过对微分方程进行分析,或者通过试验求解来确定合适的初值条件。
3. 数值积分的时间步长在进行微分方程的数值积分时,需要选择合适的时间步长,以保证数值积分的稳定性和效率。
选择时间步长时,可以通过试验求解来确定合适的时间步长,以得到最优的数值解。
三、MATLAB中微分方程数值积分的实例以下通过一个简单的例子来演示在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 为例介绍如何将之变换成一个一阶显式常微分方程组。
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 二阶常微分方程数值求解函数摘要:1.MATLAB 与常微分方程2.二阶常微分方程的基本形式3.MATLAB 中数值求解二阶常微分方程的方法4.常见数值求解函数及其应用5.总结与展望正文:一、MATLAB 与常微分方程MATLAB 是一种广泛应用于科学计算和工程设计的软件,其强大的数值计算和数据分析功能为各种数学问题提供了高效的解决方案。
常微分方程是数学中的一个重要领域,它描述了自然界和社会现象中许多变化规律。
在工程技术、物理学、生物学等领域,对常微分方程的研究具有重要意义。
利用MATLAB 求解常微分方程,可以更方便、更快捷地获得问题的数值解。
二、二阶常微分方程的基本形式二阶常微分方程是指未知函数的最高阶导数为二次的常微分方程。
其一般形式可以表示为:a * y"" +b * y" +c * y = f(x)其中,a、b、c 为常数,y(x) 为未知函数,f(x) 为已知函数。
求解这类方程,可以得到函数y(x) 的表达式,从而了解其随时间或空间的变化规律。
三、MATLAB 中数值求解二阶常微分方程的方法MATLAB 提供了丰富的函数和工具箱来解决常微分方程问题。
数值求解二阶常微分方程的主要方法有:欧拉法、改进欧拉法、龙格- 库塔法等。
下面对这些方法进行简要介绍:1.欧拉法:是最简单的数值求解方法之一,其基本思想是将微分方程的解在每个时间步长上进行局部线性近似。
欧拉法的公式为:y(t+h) = y(t) + h * (f(t, y(t)) + 0.5 * f"(t, y(t)) * h)2.改进欧拉法:为了减少欧拉法在求解非线性微分方程时的误差,可以采用改进欧拉法。
其公式为:y(t+h) = y(t) + h * (f(t, y(t)) + 0.5 * f"(t, y(t)) * h + 0.5 * f""(t, y(t)) * (h^2) / 2!)3.龙格- 库塔法:是一种较高精度的数值求解方法,其基本思想是使用泰勒展开来近似函数的值。
常微分方程数值求解 MATLAB 求解

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程序及案例欧拉法是一种常见的求解常微分方程的数值解法,在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常微分方程(组)数值求解方程与方程组的数值解

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算法的一个重要应用。
1. 求解微分方程数值解在MATLAB中,可以使用各种数值方法来求解微分方程的数值解。
其中,常见的方法包括欧拉法、改进的欧拉法、四阶龙格-库塔法等。
这些数值方法可以通过编写MATLAB脚本来实现,从而得到微分方程的近似数值解。
以常微分方程为例,可以使用ode45函数来求解微分方程的数值解。
该函数是MATLAB中用于求解常微分方程初值问题的快速、鲁棒的数值方法,可以有效地得到微分方程的数值解。
2. 求解微分方程解析解除了求解微分方程的数值解外,MATLAB还可以用于求解微分方程的解析解。
对于一些特定类型的微分方程,可以使用符号计算工具箱中的函数来求解微分方程的解析解。
通过符号计算工具箱,可以对微分方程进行符号化处理,从而得到微分方程的解析解。
这对于研究微分方程的性质和特点非常有帮助,也有助于理论分析和验证数值解的准确性。
3. MATLAB算法应用举例在实际工程和科学应用中,MATLAB算法求解微分方程问题非常常见。
在控制系统设计中,经常需要对系统的动态特性进行分析和设计,这通常涉及到微分方程的建模和求解。
通过MATLAB算法,可以对系统的微分方程进行数值求解,从而得到系统的响应曲线和动态特性。
另外,在物理学、生物学、经济学等领域的建模和仿真中,也经常需要用到MATLAB算法来求解微分方程问题。
4. MATLAB算法优势相比于其他数学软件和编程语言,MATLAB在求解微分方程问题上具有明显的优势。
MATLAB提供了丰富的数值方法和工具,能够方便地对各种微分方程进行数值求解。
MATLAB具有直观的交互式界面和强大的绘图功能,能够直观地展示微分方程的数值解和解析解,有利于分析和理解问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
一阶常微分方程(ODE )初值问题 :
ODE :Ordinary Differential Equation
dy f ( x, y ) x0 x xn dx y ( x0 ) y0
数值解法就是求y(x)在某些分立的节点 xn 上的近似值 yn,用以近似y(xn)
在[x0,x1] ,积分采用矩形近似,得:
y ( x1 ) y0 f y ( x), x dx
x1
y0 f y ( x0 ), x0 h
x0
同样,在[x0,x2] ,积分采用矩形近似,得:
y ( x2 ) y0 f y ( x ), x dx
整体截断误差: O(h)
2 向后的欧拉方法 取后一点的斜率作为平均斜率,即:
yn1 yn k2 h k2 f ( xn1 , yn1 )
整体截断误差: O(h)
3 改进的欧拉方法 取两点斜率平均值,即:
h y y k k n 1 n 1 2 2 k1 f ( xn , yn ) k f ( x , y ) n 1 n 1 2
(0) n 1
例题: y ' sin x y
y ( x0 ) 1, x0 0
3、龙格-库塔(R-K)方法
几种方法的比较 对于一般的常微分方程:
dy f ( x, y ) dx y ( x0 ) y0
1 欧拉方法 取前一点的斜率作为平均斜率,即:
yn 1 yn k1 h k1 f ( xn , yn )
对于等间隔节点
x xn1 xn h xn1 xn h
可以得到: xn y精确值 y近似值 x0 x1 x2
n=0,1,2
…. …. ….
xn
…. ….
y(x0) y(x1) y(x2) y0 y1 y2
y(xn) yn
….
在xn节点上,微分方程可以写为
y( xn1 ) y( xn ) f y( xn ) , x n h
t0 t1 t2
t3 t4 t5 t6
t
y1 y0 f ( y0 , x0 ) x1 x0 =y0 f ( y0 , x0 ) h
此切线与x=x1交点纵坐标为:
y0 y( x0 )
从(x1,y1)作曲线y(x)在 Q y (x1,y(x1))的切线的平行线, 得直线方程:
yn y( xn )
2、欧拉近似方法
2.1 简单欧拉(L.Euler, 1707-1783)方法。
dy f ( y, x) dx y ( x0 ) y0
欧拉数值算法就是由初值通过递推求解,递推求解 就是从初值开始,后一个函数值由前一个函数值得到。关 键是构造递推公式。
改进的欧拉方法递推公式为
h yn 1 yn f ( xn , yn ) f ( xn 1 , yn 1 ) 2
隐式方法: 预报---校正法
1. 用欧拉方法预报
2. 用改进的欧拉方法校正
计算公式为:
y yn h f ( xn , yn ) h (0) f ( x , y ) f ( x , y ) yn 1 yn n n n 1 n 1 2
按照相似的方法,从(xn,yn) Q y 作曲线y(x)在(xn,y(xn))的切 线的平行线,得直线方程:
Q1
y(t Q(t) )
y yn f ( yn , xn ) x xn
与x=xn+1交点纵坐标为:
tx t34 tx x x x7 t 0 1 tx 12 t 56 t6 23 x 45 t
作如下近似
yn y( xn )
yn1 yn f yn , xn h
2.2 改进的欧拉近似方法 对于一般的常微分方程:
dy f ( x, y ) dx y ( x0 ) y0
节点: 步长:
x0 , x1 ,, xi ,, xn , h xi 1 xi
格式 [x,y]=ode45(′ fun′, [x0,xn], y0,option]
说明: yi( x) fi ( x, yi ) ① 适用于求解一阶常微分方程组 ② fun定义微分方程组的函数文件名 ③ [x0,xn]求解区域 ④ y0初始条件向量 ⑤ option可选参数,由ODESET函数设置,比较复杂 ⑥ x输出自变量向量,y输出[y, y ′, y ″,..]
x2 x0
y0 f y ( x), x dx f y ( x), x dx
x1 x2
y ( x1 ) f y ( x1 ), x1 h
x0
x1
同样,在[x0,xn+1] ,积分采用矩形近似,得:
y ( xn 1 ) y0
xn1
y ( xn ) f y ( xn ), xn h
作如下近似
x0
f y ( x ), x dx
yn y( xn )
得:
yn1 yn f yn , xn h
2.1.4 欧拉法误差
利用泰勒级数得:
y xn 1 y ( xn h) 1 2 y ( xn ) hy( xn ) h y( xn ) 2 1 2 y ( xn ) hf y ( xn ), xn
)
y2
dy y y1 x1 x x1 dx y1 f ( y1 , x1 ) x x1
与x=x2交点纵坐标为:
tx t34 tx x x x7 t 0 1 tx 12 t 56 t6 23 x 45 t
y1 y( x1 )
y2 y1 f ( y1 , x1 ) h
y0 y1 y2 yn
欧拉数值算法递推公式构造
2.1.1 差分法 差分法就是用差商近似代替微商,即
y dy x dx
代入微分方程得到:
y ( x x) y ( x) f ( y ( x), x) x y ( x x) y ( x) f ( y ( x), x)x
y
( k 1) n1
yn h f ( xn1, y )
(k ) n1
2.2.2 改进的欧拉方法 积分法求欧拉公式时,积分采用梯形近似,即得到改 进的欧拉方法。
y ( xn 1 ) y ( xn )
xn1
xn
f ( x, y)dx
h y ( xn ) f xn , y xn f xn 1 , y xn 1 2
例题:
y ' sin x y y ( x0 ) 1, x0 0
2.1.2 折线法(几何意义)
Q y
从(x0,y0)作曲线y(x)的切 线,得切线方程:
y1
y(t Q(t)
)
dy y y0 x0 x x0 dx y0 f ( y0 , x0 ) x x0
yn 1 yn ci ki
i 1
N
k1 f ( xn , yn ) i 1 ki f ( xn ai h, yn bij k j ) j 1
四阶龙格—库塔法计算公式为:
h yn 1 yn k1 2k2 2k3 k4 6 k1 f ( xn , yn ) h h k2 f ( xn , yn k1 ) 2 2 h h k f ( x , y k ) 3 n n 2 2 2 k f ( x h, y h k ) n n 3 4
yn1 yn f ( yn , xn ) h
折线近似曲线,n增大,误差变大
2.1.3 数值积分
对微分方程作从 x0 到 x 积分得:
y( x ) y0
dy f y x , x dx x0
x
x
y x y0 f y x , x dx x0
科学计算与MATLAB
常微分方程数值解法
内容提要
引言 欧拉近似方法 龙格-库塔(R-K)方法 MATLAB的常微分方程函数 小结
1、引言
物理学所研究的各种物质运动中,有许多物质运动的 过程是用常微分方程来描述的。 例如,质点的加速运动,简谐振动等。
dv F m dt
d x 2 2 x 0 2 dt
整体截断误差: O(h4)
例题: y ' sin x y
y ( x0 ) 1, x0 0
time_Euler = 0.2500 time_EulerPro = 0.5000 time_RK4 = 1.0150
4、 MATLAB的常微分方程函数
ode45 ode23 ode113 ode15s ode23s ode23t ode23tb
简单欧拉方法程序
function [outx,outy]=MyEuler(fun,x0,xt,y0,PointNum) %MyEuler 用前向差分的欧拉方法解微分方程 %fun 表示f(x,y) %x0,xt表示自变量的初值和终值 %y0表示函数在x0处的值,其可以为向量形式 %PointNum表示自变量在[x0,xt]上取的点数 if nargin<5 | PointNum<=0 %如果函数仅输入4个参数值,则PointNum默认值为100 PointNum=100; end if nargin<4 %y0默认值为0 y0=0; end h=(xt-x0)/PointNum;%计算步长h x=x0+[0:PointNum]'*h;%自变量数组 y(1,:) = y0(:)';%将输入存为行向量,输入为列向量形式 for k = 1:PointNum f=feval(fun,x(k),y(k,:));%计算f(x,y)在每个迭代点的值 f=f(:)'; y(k + 1,:) =y(k,:) +h*f; %对于所取的点x迭代计算y值 end outy=y; outx=x; %plot(x,y)%画出方程解的函数图