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