如何使用python scipy fsolve实现良好的初始值和解决方案范围? [一个简单的例子]

问题描述

在这里,我想使用fsolve解决一个简单的方程式。我知道解决方案存在任何正值。但是,fsolve的成功似乎取决于初始值的选择。我的猜测是,这可能是由于h的域因“ log”而必须为正,并且fsolve过程遇到了否定的尝试。

目前,我尝试的解决方案是使用具有随机初始值的try:,直到找到一个好的解决方案为止。

我的问题: 是否可以强制fslove在某个范围内搜索,例如(0,1)?我知道scipy.optimize.brentq接受解决方案范围,但是范围必须是相反的符号(+-),这不是我的情况。

这是代码

import numpy as np
from scipy.optimize import fsolve

def h_f(h):
    # h range is (0,1)
    return -2/(np.log(h))

def find(h,r):
    return np.abs(r - h_f(h))   # to be minimized to zero

# find solution of h so h_f(h)=6
fsolve(find,x0=0.1,args=(6))[0] # bad initial value RuntimeWarning: invalid value encountered in log

fsolve(find,x0=0.7,args=(6))[0] # good initial value solution h=0.8464817248906141

现在尝试使用最小化方法:没有运气,找不到解决方法

from scipy.optimize import minimize
res = minimize(find,args=(6),bounds=((1e-12,1-1e-12),))

      fun: array([5.56570552])
 hess_inv: <1x1 LbfgsInvHessproduct with dtype=float64>
      jac: array([-1.88611695])
  message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
     nfev: 6
      nit: 1
   status: 0
  success: True
        x: array([0.1])

以“更少”的极限进行更新:

res = minimize(find,bounds=((1e-3,1-1e-3),))

工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)