我想通过以下方式在 python 中执行数学积分:
[1] 在 scipy.optimize.fsolve 的帮助下求解一个隐式方程以找到被积函数的最大位置
[2] 在 scipy.integrate.quad 的帮助下,将被积函数的最大值移到零并从 -10 积分到 10
由于被积函数有一个自由参数 xi,我想在 numpy 的帮助下使用一系列 xi 值来执行此操作,因此我使用了 numpy.vectorize。
现在有两种方法可以向量化这个算法:
[A] 分别对 [1] 和 [2] 进行矢量化,并将 vec_[1] 的结果作为输入给 vec_[2]
[B] 向量化同时执行 [1] 和 [2] 的函数
我注意到 [A] 比 [B] 快得多。这是代码:
from scipy import optimize, integrate
import numpy as np
from math import exp, sqrt, pi
import time
def integral_with_fsolve(xi):
xc = optimize.fsolve(lambda x: x+1./(1+exp(-x))-xi,0.)
def integrand(x,xi):
return exp(-(x-xi+xc)**2)/(2.*sqrt(2.*pi))/(1.+exp(x+xc))
integral = integrate.quad(integrand,-10.,10.,args=(xi,),epsabs=0.)
return integral[0]
def integral(xi,xc):
def integrand(x,xi):
return exp(-(x-xi+xc)**2)/(2.*sqrt(2.*pi))/(1.+exp(x+xc))
integral = integrate.quad(integrand,-10.,10.,args=(xi,),epsabs=0.)
return integral[0]
def fsolve(xi):
return optimize.fsolve(lambda x: x+1./(1+exp(-x))-xi,0.)
vec_integral_with_fsolve = np.vectorize(integral_with_fsolve)
vec_integral = np.vectorize(integral)
vec_fsolve = np.vectorize(fsolve)
xi = np.linspace(0.,2.,1000)
t0=time.time()
something = vec_integral_with_fsolve(xi)
dur=(time.time()-t0)
speed = xi.size/dur
print('Integrate and fsolve vectorized in one: speed = {} ints/sec'.format(speed))
t0=time.time()
xc = vec_fsolve(xi)
something = vec_integral(xi,xc)
dur=(time.time()-t0)
speed = xi.size/dur
print('Integrate and fsolve vectorized seperately: speed = {} ints/sec'.format(speed))
并且输出总是像
积分和 fsolve 向量化合二为一:速度 = 298.151473998 ints/sec
单独积分和 fsolve 矢量化:速度 = 2136.75134429 ints/sec
由于这只是我实际问题的简化版本,我需要知道它为什么会这样。有人可以解释一下吗?谢谢!