问题描述
我想找到使函数最小化的参数,但出现错误。到目前为止,请使用scipy.optimize.fmin
,但我想为每个参数添加界限。这是我的代码
def Kou_calibration_full():
i=0
global opt
p0 = spo.brute(Kou_error_function,((0.10,0.31,0.1),(0.01,2.6,0.5),(0.1,0.92,0.2),(1.1,20,7),7)),finish=None)
opt = spo.minimize(Kou_error_function,p0,bounds=((0.10,0.31),2.6),0.92),20),20)))
return opt
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<timed eval> in <module>
<ipython-input-127-e458cef75641> in Kou_calibration_full()
3 global opt
4 p0 = spo.brute(Kou_error_function,finish=None)
----> 5 opt = spo.minimize(Kou_error_function,20)))
6 return opt
~\anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
615 **options)
616 elif meth == 'l-bfgs-b':
--> 617 return _minimize_lbfgsb(fun,618 callback=callback,**options)
619 elif meth == 'tnc':
~\anaconda3\lib\site-packages\scipy\optimize\lbfgsb.py in _minimize_lbfgsb(fun,disp,maxcor,ftol,gtol,eps,maxfun,maxiter,iprint,maxls,finite_diff_rel_step,**unknown_options)
304 iprint = disp
305
--> 306 sf = _prepare_scalar_function(fun,jac=jac,args=args,epsilon=eps,307 bounds=new_bounds,308 finite_diff_rel_step=finite_diff_rel_step)
~\anaconda3\lib\site-packages\scipy\optimize\optimize.py in _prepare_scalar_function(fun,epsilon,hess)
259 # ScalarFunction caches. Reuse of fun(x) during grad
260 # calculation reduces overall function evaluations.
--> 261 sf = ScalarFunction(fun,grad,262 finite_diff_rel_step,epsilon=epsilon)
263
~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in __init__(self,fun,finite_diff_bounds,epsilon)
93
94 self._update_grad_impl = update_grad
---> 95 self._update_grad()
96
97 # Hessian Evaluation
~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in _update_grad(self)
169 def _update_grad(self):
170 if not self.g_updated:
--> 171 self._update_grad_impl()
172 self.g_updated = True
173
~\anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in update_grad()
89 self._update_fun()
90 self.ngev += 1
---> 91 self.g = approx_derivative(fun_wrapped,self.x,f0=self.f,92 **finite_diff_options)
93
~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in approx_derivative(fun,rel_step,abs_step,f0,sparsity,as_linear_operator,kwargs)
386 f0 = np.atleast_1d(f0)
387 if f0.ndim > 1:
--> 388 raise ValueError("`f0` passed has more than 1 dimension.")
389
390 if np.any((x0 < lb) | (x0 > ub)):
ValueError: `f0` passed has more than 1 dimension.
有人可以帮忙吗?我不知道该怎么办:(
(我的代码太多,所以我必须添加一些文本:abcdabcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd
解决方法
也许是由于您的Kou_error_function
函数的返回矩阵的大小,请在函数返回的末尾示例中添加.ravel()
或.flatten()
。
喜欢:
def Kou_error_function(x,obs,arg):
err = x*arg-obs
return y.ravel()