如何解决如何使用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 举报,一经查实,本站将立刻删除。