如何解决我收到此错误消息:无法根据规则“安全”将数组数据从 dtype('O') 转换为 dtype('float64')
这是我的代码。
import numpy as np
from scipy.optimize import minimize
import sympy as sp
sp.init_printing()
from sympy import *
from sympy import Symbol,Matrix
rom sympy import *
def make_Aij(m,n,a='a') :
from sympy import Symbol,Matrix # just in case they aren't already loaded
A = zeros(m,n)
for i in range(0,m) :
for j in range(0,n) :
s = a+'_'+str(i)+str(j)
exec (s + "= Symbol('" + s + "')") # go look up what "exec" does!
exec ("A[i,j] = " + s)
return A
C = make_Aij(1,2,'c')
C
z = C[0,0]
g = C[0,0]**2-C[0,1]**2
g
h = C[0,0]
h
#Function defined
def function(h):
return g
g
#Jacobian working with sympy
q = diff(g,C[0,0])
q
#Jacobian final
def jacobian(h):
return q
q
Hf = diff(q,0])
Hf
#Hessianf
def Hessianf(h):
return Hf
Hf
from scipy.optimize import Bounds
bounds = Bounds(-1,1)
h0 = (0*C[0,1])
res = minimize(function,h0,method='trust-constr',jac=jacobian,hess=Hessianf,options={'verbose': 1},bounds=bounds)
错误信息: -------------------------------------------------- -------------------------
TypeError Traceback (most recent call last)
<ipython-input-41-94c28f7f32b2> in <module>
----> 1 res = minimize(function,2
3 options={'verbose': 1},bounds=bounds)
~\anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
626 constraints,callback=callback,**options)
627 elif meth == 'trust-constr':
--> 628 return _minimize_trustregion_constr(fun,629 bounds,630 callback=callback,**options)
~\anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in _minimize_trustregion_constr(fun,grad,xtol,gtol,barrier_tol,sparse_jacobian,maxiter,verbose,finite_diff_rel_step,initial_constr_penalty,initial_tr_radius,initial_barrier_parameter,initial_barrier_tolerance,factorization_method,disp)
507
508 elif method == 'tr_interior_point':
--> 509 _,result = tr_interior_point(
510 objective.fun,objective.grad,lagrangian_hess,511 n_vars,canonical.n_ineq,canonical.n_eq,~\anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py in tr_interior_point(fun,lagr_hess,n_vars,n_ineq,n_eq,constr,fun0,grad0,constr_ineq0,jac_ineq0,constr_eq0,jac_eq0,stop_criteria,enforce_feasibility,state,initial_tolerance,initial_penalty,initial_trust_radius,factorization_method)
319 while True:
320 # Solve SQP subproblem
--> 321 z,state = equality_constrained_sqp(
322 subprob.function_and_constraints,323 subprob.gradient_and_jacobian,~\anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\equality_constrained_sqp.py in equality_constrained_sqp(fun_and_constr,grad_and_jac,constr0,jac0,trust_lb,trust_ub,scaling)
80 Z,LS,Y = projections(A,factorization_method)
81 # Compute least-square lagrange multipliers
---> 82 v = -LS.dot(c)
83 # Compute Hessian
84 H = lagr_hess(x,v)
~\anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in dot(self,x)
416
417 if x.ndim == 1 or x.ndim == 2 and x.shape[1] == 1:
--> 418 return self.matvec(x)
419 elif x.ndim == 2:
420 return self.matmat(x)
~\anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in matvec(self,x)
230 raise ValueError('dimension mismatch')
231
--> 232 y = self._matvec(x)
233
234 if isinstance(x,np.matrix):
~\anaconda3\lib\site-packages\scipy\sparse\linalg\interface.py in _matvec(self,x)
528
529 def _matvec(self,x):
--> 530 return self.__matvec_impl(x)
531
532 def _rmatvec(self,x):
~\anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\projections.py in least_squares(x)
151 # lu_sol = [aux]
152 # [ z ]
--> 153 lu_sol = solve(v)
154 # return z = inv(A A.T) A x
155 return lu_sol[n:m+n]
TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'
我只想计算沿 2 变量函数 f(c00,c01) 的 c00 轴的最小值,并有一些界限。因此,我应该得到值 c00 作为 C01 的函数(这里 c01 是一个参数)。我认为问题来自与 scipy.optimize 相关的 sympy 函数。
提前致谢。
解决方法
符号 sympy
与数字 scipy
和 numpy
不能很好地混合。数字函数不理解 sympy
的符号。
为了让事情一起工作,所有符号函数都需要转换为 numpy 等价物。 sympy
的 lambdify
可以将 sympy 表达式转换为 numpy 函数。在您的代码中,您可以按如下方式使用它:
np_function = sp.lambdify(h,function(h))
np_jacobian = sp.lambdify(h,jacobian(h))
np_hessian = sp.lambdify(h,Hessianf(h))
res = minimize(np_function,h0,method='trust-constr',jac=np_jacobian,hess=np_hessian,options={'verbose': 1},bounds=bounds)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。