簡體   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