当前位置:   article > 正文

MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解_matlab求解非线性方程组最优化

matlab求解非线性方程组最优化

一、非线性方程数值求解

  • 非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。
  • 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一系列的优化算法函数,可用于解决工程中的最优化问题,包括非线性方程求解、极小值问题、最小二乘问题等。

1. 单变量非线性方程求解

  • 在 MATLAB 中提供了一个 fzero 函数,可以用来求单变量非线性方程的根。该函数的调用格式如下:
	z=fzero(filename,x0,tol,trace)
  • 1
  • 其中,filename 是待求根的函数,x0 是搜索的起点。一个函数可能有多个根,但 fzero 函数只能给出离 x0 最近的那个根。tol 控制结果的相对精度,默认时取 tol=eps,trace 指定迭代信息是否在运算中显示,为 1 时显示,为 0 时不显示,默认时取 trace=0。
  • 例如,我们求 f ( x ) = x − 1 x + 5 f(x)=x-\frac{1}{x}+5 f(x)=xx1+5 x 0 = − 5 x_{0}=-5 x0=5 x 0 = 1 x_{0}=1 x0=1 作为迭代初值时的根。
  • 先建立函数文件 fz.m。
function f = fz(x)
f=x-1./x+5;
end
  • 1
  • 2
  • 3
  • 然后,我们调用 fzero 函数求根,程序如下:
>> fzero(@fz,-5)	%-5作为迭代初值

ans =

   -5.1926

>> fzero(@fz,1)		%1作为迭代初值

ans =

    0.1926
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 可绘制 f ( x ) f(x) f(x) 的图像如下图所示,从中可看出 f ( x ) f(x) f(x) 在 x=-5 和 x=1 附近的零点。
    在这里插入图片描述

2. 非线性方程组的求解

  • 在 MATLAB 的最优化工具箱中提供了非线性方程组的求解函数 fsolve,其调用格式如下:
	X=fsolve(filename,X0,option)
  • 1
  • 其中,X 为返回的解,filename 是用于定义需求解的非线性方程组的函数,X0 是求解过程的初值,option 用于设置优化工具箱的优化参数。
  • 优化工具箱提供了许多优化参数选项,用户在命令行窗口输入下列命令,可以将优化参数
    全部显示出来:
>> optimset
  • 1
  • 如果希望得到某个优化函数(例如 fsolve 函数)当前的默认参数值,则可在命令行窗口输入命令:
>> optimset fsolve
  • 1
  • 如果想改变其中某个参数选项,则可以调用 optimset 函数来完成。例如,Display 参数选项决定函数调用时中间结果的显示方式,其中 ‘off’ 为不显示,‘iter’ 表示每步都显示,‘final’ 只显示最终结果。如果要设定 Display 选项为 off,可以使用如下命令:
