【问题标题】:Iterative polynomial multiplication -- Chebyshev polynomials in Python迭代多项式乘法——Python中的切比雪夫多项式
【发布时间】:2011-05-04 18:21:59
【问题描述】:

我的问题是:在 Python 中迭代多项式乘法的最佳方法是什么?

我认为一个有趣的项目是用 Python 编写一个函数来为给定次数的 Chebyshev 多项式生成每个项的系数和指数。生成这样一个多项式(由 Tn(x) 表示)的递归函数是:

With:

T0(x) = 1

and

T1(x) = x:

Tn(x) = 2xTn-1(x) - Tn-2(x)

到目前为止,我所拥有的并不是很有用,但我在思考如何实现这一点时遇到了麻烦。我想要发生的事情如下:

>> chebyshev(4)
[[8,4], [8,2], [1,0]]

此列表表示 4 次切比雪夫多项式: T4(x) = 8x4 - 8x2 + 1

import sys
def chebyshev(n, a=[1,0], b=[1,1]):
    z = [2,1]
    result = []
    if n == 0:
        return a
    if n == 1:
        return b
    print >> sys.stderr, ([z[0]*b[0], 
                           z[1]+b[1]],
                          a) # This displays the proper result for n = 2
    return result

我在网上找到的one solution 不起作用,所以我希望有人能解释一下。

附言有关切比雪夫多项式的更多信息:CSU FullteronWikipedia - Chebyshev polynomials。它们非常酷/有用,并且将一些非常有趣的三角函数/属性结合在一起;值得一读。

【问题讨论】:

    标签: python iteration polynomial-math


    【解决方案1】:

    SciPy 有一个 Chebyshev 的实现

    http://www.scipy.org/doc/api_docs/SciPy.special.orthogonal.html

    我建议查看他们的代码。

    【讨论】:

    • 非常感谢!我曾在 numpy 中寻找过它,但不是 SciPy。
    【解决方案2】:

    切比雪夫的最佳实现是:

    // Computes T_n(x), with -1 <= x <= 1
    real T( int n, real x )
    {
      return cos( n*acos(x) ) ;
    }
    

    如果您针对其他实现进行测试,包括显式多项式评估和iteratively computing the recurrence relation,这实际上是一样快的。 Try it yourself..

    一般:

    • 显式多项式评估是最差的(对于较大的 n)
    • 递归评估要好一些
    • 余弦评估是最好的

    【讨论】:

    • 余弦评估可以击败递归关系,但仅适用于非常n。 (cos 和 arccos 的计算成本很高。)此外,通常需要所有多项式的值达到一定程度,这当然非常便宜,而且递归。
    【解决方案3】:

    orthopy(我的一个项目)也支持切比雪夫多项式的计算。与

    import orthopy
    
    # from sympy.abc import x
    x = 0.5
    
    normalization = "normal"   # or "classical", "monic"
    evaluator = orthopy.c1.chebyshev1.Eval(x, normalization)
    for _ in range(10):
        print(next(evaluator))
    
    0.5641895835477564
    0.39894228040143276
    -0.39894228040143265
    ...
    

    您会在x = 0.5 处获得次数增加的多项式值。您可以使用多个值的列表/向量,甚至可以使用 sympy 符号。

    计算当然发生在递归关系中。如果您对系数感兴趣,请查看

    rc = orthopy.c1.chebyshev1.RecurrenceCoefficients("monic", symbolic=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多