【发布时间】:2022-01-27 11:45:55
【问题描述】:
我正在尝试使用 Nlopt 来解决 Python 中的优化问题。我为自己设置了一个基本示例,作为掌握如何浏览库的方法。我已经建立了如下所示的 3 个简单的联立方程,并将它们转换为矩阵形式。我现在正在努力弄清楚为什么 Nlopt 对我给它的东西不满意。
#testing nlopt
import nlopt
import numpy as np
from numpy import array as array
# create 3 simple simultaenous equations
#4x - 3y + z = -10 (1)
#2x + y + 3z = 0 (2)
#-x + 2y -5z = 17 (3)
# sol: x = 1, y = 4, z = -2
constraint_matrix = []
constraint_rhs = []
# eq 1
constraint_matrix.append([4,-3,1])
constraint_rhs.append(-10)
# eq 2
constraint_matrix.append([2,1,3])
constraint_rhs.append(0)
# eq 3
constraint_matrix.append([-1,2,-5])
constraint_rhs.append(17)
A = array(constraint_matrix)
b = np.reshape(array(constraint_rhs), (-1,))
#Ax = b represents the above equations
print(A)
print(b)
ncontrols = A.shape[1]
opt = nlopt.opt(nlopt.LD_SLSQP,ncontrols)
#defining a general function for the above
def my_fn(x):
print('test')
print(A)
print(b)
val = (A*x) - b
return val
opt.set_min_objective(my_fn)
x0 = array([6,2,-5])
xopt = opt.optimize(x0)
opt_val = opt.last_optimum_value()
result = opt.last_optimize_result()
print('end')
上面我得到以下错误:
File "C:\Users\sm\Anaconda3\lib\site-packages\nlopt.py", line 335, in optimize
return _nlopt.opt_optimize(self, *args)
TypeError: my_fn() takes 1 positional argument but 2 were given
我还试图弄清楚我实际上是如何将 A 和 b 传递给 my_fn 的,但无济于事。我尝试简单地将 A 和 b 添加为函数的参数,并执行 opt.optimize([x0,A,b]) ,但没有成功。 Nlopt 不能处理矩阵,我是否需要以某种方式将其分解为 3 个单独的等式约束?
任何帮助将不胜感激
干杯
【问题讨论】:
-
请edit您的问题包含整个错误消息。
标签: python numpy optimization nlopt