>> option=optimset ('Display', 'off')
  • 1
  • 例如,我们求下列方程组在 ( 1 , 1 , 1 ) (1,1,1) (1,1,1) 附近的解并对结果进行验证。 { sin ⁡ x + y + z 2 e x = 0 x + y + z = 0 x y z = 0 \left\{
    sinx+y+z2ex=0x+y+z=0xyz=0
    \right.
    sinx+y+z2ex=0x+y+z=0xyz=0
  • 首先,我们建立函数文件 myfun.m。
function F = myfun(X)
x=X(1);
y=X(2);
z=X(3);
F(1)=sin(x)+y+z^2*exp(x);
F(2)=x+y+z;
F(3)=x*y*z;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 在给定的初值 x 0 = 1 , y 0 = 1 , z 0 = 1 x_{0}=1,y_{0}=1,z_{0}=1 x0=1y0=1z0=1 下,调用 fsolve 函数求方程的根,程序如下:
>> option=optimset('Display','off');
>> X=fsolve(@myfun,[1,1,1],option)

X =

    0.0224   -0.0224   -0.0000
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 将求得的解代回原方程,可以验证结果是否正确,程序如下:
>> q=myfun(X)

q =

   1.0e-06 *

   -0.5931   -0.0000    0.0006

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 可见得到了较高精度的结果。
  • 例如,我们求圆和直线的两个交点。 圆: x 2 + y 2 + z 2 = 9 圆:x^{2}+y^{2}+z^{2}=9 圆:x2+y2+z2=9 直线: { 3 x + 5 y + 6 z = 0 x − 3 y − 6 z − 1 = 0 直线:\left\{
    3x+5y+6z=0x3y6z1=0
    \right.
    直线:{3x+5y+6z=0x3y6z1=0
  • 该问题即为求解方程组 { x 2 + y 2 + z 2 = 9 3 x + 5 y + 6 z = 0 x − 3 y − 6 z − 1 = 0 \left\{
    x2+y2+z2=93x+5y+6z=0x3y6z1=0
    \right.
    x2+y2+z2=93x+5y+6z=0x3y6z1=0
  • 使用 fsolve 函数求解方程组时,必须先估计出方程组的根的大致范围。所给直线的方向数是 ( − 12 , 24 , − 14 ) (-12,24,-14) (12,24,14),故其与球心在坐标原点的球面的交点大致是 ( − 1 , 1 , − 1 ) (-1,1,-1) (1,1,1) ( 1 , − 1 , 1 ) (1,-1,1) (1,1,1)。以这两点作为迭代初值。
  • 我们先建立方程组函数文件 fxyz.m。
function F = fxyz(X)
x=X(1);
y=X(2);
z=X(3);
F(1)=x^2+y^2+z^2-9;
F(2)=3*x+5*y+6*z;
F(3)=x-3*y-6*z-1;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 再在 MATLAB 命令行窗口输入如下程序:
>> X1=fsolve(@fxyz,[-1,1,-1],optimset('Display','off')) %求第一个交点

X1 =

   -0.9508    2.4016   -1.5259

>> X2=fsolve(@fxyz,[1,-1,1],optimset('Display', 'off')) %求第二个交点

X2 =

    1.4180   -2.3361    1.2377

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

二、最优化问题求解

  • 最优化方法包含多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。
  • 利用 MATLAB 的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。
  • MATLAB 还提供了非线性函数最小值问题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。

1. 无约束最优化问题求解

  • 无约束最优化问题的一般描述为 m i n x f ( x ) \underset{x}{min} f(x) xminf(x)
  • 其中, x = [ x 1 , x 2 , … , x n ] T x=[x_{1},x_{2},…,x_{n}]^{T} x=[x1,x2,,xn]T,该数学表示的含义亦即求取一组 x x x,使得目标函数 f ( x ) f(x) f(x) 为最小,时间最短等。MATLAB 提供了 3 个求最小值的函数,它们的调用格式如下。
  • (1) [x,fval]=fminbnd(filename,x1,x2,option):求一元函数在 ( x 1 , x 2 ) (x1, x2) (x1,x2) 区间中的极小值点 x x x 和最小值 fval。
  • (2) [x,fval]=fminsearch(filename,x0,option): 基于单纯形算法求多元函数的极小值点 x x x 和最小值 fval。
  • (3) [x,fval]=fminunc(ilename,x0,option):基于拟牛顿法求多元函数的极小值点 x x x 和最小值 fval。
  • 确切地说,这里讨论的也只是局域极值的问题(全域最小问题要复杂得多)。filename 是定义目标函数的函数。
  • fminbnd 的输入变量 x 1 、 x 2 x1、x2 x1x2 分别表示被研究区间的左、右边界。fminsearchfminunc 的输入变量 x 0 x0 x0 是一个向量,表示极值点的初值。option 为优化参数,可以通过 optimset 函数来设置。
  • 当目标函数的阶数大于 2 时,使用 fminunc 比 fminsearch 更有效,但当目标函数高度不连续时,使用 fminsearch 效果较好。
  • MATLAB 没有专门提供求函数最大值的函数,但可以注意到 − f ( x ) -f(x) f(x) 在区间 ( a , b ) (a, b) (a,b) 上的最小值就是 f ( x ) f(x) f(x) ( a , b ) (a, b) (a,b) 的最大值, 所以 fminbnd(- f,x1,x2) 返回函数 f ( x ) f(x) f(x) 在区间 ( x 1 , x 2 ) (x1, x2) (x1,x2) 上的最大值。
  • 例如,我们求 f ( x ) = x − 1 x + 5 f(x)=x-\frac{1}{x}+5 f(x)=xx1+5 在区间 ( − 10 , − 1 ) (-10, -1) (10,1) ( 1 , 10 ) (1, 10) (1,10) 上的最小值点。
  • 程序如下:
>> f=@(x) x-1./x+5;
>> [x,fmin]=fminbnd(f,-10,-1)	%求函数在(-10-1)内的最小值点和最小值

x =

   -9.9999


fmin =

   -4.8999

>> fminbnd(f,1,10)				%求函数在(1,10)内的最小值点

ans =

    1.0001

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 例如,设 f ( x , y , z ) = x + y 2 4 x + 2 z + z 2 y f(x,y,z)=x+\frac{y^{2}}{4x}+\frac{2}{z}+\frac{z^{2}}{y} f(x,y,z)=x+4xy2+z2+yz2 我们求函数 f f f ( 0.5 , 0.5 , 0.5 ) (0.5, 0.5, 0.5) (0.5,0.5,0.5) 附近的最小值点。
  • 首先,我们建立函数文件 fxyz0.m。
function f=fxyz0(u)
x=u(1);
y=u(2);
z=u(3);
f=x+y.^2./x/4+z.^2./y+2./z;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 随后,在 MATLAB 命令行窗口输入以下程序:
>> [X,fmin]=fminsearch(@fxyz0,[0.5,0.5,0.5])

X =

    0.5000    1.0000    1.0000


fmin =

    4.0000

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2. 有约束最优化问题求解

  • 有约束最优化问题的一般描述为 m i n x s . t . G ( x ) ≤ 0 f ( x ) \underset{x s.t. G(x)≤0}{min} f(x) xs.t.G(x)0minf(x)
  • 其中, x = [ x 1 , x 2 , … , x n ] T x=[x_{1},x_{2},…,x_{n}]^{T} x=[x1,x2,,xn]T,该数学表示的含义亦即求取一组 x x x,使得目标函数 f ( x ) f(x) f(x) 为最小,且满足约束条件 G ( x ) ≤ 0 G(x)≤0 G(x)0。记号 s.t. 是英文 subject to 的缩写,表示 x x x 要满足后面的约束条件。
  • 约束条件可以进一步细化如下。
  • (1) 线性不等式约束: A x ≤ b Ax≤b Axb
  • (2) 线性等式约束: A e q x = b e q A_{eq}x=b_{eq} Aeqx=beq
  • (3) 非线性不等式约束: C x ≤ 0 Cx≤0 Cx0
  • (4) 非线性等式约束: C e q x = 0 C_{eq}x=0 Ceqx=0
  • (5) x x x 的下界和上界: L b n d ≤ x ≤ U b n d L_{bnd}≤x≤U_{bnd} LbndxUbnd
  • MATLAB 最优化工具箱提供了一个 fmincon 函数,专门用于求解各种约束下的最优化问题,其调用格式如下:
	[x,fval]=fmincon(filename,x0,A,b,Aeq,beq,Lbnd,Ubnd,NonF,option)
  • 1
  • 其中,x、fval、filename、 x0 和 option 的含义与求最小值函数相同。其余参数为约束条件,参数 NonF 为定义非线性约束函数的函数。如果某个约束不存在,则用空矩阵来表示。
  • 例如,我们求解有约束最优化问题。 m i n x s . t . { x 1 + 0.5 x 2 ≥ 0.4 0.5 x 1 + x 2 g e 0.5 x 1 ≥ 0 , x 2 ≥ 0 f ( x ) = 0.4 x 2 + x 1 2 + x 2 2 − x 1 x 2 + 1 30 x 1 3 \underset{x s.t.\left\{
    x1+0.5x20.40.5x1+x2ge0.5x10,x20
    \right.}{min}f(x)=0.4x_{2}+x_{1}^{2}+x_{2}^{2}-x_{1}x_{2}+\frac{1}{30}x_{1}^{3}
    xs.t.{x1+0.5x20.40.5x1+x2ge0.5x10,x20minf(x)=0.4x2+x12+x22x1x2+301x13
  • 首先,我们编写定义目标函数的函数文件 fop.m。
function f=fop(x)
f=0.4*x(2)+x(1)^2+x(2)^2-x(1)*x(2) +1/30*x(1)^3;
end
  • 1
  • 2
  • 3
  • 随后,我们再设定约束条件,并调用 fmincon 函数求解此约束最优化问题,程序如下:
>> x0=[0.5;0.5];
>> A=[-1,-0.5;-0.5,-1];
>> b=[-0.4;-0.5];
>> lb=[0;0];
>> option=optimset;
>> option.LargeScale='off';
>> option.Display='off';
>> [x,f]=fmincon(@fop,x0,A,b,[],[],lb,[],[],option)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 程序运行结果如下:
x =

    0.3396
    0.3302


f =

    0.2456
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. 线性规划问题求解

  • 线性规划是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。线性规划问题的标准形式为 m i n x s . t . { A x = b A e q x = b e q L b n d ≤ x ≤ U b n d f ( x ) \underset{x s.t.\left\{
    Ax=bAeqx=beqLbndxUbnd
    \right.}{min} f(x)
    xs.t.{Ax=bAeqx=beqLbndxUbndminf(x)
  • 在 MATLAB 中求解线性规划问题使用函数 linprog,其调用格式如下:
	[x,fval]=linprog(f,A,Aeq,beq,Lbnd,Ubnd)
  • 1
  • 其中,x 是最优解,fval 是目标函数的最优值。函数中各项参数是线性规划问题标准形式中的对应项,x、b、beq、Lbnd、Ubnd 是向量,A、Aeq 是矩阵,f 是目标函数系数向量。
  • 例如,我们求解线性规划问题。 m i n x s . t . { x 1 − x 2 + x 3 ≤ 20 3 x 1 + 2 x 2 + 4 x 3 ≤ 42 3 x 1 + 2 x 2 ≤ 30 x 1 ≥ 0 , x 2 ≥ 0 , x 3 f ( x ) \underset{x s.t.\left\{
    x1x2+x3203x1+2x2+4x3423x1+2x230x10,x20,x3
    \right.}{min} f(x)
    xs.t. x1x2+x3203x1+2x2+4x3423x1+2x230x10,x20,x3minf(x)
  • 程序如下:
f=[-5;-4;-6];
A=[1,-1,1;3,2,4;3,2,0];
b=[20;42;30];
Aeq=[];
Beq=[];
LB=zeros(3,1);
[x, favl]=linprog(f,A,b,Aeq,Beq,LB)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 程序运行结果如下:
Optimal solution found.

x =

         0
   15.0000
    3.0000


favl =

   -78

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

三、常微分方程初值问题的数值求解

  • 众所周知,只有对一些典型的常微分方程,才能求出它们的一般解表达式并用初始条件确定表达式中的任意常数。然而在实际问题中遇到的常微分方程往往很复杂,在许多情况下得不出一般解,所以,一般是要求获得解在若千个点上的近似值。
  • 考虑常微分方程的初值问题: y ′ = f ( t , y ) , t 0 ≤ t ≤ T y'=f(t,y),t_{0}\le t\le T y=f(t,y),t0tT y ( t 0 ) = y 0 y(t_{0})=y_{0} y(t0)=y0
  • 所谓其数值解法,就是求它的解 y ( t ) y(t) y(t) 在节点 t 0 < t 1 < ⋯ < t m t_{0}<t_{1}<\dots < t_{m} t0<t1<<tm 处的近似值 y 0 , y 1 , … , y m y_{0},y_{1},\dots ,y_{m} y0,y1,,ym 的方法。所求得的 y 0 , y 1 , … , y m y_{0},y_{1},\dots ,y_{m} y0,y1,,ym 称为常微分方程初值问题的数值解。
  • 一般采用等距节点 t n = t 0 + n h , n = 0 , 1 , … , m t_{n}=t_{0}+nh, n=0, 1, …,m tn=t0+nh,n=0,1,,m,其中 h h h 为相邻两个节点间的距离,叫做步长。
  • 常微分方程初值问题的数值解法多种多样,比较常用的有欧拉(Euler)法、龙格—库塔(Runge-Kutta)法、线性多步法、预报校正法等。

1. 龙格—库塔法简介

  • 对于一阶常微分方程的处置问题,在求解未知函数 y y y 时, y y y t 0 t_{0} t0 点的值 y ( t 0 ) = y 0 y(t_{0})=y_{0} y(t0)=y0 是已知的,并根据高等数学中的中值定理,应有 { y ( t 0 + h ) = y 1 ≈ y 0 + h f ( t 0 , y 0 ) y ( t 0 + 2 h ) = y 2 ≈ y 1 + h f ( t 1 , y 1 ) , h > 0 \left\{
    y(t0+h)=y1y0+hf(t0,y0)y(t0+2h)=y2y1+hf(t1,y1)
    \right.,h>0
    {y(t0+h)=y1y0+hf(t0,y0)y(t0+2h)=y2y1+hf(t1,y1),h>0
  • 一般地,在任意点 t i = t 0 + i h t_{i}=t_{0}+ih ti=t0+ih,有 y ( t 0 + i h ) = y i ≈ y i − 1 + h f ( t i − 1 , y i − 1 ) , i = 1 , 2 , … , n y(t_{0}+ih)=y_{i}\approx y_{i-1}+hf(t_{i-1},y_{i-1}),i=1,2,…,n y(t0+ih)=yiyi1+hf(ti1,yi1),i=1,2,,n
  • ( t 0 , y 0 ) (t_{0},y_{0}) (t0,y0) 确定后,根据上述递推式能计算出未知函数 y y y 在点 t i = t 0 + i h , i = 1 , … , n t_{i}=t_{0}+ih,i=1,…,n ti=t0+ih,i=1,,n 的一列数值解: y i = y 1 , y 2 , … , y n , i = 1 , 2 , … , n y_{i}=y_{1},y_{2},…,y_{n},i=1,2,…,n yi=y1,y2,,yn,i=1,2,,n
  • 当然,地推过程中有一个误差累积的问题。在实际计算过程中,使用的递推公式一般进行过改造,著名的龙格——库塔公式是 y ( t 0 + i h ) = y i ≈ y i − 1 + h 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) y(t_{0}+ih)=y_{i}\approx y_{i-1}+\frac{h}{6}(k_{1}+2k_{2}+2k_{3}+k_{4}) y(t0+ih)=yiyi1+6h(k1+2k2+2k3+k4)
  • 其中 k 1 = f ( t i − 1 , y i − 1 ) k_{1}=f(t_{i-1},y_{i-1}) k1=f(ti1,yi1) k 2 = f ( t i − 1 + h 2 , y i − 1 + h 2 k 1 ) k_{2}=f(t_{i-1}+\frac{h}{2},y_{i-1}+\frac{h}{2}k_{1}) k2=f(ti1+2h,yi1+2hk1) k 3 = f ( t i − 1 + h 2 , y i − 1 + h 2 k 2 ) k_{3}=f(t_{i-1}+\frac{h}{2},y_{i-1}+\frac{h}{2}k_{2}) k3=f(ti1+2h,yi1+2hk2) k 4 = f ( t i − 1 + h , y i − 1 + h k 3 ) k_{4}=f(t_{i-1}+h,y_{i-1}+hk_{3}) k4=f(ti1+h,yi1+hk3)

2. 龙格—库塔法的实现

  • MATLAB 提供了多个求常微分方程初值问题数值解的函数,一般调用格式如下:
	[t,y]=solver(filename,tspan,y0) 
  • 1
  • 其中, t t t y y y 分别给出时间向量和相应的状态向量。solver 为求常微分方程数值解的函数,下表中列出了常用函数采用的方法和适用的场合。filename 是定义 f ( t , y ) f(t, y) f(t,y) 的函数,该函数必须返回一个列向量。tspan 形式为 [ t 0 , t f ] [t0, tf] [t0,tf],表示求解区间。 y 0 y0 y0 是初始状态列向量。
求解函数采用方法适用场合
ode232 阶或 3 阶龙格-库塔算法,低精度非刚性
ode454 阶或 5 阶龙格-库塔算法,中精度非刚性
ode113Adams 算法,精度可到 1 0 − 3 ∼ 1 0 − 6 10^{-3}\sim 10^{-6} 103106非刚性,计算时间比 ode45 短
ode23t梯形算法适度刚性
odel5sGear’s 反向数值微分算法,中精度刚性
ode23s2 阶 Rosebrock 算法,低精度刚性,当精度较低时,计算时间比 odel5s 短
ode23tb梯形算法,低精度刚性,当精度较低时,计算时间比 odel5s 短
  • 若微分方程描述的一个变化过程包含着多个相互作用但变化速度相差悬殊的子过程,这样一类过程就认为具有刚性,这类方程具有非常分散的特征值。求解刚性方程的初值问题的解析解是困难的,常采用表中的函数 ode15s、ode23s 和 ode23tb 求其数值解。
  • 求解非刚性的一阶常微分方程或方程组的初值问题的数值解常采用函数 ode23 和 ode45,其中 ode23 采用 2 阶龙格-库塔算法,用 3 阶公式作误差估计来调节步长,具有低等的精度;ode45 则采用 4 阶龙格- -库塔算法,用 5 阶公式作误差估计来调节步长,具有中等的精度。
  • 例如,我们设有初值问题: { y ′ = y 2 − t − 2 4 ( y + 1 ) y ( 0 ) = 2 0 ≤ t ≤ 10 \left\{
    y=y2t24(y+1)y(0)=2
    \right.0\le t\le 10
    {y=4(y+1)y2t2y(0)=20t10
    试求其数值解,并与精确解相比较(精确解为 y ( t ) = t + 1 + 1 y(t)=\sqrt {t+1}+1 y(t)=t+1 +1
  • 首先,我们建立函数文件 funt.m。
function yp=funt(t,y)
yp=(y^2-t-2)/4/(t+1);
end
  • 1
  • 2
  • 3
  • 随后,我们调用函数求解微分方程,程序如下:
t0=0;
tf=10;
y0=2;
[t,y]=ode23(@funt,[t0,tf],y0);  %求数值解
y1=sqrt(t+1)+1;                 %求精确解
plot(t,y,'b.',t,y1,'r-');     %通过图形来比较
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 程序运行结果如下图所示。数值解图形用蓝色原点表示,精确解用红色实现表示,可以看出,两种结果近似。

在这里插入图片描述

  • 例如,已知一个二阶线性系统的微分方程为 { d 2 x d t 2 + a x = 0 , a > 0 x ( 0 ) = 0 , x ′ ( 0 ) = 1 \left\{
    d2xdt2+ax=0,a>0x(0)=0,x(0)=1
    \right.
    {dt2d2x+ax=0,a>0x(0)=0,x(0)=1
    a = 2 a=2 a=2,绘制系统的时间响应曲线和相平面图。
  • 函数 ode23 和 ode45 是对一阶常微分方程组设计的,因此对高阶常微分方程,需先将它转化为一阶常微分方程组,即状态方程。令 x 2 = x , x 1 = x ′ x_{2}=x,x_{1}=x' x2=xx1=x, 则得到系统的状态方程: { x 2 ′ = x 1 x 1 ′ = − a x 2 x 2 ( 0 ) = 0 , x 1 ( 0 ) = 1 \left\{
    x2=x1x1=ax2x2(0)=0,x1(0)=1
    \right.
    x2=x1x1=ax2x2(0)=0,x1(0)=1
  • 首先,我们建立函数文件 sys.m。
function xdot=sys(t,x)
xdot= [-2*x(2);x(1)];
end
  • 1
  • 2
  • 3
  • t 0 = 0 , t f = 20 t0=0,tf=20 t0=0tf=20,求微分方程的解,程序如下:
>> t0=0;
>> tf=20;
>> [t,x]=ode45(@sys,[t0,tf],[1,0]);
  • 1
  • 2
  • 3
  • 程序运行后,查看结果。
>> [t,x]

ans =

         0    1.0000         0
    0.0001    1.0000    0.0001
    0.0001    1.0000    0.0001
    0.0002    1.0000    0.0002
    0.0002    1.0000    0.000219.6681   -0.8968    0.3116
   19.7511   -0.9422    0.2352
   19.8340   -0.9747    0.1556
   19.9170   -0.9937    0.0738
   20.0000   -0.9991   -0.0090

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 结果第一列为 t t t 的采样点,第二列和第三列分别为 x ′ x' x x x x t t t 对应点的值。
  • 为更直观地表示方程的解,可以绘制方程的时间响应曲线及相平面曲线,程序如下。
subplot(1,2,1);
plot(t,x(:,2));
subplot(1,2,2);
plot(x(:,2),x(:,1));
axis equal
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/844280
推荐阅读
相关标签
  

闽ICP备14008679号