如何在 Matlab 中找到多项式的多个根?

How do I find Multiple Roots for a Polynomial in Matlab?

我正在尝试创建两个 matlab .m 文件。 "f.m" 包含我要使用的多项式的函数。

function y = f(x)
y = x.^3 - 7*x + 6;

Compute.m 调用 fzero,该函数返回多项式和一个从 -10 到 10 的值的 for 循环。

clc
fun = @f;
answerArray= [];
for x0 = -10:10
    z = fzero(fun,x0);
    answerArray=[answerArray z];
end
answerArrayUnique=unique(answerArray)

问题是我的独特方法不适用于某些负值。我得到的答案是:

answerArrayUnique =

-3.0000 -3.0000 -3.0000 1.0000 2.0000

奇怪的是,如果 unique 每次都在负数上失败,那么 -3.0000 会更多。有人知道是什么原因造成的吗?

注意:再次使用 unique 方法调用并不能解决问题,这让我相信它认为当它们进一步进入第 10000 个点时数字是不同的。 . 也许?

在 matlab 中,表示多项式的最佳方法是通过系数向量。举个例子:

p = [1 0 -7 +6];

要计算 x=0.8 处的值,例如您使用:

polyval(p,0.8)

查找您使用的词根:

r = roots(p) %output: -3 2 1

仅对非线性函数使用'fzero'并祈祷找到所有解决方案。

你应该看看 Mendis 的回答,了解如何正确地做到这一点。但是,您遇到的问题是因为那些 -3.000 不相等。

unique 通过排序然后检查连续数字是否相等来工作。但是,由于您已使用数值方法找到零点,因此解是近似值。尝试减去两个相等的解决方案,差异会很小,但不会为零。

为避免这种情况,您可以使用 uniquetol,它允许您指定一个公差,在此范围内,您认为两个数字相等。例如uniquetol(answerArray,1e-4)