繁体   English   中英

从非线性寻根到多目标优化

[英]Going from non-linear root-finding to multi-objective optimization

为了简化,假设我可以描述一个系统

变量x1x2

参数p1p2 ,以及

约束f(x, p) = 0g(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

现在,假设给定参数p1p2的真实值,根存在。 但是,在我的情况下,参数的确定方式并不完美,并且像scipy.optimizefsolve这样的非线性根查找器是不成功的。 可以将参数作为变量输入并尝试找到根,但是将变量和参数增加一个数量级,就像在我的实际系统中一样,并且约束变得非常难以遵守。

因此,我一直在研究 python 中的优化包,它可以“解决”我的非线性方程组。 这就是我对优化缺乏理解的障碍。

如果我理解正确,假设我的方程是约束,这意味着必须尊重它们才能使我的设计成功。 但是,我已经意识到,鉴于参数(或大量可能的变量)的不完美性,我需要一个(或多个)目标函数来最小化而不是约束。

描述我的系统的所有方程都具有相同的有效性,所以我认为我不能简单地选择一个或几个方程作为目标函数,并且 rest 仍然作为约束。 看起来我需要将所有方程作为目标函数。

因此,我有两个问题:

  1. 我的逻辑是让我的所有方程都作为目标函数有效吗?
  2. 什么 python package 可以让我最小化这些目标函数?

我看过cyipoptcasadipyomoDEAP ,但我有点迷茫。 我认为一旦我的系统的 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)

在这种情况下,通过使用一个或另一个(或两者),解决方案是相同的。 如果是大规模优化问题,求解器可能无法通过软约束将e1e2减少为零。 有时同时包含两者可以帮助求解器找到解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM