用Python有效地求解6阶多项式方程

时间:2015-08-05 22:58:52

标签: python numpy polynomial-math

我想用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))   

在两种方式中,树莓花了超过五秒钟的时间来处理...它已经很多了!有效解决多项式方程的任何帮助? (不到一秒......)

提前致谢, 丹尼尔

1 个答案:

答案 0 :(得分:3)

首先,你想要的是评估给定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
    
  • Loopy解决方案:

    >>> %%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的顺序,我正在使用台式计算机,但如果Raspberry Pi真的需要5秒才能完成该操作,我会非常感动。你确定你正确地完成了时间安排吗?

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