【问题标题】:Scipy Root Finding non square matrixScipy Root 查找非方阵
【发布时间】:2014-12-26 05:38:24
【问题描述】:

为什么不能在一个 scipy 优化函数中插入非方阵? (我的意思是函数 F 的行数多于变量)

def F(x):
    L = numpy.zeros(13)
    L[0] = x[0]*x[0] - x[0]
    L[1] = x[1]*x[1] - x[1]
    L[2] = x[2]*x[2] - x[2]
    L[3] = x[3]*x[3] - x[3]
    L[4] = x[4]*x[4] - x[4]
    L[5] = x[5]*x[5] - x[5]
    L[6] = x[6]*x[6] - x[6]
    L[7] = x[7]*x[7] - x[7]

    L[8] = x[0]+x[1]+x[2]-2
    L[9] = x[5]+x[6]-x[7]-2
    L[10] = 3*x[0]+x[1]+x[2]-1
    L[11] = x[0]+x[4]+x[3]-2
    L[12] = x[3]-2*x[5]+x[7]-2
    return L

x = [1,1,1,1,1,1,1,1]


print x
print F(x)
y = scipy.optimize.root(F, x)

那我可以用什么代替呢?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    看来optimize.root 要求 F 采用形状为 (N,) 的数组并返回 形状 (N,) 的数组。

    其中一个例外是使用method='lm' 时。 The docs say,

    方法 lm 在最小二乘意义上求解非线性方程组 使用 Levenberg-Marquardt 算法的修改,如在 小背包 [R110]。

    跑步

    sol = optimize.root(F, x, method='lm')
    print(sol.x)
    print(sol.fun))
    

    产量

    [-0.25534031  1.00426132  1.00426132  1.26246697  0.99641747 -0.1852661
      1.32671248 -0.14183467]
    [ 0.32053899  0.00427948  0.00427948  0.33135589 -0.00356969  0.21958963
      0.43345353  0.16195174 -0.24681766 -0.71671895  0.24250171  0.00354414
     -0.50883549]
    

    所以虽然找到了“解决方案”,但它不是F 的根。 这是为什么?使用method='lm'optimize.root 返回一个 最小化 |F|^2 的解决方案。它与您使用optimize.minimize 找到的位置相同:

    def Fnorm(x):
        return (F(x)**2).sum()
    
    res = optimize.minimize(Fnorm, x)
    
    print(res['x'])
    # array([-0.25534014,  1.00426118,  1.00426118,  1.26246497,  0.99641833,
    #        -0.1852652 ,  1.32672144, -0.14182902])
    
    print(res['fun'])
    # 1.3672594815275587
    

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多