【问题标题】:Solve Polynomial equation of 6th order with Python efficiently用 Python 高效求解 6 阶多项式方程
【发布时间】:2015-10-28 22:02:57
【问题描述】:

我想用 Python 求解 6 阶多项式方程。 我试过“基本”版本:

avgIrms = 19.61
c_val = (0.000002324*avgIrms**6) - (0.0001527*avgIrms**5) + (0.003961843*avgIrms**4) - (0.052211292*avgIrms**3) + (0.379269091*avgIrms**2) -(0.404399274*avgIrms) + 0.000682896
print(c_val)

之后,我使用了带有以下代码的 numpy:

import numpy as np
avgIrms = 19.61
ppar = [0.000002324, -0.0001527, 0.003961843, -0.052211292, 0.379269091, -0.404399274, 0.000682896]
p = np.poly1d(ppar)
print(p(avgIrms))   

在这两种方式中,覆盆子的处理时间都超过了 5 秒……太长了!对有效求解多项式方程有什么帮助吗? (不到一秒……)

提前致谢, 丹尼尔

【问题讨论】:

  • 您的意思是“解决”多项式还是在特定参数上对其进行评估? “求解”多项式通常意味着找到根。我无法想象你会在使用 python 时胜过 numpy,但如果你想评估多项式,请在 Wikipedia 中查找“Horner 方法”。
  • 当您说 « [...] 耗时超过五秒 [...] »,您是如何检查的?
  • 我用这个解决了我的问题: def horner(coeffs, x): return reduce(lambda acc, c: acc * x + c, reversed(coeffs), 0) def poli(value): x = horner((0.000682896, -0.404399274, 0.379269091, -0.052211292, 0.003961843, -0.0001527, 0.000002324), 值) 返回 x
  • 那你会把这个作为答案发布吗?与您的“基本”评估器相比,我仍然看不到这如何加快速度。在我的机器上horner 运行速度较慢。
  • 六阶多项式可能导致过拟合。多项式将有六个根值。你可以使用 PolynomialFeatures(degree=6)

标签: python numpy polynomial-math


【解决方案1】:

首先,您想要评估给定x 的多项式,而不是求解它。其次,我还是不明白你是怎么加快速度的。。

在这里找到几个时机:

>>> import numpy as np
>>> x = 19.61
>>> pr = [0.000002324, -0.0001527, 0.003961843, -0.052211292, 0.379269091, -0.404399274, 0.000682896]
>>> p = pr[::-1] # reverse the order
  • 硬编码解决方案:

    >>> %timeit p[0] + x * p[1] + p[2] * x**2 + p[3] * x**3 + p[4] * x**4 + p[5] * x**5 + p[6] * x**6
    809 ns
    
  • 循环解法:

    >>> %%timeit
        val = 0
        for i in range(len(p)):
            val += p[i] * x**i
    1.24 µs
    
  • 函数式编程解决方案:

    >>> %timeit reduce(lambda acc, i: acc + p[i] * x**i, range(len(p)))
    1.61 µs
    
  • 使用 numpy 的 polyval:

    >>> %timeit np.polyval(pr, x)
    6.12 µs
    
  • 使用 numpy 的 poly1d

    >>> %%timeit
        c = np.poly1d(pr)
        c(x)
    9.46 µs
    

因此,显然 numpy 速度较慢,对于这么小的数组,它在 Python C 通信中增加了一些开销,但它仍然是 6-9 µs 的顺序,我使用的是台式计算机,但如果 R​​aspberry Pi 真的需要 5 秒来完成该操作,我会印象深刻。你确定你的时间安排正确吗?

无论如何,硬编码或循环解决方案似乎都比函数式编程解决方案更快(相当于您在评论中定义为 horner 的解决方案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多