如何在Matlab上找到多项式方程的转折点?

问题描述

我有一个函数 f=x^4-8x^3+24^2-32x。

我需要使用内置命令“fsolve”找到转折点(即曲线的最大值或最小值)。

现在,我知道转折点是 x=2,因为我通过找到 f 的一阶导数并使其等于 0 手动计算了它,但是当我尝试使用 fsolve 在 matlab 上做它时我没有管理它。我这样做了:

x=sym('x'); 
f=x^4-8*x^3+24*x^2-32*x;
f1=diff(f,x,1) 

而且我不知道如何从那里继续(我的方法很可能是错误的,因为我一直从数学的角度看待问题)

有人知道我怎么写代码吗?

解决方法

fsolve 用于数值求解方程。所以你首先需要从符号表达式创建一个matlab函数:

syms x
f=x^4-8*x^3+24*x^2-32*x;
f1=matlabFunction(diff(f,x,1))
result = fsolve(f1,0)
,

您的方程在 x=2 附近似乎几乎是平坦的。所以 fsolve 可以完成这项工作,但精度不会很好。

幸运的是,找到多项式的根(所有根!)是我们可以用数学方法做的事情:

sym x
% Get the coefficient of the polynome
c      = sym2poly(diff(x^4-8*x^3+24*x^2-32*x))
% Create the Frobenius companion matrix
l        = length(c);
A        = diag(ones(l-2,1),-1)
A(:,end) = -c(l:-1:2)./c(1)
% Get the roots
roots  = eig(A)

% roots =
% 
%    2.0000 + 0.0000i
%    2.0000 - 0.0000i
%    2.0000 +      0i

为什么有效?检查 wikipedia article about companion matrix