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

如何添加a趋近于0的循环实现三重积分的双重循环计算

双重循环下的三重积分实现(a趋近于0)

核心修改说明

  • 调整目标函数f的参数顺序为t1,t2,t3,a,k,匹配积分需求
  • 添加a的趋近序列:用对数间距生成一组趋近于0的正数,模拟a→0的过程
  • 实现k和a的双重循环:对每个k值,遍历不同的a值计算积分
  • 修正积分函数的参数传递,确保a和k正确传入目标函数
  • 保留原有的归一化项1/(math.exp(H*a)**2),并处理小a值下的数值稳定性

修改后的完整代码

import numpy as np
import scipy.special
from scipy import integrate
from scipy.special import kn
import matplotlib.pyplot as plt
import math
import time, sys

H = 4.10061*10**-5
ti = -100*H
end = -H
step = H

# 定义目标函数,参数顺序调整为t1,t2,t3,a,k
f = lambda t1, t2, t3, a, k: t1 + t2 + k + a + t3

# 生成k的取值序列
k_vals = np.arange(0, 50, 0.1)
# 生成a的趋近序列:从1e-6到1,对数间距10个点,聚焦a趋近于0的区域
a_vals = np.logspace(-6, 0, 10)

# 初始化结果数组:行对应a值,列对应k值
results = np.zeros((len(a_vals), len(k_vals)))

for a_idx, a in enumerate(a_vals):
    print(f"正在计算a={a:.6f}...")
    for k_idx, k in enumerate(k_vals):
        # 三重积分:t1∈[0,a], t2∈[0,a], t3∈[0,∞)
        # args传递(a, k),严格匹配f的非积分参数顺序
        y, err = integrate.tplquad(
            f,
            0, a,  # t1的积分区间
            lambda t1: 0, lambda t1: a,  # t2的积分区间(可依赖t1)
            lambda t1, t2: 0, lambda t1, t2: float('inf'),  # t3的积分区间(可依赖t1、t2)
            args=(a, k)
        )
        # 应用归一化因子
        results[a_idx, k_idx] = y / (math.exp(H*a)**2)

# 可视化不同a值下的P(k)曲线
plt.figure(figsize=(10,6))
for a_idx, a in enumerate(a_vals):
    plt.plot(k_vals, results[a_idx], label=f'a={a:.6f}')

plt.title("P(k) 随k的变化(不同a趋近于0)")
plt.xlabel("k")
plt.ylabel("P(k)")
plt.legend()
plt.grid(True)
plt.show()

关键细节解释

  1. a的趋近序列:使用np.logspace生成对数间距数值,相比线性间距更能聚焦a趋近于0的小值区域,减少无效计算
  2. 参数传递修正:tplquad的args参数必须严格匹配目标函数中非积分变量的顺序,这里对应f的a和k
  3. 双重循环结构:外层遍历a的取值,内层遍历k的取值,结果存储为二维数组,方便对比不同a下的积分结果
  4. 数值稳定性:当a趋近于0时,math.exp(H*a)近似为1 + H*a,归一化项不会出现数值溢出,小a值下计算可靠

内容的提问来源于stack exchange,提问作者Dr. phy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:21