为了简化,假设我可以用
变量x1和x2,
参数p1和p2,以及
约束f(x, p) = 0和g(x, p) = 0
例如:
f(x1, x2, p1, p2) = x1^2 * p1 + x1^2 * p2 + x2 = 0
g(x1, x2, p1, p2) = x2^2 * p2 + x1 * p1 = 0
现在,假设给定参数p1和p2的真实值,根就存在。然而,在我的例子中,参数的确定是不完美的,像scipy.optimize's fsolve这样的非线性寻根器是不成功的,它可以将参数作为变量输入并试图找到根,但是将变量和参数增加一个数量级,就像在我的实际系统中一样,这些约束变得很难被尊重。
因此,我一直在研究python中的优化包,这些包可以“解决”我的一组非线性方程组。这也是我对优化缺乏理解的地方。
如果我正确地理解了,正如所假设的,我的方程是约束,这意味着它们必须得到尊重,我的设计才能成功。但是,我已经意识到,由于参数的不完美性(或大量可能的变量),我需要有一个(或几个)目标函数来最小化,而不是约束。
描述我的系统的所有方程都具有同等的有效性,所以我不认为我可以简单地选择一个或几个方程作为目标函数,其余的作为约束。看起来我需要把所有的方程作为目标函数。
因此,我有两个问题:
我看过cyipopt、casadi、pyomo和DEAP,但我有点迷路了。我认为,一旦我的系统模型得到了更好的定义,我将确切地知道该寻找什么。但是,如果可以为我的简单示例提供代码,我将非常感激。
P.S:我现在的模型有11个变量和11个5个参数(5个系数代表每个变量的4次多项式)。如果有必要,我还可以在优化包中向变量添加约束。
发布于 2022-07-13 23:41:11
用方程式:
e1 = x1**2 * p1 + x1**2 * p2 + x2
e2 = x2**2 * p2 + x1 * p1可以将方程组解为硬约束(相等形式):
m.Equation(e1==0)
m.Equation(e2==0)或作为软约束(最小化目标):
m.Minimize(e1**2)
m.Minimize(e2**2)这种方法适用于Pyomo、CasADi和Gekko。下面是一个使用这两种方法的盖科示例:
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Array(m.Var,2,value=2)
x1,x2 = x
p = m.Array(m.Param,2,value=1)
p1,p2 = p
e1 = x1**2 * p1 + x1**2 * p2 + x2
e2 = x2**2 * p2 + x1 * p1
# approach #1
m.Equation(e1==0)
m.Equation(e2==0)
# approach #2
m.Minimize(e1**2)
m.Minimize(e2**2)
m.options.SOLVER=1
m.solve()
print('x: ', x)
print('Objective: ',m.options.OBJFCNVAL)在这种情况下,通过使用其中一个或另一个(或两者),解决方案是相同的。如果这是一个大规模的优化问题,求解器可能不会在软约束下将e1或e2降到零。有时,两者兼而有之,可以帮助解决者找到解决方案。
https://stackoverflow.com/questions/63293425
复制相似问题