[英]Python fsolve ValueError
為什么以下代碼返回ValueError?
from scipy.optimize import fsolve
import numpy as np
def f(p,a=0):
x,y = p
return (np.dot(x,y)-a,np.outer(x,y)-np.ones((3,3)),x+y-np.array([1,2,3]))
x,y = fsolve(f,(np.ones(3),np.ones(3)),9)
ValueError: setting an array element with a sequence.
這里的基本問題是您的函數f
不滿足fsolve
所需的條件。 這些標准在文檔中進行了描述-盡管可以說不是很清楚。
您需要注意的特定事項是:
x
的值就是f(x, *args) = 0
。 f
必須是相同的形狀的x
輸入到f
。 當前,您的函數采用1x3-arrays
的2個成員tuple
(在p
)和一個固定的標量偏移量(在a
)。 它返回一個3成員類型的tuple
( scalar
, 3x3 array
, 1x3 array
)
如您所見,條件1和2都不滿足。
在不完全確定要解決的方程式的情況下,很難就如何解決此問題提供建議。 似乎您正在嘗試用x0 = (1,1,1)
和y0 = (1,1,1)
且a = 9
作為a來求解x
和y
某些特定方程f(x,y,a) = 0
固定值。 您可能可以通過傳遞x
和y
串聯來實現此目的(例如,傳遞p0 = (1,1,1,1,1,1)
並在函數中使用x=p[:3]
和y = p[3:]
但是您必須修改函數以類似地輸出x和y並連接成6維向量。這取決於您要求解的確切函數,而我無法從現有f
(即基於點積,外部積和基於和的元組)。
需要注意的是不要在矢量傳遞參數(例如, a
在你的情況下),將被視為固定值,不會被改變作為優化的一部分,或者返回任何解決方案的一部分。
fsolve
是MINPACK的hybrd和hybrj算法的包裝。
如果我們查看MINPACK混合文檔 ,則輸入和輸出向量的條件會更清楚地說明。 請參閱下面的相關位(為了清楚起見,我已經刪掉了一些內容-用...表示,並添加了注釋以顯示輸入和輸出必須具有相同的形狀-用<-表示)
1。目的。
HYBRD的目的是通過修改Powell混合方法在N個變量中找到N個非線性函數系統的零點。 用戶必須提供一個計算功能的子程序。 然后通過前向差異近似來計算雅可比行列式。
2子例程和類型語句。
SUBROUTINE HYBRD(FCN,N,X, ...
...
FCN
是用戶提供的用於計算功能的子例程的名稱。 FCN必須在用戶調用程序的EXTERNAL語句中聲明,並且應編寫如下。SUBROUTINE FCN(N,X,FVEC,IFLAG) INTEGER N,IFLAG DOUBLE PRECISION X(N),FVEC(N) <-- input X is an array length N, so is output FVEC ---------- CALCULATE THE FUNCTIONS AT X AND RETURN THIS VECTOR IN FVEC. ---------- RETURN END
N
是設置為函數和變量數量的正整數輸入變量。
X
是長度N的數組。在輸入X上,必須包含解矢量的初始估計。 在輸出X上包含解向量的最終估計值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.