CST-Python實(shí)例教程四:仿真優(yōu)化
前言
在工程設(shè)計(jì)、求解計(jì)算的過(guò)程中,往往存在大量重復(fù)性的工作,這些工作不僅耗時(shí)耗力,而且容易出錯(cuò)。為了提高工作效率,減少人為錯(cuò)誤,我們希望這些重復(fù)性工作能夠被計(jì)算機(jī)自動(dòng)完成,從而讓工程師從繁重的重復(fù)性勞動(dòng)中解放出來(lái),將更多的精力投入到創(chuàng)造性的工作中。
CST Studio Suite(R) 提供了 Python 編程接口,也提供了在 Python 環(huán)境中執(zhí)行 VB 腳本的接口。并且,在 CST Studio Suite 2024 中,CST Python Libraries 的特性得到了更新。
廣州浦信系統(tǒng)技術(shù)有限公司發(fā)布的 CST Studio Suite(R) Python Automation and Scripting 系列文章,將會(huì)為您詳細(xì)介紹使用 Jupyter Notebook 連接到 CST Studio Suite 進(jìn)行腳本控制與自動(dòng)化仿真的方方面面。
現(xiàn)在,我們將使用 Jupyter Notebook 連接到 CST Studio Suite,通過(guò)一個(gè)演示案例,使用 Python 優(yōu)化模塊對(duì)該模型進(jìn)行優(yōu)化。
文章共分為5個(gè)部分,分別介紹以下內(nèi)容:
搭建 Python 環(huán)境
控制 CST 建模
仿真并繪制結(jié)果
仿真優(yōu)化
外部后處理
本期為第 4 篇文章,詳細(xì)介紹如何使用 Python 的優(yōu)化模塊控制 CST 進(jìn)行自動(dòng)優(yōu)化。
零、為什么需要使用 Python
CST Studio Suite 已經(jīng)擁有一套功能強(qiáng)大的優(yōu)化器,這不禁讓人思考:在這樣高速運(yùn)轉(zhuǎn)的機(jī)器面前,為何還需要借助 Python 的優(yōu)化功能?
首先,我們必須承認(rèn),CST Studio Suite 的優(yōu)化器已經(jīng)能夠解決大多數(shù)用戶在電磁場(chǎng)仿真和優(yōu)化方面的需求。然而,隨著智能化時(shí)代的到來(lái),我們面臨的工程挑戰(zhàn)也日益復(fù)雜。對(duì)于那些追求高度定制化優(yōu)化策略的用戶來(lái)說(shuō),單純依賴 CST Studio Suite 的內(nèi)置優(yōu)化器可能無(wú)法滿足他們的需求。
此外,隨著人工智能(AI)技術(shù)的飛速發(fā)展,AI 能夠處理的問(wèn)題范圍正在不斷擴(kuò)大。在許多情況下,AI 可以高效解決人工難以應(yīng)對(duì)的復(fù)雜問(wèn)題。而在 AI 領(lǐng)域,Python 無(wú)疑占據(jù)著主導(dǎo)地位。為了順應(yīng)這一趨勢(shì),將 CST Studio Suite 與 Python 結(jié)合使用,無(wú)疑是明智之舉。
CST Studio Suite 提供了 Python 接口,這意味著用戶可以將其與已有的優(yōu)化程序和/或算法相結(jié)合,為有自動(dòng)化需求的用戶提供更加靈活的解決方案。同時(shí),對(duì)于需要引入 AI 模型/技術(shù)來(lái)解決問(wèn)題的用戶,Python 接口為他們提供了極大的便利。
綜上所述,雖然 CST Studio Suite 的優(yōu)化器已經(jīng)非常強(qiáng)大,但通過(guò)與 Python 的結(jié)合,我們可以進(jìn)一步拓展其應(yīng)用范圍,應(yīng)對(duì)更加復(fù)雜的工程挑戰(zhàn)。這種協(xié)同進(jìn)化的方式,不僅能夠提升我們的工作效率,還能為復(fù)雜工程問(wèn)題研究和計(jì)算領(lǐng)域帶來(lái)更多的可能性。
一、準(zhǔn)備工作
在此前的文章中,我們分享了搭建 Python 測(cè)試環(huán)境的流程,并完成了建模、求解器設(shè)置、仿真、結(jié)果繪制等工作。
現(xiàn)在,我們嘗試使用 Python 命令定義相關(guān)的函數(shù),并控制 CST 進(jìn)行自動(dòng)優(yōu)化。
模型介紹
我們使用前面創(chuàng)建的 T 型波導(dǎo)進(jìn)行演示。在 T 形波導(dǎo)結(jié)構(gòu)中,中間的金屬結(jié)構(gòu)通常被稱為“探針”,它的作用主要是將能量從主波導(dǎo)耦合到分支波導(dǎo),或者從分支波導(dǎo)耦合到主波導(dǎo)。
改變探針的位置,能夠改變波導(dǎo)內(nèi)部的場(chǎng)分布。前面設(shè)置的offset
參數(shù)的作用就是修改探針的位置。優(yōu)化的過(guò)程即調(diào)整offset
參數(shù)的過(guò)程,使得仿真結(jié)果符合我們的期望。
路徑和參數(shù)設(shè)置
本案例基于此前的 Python 自動(dòng)化案例,文件名為CST_TEST.cst
,默認(rèn)的路徑為C:\Users\<Users>\AppData\Local\Temp
。
在開始優(yōu)化之前,需要加載所需的庫(kù),以及明確文件的路徑。
為了避免訪問(wèn)沖突,讓我們先關(guān)閉項(xiàng)目,并加載必要的庫(kù)。
關(guān)閉項(xiàng)目和窗口
#調(diào)用 CST Design Environmentproject = cst.interface.DesignEnvironment()#關(guān)閉項(xiàng)目和窗口mws_project.close()project.close()
安裝必要的 Python 庫(kù)
import timeimport numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import minimizeimport tempfiletmp = tempfile.gettempdir()%matplotlib notebook
安裝 CST Python 庫(kù)
import cstimport cst.interfaceimport cst.resultsprint(cst.__file__)# should print'<PATH_TO_CST_AMD64>\python_cst_libraries\cst\__init__.py'
二、Python函數(shù)
在這里,我們使用 Python 優(yōu)化模塊進(jìn)行參數(shù)優(yōu)化。優(yōu)化的核心過(guò)程完全基于 Python,CST Studio Suite 的優(yōu)化模塊并未參與本次計(jì)算。
在整個(gè)優(yōu)化的過(guò)程中,我們使用優(yōu)化函數(shù)
和控制函數(shù)
兩個(gè)函數(shù),通過(guò)優(yōu)化函數(shù)
多次調(diào)用控制函數(shù)
,調(diào)整offset
參數(shù)的值,盡可能降低S11@9GHz
,從而達(dá)到優(yōu)化的效果。
具體地,優(yōu)化函數(shù)我們選用scipy.optimize
庫(kù)中的minimize_scalar
函數(shù),控制函數(shù)我們定義一個(gè)runcst(x)
函數(shù),這兩個(gè)函數(shù)會(huì)在后面有詳細(xì)介紹。
優(yōu)化過(guò)程簡(jiǎn)介
為了便于理解,我們可以給本例中的各個(gè)相關(guān)的函數(shù)/模塊分別取個(gè)昵稱:
函數(shù)/模塊 | 昵稱稱謂 | 主要職責(zé) | 作用 |
---|---|---|---|
優(yōu)化函數(shù) | 熊大函數(shù) | 指揮 | 發(fā)起優(yōu)化流程,判定求解結(jié)果是否符合優(yōu)化期望,并傳遞新的offset 參數(shù)值給控制函數(shù)。 |
控制函數(shù) | 熊二函數(shù) | 落實(shí) | 傳遞offset 參數(shù)值給 CST,并控制 CST 求解器進(jìn)行運(yùn)算控制,提取求解結(jié)果并返回給優(yōu)化函數(shù)。 |
CST 求解器 | 幻獸帕魯 | 干活 | 進(jìn)行每一次offset 參數(shù)值的模型求解運(yùn)算,輸出求解結(jié)果。 |
各個(gè)相關(guān)的函數(shù)/模塊的運(yùn)行過(guò)程可以參考下圖:
優(yōu)化函數(shù)(熊大)
身居高位,負(fù)責(zé)布置任務(wù),以及判定仿真結(jié)果,并傳遞新的offset
參數(shù)值(布置新的任務(wù))。
控制函數(shù)(熊二)
承上啟下,負(fù)責(zé)分配任務(wù),控制一線的幻獸帕魯 CST 求解器按照上級(jí)領(lǐng)導(dǎo)優(yōu)化函數(shù)(熊大)布置的任務(wù)進(jìn)行仿真,并從仿真結(jié)果中提取所需的數(shù)據(jù)S11@9GHz
,返回給其上級(jí)領(lǐng)導(dǎo)優(yōu)化函數(shù)(熊大)。
在優(yōu)化的過(guò)程中,若熊大函數(shù)發(fā)現(xiàn)熊二函數(shù)計(jì)算輸出的結(jié)果符合期望(例如達(dá)到優(yōu)化目標(biāo)/限定值等),則指揮熊二暫停給幻獸帕魯分配計(jì)算任務(wù),落班!兩人可以一邊玩去了。
CST求解器(幻獸帕魯)
僅負(fù)責(zé)對(duì)具體參數(shù)的求解。在示意圖中我們能夠清晰地看到,優(yōu)化的核心過(guò)程完全基于 Python 環(huán)境中的熊大和熊二,CST Studio Suite 只有求解器參與了整個(gè)流程,并且只完成最后的數(shù)值計(jì)算工作。而 CST Studio Suite 的優(yōu)化模塊并未參與優(yōu)化決策的過(guò)程。
讓我們分別介紹 Python 環(huán)境下的這兩個(gè)函數(shù),先從控制函數(shù)
開始。
控制函數(shù)(熊二函數(shù))
在這里,我們先定義一個(gè)負(fù)責(zé)“干活”的控制函數(shù),用來(lái)調(diào)整offset
參數(shù)的值。
后續(xù)優(yōu)化函數(shù)將會(huì)調(diào)用控制函數(shù),并期望在優(yōu)化中返回當(dāng)前參數(shù)和結(jié)果值,完成整個(gè)優(yōu)化過(guò)程。
具體而言,控制函數(shù)(熊二)
負(fù)責(zé)分配來(lái)自上級(jí)函數(shù)(優(yōu)化函數(shù))的具體仿真任務(wù),控制一線的幻獸帕魯 CST 求解器按照上級(jí)領(lǐng)導(dǎo)優(yōu)化函數(shù)(熊大)布置的任務(wù)進(jìn)行仿真,并從仿真結(jié)果中提取所需的數(shù)據(jù)S11@9GHz
,返回給其上級(jí)領(lǐng)導(dǎo)優(yōu)化函數(shù)(熊大)。
定義控制函數(shù)
首先,讓我們打開一個(gè)新的設(shè)計(jì)環(huán)境。
project = cst.interface.DesignEnvironment()
隨后,定義控制函數(shù)runcst(x)
,參數(shù)x
是金屬探針的偏移量offset
。
我們將嘗試使用控制函數(shù)找到金探針的最佳位置,以盡量減少 9 GHz 時(shí)的反射。
def runcst(x): try: # 確保輸入的格式正確 y = float(x) except ValueError: # 如果輸入數(shù)據(jù)不能解釋為浮點(diǎn)數(shù),則輸出錯(cuò)誤提示 return nan raise ValueError("The expression entered in function runcst cannot be converted to a float...") else: # 如果輸入成功,則繼續(xù)執(zhí)行 print(f'parameter value: {y}') CST_file = project.open_project(tmp + r"\CST_TEST.cst")# 打開現(xiàn)有的CST項(xiàng)目 CST_file.model3d.StoreDoubleParameter("offset", y) # 將浮點(diǎn)數(shù)y存儲(chǔ)為參數(shù)offset CST_file.model3d.full_history_rebuild() # 加載到項(xiàng)目歷史,使得參數(shù)生效 CST_file.model3d.run_solver() # 運(yùn)行CST求解器 CST_file.save() # 保存項(xiàng)目文件并關(guān)閉 CST_file.close() result_project = cst.results.ProjectFile(tmp + r"\CST_TEST.cst")# 打開結(jié)果 s11 = result_project.get_3d().get_result_item(r"1D Results\S-Parameters\S1,1") ss = np.asarray([s11.get_xdata() , s11.get_ydata()]) return np.absolute(ss[1][np.searchsorted(ss[0][:], 9)])# 提取9GHz處的Abs(S11),并由函數(shù)返回
原則上,更有效的工作流程是保持項(xiàng)目一直打開,并簡(jiǎn)單更改參數(shù)值、更新歷史列表(如使用 full_history_rebuild()
)和分析結(jié)果。
但出于演示目的(突出每一次優(yōu)化流程),我們編寫的控制函數(shù)在運(yùn)行時(shí),將多次打開和關(guān)閉項(xiàng)目。
因此,調(diào)用該函數(shù)時(shí),除了第一次調(diào)用 Python 命令打開設(shè)計(jì)環(huán)境外,無(wú)需任何其他附加操作。
測(cè)試控制函數(shù)
為了測(cè)試控制函數(shù),讓我們使用新的offset
參數(shù)值運(yùn)行一次,運(yùn)行完畢后,程序輸出值是線性的Abs(S11)
。
runcst(2.3456789)
運(yùn)行完畢后,可以再次更改offset
參數(shù),并進(jìn)行多次測(cè)試。
runcst(1.14514)
runcst(2.33333)
運(yùn)行以下代碼,可以查看當(dāng)前參數(shù)值仿真結(jié)果的dB(Abs(S11)
頻率曲線。
result_project = cst.results.ProjectFile(tmp + r"\CST_TEST.cst")s11_orig = result_project.get_3d().get_result_item("1D Results\S-Parameters\S1,1")
%matplotlib inline plt.figure(figsize=(9,5))plt.plot(s11_orig.get_xdata(),20*np.log10(np.absolute(np.asarray(s11_orig.get_ydata()))))plt.title('S-Parameter MAG ')plt.ylabel('Mag in dB')plt.xlabel('Freq. in GHz')plt.grid(True)plt.ylim((-40,0))plt.xlim((8,10))
優(yōu)化函數(shù)(熊大函數(shù))
隨后,我們介紹負(fù)責(zé)“指揮”的優(yōu)化函數(shù),用來(lái)配合控制函數(shù)進(jìn)行優(yōu)化。
優(yōu)化函數(shù)(熊大)
身居高位,負(fù)責(zé)布置任務(wù),以及判定仿真結(jié)果。如果當(dāng)前結(jié)果不符合優(yōu)化要求,那么優(yōu)化函數(shù)將會(huì)傳遞新的offset
參數(shù)值(即布置新的任務(wù))。
在優(yōu)化的過(guò)程中,若熊大函數(shù)發(fā)現(xiàn)熊二函數(shù)計(jì)算輸出的結(jié)果符合期望(例如達(dá)到優(yōu)化目標(biāo)/限定值等),則指揮熊二暫停給幻獸帕魯分配計(jì)算任務(wù),落班!??!兩人可以一邊玩去了。
對(duì)于這個(gè)簡(jiǎn)單的優(yōu)化任務(wù),我們使用scipy.optimize
庫(kù)中的minimize_scalar
函數(shù)進(jìn)行參數(shù)優(yōu)化,配合上文的控制函數(shù),將S11@9GHz
盡可能降低。
優(yōu)化函數(shù)簡(jiǎn)介
SciPy
是一個(gè)用于科學(xué)計(jì)算的開源 Python 庫(kù),其中的scipy.optimize
模塊專門用于優(yōu)化算法和函數(shù),包括無(wú)約束和有約束的優(yōu)化問(wèn)題,以及局部和全局優(yōu)化算法。
模塊中的minimize_scalar
函數(shù)是一個(gè)用于尋找單變量無(wú)約束函數(shù)最小值的 Python 函數(shù),其特性符合我們的需求:將某一頻段內(nèi)的S11@9GHz
盡可能降低。
minimize_scalar
函數(shù)的基本用法非常簡(jiǎn)單,只需提供一個(gè)目標(biāo)函數(shù),然后該函數(shù)就會(huì)返回一個(gè)包含最優(yōu)解的OptimizeResult
對(duì)象,這個(gè)對(duì)象包含了最優(yōu)解的值、目標(biāo)函數(shù)在該點(diǎn)的值、優(yōu)化是否成功完成的信息等。
優(yōu)化函數(shù)參數(shù)介紹
進(jìn)行優(yōu)化時(shí),需要提供優(yōu)化函數(shù)的參數(shù),以下是部分參數(shù)的說(shuō)明:
runcst
-優(yōu)化對(duì)象的函數(shù)名,即前面定義的控制函數(shù)method
-優(yōu)化算法,這里選擇bounded
法,以定義優(yōu)化范圍的邊界bounds
-優(yōu)化區(qū)間,這里填寫我們要尋找的最佳offset
值,即(1.8,3.2)
這個(gè)區(qū)間
有關(guān)參數(shù)的進(jìn)一步解釋,可查閱scipy.optimize
庫(kù)的文檔。
三、執(zhí)行優(yōu)化
確定好優(yōu)化函數(shù)(熊大)
和控制函數(shù)(熊二)
后,我們即可開始使喚他們干活,完成參數(shù)優(yōu)化的工作。
運(yùn)行以下代碼,即可開始優(yōu)化:
from scipy.optimize import minimize_scalarfrom scipy.optimize import Boundsres = minimize_scalar(runcst, method='bounded', bounds=(1.8,3.2),options={'xatol': 1e-02, 'maxiter': 15, 'disp': 3})
程序運(yùn)行后,優(yōu)化函數(shù)
會(huì)多次調(diào)用控制函數(shù)
,從而控制 CST Studio Suite 求解器求解計(jì)算。類比熊大
使喚熊二
干活,熊二
使喚帕魯
干活……
優(yōu)化算法運(yùn)行時(shí),會(huì)調(diào)用 CST Studio Suite 多次打開項(xiàng)目求解,并返回每次求解的offset
和S11@9GHz
的值。
需要注意的是,優(yōu)化的核心過(guò)程完全基于 Python,CST 的優(yōu)化模塊并未參與本次計(jì)算。
四、查閱結(jié)果
優(yōu)化結(jié)束后,可以查閱優(yōu)化后的結(jié)果,以檢查熊大
和熊二
的工作質(zhì)量:
result_project = cst.results.ProjectFile(tmp + r"\CST_TEST.cst")s11 = result_project.get_3d().get_result_item("1D Results\S-Parameters\S1,1")
%matplotlib inlineplt.figure(figsize=(9,5))plt.plot(s11.get_xdata(),20*np.log10(np.absolute(np.asarray(s11.get_ydata()))),label='Optimized')plt.plot(s11_orig.get_xdata(),20*np.log10(np.absolute(np.asarray(s11_orig.get_ydata()))),label='Original')plt.title('S-Parameter MAG ')plt.ylabel('Mag in dB')plt.xlabel('Freq. in GHz')plt.legend(loc='lower right')plt.grid(True)plt.ylim((-45,-10))plt.xlim((8,10))
從結(jié)果可以看到,經(jīng)過(guò)本次簡(jiǎn)單優(yōu)化后,模型的 S 參數(shù)有所改善,反射系數(shù)S11
已經(jīng)低于 -30dB。
通過(guò)以上示例,可以看到簡(jiǎn)單的優(yōu)化目標(biāo)的優(yōu)化效果。
雖然 CST Studio Suite 的優(yōu)化器已經(jīng)非常強(qiáng)大,但通過(guò)與 Python 的結(jié)合,我們可以進(jìn)一步拓展其應(yīng)用范圍,應(yīng)對(duì)更加復(fù)雜的工程挑戰(zhàn)。如需定制更加復(fù)雜的優(yōu)化目標(biāo),可以根據(jù)工程需要修改對(duì)應(yīng)的控制函數(shù),或者使用更加適合的優(yōu)化函數(shù),也可以專門編寫對(duì)應(yīng)的優(yōu)化程序。
總結(jié)
將 CST Studio Suite 與 Python 結(jié)合使用,不僅能夠應(yīng)對(duì)復(fù)雜工程問(wèn)題,而且能引入 AI 參與到優(yōu)化工作中。
在整個(gè)計(jì)算過(guò)程中,使用
優(yōu)化函數(shù)
多次調(diào)用控制函數(shù)
,從而達(dá)到優(yōu)化offset
參數(shù)的效果。本案例為了演示,在腳本中控制打開和關(guān)閉項(xiàng)目,并輸出運(yùn)行結(jié)果,但更有效的工作流程是:保持項(xiàng)目打開,并簡(jiǎn)單更改參數(shù)值、更新歷史列表(如使用
full_history_rebuild()
)和分析結(jié)果。優(yōu)化的核心過(guò)程完全基于 Python,CST Studio Suite 的優(yōu)化模塊并未參與本次計(jì)算。