python - Gekko 求解器不提供任何解决方案
问题描述
我正在尝试使用优化来解决天线匹配问题,我想最小化生成的匹配阻抗的相位(通过 pi 匹配网络),受制于 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)
和导出的方程:
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))))
这种优化我的 pi 匹配网络中的组件值以最大化匹配(最小化相位)同时实现高 Q 值的方法是否错误?
解决方案
我无法验证您的方程式,但可以对问题特征提供一些见解。看来您的问题是非常非线性的。由于边界不同,内点算法可能会采取不同的路线。这是您的解决方案的等高线图,其中 x2=1000 将其减少到仅 x3 和 x4 作为变量。
黑线是目标函数,不等式约束 (>10),蓝线是等式约束 (=50)。分母中的变量可能会变小(接近零)。有时它有助于将分母项乘以等式的另一边,例如x/y==50
to 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()
推荐阅读
- gitlab - 无法在 Gitlab Wiki 中使用 img 标签从 Google 存储中插入经过身份验证的 URL 的图像
- javascript - 将数组和对象添加到数组反应钩子
- php - $_SESSION 变量在本地主机上工作并且在现场失败
- compiler-construction - 使用没有解析器模块的 ocamllex 构建词法分析器
- splunk - 如果没有更改任何输入,Splunk 提交按钮 (submitButton) 不会刷新仪表板
- go - 在 Go 中如何向无缓冲通道写入/读取多个值?
- c# - 如何用 NAudio 处理输入的音频信号并实时播放?(C#WPF.NET)
- typescript - 可以接受两个对象或一个合并对象的重载函数
- flutter - 扑动中的firestore和rtc引擎问题
- r - 使用 ggplot 比较 2 个分布