scipy 优化 fsolve 或 root

计算科学 优化 scipy 一体化
2021-12-04 04:20:26

我有一个功能:

delt=1 #trial
def f(z):
    return ((1-2*z)*np.exp(-delt/z))/(((1-z)**(2+delt))*(z**(2-delt)))

我还有一个变量:

import scipy.integrate as integrate
var=integrate.quad(f,0,0.5)[0]  # equals 0.040353419593637516

现在我试图找到值 p 这样

integrate.quad(f,0.5,p)= var

手动我可以检查它是否在 0.605 左右

我定义了以下用于优化的函数:

def integral(p):
    return integrate.quad(f,0.5, p)[0]-var

但是,我得到以下结果:

import scipy.optimize as op
In[26]: op.root(integral,0.61)
Out[26]: 
    fjac: array([[-1.]])
     fun: -0.040353420516861596
 message: 'The iteration is not making good progress, as measured by the \n  improvement from the last ten iterations.'
    nfev: 18
     qtf: array([ 0.04035342])
       r: array([ 0.00072888])
  status: 5
 success: False
       x: array([ 0.50002065])
In[27]: op.fsolve(integral,0.61)
Out[27]: array([ 0.50002065])

知道为什么 root 和 fsolve 都可能失败吗?

1个回答

正如@Stelios 提到的,从 0.5 到 ~0.605 的积分似乎接近 0,然后变为负数。函数的反导数由下式给出

f(z;t=1)dz=e1z1[e(12z)ze1/z(z1)2Ei(z1z)]2(z1)2,

请记住,它不适用于,实际上,您的原始函数未在处定义,甚至不存在限制。如果您绘制反导数图,您可以看到这些特征z=0z=0

在此处输入图像描述