如何解决scipy.integrate.quad中特定被积函数的舍入误差问题?

问题描述 投票:0回答:0

我正在做下面的数值计算。

import numpy as np
from scipy.integrate import quad

def E_k(gap, q, mu):
    return np.sqrt(abs(gap) * abs(gap) + (q * q - mu) * (q * q - mu))

quad(lambda q: q * q * (1 - (q * q - mu) / E_k(gap, q, mu) * np.tanh(E_k(gap, q, mu) / 2 / T)),
                 0, np.inf, epsabs=1.49e-6, epsrel=1.49e-6, limit=50)

旨在让mu的值在(-30, 1)范围内,gap的值在(0, 3)范围内,T为正数。当 T 很小(大约小于 0.1)并且 mu 为正或负接近于零(大约 -0.0005 < mu < 1).

)时,四边形会给出错误的结果(它告诉我检测到舍入误差)

当mu为正时,我尝试在点mu处划分积分区间。

quad(lambda q: q * q * (1 - (q * q - mu) / E_k(gap, q, mu) * np.tanh(E_k(gap, q, mu) / 2 / T)),
                 0, mu, epsabs=1.49e-6, epsrel=1.49e-6, limit=50)[0] + \
quad(lambda q: q * q * (1 - (q * q - mu) / E_k(gap, q, mu) * np.tanh(E_k(gap, q, mu) / 2 / T)),
                 mu, np.inf, epsabs=1.49e-6, epsrel=1.49e-6, limit=50)[0]

但是好像不行。我也调高了limit,调整了quad中的epsabs,epsrel,但是结果还是不对

scipy numerical-integration quad
© www.soinside.com 2019 - 2024. All rights reserved.