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