简介:本资源是一份面向物理光学、热辐射或计算物理方向初学者与教学实践者的Matlab可视化教学材料,聚焦黑体辐射核心规律——普朗克定律的数值实现与多温度对比分析。通过编写可运行的Matlab脚本,直观呈现不同温度(如300K、4000K、6000K等)下光谱辐射强度随波长变化的典型曲线,特别适配不均匀刻度图绘制需求,帮助理解峰值波长位移(维恩位移)与总辐射量增长(斯特藩-玻尔兹曼关系)的物理内涵。压缩包共3个文件(2个.m源码文件+1个.png结果图),总大小227KB,结构精炼:plk.m为主绘图脚本,test.m提供参数调试入口,输出图像已预览验证,可直接用于课件展示或实验报告配图。目前已有8372人学习下载,附带完整公式实现、坐标轴非线性缩放处理及多曲线叠绘技巧,是理解热辐射理论并掌握科学绘图实践的即用型参考范例。
1. 普朗克定律到底是什么:一个烤炉里“看不见的光”如何被数学说清?
你有没有注意过,电炉丝从暗红→橙红→亮黄→发白的过程?温度一升,它不仅更亮,颜色也悄悄变了——这不是人眼的错觉,而是物质在不同温度下“发光方式”的根本改变。早在1900年,物理学家普朗克就发现:任何能完全吸收再完全辐射能量的“理想物体”(黑体),其发出的光,并不是均匀铺满所有颜色的;相反,它在某个特定波长处最“卖力”,两边则迅速衰减,而且这个“最卖力的位置”会随温度升高往短波(蓝紫)方向移动。这背后那条精确描述“某温度下、某波长上光有多强”的数学曲线,就是普朗克定律。它不是经验公式,而是量子力学的起点——第一次用“能量必须一份份地发”这个“不连续”思想,完美解释了实验数据。今天,我们不用推导公式,而是用Matlab把它画出来:让一条条不同温度下的光谱曲线并排站好,亲眼看见“热”如何变成“光”,又如何决定“光是什么颜色”。这份资料,就是帮你把抽象物理定律,变成可观察、可比较、可动手调整的图形化认知。
2. 为什么非得用Matlab画这条曲线:数值计算+多曲线对比+不均匀刻度,三件事缺一不可
2.1 公式太“硬”,人脑算不动:普朗克定律的数学结构决定了它必须靠程序
普朗克定律的完整表达式是:
$$ B_\lambda(\lambda, T) = \frac{2hc^2}{\lambda^5} \cdot \frac{1}{e^{\frac{hc}{\lambda k_B T}} - 1} $$
别被这串符号吓住,我们拆开看它“难在哪”:
- 分子有 $ \lambda^5 $,分母有指数项 $ e^{1/\lambda} $,整个函数对波长 $ \lambda $ 极其敏感;
- 当 $ \lambda $ 很小(紫外端),指数项爆炸式增长,导致整个值趋近于0;
- 当 $ \lambda $ 很大(红外端),$ \lambda^5 $ 让分子急剧变小,值也趋近于0;
- 峰值位置由 $ \lambda_{\text{max}} \approx \frac{b}{T} $(维恩位移定律)给出,但要画出整条光滑曲线,必须在峰值附近密采样,在两端稀疏采样——人手工列几十个点都容易出错,更别说画图。
提示:这不是“代入计算器就能出结果”的初中公式。它是一条需要在 $ 0.1,\mu\text{m} $ 到 $ 3000,\mu\text{m} $ 跨越四个数量级的波长范围内,做非线性、非均匀采样的函数。手动计算既无效率,也无法体现物理趋势。
Matlab 的优势正在于此:linspace和logspace可以按需生成波长向量;arrayfun或向量化运算能一次性算出整条曲线;plot自动处理坐标轴缩放。下面这段核心代码,就是把“数学定义”翻译成“图像语言”的关键一步:
% 定义常数(单位:SI) h = 6.626e-34; % 普朗克常数 c = 2.998e8; % 光速 k_B = 1.381e-23; % 玻尔兹曼常数 % 波长范围:从紫外到远红外,共2000个点(足够平滑) lambda = logspace(-7, -3, 2000); % 单位:米 → 对应 0.1 μm 到 1000 μm % 计算某温度T下的光谱辐射出射度(单位:W·sr⁻¹·m⁻³) T = 3000; % 开尔文 B_lambda = (2*h*c^2) ./ (lambda.^5) ./ (exp(h*c./(lambda*k_B*T)) - 1);注意. /和.^5中的点号——这是Matlab向量化运算的标志。没有它,代码会报错或只返回单个值。初学者常在这里翻车:以为写对了公式,却忘了Matlab不是计算器,它默认操作是矩阵运算,必须显式声明“逐元素”。
2.2 多曲线图不是“叠在一起就行”,而是为了回答一个物理问题:温度怎么改写光的“性格”
单画一条3000K的曲线,只能看到“它长什么样”;但把3000K、4000K、5000K、6000K(近似太阳表面温度)、8000K五条曲线画在同一张图上,你立刻能验证三个经典结论:
- 峰值左移:每条曲线的“最高点”越来越靠左(波长变短),对应颜色从红→黄→白→蓝;
- 总能量飙升:曲线下面积(即总辐射功率)随 $ T^4 $ 急剧增大——8000K曲线整体比3000K高得多;
- 形状不变但拉伸:所有曲线都保持“单峰、不对称、右拖尾长”的特征,说明这是黑体辐射的普适形态,与材料无关。
实现多曲线图的关键,不是反复调用plot,而是用hold on+ 循环,或更推荐的方式:把所有温度打包进向量,用arrayfun一次生成所有曲线矩阵:
T_vec = [3000, 4000, 5000, 6000, 8000]; B_matrix = zeros(length(lambda), length(T_vec)); for i = 1:length(T_vec) T = T_vec(i); B_matrix(:,i) = (2*h*c^2) ./ (lambda.^5) ./ (exp(h*c./(lambda*k_B*T)) - 1); end % 绘图:自动配色,加图例 figure; plot(lambda*1e6, B_matrix); % lambda转为微米,更符合习惯 xlabel('波长 \lambda (\mum)'); ylabel('光谱辐射出射度 B_\lambda (W·sr^{-1}·m^{-3})'); legend(arrayfun(@(t)sprintf('%d K',t), T_vec, 'UniformOutput', false)); title('不同温度下黑体的普朗克辐射谱'); grid on;这段代码跑出来,你看到的不是五条杂乱线条,而是一组有逻辑、可解读的物理证据。它把教科书上“温度升高,辐射峰值向短波移动”这句话,变成了眼睛能确认的事实。
2.3 不均匀刻度图不是“炫技”,而是尊重物理尺度的真实表达
你可能注意到:上面代码用了logspace(-7,-3,2000)生成波长,而不是linspace(1e-7,1e-3,2000)。为什么?
因为黑体辐射的能量分布,在短波(紫外/可见)和长波(红外)区域变化速率天差地别。用等间隔的线性刻度(linspace)画图,会导致:
- 在短波区(< 1 μm),曲线剧烈变化,但采样点太少,峰形锯齿状、失真;
- 在长波区(> 10 μm),曲线已衰减到接近零,但采样点密密麻麻,全是无效空白。
logspace则按对数等距采样:在 $ 0.1,\mu\text{m} $ 处采得密,在 $ 100,\mu\text{m} $ 处采得疏——这恰好匹配物理过程本身的“非线性节奏”。画出来的图,横轴天然呈现“前密后疏”的视觉效果,这才是真实世界的样子。
注意:Matlab中
semilogx函数可直接绘制横轴为对数坐标的图,但前提是你的数据点本身已在对数尺度上合理分布。如果先用linspace生成线性点,再用semilogx强制显示,图看起来“像对数”,实则采样失真——这是很多初学者踩过的坑。
3. “普朗克定律”“维恩位移定律”“斯特藩-玻尔兹曼定律”:三个名字,一张黑体辐射拼图
3.1 易混点一:以为“维恩位移定律”是普朗克定律的简化版,其实它是独立推论
- 易混点:看到 $ \lambda_{\text{max}} T = b $(b≈2.898×10⁻³ m·K),就认为“这是普朗克公式求导后约掉的简单结果,所以维恩定律更基础”。
- 为什么混:教材常把维恩定律放在普朗克之前讲,且形式极简,容易让人误判主次。
- 怎么区分:维恩定律不能预测曲线形状,也不能算任意波长的强度。它只回答“峰值在哪”,是个“定位工具”。而普朗克定律是完整描述函数本身,有了它,你才能算出3000K时550nm(绿光)处的具体辐射值,才能模拟LED芯片的热辐射噪声,才能校准红外测温仪。维恩是普朗克的“副产品”,不是替代品。
3.2 易混点二:把“斯特藩-玻尔兹曼定律”当成普朗克定律的积分结果,忽略它的工程价值
- 易混点:知道 $ j^* = \sigma T^4 $ 是对普朗克公式全波长积分而来,就以为“只要会积普朗克,斯特藩就没用”。
- 为什么混:数学上确实如此,但积分过程复杂(涉及黎曼ζ函数),且结果丢失了全部光谱信息。
- 怎么区分:斯特藩-玻尔兹曼定律是工程界的“快算口诀”。比如估算卫星散热器需要多大面积,工程师不会重算整条光谱,而是直接套 $ T^4 $ ——快、稳、够用。而普朗克定律是科研界的“显微镜”,要分析某段红外波段的干扰,就必须打开光谱细节。二者分工明确:一个管“总量”,一个管“分布”。
3.3 易混点三:混淆“黑体”与“日常物体”,以为普朗克曲线能直接套用在灯泡、铁块上
- 易混点:画完6000K曲线,就去对比白炽灯照片,发现颜色不一致,于是怀疑公式错了。
- 为什么混:忽略了“黑体”是理想模型,而真实物体有“发射率 $ \varepsilon(\lambda,T) < 1 $”,且随波长变化。
- 怎么区分:普朗克定律给出的是理论上限——任何真实物体在相同温度下,其光谱辐射强度都 ≤ 对应黑体曲线,且形状可能畸变(如金属在红外发射率高,可见光反射率高)。要拟合真实数据,必须引入发射率修正:$ B_{\text{real}} = \varepsilon(\lambda,T) \cdot B_{\text{black}} $。这份Matlab资源只实现理想黑体,正是为了先筑牢基准,避免初学时被发射率这个“变量黑洞”带偏。
3.4 易混点四:“多曲线图”不等于“多图叠加”,关键在坐标系统一与物理可比性
- 易混点:用
subplot画五个小图,每个图一条曲线,也叫“多曲线分析”。 - 为什么混:没意识到“可比性”依赖于同一坐标系下的相对位置。
- 怎么区分:
subplot展示的是“各自独立的状态”,适合对比不同参数下的系统响应;而hold on同图多线,展示的是“同一舞台上的角色关系”。例如,只有把3000K和6000K曲线画在同一图上,你才能直观看出6000K的峰值波长是否真的约为3000K的一半(维恩定律预言),这种定量验证,分图做不到。
3.5 易混点五:“不均匀刻度”常被误认为“坐标轴设置技巧”,实则是建模思维的体现
- 易混点:学会用
semilogx就以为掌握了不均匀刻度,甚至用xticks手动设几个点充数。 - 为什么混:把“表现形式”当成了“本质要求”。
- 怎么区分:真正的不均匀刻度,始于数据生成阶段(
logspace),而非绘图阶段。前者保证了计算精度与物理合理性;后者只是让图像“看起来像对数”。就像做菜,火候控制在炒制过程(数据生成),而不是最后摆盘(绘图设置)。本资源中的Matlab脚本,从第一行lambda = logspace(...)就确立了这一建模原则。
4. 为什么这份Matlab资源特别适合入门:它把“物理直觉”编进了代码结构里
4.1 代码即注释:变量名直指物理意义,拒绝a,b,c,x1,x2式玄学命名
很多初学者拿到代码,第一反应是“这变量c1代表啥?k2是常数还是系数?”——然后卡死。而本资源的变量命名,严格遵循物理惯例:
h_planck = 6.626e-34; % 不简写为 h,强调“普朗克常数” c_light = 2.998e8; % 不简写为 c,强调“光速” k_boltz = 1.381e-23; % 不简写为 k,强调“玻尔兹曼常数” lambda_um = lambda * 1e6; % 显式标注单位转换,避免单位混乱这种命名不是“多此一举”,而是把物理概念锚定在代码符号上。当你读到B_lambda = ... / (exp(h_planck*c_light ./ (lambda.*k_boltz.*T)) - 1),大脑无需切换“代码模式”和“物理模式”,公式和代码是同一套语言。这是降低认知负荷最有效的设计。
4.2 温度向量预设为典型值,自带物理语境,拒绝“随便输个数字”
资源里默认的T_vec = [3000, 4000, 5000, 6000, 8000],不是随意选的:
- 3000K:典型白炽灯丝工作温度(暖黄光);
- 5000–6000K:正午阳光色温(标准白光);
- 8000K:晴朗天空散射光(冷白偏蓝)。
这意味着,你运行脚本的第一眼,看到的就是“现实世界中的光”。不需要查表换算,温度值本身就在讲故事。如果你改成T_vec = [100, 200, 300],图会出来,但曲线全挤在远红外,峰值波长几毫米——那是宇宙微波背景辐射的范畴,和日常光学完全脱节。资源的设计,是在用数值选择,悄悄引导你建立“温度-颜色-应用”的直觉链接。
4.3 图例与标签强制使用LaTeX语法,从第一行就培养专业表达习惯
Matlab绘图中,xlabel('波长 (m)')是合格的;但xlabel('波长 \lambda\ (\mathrm{m})')是专业的。本资源所有文本标注均启用LaTeX渲染:
xlabel('波长 \lambda\ (\mum)'); % \mum 是微米符号 ylabel('B_\lambda(\lambda,T)\ (W\cdot sr^{-1}\cdot m^{-3})'); title('黑体辐射谱:普朗克定律的可视化');这看似小事,实则关键:
\lambda让你每次敲代码都在强化“波长用λ表示”的物理约定;\mum避免手打“um”或“micron”带来的歧义;sr^{-1}明确立体角单位,提醒你辐射出射度是“单位立体角、单位面积、单位波长”的量纲。
这些不是格式洁癖,而是把“量纲意识”“符号规范”“单位严谨”这些科研基本功,织进了最基础的操作环节。
4.4 内置错误防护:对极端温度与波长边界做预警,不让你陷入“为什么图是空的”玄学
普朗克公式在 $ T \to 0 $ 或 $ \lambda \to 0 $ 时会出现数值溢出(Inf或NaN)。新手常因输入T=0或lambda=0导致整张图消失,然后花两小时查语法错误。本资源脚本包含前置检查:
if T <= 0 error('温度T必须大于0 K(绝对零度不可达)'); end if any(lambda <= 0) error('波长lambda必须为正数'); end % 计算前截断极小lambda,防指数爆炸 lambda_safe = max(lambda, 1e-10);它不假装“用户永远正确”,而是用清晰报错,把物理限制(T>0)和数值限制(λ不能为0)直接告诉你。这种设计,省去的是调试时间,建立的是“物理约束即编程约束”的条件反射。
5. 什么时候该用它,什么时候该关掉Matlab:一份资源的合理边界
5.1 该用它的时候:你需要建立“温度-颜色-能量”的三维直觉
场景举例:某高校《热学与光学交叉实验》课,学生要理解“为什么恒星分类用OBAFGKM序列(对应温度从5万K到2千K)”,但课本只有文字描述。此时,运行这份脚本,把T_vec = [300, 1000, 3000, 6000, 10000, 30000]输入,生成六条曲线,立刻能看到:
- 300K(室温)曲线峰值在10μm,纯红外,人眼不可见;
- 3000K(红巨星)峰值在1μm,已进入近红外,可见光部分偏红;
- 30000K(O型星)峰值在0.1μm,已是远紫外,可见光部分偏蓝白。
这张图,胜过千言万语。它把离散的恒星类型,连成一条连续的物理标尺。这时候,Matlab不是工具,而是你的“物理直觉加速器”。
5.2 该用它的时候:你要验证仪器校准的理论依据
某公司研发一款新型红外热像仪,需在3–5μm波段标定。工程师需要知道:在目标温度(如80℃=353K)下,该波段的理论辐射强度占全谱比例是多少?能否被探测器信噪比覆盖?
这时,修改脚本中的lambda范围为logspace(-6, -5, 1000)(对应1–10μm),固定T=353,计算B_lambda,再用trapz积分3–5μm区间与全波段比值:
idx_band = (lambda >= 3e-6) & (lambda <= 5e-6); fraction_in_band = trapz(lambda(idx_band), B_lambda(idx_band)) ... / trapz(lambda, B_lambda); fprintf('3-5 \\mum波段辐射占比:%.2f%%\\n', fraction_in_band*100);输出可能是12.7%。这个数字,就是硬件选型(探测器灵敏度需覆盖此强度)和算法设计(信号处理增益需匹配此占比)的共同起点。没有这个计算,校准就是拍脑袋。
5.3 该关掉Matlab的时候:你面对的是非黑体、非平衡态或动态过程
这份资源严格基于理想黑体、热平衡态、稳态辐射三大前提。一旦脱离,它就不再是“参考答案”,而可能成为“误导源”。
| 场景 | 为什么不该直接用 | 替代思路 |
|---|---|---|
| 测量一块抛光铝板的辐射 | 铝在5μm处发射率ε≈0.05,而在15μm处ε≈0.2,必须乘以实测ε(λ)曲线 | 先用FTIR测出发射率谱,再与普朗克曲线相乘 |
| 模拟激光加热金属的瞬态过程 | 普朗克定律假设“温度处处均匀且不随时间变”,而激光加热产生极大梯度与毫秒级变化 | 需耦合热传导方程(PDE)与辐射边界条件,用COMSOL等专用软件 |
| 分析LED芯片结温辐射 | LED是电致发光,主要能量来自电子跃迁,热辐射(黑体成分)仅占总光通量<0.1%,且光谱含尖锐峰 | 应用朗伯余弦定律+实测光谱功率分布(SPD),而非黑体模型 |
提示:看到“辐射”二字就条件反射打开普朗克脚本,是初学者最常见的认知陷阱。物理建模的第一步,永远是问:“这个系统,满足黑体假设吗?”
5.4 一个血泪经验:我曾用它“优化”散热设计,结果翻车了三次
第一次,我直接拿60℃(333K)的普朗克曲线,算散热片表面辐射功率,发现远小于对流换热,于是砍掉辐射散热设计。交付后设备在高原低压环境过热——忽略了对流减弱时,辐射占比会相对上升,而我的计算没做工况联动。
第二次,我把CPU热区(85℃)和外壳(45℃)都设为黑体,画两条曲线叠在一起,想看“热泄漏光谱”。结果发现45℃曲线在可见光区几乎为零,就判定“完全不可见”。但实际红外热像仪拍出来,温差清晰可见——忘了热像仪探测的是辐射强度差(ΔB),不是绝对强度B,而ΔB在长波红外(8–14μm)对温差极其敏感。
第三次,我用脚本生成100组T值,训练神经网络预测温度,结果泛化极差。复盘发现:网络学的不是物理规律,而是T^4的数值拟合;一旦遇到发射率突变(如散热膏干裂),预测完全失效。
从那以后,我每次用这份普朗克脚本,都强制走一遍“三问”:
- 对象是不是黑体?(查材料发射率手册)
- 状态是不是平衡?(测温点是否稳定≥10秒?)
- 需求是不是要分布?(只要总功率,用斯特藩就够了)
希望帮到你。
本文还有配套的精品资源,点击获取