我想用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))
在两种方式中,树莓花了超过五秒钟的时间来处理...它已经很多了!有效解决多项式方程的任何帮助? (不到一秒......)
提前致谢, 丹尼尔
答案 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
的那个)。