簡體   English   中英

Python fsolve ValueError

[英]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所需的條件。 這些標准在文檔中進行了描述-盡管可以說不是很清楚。

您需要注意的特定事項是:

  1. 要解決的函數的輸入必須是n維向量(在文檔中稱為ndarray ),這樣您想要的x的值就是f(x, *args) = 0
  2. 的輸出f必須是相同的形狀x輸入到f

當前,您的函數采用1x3-arrays的2個成員tuple (在p )和一個固定的標量偏移量(在a )。 它返回一個3成員類型的tuplescalar3x3 array1x3 array

如您所見,條件1和2都不滿足。

在不完全確定要解決的方程式的情況下,很難就如何解決此問題提供建議。 似乎您正在嘗試用x0 = (1,1,1)y0 = (1,1,1)a = 9作為a來求解xy某些特定方程f(x,y,a) = 0固定值。 可能可以通過傳遞xy串聯來實現此目的(例如,傳遞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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM