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

求解含时薛定谔方程时矩阵积分报错:函数对象不可下标访问

问题原因分析

你遇到的'function' object is not subscriptable错误,核心原因是:func是一个返回矩阵的函数,而非矩阵本身。直接用func[row][column]试图对函数对象做下标访问,Python自然会报错——函数不支持下标操作。

解决方法

要逐个积分矩阵元素,需要先让函数返回对应时刻的矩阵,再提取指定位置的元素作为积分对象。同时要注意lambda的延迟绑定问题,避免捕获到错误的变量值。

修改后的核心逻辑

  1. 定义输入t、返回对应时刻复合矩阵的函数;
  2. 遍历每个矩阵元素,为每个元素单独定义提取该元素的标量函数;
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:45:05