求解含时薛定谔方程时矩阵积分报错:函数对象不可下标访问
问题原因分析
你遇到的'function' object is not subscriptable错误,核心原因是:func是一个返回矩阵的函数,而非矩阵本身。直接用func[row][column]试图对函数对象做下标访问,Python自然会报错——函数不支持下标操作。
解决方法
要逐个积分矩阵元素,需要先让函数返回对应时刻的矩阵,再提取指定位置的元素作为积分对象。同时要注意lambda的延迟绑定问题,避免捕获到错误的变量值。
修改后的核心逻辑
- 定义输入
t、返回对应时刻复合矩阵的函数; - 遍历每个矩阵元素,为每个元素单独定义提取该元素的标量函数;
- 用
quad积分这个标量函数,取积分结果赋值给psi的对应位置。
完整修正代码
import numpy as np from scipy.integrate import quad from numpy.linalg import norm # 若为自定义归一化函数,需替换此处 tol = 10**(-5) # 设置收敛阈值 angfreq = np.pi/3 # 设置角频率 error = 1 # 初始误差,用于进入循环 ti = 0 # 积分下限 tf = 1 # 积分上限 # 以下为示例占位定义,请替换为你实际的矩阵和函数 eigenvectors = np.random.rand(8, 8) U = np.random.rand(8, 8) U_H = np.random.rand(8, 8) def eE(t, tf): return np.random.rand(8, 8) * t/tf def V(t, angfreq): return np.cos(angfreq * t) c_0 = np.array([np.random.rand(len(eigenvectors[0]))]) # 初始系数猜测 psi_0 = norm(c_0@eigenvectors) # 初始波函数猜测(归一化) psi = np.empty(np.shape(psi_0)) # 初始化待更新的波函数 while tol < error: # 定义返回t时刻复合矩阵的函数,避免lambda延迟绑定问题 def matrix_func(t): return U @ eE(t, tf) @ U_H @ psi_0 * V(t, angfreq) # 遍历矩阵的每个元素 for row in range(psi_0.shape[0]): for col in range(psi_0.shape[1]): # 定义提取当前元素的标量函数,用于积分 elem_func = lambda t: matrix_func(t)[row, col] # 调用quad积分,取第一个返回值(积分结果),忽略误差项 integral_result, _ = quad(elem_func, ti, tf) psi[row, col] = integral_result # 计算误差并更新波函数 error = np.linalg.norm(psi - psi_0) psi_0 = norm(psi)
额外注意事项
- lambda延迟绑定:如果坚持用lambda定义
matrix_func,需要用默认参数绑定当前的psi_0,避免后续循环中psi_0更新后函数捕获错误值:matrix_func = lambda t, psi_0=psi_0: U@eE(t, tf)@U_H@psi_0*V(t, angfreq)。 - 维度遍历:用
psi_0.shape替代len(psi_0[0]),更适配不同维度的矩阵,代码鲁棒性更强。 - quad返回值:
scipy.integrate.quad返回元组(积分值, 误差估计),必须取第一个值赋值给矩阵元素,否则会把元组存入psi导致后续计算错误。
内容的提问来源于stack exchange,提问作者lilted
相关产品推荐
相关产品推荐

