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

news2024/11/26 20:34:27

这里写目录标题

  • 一、非线性方程数值求解
    • 1. 单变量非线性方程求解
    • 2. 非线性方程组的求解
  • 二、最优化问题求解
    • 1. 无约束最优化问题求解
    • 2. 有约束最优化问题求解
    • 3. 线性规划问题求解
  • 三、常微分方程初值问题的数值求解
    • 1. 龙格—库塔法简介
    • 2. 龙格—库塔法的实现

一、非线性方程数值求解

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

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

  • 在 MATLAB 中提供了一个 fzero 函数,可以用来求单变量非线性方程的根。该函数的调用格式如下:
	z=fzero(filename,x0,tol,trace)
  • 其中,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
  • 然后,我们调用 fzero 函数求根,程序如下:
>> fzero(@fz,-5)	%-5作为迭代初值

ans =

   -5.1926

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

ans =

    0.1926
 
  • 可绘制 f ( x ) f(x) f(x) 的图像如下图所示,从中可看出 f ( x ) f(x) f(x) 在 x=-5 和 x=1 附近的零点。
    在这里插入图片描述

2. 非线性方程组的求解

  • 在 MATLAB 的最优化工具箱中提供了非线性方程组的求解函数 fsolve,其调用格式如下:
	X=fsolve(filename,X0,option)
  • 其中,X 为返回的解,filename 是用于定义需求解的非线性方程组的函数,X0 是求解过程的初值,option 用于设置优化工具箱的优化参数。
  • 优化工具箱提供了许多优化参数选项,用户在命令行窗口输入下列命令,可以将优化参数
    全部显示出来:
>> optimset
  • 如果希望得到某个优化函数(例如 fsolve 函数)当前的默认参数值,则可在命令行窗口输入命令:
>> optimset fsolve
  • 如果想改变其中某个参数选项,则可以调用 optimset 函数来完成。例如,Display 参数选项决定函数调用时中间结果的显示方式,其中 ‘off’ 为不显示,‘iter’ 表示每步都显示,‘final’ 只显示最终结果。如果要设定 Display 选项为 off,可以使用如下命令:
