为什么以下代码返回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的输出必须与xf输入相同。


当前,您的函数采用tuple的2个成员1x3-arrays(在p中)和固定的标量偏移量(在a中)。它返回类型为(tuplescalar3x3 array)的3个成员1x3 array

如您所见,条件1和2都不满足。

在不完全确定要解决的方程式的情况下,很难就如何解决此问题提供建议。似乎您正在尝试使用f(x,y,a) = 0xy作为固定值来求解x0 = (1,1,1)y0 = (1,1,1)的某些特定方程式a = 9。您可以通过传入串联的xy来做到这一点(例如,传入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/

10-14 01:08