为什么以下代码返回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),这样您想要的x
值就是f(x, *args) = 0
的解决方案。f
的输出必须与x
的f
输入相同。
当前,您的函数采用tuple
的2个成员1x3-arrays
(在p
中)和固定的标量偏移量(在a
中)。它返回类型为(tuple
,scalar
,3x3 array
)的3个成员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
)将被视为固定值,并且不会在优化过程中发生变化或在任何解决方案中返回。
对于那些喜欢完整故事的人请注意...
As the docs say:
fsolve
是MINPACK的hybrd和hybrj算法的包装。
如果我们查看MINPACK hybrd documentation,则会更清楚地说明输入和输出向量的条件。请参阅下面的相关位(为了清楚起见,我已经删掉了一些内容-用...表示,并添加了注释以显示输入和输出必须具有相同的形状-用
1。目的。
HYBRD的目的是找到N个非-N系统的零
通过修改Powell在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上包含
解向量的最终估计。
关于python - Python fsolve ValueError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28828578/