为什么以下代码返回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.
答案 0 :(得分:2)
此处的基本问题是您的函数f
不符合fsolve
工作所需的条件。这些标准被描述为in the documentation - 尽管可能不是很清楚。
您需要注意的具体事项是:
x
的值是解决f(x, *args) = 0
。f
的输出必须与x
f
输入的形状相同。 目前,您的函数需要tuple
1x3-arrays
的{{1}}成员(p
)和固定的标量偏移(a
中)。它返回3个成员tuple
类型(scalar
,3x3 array
,1x3 array
)
如您所见,条件1和2均未得到满足。
如果没有完全确定您要解决的等式,很难建议您如何解决这个问题。您似乎正尝试使用f(x,y,a) = 0
和x
以及y
作为固定值来解决x0 = (1,1,1)
和y0 = (1,1,1)
的某个特定等式a = 9
。 可能 可以通过传入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 hybrd documentation,则可以更清楚地说明输入和输出向量的条件。请参阅下面的相关部分(为了清楚起见,我已经删除了一些东西 - 用......表示 - 并添加了注释以表明输入和输出必须是相同的形状 - 用< - 表示)
1目的。
HYBRD的目的是找到一个N非系统的零 通过修改Powell在N个变量中的线性函数 混合方法。用户必须提供一个计算的子程序 lates这些功能。然后通过以下方式计算雅可比行列式 区差近似。
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包含 解决方案向量的最终估计。