摘要:本文主要介紹軟體安裝、參考論文,以及第一個模塊——參數計算模塊。

準備工作

在開始之前,請確保裝了以下軟體或資源(括弧中是我個人推薦版本或配置,若安裝有困難,請自行搜索相關教程):

  • Python3.x,必裝推薦直接安裝Anaconda,融合了常用Python模塊的開源軟體,可免去自行下載各種包的麻煩

Home - Anaconda?

www.anaconda.com圖標

  • HFSS,必裝我使用的是ANSYS Electronics Desktop19.0,如果使用其他版本的話,代碼可能會有出入,但問題不大,稍作修改即可

Electromagnetic Simulation Products | ANSYS?

www.ansys.com圖標

  • IDE,可選IDE即編程環境,我用的是Pycharm,個人比較喜歡,免費社區版即可

https://www.jetbrains.com/pycharm/?

www.jetbrains.com

  • Python包,必裝除了打包用的cx-Freeze,沒什麼特殊的包,基本都是Python自帶,如果後續運行報錯提示缺xxx module的話,在windows命令行中輸入pip install xxx,xxx為缺的包,即可


理論部分

本文理論部分比較簡單直觀,只需要簡單提一下。首先,參考論文鏈接如下:

https://pan.baidu.com/s/1iggiF1ijjnuG3pBdDFrp8Q?

pan.baidu.com

文章發表於2002年IEEE Antennas and Propagation Magazine,收錄於Antenna Designers Notebooks欄目(順便提一句,該欄目我一直很喜歡,經常介紹一些偏實際工程使用的文章,內容也很靠譜)。文章主要介紹了給定E面和H面的波束寬度,如何設計角錐喇叭,使得在滿足該波束寬度要求的前提下,最大化天線的方向性係數(或增益)。

文中並沒有羅列大量理論公式,因為這部分早已研究透徹,而是選用了一種為廣大工程師喜聞樂見的方法:參數擬合,並給出了詳盡的參數列表,從而得到了快速、方便的查表式設計公式,並給出了一些實際算例來證明理論的可靠性。

理論部分大體就是這樣,當然,有興趣的同志可以認真看一下論文和參考文獻,大部分理論公式均可於Balanis那本「天線聖經」中找到更為詳細的推導(參見原書第13.2章節),此處不再贅述。


編寫參數計算模塊

從最簡單的模塊入手,首先編寫參數計算模塊,該模塊要實現參考文獻的內容,即給出設計參數,返回喇叭天線的尺寸,從程序角度來看,其輸入和輸出如下:

輸入:設計頻點f0,E面波束寬度HPE,H面波束寬度HPE,波導寬邊a,波導窄邊b。

輸出:喇叭寬邊A,喇叭窄邊B,喇叭長L。

顯然,對於這種輸入輸出很單一的功能,寫一個函數來實現是最為合適的,也方便後續為其他模塊所調用。

代碼如下:

import math

#constant
t0, s0, a0, a1, a2 = 0.375, 0.25, 0.2974, 7.0401, -37.5383
c00,c01,c10, c11, c12, c13, c14, c15 = 44.8365, 4.3374, -8.1501, -2.9183, 8.4217, -13.2623, 10.6702, -3.4713
ah, bh, ch, dh, eh, fh, gh, hh, ih = 0.3534, -5.9711, -1.5379, 13.4735, 2.4359, -13.3102, -1.6386, 4.7981, 0.6333
ae, be, ce, de, ee, fe, ge, he = 0.1962, -11.3448, -1.9135, 4.78, 5.7284, -47.9711, -4.8935, -6.4175
d0, d1, d2, d3, d4, d5, d6, d7, d8 =
0.1020, 2.9658e-2, -2.4894e-3, -2.0962e-2, 6.3028e-4, -5.9327e-6, -0.6802, -4.4039e-2, 1.0213e-3
f00, f01, f10, f11, f12, f13, f14, f15 = 44.3672, -4.098, -8.0775, -4.2683, 14.5647, -26.1244, 23.9791, -8.7301

def calc(freq, HPE, HPH, a, b):
lam = 300 / freq
k = HPH / HPE

