[英]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.