问题描述
在这里,我想使用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 (将#修改为@)