【问题标题】:Numpy arange error with Lagrange Multiplier in PythonPython中拉格朗日乘数的Numpy arange错误
【发布时间】:2017-01-13 12:45:46
【问题描述】:

我尝试使用拉格朗日乘数优化函数,并尝试循环遍历该函数以获取数字列表,但出现错误

ValueError: setting an array element with a sequence.    

这是我的代码,我哪里出错了?如果 n 不是数组,我可以正确得到结果

import numpy as np
from scipy.optimize import fsolve

n = np.arange(10000,100000,10000)

def func(X):
    x = X[0]
    y = X[1]
    L = X[2]
    return (x + y + L * (x**2 + y**2 - n))

def dfunc(X):
    dLambda = np.zeros(len(X))
    h = 1e-3
    for i in range(len(X)):
        dX = np.zeros(len(X))
        dX[i] = h
        dLambda[i] = (func(X+dX)-func(X-dX))/(2*h);
    return dLambda

X1 = fsolve(dfunc, [1, 1, 0])

print (X1)

非常感谢您的帮助,非常感谢您

【问题讨论】:

  • 能否给出出现此错误的行号?
  • 我不确定您要做什么,但您的表达式 (func(X+dX)-func(X-dX))/(2*h) 返回一个数组,您正尝试将其插入一维数组 dLambda
  • 错误在这一行 21, 在 X1 = fsolve(dfunc, [1, 1, 0])
  • @periphreal 最初,n 只是一个数字,所以我可以通过打印(X1)得到一个包含三个数字的数组,现在我试图将 n 更改为数字列表,但它没有工作

标签: python numpy optimization


【解决方案1】:

首先,检查 func = fsolve()

第二,print(func([1,1,0]))` - 结果不是数字([2 2 2 2 2 2 2 2 2]),因为“n”是列表。如果你想迭代 n 试试:

import numpy as np
from scipy.optimize import fsolve

n = np.arange(10000,100000,10000)

def func(X,n):
    x = X[0]
    y = X[1]
    L = X[2]
    return (x + y + L * (x**2 + y**2 - n))

def dfunc(X,n):
    dLambda = np.zeros(len(X))
    h = 1e-3
    r = 0
    for i in range(len(X)):
        dX = np.zeros(len(X))
        dX[i] = h
        dLambda[i] = (func(X+dX,n)-func(X-dX,n))/(2*h)
    return dLambda

for iter_n in n:
    print("for n = {0} dfunc = {1}".format(iter_n,dfunc([0.8,0.4,0.3],iter_n)))

【讨论】:

  • 你能解释一下为什么把 [0.8, 0.4 ,0.3] 放在那里吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多