Решатель Gekko не предлагает решения

Я пытаюсь использовать оптимизацию для решения проблемы согласования антенн, когда я хочу минимизировать фазу результирующего согласованного импеданса (через схему согласования по пи) с учетом Q ›100 (например) и реального импеданса = 50.

Как ни странно, это дает решение только в том случае, если мои первоначальные предположения равны 50 для трех переменных. Кроме того, он находит решение, когда ограничение неравенства составляет ›10, но не› 1 ..... Я не понимаю этого, поскольку если оно ›10, оно больше 1 ....

Если я изменю верхнюю и нижнюю границы, это также повлияет на решатель. При lb = -1000 и ub = 1000 я получаю x2 = 1000, x3 = -125,57, x4 = 22,53. Но если я изменю нижнюю границу на -200, что по-прежнему должно допускать решение -125,57, решатель не сможет найти решение.

Возможно, я неправильно ставлю задачу оптимизации? Это моя постановка задачи: целевая функция: минимизировать мнимую часть Zin (для резонанса), ограничение неравенства: при условии Q ›ограничение на некоторое числовое равенство: и действительная часть Zin = 50

Вот простой скрипт на Python, который я написал:

from gekko import GEKKO
m = GEKKO()
x2,x3,x4, = m.Array(m.Var,3,lb=-1000,ub=1000)  # upper and lower bounds for unknowns
x2.value = 50; x3.value =50; x4.value =50; # initial guess

#equations
m.Equation((-9.84*x2**2*x4)/(96.786*(x2+x3)*(x2+x3+4)+(120.11*x3+x2*(120.11+x3))*(120.11*(x3+x4)+x2*(120.11+x3+x4)))  > 10) # inequality constraint
m.Equation((9.84*(x2**2)*(x4**2))/((9.84*(x2+x3+x4))**2+(120.11*(x2+x3+x4)+x2*(x3+x4))**2) ==50) #  equality constraint

#objective
m.Obj((x4*(96.79*(x2+x3)*(x2+x3+x4)+(120.109*x3+ x2*(120.11+x3))*(120.11*(x3+x4)+x2*(120.11+x3+x4))))/(96.9*(x2+x3+x4)**2+(120.11*(x3+x4)+x2*(120.11+x3+x4))**2))

#m.options.IMODE=3
m.options.SOLVER=3

#Solve
#m.solve(disp=False)
m.solve()
print('x2 =' ,x2.value,'x3 =',x3.value,'x4 =',x4.value)

Вот схема анализируемой цепи (jX1 == 0),  соответствующая сеть

и полученные уравнения:

ReZinpi=(R1 X2^2 X4^2)/(R1^2 (X2 + X3 + X4)^2 + ((X3 + X4) XL + X2 (X3 + X4 + XL))^2) 

   ImZinpi = (X4 (R1^2 (X2 + X3) (X2 + X3 + X4) + 
              (X3 XL + X2 (X3 + XL)) ((X3 + X4) XL + X2 (X3 + X4 + XL))))
             /(R1^2 (X2 + X3 + X4)^2 + ((X3 + X4) XL + X2 (X3 + X4 + XL))^2) 

   Qpi= -((R1 X2^2 X4)/(R1^2 (X2 + X3) (X2 + X3 + X4) + 
          (X3 XL +  X2 (X3 + XL)) ((X3 + X4) XL + X2 (X3 + X4 + XL))))

Неправильно ли этот подход к оптимизации значений компонентов в моей сети сопоставления Пи для максимального совпадения (минимизации фазы) при достижении высокого Q?


person jrive    schedule 09.10.2020    source источник


Ответы (1)


Я не могу проверить ваши уравнения, но могу дать некоторое представление о характеристиках проблемы. Похоже, ваша проблема очень нелинейная. алгоритм внутренней точки может выбрать другой маршрут из-за других границ. Вот контурный график вашего решения с x2 = 1000, чтобы уменьшить его до x3 и x4 в качестве переменных.

контурный график

