欢迎光临我的Blog,虽然这里还很简陋,但未来一定会焕发生机的!

Matlab求解无约束问题——炎泽汐 の Blog

数模 yanzexi 2年前 (2023-08-16) 257次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

多元函数极值符号解

理论基础:

雅可比矩阵:雅可比矩阵是函数的一阶偏导数以一定方式排列成的矩阵。
二元函数的极值判别:一阶偏导均为 0,令 $A\ =\frac{\textit{∂ }²f\left( x_0,y_0 \right)}{\textit{∂ }x²}$、$B\,\,=\frac{\textit{∂ }²f\left( x_0,y_0 \right)}{\textit{∂ }x\textit{∂ }y}$ 、$C\,\,=\frac{\textit{∂ }²f\left( x_0,y_0 \right)}{\textit{∂ }y²}$ ,计算$\varDelta =AB-C^2$。当 $\varDelta >0$时,若 $A >0$为极小值;若 $A <0$则为极大值。当$\varDelta <0$ 时,不是极值。当$\varDelta =0$时需要进一步判别。还可以通过黑森进行判定,将驻点带入黑森矩阵,若为正定矩阵则该点为极小值点,若为负的矩阵则为极大值点,若为不定阵则不是极值点,其他情况需要进一步讨论。
另外,Matlab 自定义函数作为参数的几种方法:
(1)利用 function 定义函数时:参数用’函数名’ 或者 @函数名
(2)匿名函数,f = @ (输入) 定义内容,直接调用 f 即可

代码

clc,clear
syms x y;		%%定义符号变量
f = x^3 - y^3 + 3 * x^2 +3 * y^2 - 9 * x;
df = jacobian(f)		%%雅可比矩阵
d2f = jacobian(df) 		%%求得黑森矩阵
[xx, yy] = solve(df);		%%令一阶偏导为 0,求得驻点
xx = double(xx);
yy = double(yy);

for i =1 : length(xx)
    A = subs(d2f, {x,y}, {xx(i),yy(i)});		%%将计算的驻点带入二阶雅可比矩阵
    delta = eig(A)		%%计算特征值
    f = sub(f, {x, y}, {xx(i),yy(i)});		%%将计算的驻点带入函数表达式
    f = double(f);
    %%进入判断,不做赘述
end

多元函数极值数值解

常用两函数,形式如下:

[x,fval] = fminunc(fun, x0, options)

[x,fval] = fminsearch(fun, x0, options) %%只能求出初始值附近的一个极小值点

特别的,fun 是一个自定义函数,第一个返回值为 f(x);第二个返回值为 f(x)的梯度向量;第三个返回值为其黑森矩阵。

若在 fun 函数中提供了梯度,则应该将 options 参数的 GradObj 设置 为’on’,即设置:options = optimset(‘GradObj’,’on’)。即设置了目标函数的用户定义梯度或 Jacobian 矩阵。

若在 fun 函数中提供了黑森矩阵,则应该将 options 参数的 Hessian 设置 为’on’,即设置:options = optimset(‘Hessian’,’on’)。

一般来说,fun 提供的信息越多,Matlab 求解的速度就越快,计算精度也就越高。

函数零点问题

一元函数:

      数值解:函数 roots(系数向量),系数由幂次高到低的顺序排列。

      符号解:定义符号向量,使用 solve(函数表达式)求解后,类型转换为数值。

      初始解附近的一个零点:fslove(函数表达式,初始解)

多元函数同理!

喜欢 (0)
[炎泽汐de收款码]
分享 (0)

您必须 登录 才能发表评论!