第4章 Python环境搭建:NumPy/SciPy安装、光学计算库简介、Jupyter Notebook配置
好,咱们进入实操环节。说实话,光学设计软件动辄几万块,但Python这套环境完全免费。我这些年做项目,从镜头设计到公差分析,大部分计算其实都是在Jupyter里完成的。这一章,我带你把地基打牢。
4.1 为什么选Python做近轴计算?
你可能会问:用Excel或者Matlab不行吗?当然行。但Python的优势在于——开源、生态全、可复现。我在做变焦系统优化时,需要反复调整参数跑几百次光线追迹。Excel扛不住,Matlab要授权,Python+NumPy几秒钟搞定。
核心工具链:
- NumPy:矩阵运算、向量化计算——近轴光线追迹的基石
- SciPy:优化算法、插值、线性代数——用于透镜设计和像差校正
- Matplotlib:画光路图、像差曲线、点列图
- Jupyter Notebook:交互式开发环境,边写边看结果
4.2 安装Python与包管理器
我个人习惯用Anaconda发行版。它自带NumPy、SciPy、Jupyter,省去很多麻烦。如果你已经装了纯净Python,也别急,用pip一样能搞定。
4.2.1 通过Anaconda安装(推荐)
- 去Anaconda官网下载对应系统的安装包
- 安装时勾选「Add Anaconda to my PATH environment variable」
- 打开终端(或Anaconda Prompt),验证安装:
conda --version
python --version
4.2.2 通过pip安装(轻量方案)
如果你只想装最小环境,用pip也行。我曾经在服务器上就是这么干的——省空间。
pip install numpy scipy matplotlib jupyter
小技巧:建议用虚拟环境隔离项目。我每个光学项目都建独立环境,避免包版本冲突。
conda create -n optics python=3.9
conda activate optics
conda install numpy scipy matplotlib jupyter
4.3 NumPy与SciPy快速验证
装完别急着走。先跑几行代码,确认环境能用。说白了,就是给工具箱做个「点检」。
import numpy as np
import scipy as sp
# 验证NumPy:创建一个2x2矩阵,代表近轴光线变换矩阵
M = np.array([[1, 0.5], [0, 1]])
print("光线变换矩阵:\n", M)
# 验证SciPy:解一个线性方程组,模拟双透镜系统
A = np.array([[1, -0.1], [0.2, 1]])
b = np.array([0.05, 0.01])
x = sp.linalg.solve(A, b)
print("透镜参数解:\n", x)
如果能正常输出,说明环境就绪。嗯,这里要注意——SciPy的linalg模块比NumPy的linalg更全,做光学优化时我常用它。
4.4 光学计算库简介
除了NumPy/SciPy,光学领域还有一些专用库。我整理了一张表,方便你对照选择。
| 库名 | 功能 | 适用场景 | 安装方式 |
|---|---|---|---|
| rayoptics | 几何光学追迹、像差分析 | 近轴/实际光线追迹、赛德尔像差 | pip install rayoptics |
| OpticsPy | 薄透镜、矩阵光学、衍射 | 教学演示、快速原型 | pip install opticspy |
| PyZDDE | Zemax OpticStudio 接口 | 与商业软件联动 | pip install pyzdde |
| LightPipes | 物理光学传播、衍射 | 激光束传播、干涉 | pip install LightPipes |
避坑指南:我曾经在Windows上装rayoptics时遇到C++编译错误。解决方案是提前装好Microsoft C++ Build Tools。如果你用Linux或macOS,一般不会出问题。
4.5 Jupyter Notebook配置
Jupyter Notebook是我最常用的光学计算环境。为什么?因为它支持代码、公式、图表、说明文字混排。做镜头设计报告时,我直接把Notebook导出成HTML或PDF,省去写文档的时间。
4.5.1 启动与基本操作
# 在终端启动
jupyter notebook
# 或者用更现代的JupyterLab
jupyter lab
启动后浏览器会自动打开。点击右上角「New」→「Python 3」新建笔记本。
4.5.2 我常用的几个配置
- 自动补全:按
Tab键,变量名、函数名自动补全 - 帮助文档:在函数后加
?再运行,比如np.linalg.inv? - LaTeX公式:在Markdown单元格中用
$...$或$$...$$写公式 - 魔法命令:
%timeit测量代码执行时间,%matplotlib inline让图表直接显示
个人经验:我习惯在Notebook开头加一个配置单元格,统一设置图表参数和显示选项:
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 120
plt.rcParams['font.size'] = 12
这样后面画的图都清晰、统一,省得每张图调参数。
4.6 本章知识体系
下面这张图概括了本章的核心逻辑。你想想看,从安装到验证,再到工具选择,其实就一条线——搭好环境,才能跑通计算。
4.7 验证环境是否完整
最后,我建议你跑一个完整的「冒烟测试」。把下面这段代码复制到Jupyter里执行,如果全部通过,说明环境搭建成功。
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
# 1. NumPy:近轴光线追迹矩阵
M_free = np.array([[1, 10], [0, 1]]) # 10mm自由传播
M_lens = np.array([[1, 0], [-0.02, 1]]) # 焦距50mm薄透镜
M_sys = M_lens @ M_free
print("系统矩阵:\n", M_sys)
# 2. SciPy:求解透镜焦距
from scipy.optimize import fsolve
def lens_eq(f):
return 1/f - 0.02
f_sol = fsolve(lens_eq, 50)
print(f"求解焦距: {f_sol[0]:.2f} mm")
# 3. Matplotlib:画光路
z = np.linspace(0, 100, 500)
y = 5 * (1 - z/50)
plt.plot(z, y, label='光线路径')
plt.axvline(50, color='r', linestyle='--', label='透镜位置')
plt.xlabel('z (mm)')
plt.ylabel('y (mm)')
plt.legend()
plt.grid(True)
plt.show()
print("✅ 环境验证通过!")
注意:如果Matplotlib绘图不显示,检查是否运行了 %matplotlib inline。我刚开始用Jupyter时也踩过这个坑——代码跑完没图,还以为库没装对。