Python fsolve ValueError

时间:2015-03-03 09:47:32

标签: python scipy

为什么以下代码返回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.

1 个答案:

答案 0 :(得分:2)

此处的基本问题是您的函数f不符合fsolve工作所需的条件。这些标准被描述为in the documentation - 尽管可能不是很清楚。

您需要注意的具体事项是:

  1. 要解决的函数的输入必须是n维向量(在文档中称为 ndarray ),这样你想要的x的值是解决f(x, *args) = 0
  2. f的输出必须与x f输入的形状相同。
  3. 目前,您的函数需要tuple 1x3-arrays的{​​{1}}成员(p)和固定的标量偏移(a中)。它返回3个成员tuple类型(scalar3x3 array1x3 array

    如您所见,条件1和2均未得到满足。

    如果没有完全确定您要解决的等式,很难建议您如何解决这个问题。您似乎正尝试使用f(x,y,a) = 0x以及y作为固定值来解决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非系统的零      通过修改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包含        解决方案向量的最终估计。