代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

mathematica到python

  •  8
  • Eric Schoonover thSoft  · 技术社区  · 14 年前

    如何将这个Mathematica代码移植到Python?我不知道Mathematica语法,很难理解如何用更传统的语言来描述它。

    资料来源(第5页): http://subjoin.net/misc/m496pres1.nb.pdf >p他用数学的句法,很难理解这是如何用更传统的语言来描述的。

    mathematica code

    源(PG 5): http://subjoin.net/misc/m496pres1.nb.pdf

    3 回复  |  直到 13 年前
        1
  •  6
  •   kennytm    14 年前

    这不能作为定义直接移植到python a[j] 使用Mathematica的符号算术特性。

    [j] 基本上是x的系数 J 在这个有理函数的级数展开中,内部分离。

    假设你有 [j] 然后 f[n] 很容易。Mathematica中的一个块基本上引入了变量的范围。第一个列表初始化变量,其余的是代码的执行。所以

    from __future__ import division
    def f(n):
      v = n // 5
      q = v // 20
      r = v % 20
      return sum(binomial(q+5-j, 5) * a[r+20*j] for j in range(5))
    

    ( binomial Binomial coefficient )

        2
  •  4
  •   nanitous    13 年前

    使用先前答案中提出的解决方案,我发现 症状 遗憾的是,没有计算 公寓() 立即的理性。不知怎的,它变得混乱了。此外,*poly.all_coeffs()*返回的系数python列表的语义与mathmatica列表不同。因此,定义中的try except子句 () .

    以下代码确实有效,对于某些测试值,输出与Mathematica 7中Mathematica公式给出的答案一致:

    from __future__ import division
    from sympy import expand, Poly, binomial, apart
    from sympy.abc import x
    
    A = Poly(apart(expand(((1-x**20)**5)) / expand((((1-x)**2)*(1-x**2)*(1-x**5)*(1-x**10))))).all_coeffs()
    
    def a(n):
        try:
            return A[n]
        except IndexError:
            return 0
    
    def f(n):
        v = n // 5
        q = v // 20
        r = v % 20
        return sum(a[r+20*j]* binomial(q+5-j, 5) for j in range(5))
    
    print map(f, [100, 50, 1000, 150])
    
        3
  •  2
  •   Simon    14 年前

    符号可以用 sympy . 结合Kennytm的回答,这样的问题可能就是你想要的:

    from __future__ import division
    from sympy import Symbol, apart, binomial
    
    x = Symbol('x')
    poly = (1-x**20)**5 / ((1-x)**2 * (1-x**2) * (1-x**5) * (1-x**10))
    poly2 = apart(poly,x)
    
    def a(j):
        return poly2.coeff(x**j)
    
    def f(n):
        v = n // 5
        q = v // 20
        r = v % 20
        return sum(binomial(q+5-j, 5)*a(r+20*j) for j in range(5))
    

    尽管我不得不承认f(n)不起作用(我对python不太在行)。