代码之家  ›  专栏  ›  技术社区  ›  obizues

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

  •  0
  • obizues  · 技术社区  · 8 年前

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

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

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

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

    问题是我的独特方法对某些负值无效。我得到的答案是:

    答案Arrayunique=

    -3.0000 -3.0000 -3.0000 1.0000 2.0000

    奇怪的是,如果unique每次都在负数上失败,那么还会有更多的负数-3.0000。有人知道是什么导致了这一结果吗?

    注意:再次使用独特的方法调用并不能解决问题,这让我相信,当它们进一步深入到第万分之一点时,数字是不同的。。大概

    2 回复  |  直到 8 年前
        1
  •  1
  •   Nicky Mattsson    8 年前

    你们应该看看门迪斯的答案,看看如何正确地做到这一点。然而,你的问题是因为那些-3.000并不相等。

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

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

        2
  •  0
  •   Mendi Barel    8 年前

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

    p = [1 0 -7 +6];
    

    例如,要计算x=0.8时的值,请使用:

    polyval(p,0.8)
    

    要查找您使用的根,请执行以下操作:

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

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