【问题标题】:How do I find Multiple Roots for a Polynomial in Matlab?如何在 Matlab 中找到多项式的多个根?
【发布时间】:2018-02-19 22:28:41
【问题描述】:

我正在尝试创建两个 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。有人知道是什么原因造成的吗?

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

【问题讨论】:

    标签: matlab polynomial-math polynomials


    【解决方案1】:

    您应该看到 Mendis 的回答,了解如何正确执行此操作。但是,您遇到的问题是因为那些 -3.000 不相等。

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

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

    【讨论】:

      【解决方案2】:

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

      p = [1 0 -7 +6];
      

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

      polyval(p,0.8)
      

      查找您使用的根:

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

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

      【讨论】:

      • 有没有办法将多项式转换为向量?我希望输入是多项式,而不是表示它的向量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多