[英]Going from non-linear root-finding to multi-objective optimization
为了简化,假设我可以描述一个系统
变量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
的fsolve
这样的非线性根查找器是不成功的。 可以将参数作为变量输入并尝试找到根,但是将变量和参数增加一个数量级,就像在我的实际系统中一样,并且约束变得非常难以遵守。
因此,我一直在研究 python 中的优化包,它可以“解决”我的非线性方程组。 这就是我对优化缺乏理解的障碍。
如果我理解正确,假设我的方程是约束,这意味着必须尊重它们才能使我的设计成功。 但是,我已经意识到,鉴于参数(或大量可能的变量)的不完美性,我需要一个(或多个)目标函数来最小化而不是约束。
描述我的系统的所有方程都具有相同的有效性,所以我认为我不能简单地选择一个或几个方程作为目标函数,并且 rest 仍然作为约束。 看起来我需要将所有方程作为目标函数。
因此,我有两个问题:
我看过cyipopt
、 casadi
、 pyomo
和DEAP
,但我有点迷茫。 我认为一旦我的系统的 model 得到更好的定义,我就会确切地知道要寻找什么。 但是,如果可以提供我的简单示例的代码,我将不胜感激。
PS:我的 model 现在有 11 个变量和 11*5 个参数(五个系数代表每个变量的 4 次多项式)。 如果需要,我还可以在优化 package 中为变量添加约束。
使用方程:
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。 这是一个使用这两种方法的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
减少为零。 有时同时包含两者可以帮助求解器找到解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.