>> option=optimset ('Display', 'off')
  • 例如,我们求下列方程组在 ( 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\{\begin{matrix}\sin x+y+z^{2}e^{x}=0 \\x+y+z=0 \\xyz=0 \end{matrix}\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
  • 在给定的初值 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
 
  • 将求得的解代回原方程,可以验证结果是否正确,程序如下:
>> q=myfun(X)

q =

   1.0e-06 *

   -0.5931   -0.0000    0.0006

  • 可见得到了较高精度的结果。
  • 例如,我们求圆和直线的两个交点。 圆: 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\{\begin{matrix}3x+5y+6z=0 \\x-3y-6z-1=0 \end{matrix}\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\{\begin{matrix}x^{2}+y^{2}+z^{2}=9 \\3x+5y+6z=0 \\x-3y-6z-1=0 \end{matrix}\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
  • 再在 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

二、最优化问题求解

  • 最优化方法包含多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。
  • 利用 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

  • 例如,设 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
  • 随后,在 MATLAB 命令行窗口输入以下程序:
>> [X,fmin]=fminsearch(@fxyz0,[0.5,0.5,0.5])

X =

    0.5000    1.0000    1.0000


fmin =

    4.0000

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)
  • 其中,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\{\begin{matrix}x_{1}+0.5x_{2}\ge 0.4 \\0.5x_{1}+x_{2}ge 0.5 \\x_{1}\ge 0,x_{2}\ge 0 \end{matrix}\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
  • 随后,我们再设定约束条件,并调用 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)
  • 程序运行结果如下:
x =

    0.3396
    0.3302


f =

    0.2456
    

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\{\begin{matrix}Ax=b \\A_{eq}x=b_{eq} \\L_{bnd}≤x≤U_{bnd} \end{matrix}\right.}{min} f(x) xs.t.{Ax=bAeqx=beqLbndxUbndminf(x)
  • 在 MATLAB 中求解线性规划问题使用函数 linprog,其调用格式如下:
	[x,fval]=linprog(f,A,Aeq,beq,Lbnd,Ubnd)
  • 其中,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\{\begin{matrix}x_{1}-x_{2}+x_{3}\le 20 \\3x_{1}+2x_{2}+4x_{3}\le 42 \\3x_{1}+2x_{2}\le 30 \\x_{1}\ge 0,x_{2}\ge 0,x_{3} \end{matrix}\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)
  • 程序运行结果如下:
Optimal solution found.

x =

         0
   15.0000
    3.0000


favl =

   -78

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

  • 众所周知,只有对一些典型的常微分方程,才能求出它们的一般解表达式并用初始条件确定表达式中的任意常数。然而在实际问题中遇到的常微分方程往往很复杂,在许多情况下得不出一般解,所以,一般是要求获得解在若千个点上的近似值。
  • 考虑常微分方程的初值问题: 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\{\begin{matrix}y(t_{0}+h)=y_{1}\approx y_{0}+hf(t_{0},y_{0}) \\y(t_{0}+2h)=y_{2}\approx y_{1}+hf(t_{1},y_{1}) \end{matrix}\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) 
  • 其中, 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\{\begin{matrix}y'=\frac{y^{2}-t-2}{4(y+1)} \\y(0)=2 \end{matrix}\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
  • 随后,我们调用函数求解微分方程,程序如下:
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-');     %通过图形来比较
  • 程序运行结果如下图所示。数值解图形用蓝色原点表示,精确解用红色实现表示,可以看出,两种结果近似。

在这里插入图片描述

  • 例如,已知一个二阶线性系统的微分方程为 { d 2 x d t 2 + a x = 0 , a > 0 x ( 0 ) = 0 , x ′ ( 0 ) = 1 \left\{\begin{matrix}\frac{\mathrm{d}^{2} x}{\mathrm{d} t^{2}}+ax=0,a>0 \\x(0)=0,x'(0)=1 \end{matrix}\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\{\begin{matrix}x'_{2}=x1 \\x'_{1}=-ax_{2} \\x_{2}(0)=0,x_{1}(0)=1 \end{matrix}\right. x2=x1x1=ax2x2(0)=0,x1(0)=1
  • 首先,我们建立函数文件 sys.m。
function xdot=sys(t,x)
xdot= [-2*x(2);x(1)];
end
  • 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]);
  • 程序运行后,查看结果。
>> [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

  • 结果第一列为 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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day975.如何使用JWT结构化令牌 -OAuth 2.0

如何使用JWT结构化令牌 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何使用JWT结构化令牌的内容。 OAuth 2.0 规范并没有约束访问令牌内容的生成规则&#xff0c;只要符合唯一性、不连续性、不可猜性就够了。这就意味着&#xff0c;可以灵活选择令牌的形式&…

将递归函数转成非递归函数的通用方法

看到过一道非常不错的面试题&#xff1a;不支持递归的程序语言如何实现递归程序&#xff1f; 之所以说这道题好&#xff0c;是因为&#xff1a; 首先&#xff0c;它不是纯粹考概念和死记硬背&#xff0c;求职者在回答问题之前需要进行一定的思考&#xff1b; 其次&#xff0c…

vim粘贴出现多余的#

vim粘贴yaml格式时&#xff0c;出现多余的#&#xff0c;格式错误 解决&#xff1a;设置paste :set paste 然后再粘贴即可

final不可变性

一、什么是不可变性&#xff08;Immutable&#xff09; 如果对象在被创建后&#xff0c;状态就不能被修改&#xff0c;那么它就是不可变的这个对象不能被修改指&#xff1a; 对象指向(引用)不可变字段不可变成员变量不可变 案列演示&#xff1a; person对象&#xff0c;age和…

我的C++学习笔记

声明&#xff1a; 写本篇博客的目的是为了整理自己在找工作时学习的C相关知识点&#xff0c;博客整体内容会分为两种风格&#xff0c;第一章基础部分是以常见C面试问题解答的形式呈现&#xff1b;其余部分是知识点层层递进的方式展现&#xff0c;比较系统。其中&#xff0c;在第…

Avalon 学习系列(三)—— 数据和指令同步

Avalon 有很多个指令&#xff0c;通过这些指令可以对 DOM 进行一些事件操作、或者样式修改。 ms-duplex Avalon 实现数据与视图的同步的方式是用 ms-duplex 将元素跟数据绑定在一起&#xff0c;如果有其中一个的值改变另一个值也将改变。 ms-duplex 是 avalon 的双向绑定属性…

OpenCV(C++)创建图片绘制图形(矩形、圆、文字、线段等等)

一、OpenCV介绍 OpenCV 是基于开源许可证的跨平台计算机视觉库,提供了一组丰富、广泛的图像处理和计算机视觉算法。OpenCV 支持多种编程语言,包括 C++、Python、Java 等,可以运行在 Linux、Windows、Mac OS 等平台上。 OpenCV 能够在图像上绘制各种几何形状、文本和曲线,…

学习ESP32笔记

学习ESP32笔记 1.platform IO插件的下载&#xff08;提前安装好python&#xff0c;不然在中间的一部分会一直报错&#xff09; VS Code下载platform IO时&#xff0c;开加速器&#xff08;VPN&#xff09;&#xff0c;并且关闭防火墙 这一步比较慢&#xff0c;大概等十来分钟…

Kendo UI for jQuery---02.开始---01.使用 Kendo UI for jQuery 的第一步

使用 Kendo UI for jQuery 的第一步 欢迎来到 Kendo UI for jQuery 入门的第一步指南&#xff01; 本指南演示如何通过添加所需资源和初始化 Kendo UI 网格来开始使用套件。 该过程借鉴了以下里程碑&#xff1a; 1.下载控件 2.添加所需的 JavaScript 和 CSS 文件 3.将网格绑…

如何使用postman做接口测试

常用的接口测试工具主要有以下几种&#xff1a; Postman: 简单方便的接口调试工具&#xff0c;便于分享和协作。具有接口调试&#xff0c;接口集管理&#xff0c;环境配置&#xff0c;参数化&#xff0c;断言&#xff0c;批量执行&#xff0c;录制接口&#xff0c;Mock Server…

【每日挠头算法题(6)】二叉树的所有路径|神奇字符串

欢迎~ 一、二叉树的所有路径思路&#xff1a;深度优先搜索具体代码如下&#xff1a; 二、神奇字符串思路&#xff1a;模拟双指针具体代码如下&#xff1a; 总结 一、二叉树的所有路径 点我直达~ 思路&#xff1a;深度优先搜索 使用深度优先搜索&#xff1a;即二叉树的前序遍历…

设计模式(十二):结构型之享元模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

编码生成矩阵与检错监督矩阵

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 线性分组码基本概念…

Elasticsearch快速入门及使用

Elasticsearch快速入门及使用 一.Elasticsearch是什么二.基本概念1.index (索引)2. type (类型)3.Document (文档) 三.为什么Elasticsearch可以从海量数据里快速检索出数据四.Elasticsearch安装1.解压2.运行3.显示以下内容就是启动成功14.Kibana可视化软件安装 五.入门(基本的操…

如何编写有效的接口测试?

在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原则&#xff1f;测…

unity Ignis - Interactive Fire(完美模拟:森林火灾、草原火灾、建筑火灾)

Ignis 可以把任何物体、植被或带皮带骨的网状物转换为可燃物体&#xff0c;它就会自动着火。然后&#xff0c;火焰可以蔓延&#xff0c;点燃其他物体&#xff0c;被粒子或光线熄灭&#xff0c;或者自然烧尽。也可以被粒子点燃。还会收到风力影响WindZone。 WindZone文档&#…

轻量级性能测试工具 wrk 如何使用?

项目设计之初或者是项目快要结束的时候&#xff0c;大佬就会问我们&#xff0c;这个服务性能测试的结果是什么&#xff0c;QPS 可以达到多少&#xff0c;RPS 又能达到多少&#xff1f;接口性能可以满足未来生产环境的实际情况吗&#xff1f;有没有自己测试过自己接口的吞吐量&a…

磁盘详解(一文搞懂磁盘)

目录 一.磁盘的结构 二.磁盘的分类 2.1按照磁头是否可以移动分类 2.2按照盘片是否可以更换分类 三.磁盘的读写过程 四.磁盘的调度 4.1FCFS先来先服务算法 4.2SSTF最短寻找时间优先 4.3 SACN扫描算法 4.4C-SACN循环扫描算法 4.5 SPTF&#xff08;最短定位时间优先&…

Maxwell安装使用

​欢迎光临我的博客查看最新文章: https://river106.cn 1、Maxwell简介 Maxwell 是由美国Zendesk开源&#xff0c;用Java编写的MySQL实时抓取软件。读取 MySQL binlogs 并将修改行字段的更新写入 Kafka, Kinesis, RabbitMQ, Google Cloud Pub/Sub 或 Redis (Pub/Sub or LPUSH)…

基于Aidlux的停车标志检测(可修改为coco 80类目标检测)

●项目名称 基于Aidlux的停车标志检测&#xff08;可修改为coco 80类目标检测&#xff09; ●项目简介 本项目在Aidlux上部署检测停车标志检测&#xff0c;并可在源码上修改coco 80类目标检测索引直接检测其他79类目标&#xff0c;可以直接修改、快速移植到自己的项目中。 ●…