Python 中的数值积分问题

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

我有一个贝塞尔函数的积分,我想对其进行数值计算。

我想求 z 和 w 函数在 w 上的数值积分,这样我的结果就是一个在 z 上的数组。也就是说,我想要

F(z) = 积分 f(z,w)dw

我想我可以使用以下代码使用 numpy 有效地完成此任务:

def readinKernel(wdummy, z, Ec, Ep, kval=1, ic = 1, od = 10000):
    return (Ec * kval * special.jv(0, 2* Ec * kval * np.sqrt(np.outer(z, (1 - wdummy))))
            * np.sqrt(ic)*Ep )

def steep_sigmoid(x, k=50):    
    return 1.0 / (1.0 + np.exp(-k*x))

def spinwave_calculation(z_values, Ec, Ep, numpoints = 100):

    wdummy_values = np.linspace(1e-10, 1-1e-10, numpoints)
    readin_values = readinKernel(wdummy_values, z_values, Ec, Ep)
    readin_integrals = np.trapz(readin_values, wdummy_values, axis=1)
    return readin_integrals

numpoints = 1000

z_values =  np.linspace(1e-10, 1-1e-10, numpoints)    

E_c_val = 1
E_p_val = 1

outputspinwave = spinwave_calculation(z_values, E_c_val, E_p_val, numpoints)
output = np.sum(np.square(outputspinwave))
print(output)

但看起来这个解决方案似乎随着我使用的点数而“爆炸”。因此,如果我将 numpoints 增加 10,那么我的输出积分就会大 10 倍。

如何准确估计该积分,是否可以同时保持精度和速度?

python numpy integral calculus
1个回答
0
投票

这感觉更像是一个数学问题:

代码中的

numpy.trapz
函数计算
w
上的积分。您的
numpoints
是获得
z
数组的
F(z)
点的数量。当您增加
F(z)
点的数量时,
z
的平方和肯定会增加。

就像您在 [0, 1] 中定义

F(z)=z
并在
F(z)^2
上求和
z
一样。如果你增加你选择的
z
的数量,它就会爆炸。

© www.soinside.com 2019 - 2024. All rights reserved.