首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非线性寻根到多目标优化

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

Stack Overflow用户
提问于 2020-08-07 00:10:11
回答 1查看 297关注 0票数 0

为了简化,假设我可以用

变量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.optimize's fsolve这样的非线性寻根器是不成功的,它可以将参数作为变量输入并试图找到根,但是将变量和参数增加一个数量级,就像在我的实际系统中一样,这些约束变得很难被尊重。

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

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

描述我的系统的所有方程都具有同等的有效性,所以我不认为我可以简单地选择一个或几个方程作为目标函数,其余的作为约束。看起来我需要把所有的方程作为目标函数。

因此,我有两个问题:

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

我看过cyipoptcasadipyomoDEAP,但我有点迷路了。我认为,一旦我的系统模型得到了更好的定义,我将确切地知道该寻找什么。但是,如果可以为我的简单示例提供代码,我将非常感激。

P.S:我现在的模型有11个变量和11个5个参数(5个系数代表每个变量的4次多项式)。如果有必要,我还可以在优化包中向变量添加约束。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-13 23:41:11

用方程式:

代码语言:javascript
复制
e1 = x1**2 * p1 + x1**2 * p2 + x2
e2 = x2**2 * p2 + x1 * p1

可以将方程组解为硬约束(相等形式):

代码语言:javascript
复制
m.Equation(e1==0)
m.Equation(e2==0)

或作为软约束(最小化目标):

代码语言:javascript
复制
m.Minimize(e1**2)
m.Minimize(e2**2)

这种方法适用于Pyomo、CasADi和Gekko。下面是一个使用这两种方法的盖科示例:

代码语言:javascript
复制
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降到零。有时,两者兼而有之,可以帮助解决者找到解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63293425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档