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

这篇具有很好参考价值的文章主要介绍了MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、非线性方程数值求解

  • 非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。
  • 在 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 附近的零点。
    MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

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 是初始状态列向量。
求解函数 采用方法 适用场合
ode23 2 阶或 3 阶龙格-库塔算法,低精度 非刚性
ode45 4 阶或 5 阶龙格-库塔算法,中精度 非刚性
ode113 Adams 算法,精度可到 1 0 − 3 ∼ 1 0 − 6 10^{-3}\sim 10^{-6} 103106 非刚性,计算时间比 ode45 短
ode23t 梯形算法 适度刚性
odel5s Gear’s 反向数值微分算法,中精度 刚性
ode23s 2 阶 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-');     %通过图形来比较
  • 程序运行结果如下图所示。数值解图形用蓝色原点表示,精确解用红色实现表示,可以看出,两种结果近似。

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

  • 例如,已知一个二阶线性系统的微分方程为 { 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

MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解文章来源地址https://www.toymoban.com/news/detail-481742.html

到了这里,关于MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 节点不连续伽辽金方法在求解线性和非线性平流方程中的一维实现(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文提

    2024年02月12日
    浏览(56)
  • 非线性最优化问题求解器Ipopt介绍

    Ipopt(Interior Point OPTimizer) 是求解大规模非线性最优化问题的求解软件。可以求解如下形式的最优化问题的(局部)最优解。 m i n ⏟ x ∈ R n     f ( x ) s . t . g L ≤ g ( x ) ≤ g U x L ≤ x ≤ x U (0) underbrace{min}_ {x in Rⁿ} , , , f(x) \\\\ s.t. g_L ≤ g(x) ≤ g_U \\\\ x_L ≤ x ≤ x_U tag{0} x ∈ R

    2024年01月20日
    浏览(56)
  • 详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题

       本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题,结合给出的带约束的最优化问题示例,给出相应的完整的C++程序,并给出详细的解释和注释,以及编译规则等    一、Ipopt库的安装和测试    本部分内容在之前的文章《Ubuntu20.04安装Ipopt的流程介

    2024年02月08日
    浏览(75)
  • 数值分析——关于非线性方程求根的迭代法

    目录 一、Aitken算法: 二、Steffensen算法: 三、牛顿切线法 四、定端点弦截法 五、动端点弦截法 六、不动点迭代法 七、二分迭代法 Aitken算法是一种加速级数收敛的方法,适用于递推计算和迭代解法,其核心思想是通过利用级数中的部分和之间的线性关系来加速收敛。 对应的迭

    2024年02月03日
    浏览(57)
  • 6自由度并联机器人 运动学算法 正解 逆解6个耦合的非线性方程组求解

    6自由度并联机器人 运动学算法   正解  逆解 6个耦合的非线性方程组求解 正解快速收敛可用在机器人控制中 已实际使用 6自由度并联机器人运动学算法及其在机器人控制中的应用 随着社会科技的不断发展,机器人技术在工业自动化和服务业中的应用越来越广泛。其中,高自

    2024年04月28日
    浏览(52)
  • 【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对于解决多自由度(MDOF)非线性振动问题,使用单个谐波表示是一种常见的近似方法。这种方法将系统的非线性部分在谐波振动的基础上线性化,从而简化求解过程。 以下是一个基于GUI的单谐波非线性振动问题

    2024年02月15日
    浏览(43)
  • Matlab数据处理:用离散数据根据自定义多变量非线性方程拟合解析方程求取参数

    问题:已知xlsx表格[X,Y,Z]的离散取值,希望用  来拟合,用matlab求得[C1,C2,C3,C5,C6]的值 解答: 运行结果:  备注: 1.rsquare=0.8668认为接近1,拟合效果不错 2.fill函数的startpoint如何设置[C1,...C6]得到一个收敛点?(我找了没找到什么设置startpoint好方法,摸索用如下方法找到了一个

    2024年02月11日
    浏览(50)
  • 【Matlab算法】L-M法求解非线性最小二乘优化问题(附L-M法MATLAB代码)

    博主 一头小山猪 目前已开放所有文章:小山猪——经典算法专栏 活动地址:CSDN21天学习挑战赛 L-M法 (Levenberg-Marquardt法)原理 当矩阵 ( J k ) T J k left(J_{k}right)^{T} J_{k} ( J k ​ ) T J k ​ 为病态矩阵时,用G-N算法可能得不到正确的解,甚至当 ( J k ) T J k left(J_{k}right)^{T} J_{k} ( J

    2024年02月02日
    浏览(46)
  • 非线性方程二分法

    优点:算法直观、简单、总能保证收敛;局限:收敛速度慢、一般不单独用它求根,仅为了获取根的粗略近似 设 f ( x ) f(x) f ( x ) 在 [ a , b ] [a,b] [ a , b ] 上连续、严格单调、满足条件 f ( a ) f ( b ) 0 f(a)f(b)0 f ( a ) f ( b ) 0 则在区间 [ a , b ] [a,b] [ a , b ] 内必有一根 x ∗ x^* x ∗ 。通

    2024年02月04日
    浏览(48)
  • 非线性方程组——牛顿迭代求根

    三维曲面函数的参数方程 x(u,v),y(u,v) ,z(u,v),且曲面满足凸性质,u属于[0,1],v属于[0,1],则在xoy平面任给一点p,过点p做一条平行与z轴的直线,假如该直线与曲面相交与一点,求该点的u,v值。用c++程序编写该数学案例,考虑继承和多态,要求用户给定的曲面作为输入,输

    2023年04月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包