if k < 1:
t = t0
c0 = c00 + c01*math.log(k)
c1 = c10 + c11*k + c12*k**2 + c13*k**3 + c14*k**4 + c15*k**5
D = c0 + c1 * math.log(HPH)
s = (a0 + a1 / k**2 + a2 / D) ** (-1)

A = 0.5 * math.sqrt(
(ah + ch*t**2 + eh*t**4 + gh*t**6 + ih*t**8) / (1 + bh*t**2 + dh*t**4 + fh*t**6 + hh*t**8)) *
lam * math.cos(HPH*math.pi/720) / math.tan(HPH*math.pi/720)

B = 0.5 * math.sqrt(
(ae + ce*s**2 + ee*s**4 + ge*s**6) / (1 + be*s**2 + de*s**4 + fe*s**6 + he*s**8)) *
lam * math.cos(HPE*math.pi/720) / math.tan(HPE*math.pi/720)

R = A * (A - a) / (8 * lam * t)

else:
s = s0
f0 = f00 + f01 * math.log(k)
f1 = f10 + f11 / k + f12 / k**2 + f13 / k**3 + f14 / k**4 + f15 / k**5
D = f0 + f1 * math.log(HPE)
t = (d0 + d1*k + d2*k**2 + d3*D + d4*D**2 + d5*D**3) / (1 + d6*k + d7*D + d8*D**2)

A = 0.5 * math.sqrt(
(ah + ch * t ** 2 + eh * t ** 4 + gh * t ** 6 + ih * t ** 8) / (
1 + bh * t ** 2 + dh * t ** 4 + fh * t ** 6 + hh * t ** 8)) *
lam * math.cos(HPH * math.pi / 360) / math.tan(HPH * math.pi / 720)

B = 0.5 * math.sqrt(
(ae + ce * s ** 2 + ee * s ** 4 + ge * s ** 6) / (
1 + be * s ** 2 + de * s ** 4 + fe * s ** 6 + he * s ** 8)) *
lam * math.cos(HPE * math.pi / 360) / math.tan(HPE * math.pi / 720)

R = A * (B - b) / (8 * lam * s)

return round(A, 2), round(B, 2), round(R, 2)

if __name__ == __main__:
_A, _B, _R = calc(freq=10, HPE=30, HPH=20, a=47.55, b=22.15)
print(_A, _B, _R)

結尾部分做簡單的測試,並和論文中的算例結果比較(Table7.a),以證明代碼無誤。

這個過程幾乎是將論文的參數和公式直接「翻譯」到程序裏,沒有太多可講的,但針對對於Python語法不太熟悉的讀者,我提煉出了以下幾點幫助理解:

  1. Python對每一行前面的空格有嚴格要求,不可為了好看隨意增減,否則出錯;
  2. 和Matlab一樣,Python對於變數無需先定義再使用,如先int a、float b等,而是直接使用即可,因而代碼會比大部分語言更「自然」一些;
  3. 與Matlab不同的是,Python並非專門針對科學計算和工程計算而設計,故基本運算只有四則(+-)、平方(*)等,複雜點的數學符號,如log、sin、cos等,則依賴於其他包(module),故而在代碼開頭要寫一句import math,並在中間調用時使用math.xxx格式,需要說明的是,如果將開頭一句改為:from math import *,則可不必使用math.xxx而直接輸入運算符xxx,但編程教科書說最好別這樣
  4. 用round(A,2)輸出小數點後兩位格式。
  5. 代碼最後的if __name__ == __main__: 部分比較有Python特色,其作用可簡單理解為供測試使用。因本部分代碼是為了被其他模塊調用,這句話的意思就是說被調用時不執行後面內容,因此冒號後面可以方便、隨意地寫調試代碼,而不用擔心影響調用它的程序;
  6. 與Matlab相比不便的地方是,Python並不會保存並顯示中間變數,調試起來諸多不便,辦法一是用print語句將變數「列印」出來;方法二是在IDE中設置斷點,如下圖所示(以pycharm舉例):


小結

到此為止,核心功能其實已經完成,但為了把工作做得更漂亮,還需要做很多工作。本篇介紹即到此結束,下一部分將會講到波導查值模塊和主調用模塊,謝謝各位觀看(*^_^*)!


推薦閱讀:
相關文章