第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安装(推荐)

  1. 去Anaconda官网下载对应系统的安装包
  2. 安装时勾选「Add Anaconda to my PATH environment variable」
  3. 打开终端(或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 本章知识体系

下面这张图概括了本章的核心逻辑。你想想看,从安装到验证,再到工具选择,其实就一条线——搭好环境,才能跑通计算。

近轴光学 Python 环境搭建知识体系 Python 光学计算环境 包管理器 核心库 光学专用库 Anaconda pip NumPy SciPy rayoptics OpticsPy 虚拟环境隔离 矩阵运算 / 光线追迹 赛德尔像差 / 透镜设计 Jupyter Notebook / JupyterLab 核心思路:包管理器 → 核心库 → 光学专用库 → 交互式开发环境

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时也踩过这个坑——代码跑完没图,还以为库没装对。