多元函数极值符号解
理论基础:
雅可比矩阵:雅可比矩阵是函数的一阶偏导数以一定方式排列成的矩阵。
二元函数的极值判别:一阶偏导均为 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 即可
(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(函数表达式,初始解)
多元函数同理!