别再死记硬背了!用Python+Matplotlib可视化理解‘发光强度’与‘立体角’
用Python+Matplotlib动态可视化理解发光强度与立体角
光学中的发光强度和立体角是许多初学者容易感到困惑的概念。传统的学习方式往往依赖于复杂的公式推导,让人望而生畏。本文将带你用Python和Matplotlib库,通过代码实践和动态可视化,直观理解这些抽象的光学概念。
1. 立体角的可视化理解
立体角是描述三维空间中一个点向某个方向"看"过去所张开的角度的量。想象你站在房间中央,抬头看一盏吊灯——你所看到的吊灯占据的空间范围就是一个立体角。
我们可以用Python绘制一个简单的立体角示意图:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制球体
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, color='b', alpha=0.1)
# 绘制立体角对应的锥体
theta = np.linspace(0, 2*np.pi, 100)
phi = np.linspace(0, np.pi/4, 100)
theta_grid, phi_grid = np.meshgrid(theta, phi)
x_cone = np.sin(phi_grid) * np.cos(theta_grid)
y_cone = np.sin(phi_grid) * np.sin(theta_grid)
z_cone = np.cos(phi_grid)
ax.plot_surface(x_cone, y_cone, z_cone, color='r', alpha=0.5)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.set_title('立体角可视化 (红色区域表示立体角)')
plt.tight_layout()
plt.show()
这段代码会生成一个3D图形,展示球体上的一个立体角区域。通过调整 phi = np.linspace(0, np.pi/4, 100) 中的 np.pi/4 参数,你可以改变立体角的大小,直观感受不同大小的立体角。
1.1 立体角的计算实践
立体角的计算公式为: dw = dS / r²
其中:
- dw:立体角
- dS:球面上被截取的面积
- r:球的半径
让我们用Python计算几个典型情况下的立体角:
def calculate_solid_angle(angle_deg):
"""计算给定平面角对应的立体角"""
angle_rad = np.deg2rad(angle_deg)
return 4 * np.pi * np.sin(angle_rad/2)**2
angles = [10, 30, 60, 90, 180]
for angle in angles:
solid_angle = calculate_solid_angle(angle)
print(f"平面角 {angle}° 对应的立体角: {solid_angle:.4f} sr")
运行结果会显示不同平面角对应的立体角大小。例如,30°的平面角对应的立体角约为0.84 sr,仅占整个空间立体角(4π≈12.566 sr)的6.7%。
2. 发光强度的动态演示
发光强度描述的是光源在特定方向上单位立体角内发出的光通量。我们可以创建一个动态演示,展示不同方向上的发光强度变化。
from matplotlib.animation import FuncAnimation
# 设置光源在不同方向上的发光强度分布
def intensity_distribution(theta, phi):
"""模拟非均匀光源的发光强度分布"""
return np.exp(-0.5*(theta-np.pi/2)**2/(np.pi/8)**2) * np.sin(phi)**2
# 准备数据
theta = np.linspace(0, np.pi, 50)
phi = np.linspace(0, 2*np.pi, 50)
theta_grid, phi_grid = np.meshgrid(theta, phi)
intensity = intensity_distribution(theta_grid, phi_grid)
# 转换为笛卡尔坐标用于3D绘图
x = np.sin(theta_grid) * np.cos(phi_grid)
y = np.sin(theta_grid) * np.sin(phi_grid)
z = np.cos(theta_grid)
# 创建图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制初始状态
surf = ax.plot_surface(x, y, z, facecolors=plt.cm.viridis(intensity/intensity.max()),
rstride=1, cstride=1, alpha=0.8)
# 添加颜色条
m = plt.cm.ScalarMappable(cmap=plt.cm.viridis)
m.set_array(intensity)
plt.colorbar(m, ax=ax, label='发光强度 (cd)')
ax.set_title('非均匀光源的发光强度分布')
plt.tight_layout()
# 创建旋转动画
def update(frame):
ax.view_init(elev=20, azim=frame)
return surf,
ani = FuncAnimation(fig, update, frames=np.arange(0, 360, 2), interval=50)
plt.show()
这段代码创建了一个动态的3D图形,展示了一个非均匀光源在不同方向上的发光强度分布。颜色越亮表示该方向上的发光强度越大。
3. 光通量与发光强度的关系
光通量(Φ)是光源发出的总可见光功率,而发光强度(I)描述了光源在特定方向上的"亮度"。它们之间的关系可以通过立体角联系起来:
Φ = ∫ I dw
对于均匀发光的点光源,这个关系简化为: Φ = 4π I₀
让我们用Python演示这种关系:
# 定义不同发光强度的光源
intensities = [1, 5, 10, 50, 100] # 单位:cd
# 计算总光通量
fluxes = [4 * np.pi * i for i in intensities]
# 绘制关系图
plt.figure(figsize=(10, 6))
plt.plot(intensities, fluxes, 'o-', markersize=8)
plt.xlabel('发光强度 (cd)')
plt.ylabel('总光通量 (lm)')
plt.title('均匀点光源的发光强度与总光通量关系')
plt.grid(True)
# 添加数据标签
for i, (x, y) in enumerate(zip(intensities, fluxes)):
plt.annotate(f'{y:.1f} lm', (x, y), textcoords="offset points", xytext=(0,10), ha='center')
plt.tight_layout()
plt.show()
这个图表清晰地展示了发光强度与总光通量之间的线性关系。对于均匀发光的点光源,每增加1 cd的发光强度,总光通量就增加约12.57 lm。
4. 实际应用案例:灯具设计分析
让我们通过一个实际案例来综合应用这些概念。假设我们要分析一个LED灯具的光学性能:
# LED灯具参数
led_intensity = 120 # cd (主方向发光强度)
viewing_angle = 60 # 度 (半角)
# 计算有效立体角
half_angle_rad = np.deg2rad(viewing_angle)
effective_solid_angle = 2 * np.pi * (1 - np.cos(half_angle_rad))
# 计算总光通量
total_flux = led_intensity * effective_solid_angle
# 计算平均发光强度
average_intensity = total_flux / (4 * np.pi)
# 结果展示
results = {
"主方向发光强度": f"{led_intensity} cd",
"视角": f"{viewing_angle}°",
"有效立体角": f"{effective_solid_angle:.2f} sr",
"总光通量": f"{total_flux:.1f} lm",
"平均发光强度": f"{average_intensity:.1f} cd"
}
print("LED灯具光学性能分析:")
for param, value in results.items():
print(f"{param:20}: {value}")
这个分析可以帮助我们理解灯具的实际性能。例如,即使主方向发光强度很高,如果视角很窄,总光通量可能并不大。
提示:在实际灯具设计中,通常使用配光曲线来描述发光强度分布。我们可以用极坐标图来可视化这种分布:
# 创建配光曲线
angles = np.linspace(0, np.pi, 180) # 0到180度
intensity_profile = led_intensity * np.cos(angles)**4 # 模拟LED的发光强度分布
# 极坐标绘图
plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
ax.plot(angles, intensity_profile, linewidth=2)
ax.set_theta_zero_location('N') # 0度在顶部
ax.set_theta_direction(-1) # 顺时针方向
ax.set_rlabel_position(90) # 半径标签位置
ax.set_title('LED灯具配光曲线', pad=20)
plt.tight_layout()
plt.show()
这种可视化方式在照明工程中非常常用,可以直观地展示灯具在不同方向上的发光强度分布。
更多推荐

所有评论(0)