Python fsolve ValueError
Python fsolve ValueError
为什么以下代码 return 出现 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
工作所需的条件。描述了这些标准 in the documentation - 虽然可以说不是很清楚。
您需要注意的具体事项是:
- 要求解的函数的输入必须是 n 维向量(在文档中称为 ndarray),这样 [=14 的值=]你要的是
f(x, *args) = 0
. 的解法
f
的输出必须与 f
的 x
输入相同 shape。
目前,您的函数采用 1x3-arrays
的第 2 个成员 tuple
(在 p
中)和一个固定的标量偏移量(在 a
中)。它 returns 类型为 (scalar
,3x3 array
, 1x3 array
)
的 3 个成员 tuple
如您所见,条件 1 和条件 2 都不满足。
在不确定您要求解的方程式的情况下,很难就如何解决此问题给出确切的建议。您似乎正在尝试用 x0 = (1,1,1)
和 y0 = (1,1,1)
和 a = 9
作为固定值来求解 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
is a wrapper around MINPACK’s hybrd and hybrj algorithms.
如果我们看一下 MINPACK hybrd documentation,输入和输出向量的条件就更清楚了。请参阅下面的相关位(为了清楚起见,我删除了一些内容 - 用 ... 表示 - 并添加了注释以表明输入和输出必须具有相同的形状 - 用 <-- 表示)
1 Purpose.
The purpose of HYBRD is to find a zero of a system of N non-
linear functions in N variables by a modification of the Powell
hybrid method. The user must provide a subroutine which calcu-
lates the functions. The Jacobian is then calculated by a for-
ward-difference approximation.
2 Subroutine and type statements.
SUBROUTINE HYBRD(FCN,N,X, ...
...
FCN
is the name of the user-supplied subroutine which calculates
the functions. FCN must be declared in an EXTERNAL statement
in the user calling program, and should be written as follows.
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
is a positive integer input variable set to the number of
functions and variables.
X
is an array of length N. On input X must contain an initial
estimate of the solution vector. On output X contains the
final estimate of the solution vector.
为什么以下代码 return 出现 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
工作所需的条件。描述了这些标准 in the documentation - 虽然可以说不是很清楚。
您需要注意的具体事项是:
- 要求解的函数的输入必须是 n 维向量(在文档中称为 ndarray),这样 [=14 的值=]你要的是
f(x, *args) = 0
. 的解法
f
的输出必须与f
的x
输入相同 shape。
目前,您的函数采用 1x3-arrays
的第 2 个成员 tuple
(在 p
中)和一个固定的标量偏移量(在 a
中)。它 returns 类型为 (scalar
,3x3 array
, 1x3 array
)
tuple
如您所见,条件 1 和条件 2 都不满足。
在不确定您要求解的方程式的情况下,很难就如何解决此问题给出确切的建议。您似乎正在尝试用 x0 = (1,1,1)
和 y0 = (1,1,1)
和 a = 9
作为固定值来求解 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
is a wrapper around MINPACK’s hybrd and hybrj algorithms.
如果我们看一下 MINPACK hybrd documentation,输入和输出向量的条件就更清楚了。请参阅下面的相关位(为了清楚起见,我删除了一些内容 - 用 ... 表示 - 并添加了注释以表明输入和输出必须具有相同的形状 - 用 <-- 表示)
1 Purpose.
The purpose of HYBRD is to find a zero of a system of N non- linear functions in N variables by a modification of the Powell hybrid method. The user must provide a subroutine which calcu- lates the functions. The Jacobian is then calculated by a for- ward-difference approximation.
2 Subroutine and type statements.
SUBROUTINE HYBRD(FCN,N,X, ...
...
FCN
is the name of the user-supplied subroutine which calculates the functions. FCN must be declared in an EXTERNAL statement in the user calling program, and should be written as follows.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
is a positive integer input variable set to the number of functions and variables.
X
is an array of length N. On input X must contain an initial estimate of the solution vector. On output X contains the final estimate of the solution vector.