循环计算阶乘级数部分和时遇'numpy.ndarray'无'subs'属性错误
问题:Sympy级数计算报错
'numpy.ndarray' object has no attribute 'subs' 尝试计算级数 $\frac{(-1)n\sqrt{\pi}x{2n+1}}{(2n+1)n!}$ 的部分和并绘图,通过迭代生成0到指定项的表达式值存入列表后求和,但运行时出现错误:'numpy.ndarray' object has no attribute 'subs',推测与sympy的factorial函数有关,此前处理不含阶乘的同类表达式可正常运行。
原代码如下:
from sympy import * import matplotlib.pyplot as plt n=symbols('n') x=symbols('x') a=((-1)**(n)*sqrt(pi)*x**(2*n+1))/((2*n+1)*factorial(n)) a0to5=[a.subs({n:i}) for i in range(6)] s5=sum(a0to5) a0to10=[a.subs({n:i}) for i in range(11)] s10=sum(a0to10) a0to15=[a.subs({n:i}) for i in range(16)] s15=sum(a0to15) t=symbols('t') function=E**((-t)**2) integral=(sqrt(pi))*integrate(function,t) f=integral.subs(t,0)-integral.subs(t,x) plot((s5,(x,-10,10)),(s10,(x,-10,10)),(s15,(x,-10,10)),(f,(x,-10,10)),ylim=[-2,2])
解决方案
错误原因
问题出在sqrt(pi)的使用上:pi是numpy的常量,调用sqrt(pi)会返回numpy数组类型的对象,导致后续构造的表达式a混合了SymPy符号对象和numpy数组,当调用SymPy的subs方法时,numpy数组不支持该方法,从而触发报错。
修正步骤
将代码中所有的sqrt(pi)替换为sqrt(Pi)(SymPy中的圆周率符号为大写Pi),确保整个表达式始终使用SymPy的符号类型进行运算,避免类型冲突。
修正后代码
from sympy import * import matplotlib.pyplot as plt n=symbols('n') x=symbols('x') # 替换sqrt(pi)为sqrt(Pi) a=((-1)**(n)*sqrt(Pi)*x**(2*n+1))/((2*n+1)*factorial(n)) a0to5=[a.subs({n:i}) for i in range(6)] s5=sum(a0to5) a0to10=[a.subs({n:i}) for i in range(11)] s10=sum(a0to10) a0to15=[a.subs({n:i}) for i in range(16)] s15=sum(a0to15) t=symbols('t') function=E**((-t)**2) # 同样替换此处的sqrt(pi)为sqrt(Pi) integral=(sqrt(Pi))*integrate(function,t) f=integral.subs(t,0)-integral.subs(t,x) plot((s5,(x,-10,10)),(s10,(x,-10,10)),(s15,(x,-10,10)),(f,(x,-10,10)),ylim=[-2,2])
额外说明
- SymPy中所有数学常量(如圆周率、自然对数底数)均为大写开头(
Pi、E),小写的pi、e通常属于numpy或Python标准库的常量,混用会导致类型冲突。 - 修正后,表达式
a全程为SymPy符号对象,subs方法可正常替换变量n的取值,后续求和、绘图逻辑均可正常执行。
内容的提问来源于stack exchange,提问作者Pau Forcadell Campos
相关产品推荐
相关产品推荐

