寫在前面
寫開題報告, 想用個圖發現截出來全是糊的。索性自己畫了,主要實現的Matsuno(1966)的赤道波動頻散關系圖。但是,實在是沒有審美,其他文獻里都是黑色,這里非要用個紫色,因為紫色更有韻味。
之前想過把所有畫過的圖的代碼都整理一遍,想想工作量還是懶了。索性,從現在開始,再畫過的圖都放到一個jupyter文件里好了。
淺水波頻散關系圖
效果就是下面這個樣子,實現邏輯也很容易。得到四個淺水波解的頻散關系公式,進行繪圖就好。
相關關系式可以直接參考ncl中kf-filter函數的相關公式:
- https://github.com/yyr/ncl/blob/master/ni/src/contrib/kf_filter.ncl
我這里使用了無量綱的頻散形式,喂給gpt隨便給他幾個指令很快就實現了。
- 唯一比較麻煩的是MRG波,從負波數到正波數都有,需要仔細注意一下。kelvin波最簡單。
- 慣性重力波的頻散關系:
ω g ( k , n ) = k 2 + 2 n + 1 \omega_g(k, n) = \sqrt{k^2 + 2n + 1} ωg?(k,n)=k2+2n+1?
- Rossby波的頻散關系:
ω r ( k , n ) = ? k k 2 + 2 n + 1 \omega_r(k, n) = -\frac{k}{k^2 + 2n + 1} ωr?(k,n)=?k2+2n+1k?
- 混合Rossby-重力波的頻散關系:
ω M R G ( k ) = 1 2 ( k + k 2 + 4 ) \omega_{MRG}(k) = \frac{1}{2} \left(k + \sqrt{k^2 + 4}\right) ωMRG?(k)=21?(k+k2+4?)
python代碼
# -*- coding: utf-8 -*-
"""
Created on %(date)s@author: %(username)s@email : xianpuji@hhu.edu.cn
"""import matplotlib.pyplot as plt
import numpy as np# ================================================================================================
# Author: %(Jianpu)s | Affiliation: Hohai
# email : xianpuji@hhu.edu.cn
# =================================================================================================
# 定義各類波的頻散關系
def omega_gravity(k, n):return np.sqrt(k**2 + 2 * n + 1)def omega_rossby(k, n):return -k / (k**2 + 2 * n + 1)def omega_mixed_rossby_gravity(k):return 0.5 * (k + np.sqrt(k**2 + 4))def plot_kelvin(ax, k, color, lw):k_pos = k[k > 0]ax.plot(k_pos, k_pos, label='Kelvin波', color=color, linewidth=lw)def plot_mrg(ax, k, omega_func, color, lw):k_pos = k[k > 0]k_neg = k[k <= 0]ax.plot(k_neg, omega_func(k_neg), color=color, label='MRG波', linewidth=lw)ax.plot(k_pos, omega_func(k_pos), color=color, linewidth=lw)def plot_rossby(ax, k, omega_func, color, lw, n_max=4):k_neg = k[k < 0]for n in range(1, n_max+1):omega_r = omega_func(k_neg, n)ax.plot(k_neg, omega_r, color=color, linewidth=lw)def plot_gravity(ax, k, omega_func, color, lw, n_max=4):for n in range(1, n_max+1):omega_g = omega_func(k, n)ax.plot(k, omega_g, color=color, linewidth=lw)if n == 1:ax.plot([], [], color=color, label='慣性重力波')def style_axes(ax, color, lw):ax.axhline(0, color=color, linewidth=lw)ax.axvline(0, color=color, linewidth=lw)ax.set_xlabel(r'$k^*$', fontsize=14, color=color)ax.set_ylabel(r'$\omega^*$', fontsize=14, color=color)ax.set_xlim(-4.2, 4.2)ax.set_ylim(0, 4.5)for spine in ['top', 'right', 'left']:ax.spines[spine].set_visible(False)ax.spines['bottom'].set_linewidth(1.8)ax.spines['bottom'].set_color(color)ax.tick_params(axis='both', colors=color, width=0)for tick in ax.get_xticklabels() + ax.get_yticklabels():tick.set_color(color)ax.plot(1, 0, ">", transform=ax.get_yaxis_transform(), clip_on=False, color=color)ax.plot(0, 1, "^", transform=ax.get_xaxis_transform(), clip_on=False, color=color)def annotate(ax, color):ax.text(1.2, 0.7, 'Kelvin波 \n (n=-1)', fontsize=10, rotation=55, color=color)ax.text(-3.8, 0.35, 'Rossby波 \n (n=1,2,3,4)', fontsize=10, color=color)ax.text(-1, 0.9, 'MRG波 \n (n=0)', fontsize=10, rotation=25, color=color)ax.set_title('赤道淺水波頻散關系圖(Matsuno 1966)', fontsize=15, color=color)ax.set_title('東傳慣性重力波', fontsize=10, loc='right', color=color)ax.set_title('西傳慣性重力波', fontsize=10, loc='left', color=color)def plot_equatorial_waves(k, omega_mrg, omega_rossby, omega_gravity, main_color='k', linewidth=1.8):fig, ax = plt.subplots(figsize=(8, 6), dpi=200)# 繪制各類波動plot_kelvin(ax, k, main_color, linewidth)plot_mrg(ax, k, omega_mrg, main_color, linewidth)plot_rossby(ax, k, omega_rossby, main_color, linewidth)plot_gravity(ax, k, omega_gravity, main_color, linewidth)# 樣式設置style_axes(ax, main_color, linewidth)annotate(ax, main_color)ax.grid(True, linestyle='--', alpha=0.4)plt.tight_layout()plt.show()fig.savefig('頻散曲線理論關系圖.png',dpi=600)plt.rcParams['font.sans-serif']=['SimHei'] #正常顯示中文標簽
plt.rcParams['axes.unicode_minus']=False #正常顯示負號
# 示例 k 軸(你應該根據實際數據定義)
k = np.linspace(-4.2, 4.2, 500)
# 通用配色(深藍紫色)
main_color = '#4B0082'
linewidth = 1.8plot_equatorial_waves(k=k,omega_mrg=omega_mixed_rossby_gravity,omega_rossby=omega_rossby,omega_gravity=omega_gravity,main_color=main_color,linewidth=1.8
)