Целевая функция, ограничение-неравенство (›10) показано черными линиями, а ограничение-равенство (= 50) показано синей линией. Переменные в знаменателе могут стать маленькими (приближаться к нулю). Иногда помогает умножить член знаменателя на другую часть уравнения, например с x/y==50 на x=y*50.

from gekko import GEKKO
m = GEKKO(remote=False)
# upper and lower bounds for unknowns
x2,x3,x4 = m.Array(m.Var,3,lb=-1000,ub=1000)
x2.value = 50; x3.value =50; x4.value =50; # initial guess

#equations
m.Equation((-9.84*x2**2*x4)/(96.786*(x2+x3)*(x2+x3+4)+\
            (120.11*x3+x2*(120.11+x3))*(120.11*(x3+x4)+\
            x2*(120.11+x3+x4)))  > 10) # inequality constraint
m.Equation((9.84*(x2**2)*(x4**2))/((9.84*(x2+x3+x4))**2+\
            (120.11*(x2+x3+x4)+x2*(x3+x4))**2) ==50) #  equality constraint

#objective
m.Minimize((x4*(96.79*(x2+x3)*(x2+x3+x4)+(120.109*x3+ \
            x2*(120.11+x3))*(120.11*(x3+x4)+x2*\
            (120.11+x3+x4))))/(96.9*(x2+x3+x4)**2+\
            (120.11*(x3+x4)+x2*(120.11+x3+x4))**2))

#m.options.IMODE=3
m.options.SOLVER=3

#Solve
#m.solve(disp=False)
m.solve()
print('x2 =' ,x2.value,'x3 =',x3.value,'x4 =',x4.value)

# solution
x2_opt = 1000.0
x3_opt = -125.57474673
x4_opt = 22.537916773

## Generate a contour plot
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Design variables at mesh points
x2 = x2_opt
x3 = np.arange(-150.0, -100.0, 0.2)
x4 = np.arange(10, 30, 0.1)
x3,x4 = np.meshgrid(x3, x4)

# Equations and Constraints
eq1 = (-9.84*x2**2*x4)/(96.786*(x2+x3)*(x2+x3+4)+\
        (120.11*x3+x2*(120.11+x3))*(120.11*(x3+x4)+x2*(120.11+x3+x4)))
eq2 = (9.84*(x2**2)*(x4**2))/((9.84*(x2+x3+x4))**2+\
        (120.11*(x2+x3+x4)+x2*(x3+x4))**2)
obj = (x4*(96.79*(x2+x3)*(x2+x3+x4)+(120.109*x3+ x2*(120.11+x3))*\
        (120.11*(x3+x4)+x2*(120.11+x3+x4))))/(96.9*(x2+x3+x4)**2+\
        (120.11*(x3+x4)+x2*(120.11+x3+x4))**2)

# Create a contour plot
# Visit https://matplotlib.org/examples/pylab_examples/contour_demo.html
#   for more examples and options for contour plots
plt.figure()
# Objective contours
CS = plt.contour(x3,x4,obj)
plt.clabel(CS, inline=1, fontsize=10)
# eq1>10
CS = plt.contour(x3,x4,eq1,[10.0,15.0,20.0],colors='k',linewidths=[2.0,0.5,0.5])
plt.clabel(CS, inline=1, fontsize=10)
# eq2=50
CS = plt.contour(x3,x4,eq2,[50],colors='b',linewidths=[4.0])
plt.clabel(CS, inline=1, fontsize=10)

plt.plot(x3_opt,x4_opt,'.',color='orange',markersize=15)
# Add some labels
plt.xlabel('x3')
plt.ylabel('x4')
# Save the figure as a PNG
plt.savefig('contour_plot.png')

# Show the plots
plt.show()
person John Hedengren    schedule 10.10.2020
comment
Я ценю ваш вклад! Полезно иметь возможность визуализировать то, что может происходить. Могу я спросить, как вы создали контурный сюжет? - person jrive; 12.10.2020
comment
Код в моем ответе. См. Проблему с двумя балками на странице apmonitor.com/me575 - person John Hedengren; 12.10.2020