[英]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.