You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环计算阶乘级数部分和时遇'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:36