首页 > 解决方案 > 符号无穷级数的收敛

问题描述

我想象征性地确定无限级数的收敛值。使用 Mathematica 和 Sum 命令,我得到了一个结果(我不知道是否正确),我尝试用 Python 重现它,但无法详细说明。

我的代码是:

import sympy as sym
from sympy.abc import k, x, d,f
from sympy import Sum, oo

result = sym.Sum(x**(2*(k-1))*sym.exp(sym.I*(2*k-1)*d), (k, 1, oo)).doit()

有什么问题吗?有没有更有效的方法来执行这个操作?

谢谢

标签: pythonsumsympy

解决方案


应该可以按照您尝试的方式计算它,尽管它可能尚未在 sympy 中实现。总和是一个几何级数,所以我们可以手动计算它:

In [82]: s = Sum(x**(2*(k-1))*sym.exp(I*(2*k-1)*d), (k, 1, oo))

In [83]: s
Out[83]: 
  ∞                          
 ___                         
 ╲                           
  ╲    2⋅k - 2  ⅈ⋅d⋅(2⋅k - 1)
  ╱   x       ⋅ℯ             
 ╱                           
 ‾‾‾                         
k = 1                        

In [84]: s2 = factor_terms(powsimp(factor_terms(s.rewrite(exp).expand()), deep=True))

In [85]: s2
Out[85]: 
        ∞                      
       ___                     
       ╲                       
 -ⅈ⋅d   ╲    2⋅k⋅(ⅈ⋅d + log(x))
ℯ    ⋅  ╱   ℯ                  
       ╱                       
       ‾‾‾                     
      k = 1                    
───────────────────────────────
                2              
               x               

In [86]: Sum(x**k, (k, 1, oo)).doit().subs(x, exp(2*(I*d + log(x)))) * exp(-I*d) / x**2
Out[86]: 
⎛⎧     2  2⋅ⅈ⋅d                   ⎞      
⎜⎪    x ⋅ℯ                │ 2│    ⎟      
⎜⎪ ───────────────    for │x │ < 1⎟      
⎜⎪    2  2⋅ⅈ⋅d                    ⎟      
⎜⎪ - x ⋅ℯ      + 1                ⎟      
⎜⎪                                ⎟      
⎜⎪  ∞                             ⎟      
⎜⎪ ____                           ⎟  -ⅈ⋅d
⎜⎨ ╲                              ⎟⋅ℯ    
⎜⎪  ╲                             ⎟      
⎜⎪   ╲             k              ⎟      
⎜⎪   ╱  ⎛ 2  2⋅ⅈ⋅d⎞    otherwise  ⎟      
⎜⎪  ╱   ⎝x ⋅ℯ     ⎠               ⎟      
⎜⎪ ╱                              ⎟      
⎜⎪ ‾‾‾‾                           ⎟      
⎜⎪k = 1                           ⎟      
⎝⎩                                ⎠      
─────────────────────────────────────────
                     2                   
                    x  

如果将特定值替换为xand ,则可以用数字测试结果d

In [95]: s3 = Sum(x**k, (k, 1, oo)).doit().subs(x, exp(2*(I*d + log(x)))) * exp(-I*d) / x**2

In [96]: s.subs(x, S.Half).subs(d, 1).n()
Out[96]: 0.318932163677498 + 0.827845692253729⋅ⅈ

In [97]: s3.subs(x, S.Half).subs(d, 1).n()
Out[97]: 0.318932163677498 + 0.827845692253729⋅ⅈ

推荐阅读