2017-08-04 94 views
0

我想盡量減少使用scipy.optimize函數。這是我的程序,最後一行是錯誤消息。如何將符號變量轉換爲可迭代變量?

import sympy as s 
from scipy.optimize import minimize 
x,y,z=s.symbols('x y z') 
f= lambda z: x**2-y**2 
bnds = ((70,None),(4,6)) 
res = minimize(lambda z: fun(*x),(70,4), bounds=bnds) 



<lambda>() argument after * must be an iterable, not Symbol 

如何將符號轉換爲可迭代或直接定義迭代?

回答

1

在Python中,用f(*x)調用函數意味着f(x[0], x[1], ...)。也就是說,預計x一個元組(或其他可迭代),以及函數應該有像

def f(*args): 
    <use args tuple> 

的定義,我不太清楚你正在嘗試與sympy代碼做,或者你爲什麼使用它而不是直接在Python/numpy中定義函數。

的函數,如:

def f(z): 
    x,y = z # expand it to 2 variables 
    return x**2 - y**2 

應以儘量減少通話與工作:

minimize(f, (10,3)) 

這將改變xy開始(10,3)尋求減少f值。

In [20]: minimize(f, (70,4), bounds=((70,None),(4,6))) 
Out[20]: 
     fun: 4864.0 
hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64> 
     jac: array([ 139.99988369, -11.99996404]) 
    message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL' 
    nfev: 9 
     nit: 1 
    status: 0 
    success: True 
     x: array([ 70., 6.]) 
+0

消息:b'CONVERGENCE:NORM_OF_PROJECTED_GRADIENT _ <= _ PGTOL'是什麼意思? – Shareef