'''
大气辐射第二次作业
'''
# 第一问洛伦兹展宽
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 假设我们已经从HITRAN提取了波数和吸收系数数据
# wave_numbers = np.array([...]) # 波数数组
# absorption_coefficients = np.array([...]) # 吸收系数数组
# (a) 使用Lorentz线形绘制吸收系数k与波数的关系gamma是半宽
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'DejaVu Sans' # 不知道为什么会出现缺少子图故加上
def lorentzian(nu, s, nu_0, gamma):
return (s / np.pi) * (gamma / ((nu - nu_0)**2 + gamma**2))
# 定义数据
data = {
'v': [7280.31512, 7280.47400, 7281.08200, 7281.72912, 7282.70531,
7283.01859, 7283.73107, 7284.71668, 7285.04497, 7286.05083,
7287.00300, 7287.28900, 7287.50218, 7288.09091, 7290.10832],
'S': [4.194E-03, 8.872E-04, 3.764E-02, 4.033E-03, 5.673E-04,
1.132E-02, 1.710E-02, 2.401E-03, 4.275E-04, 4.732E-03,
6.990E-03, 2.285E-02, 2.877E-04, 6.882E-02, 3.226E-02],
'y_air': [0.0704, 0.0846, 0.0994, 0.0602, 0.0752,
0.0680, 0.0710, 0.0702, 0.0866, 0.0683,
0.0886, 0.1020, 0.0685, 0.1002, 0.0872]
}
# 创建 DataFrame
data = pd.DataFrame(data)
# # 示例参数
# S = 1.0 # 强度
# nu_0 = 7200 # 中心频率 (cm^-1)
# gamma = 10 # 线宽 (cm^-1)
wave_numbers = np.linspace(7278, 7292, 500) # 波数范围
# 将数据转换为数值类型
data['v'] = pd.to_numeric(data['v'], errors='coerce')
data['S'] = pd.to_numeric(data['S'], errors='coerce')
data['y_air'] = pd.to_numeric(data['y_air'], errors='coerce')
# 绘制多个不同中心频率的洛伦兹线型
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
# 假设我们使用数据中的多个中心频率
# 初始化一个与 wave_numbers 形状相同的数组来存储累积的 k 值
total_k_values = np.zeros_like(wave_numbers)
for index, row in data.iterrows():
nu_0 = row['v'] # 中心频率
S = row['S'] # 吸收强度
gamma = row['y_air'] # 线宽
k_values = lorentzian(wave_numbers, S, nu_0, gamma)
# 将当前的 k 值叠加到 total_k_values 中
total_k_values += k_values
ax.plot(wave_numbers, k_values, label=f'ν₀={nu_0:.2f} cm⁻¹')
ax.axis([7278, 7292, 1e-6, 1])
# 添加图例,放在坐标轴外部
ax.legend(loc='upper left', bbox_to_anchor=(1, 1)) # 调整位置
# 添加主刻度和次刻度 !!!!!
ax.xaxis.set_major_locator(plt.MultipleLocator(2)) # 主刻度间隔
ax.xaxis.set_minor_locator(plt.MultipleLocator(1)) # 次刻度间隔
ax.yaxis.set_major_locator(plt.LogLocator(base=10.0, numticks=10)) # 使用对数刻度
ax.yaxis.set_minor_locator(plt.LogLocator(base=10.0, subs='auto', numticks=10))
# 设置对数坐标
plt.yscale('log')
# 添加图例和标签
plt.xlabel('Wavenumber (cm$^{-1}$)')
plt.ylabel(r'Absorption Coefficient log(k$_\nu$) (atm cm$^{-1}$)')
plt.title('Absorption Coefficient of H$_{2}$O')
plt.grid(linestyle='--')
在绘制洛伦兹线性的吸收谱线时,第一次运行时图像如下
再次运行时,刻度线突然消失,图像如下:
有没有大佬可以解解惑,在网上搜索了半天一直没有结果。之前也出现过同样的问题,用.py文件运行相同的代码图像没有任何问题。不知道是不是jupyter自身的问题。
相似问题