简介:这份资源面向从事红外仿真、物理模拟与科学计算的工程师及科研人员,聚焦如何用MATLAB实现普朗克公式的数值计算。普朗克公式是描述黑体辐射能量分布的基本定律,掌握其编程实现是红外仿真与辐射度分析的基础技能。资源包共5个文件,均为m脚本文件,压缩包约3KB,涵盖普朗克公式计算、辐射度计算、曲线拟合与映射函数等模块,便于读者直接运行、修改参数并对照理解各步骤的数值处理逻辑。代码中定义了普朗克常数、光速与玻尔兹曼常数,设定温度与波长范围后通过循环遍历组合计算辐射出射度,并借助可视化函数呈现温度、波长与辐射强度的关系,读者可据此快速搭建自己的黑体辐射计算流程。目前已有4854人学习下载,适合需要将物理公式落地为可执行脚本、并希望借助图形化结果分析数据的初中级MATLAB用户参考。1. 普朗克公式到底在算什么:从“烧红的铁块”说起一块铁放进炉子里加热,温度低的时候它只是微微发暗,继续升温会变成暗红、橙红,再高就发白发亮。这个“颜色随温度变化”的现象,背后就是热辐射。普朗克公式要算的,正是不同温度下,一个理想辐射体在每个波长上到底辐射出多少能量。它把“温度”和“光谱”这两件事用一条曲线绑在了一起。很多人第一次听到“普朗克 辐射度”会觉得这是量子力学里的古董,跟自己没关系。但只要涉及红外测温、遥感成像、热像仪标定、太阳能光谱模拟,甚至白炽灯的光色估算,这条公式就是绕不开的底层账本。搞懂它,你就能看懂一条光谱曲线为什么长成那个形状,也能明白为什么经典物理在这里会“翻车”。2. 为什么经典公式会崩:普朗克公式存在的理由2.1 从瑞利-金斯到“紫外灾难”在普朗克之前,物理学家用经典电磁学和统计力学推导过一个公式,叫瑞利-金斯公式。它的思路很自然:把空腔里的电磁波看成无数个驻波模式,每个模式按能量均分定理分到一份能量。短波长时模式数量急剧增加,算出来的辐射度就一路飙升,波长趋近于零时直接冲到无穷大。这个结果显然不对。实验测出来的曲线在短波方向是往下掉的,不是往上炸的。因为这件事发生在紫外波段附近,大家把它叫做“紫外灾难”。它不是实验误差,而是经典理论框架本身出了问题。普朗克公式就是为了解决这个矛盾而出现的。2.2 能量不是连续的:普朗克的关键假设普朗克的破局点在于一个当时看起来很“玄学”的假设:振子的能量不能连续变化,只能一份一份地取,每份的大小是 ( h\nu )。( h ) 就是普朗克常数,( \nu ) 是频率。这个“能量量子化”的假设,直接掐断了短波方向能量无限堆积的可能。通俗地说,经典理论认为能量像水龙头里的水,想放多少放多少;普朗克说不对,能量像硬币,只能一枚一枚地给。波长越短,频率越高,一枚“硬币”的面值就越大,能分到硬币的模式就越少,辐射度自然就掉下来了。这条公式后来成了量子力学的起点之一,但它本身只是一个关于热辐射能量分布的计算式。2.3 公式长什么样:每个符号都有物理含义普朗克公式常见的形式有两种,一种按波长写,一种按频率写。做数值计算时,按波长写更直观,因为实验数据通常以波长为横轴。它的光谱辐射度形式是:[ B(\lambda, T) = \frac{2hc^2}{\lambda^5} \cdot \frac{1}{e^{hc/(\lambda k T)} - 1} ]其中 ( B ) 是光谱辐射度,单位是 ( \mathrm{W \cdot m^{-2} \cdot sr^{-1} \cdot m^{-1}} );( \lambda ) 是波长;( T ) 是绝对温度;( h ) 是普朗克常数;( c ) 是光速;( k ) 是玻尔兹曼常数。分母里的指数项决定了曲线的形状,( \lambda^5 ) 决定了短波方向的衰减。在 MATLAB 里算这条曲线,核心就是把这几个常数代进去,然后对波长向量做逐元素运算。下面是一段可以直接运行的代码:% 普朗克光谱辐射度计算(按波长) h = 6.62607015e-34; % 普朗克常数,单位 J·s c = 2.99792458e8; % 光速,单位 m/s k = 1.380649e-23; % 玻尔兹曼常数,单位 J/K T = 3000; % 温度,单位 K lambda = linspace(100e-9, 5000e-9, 2000); % 波长范围 100nm 到 5000nm % 逐元素计算,注意用点乘和点除 B = (2*h*c^2) ./ (lambda.^5) ./ (exp(h*c./(lambda*k*T)) - 1); plot(lambda*1e9, B); xlabel('波长 (nm)'); ylabel('光谱辐射度 (W·m^{-2}·sr^{-1}·m^{-1})'); title(['普朗克曲线,T = ' num2str(T) ' K']);这段代码里,lambda.^5和exp(...)前面的点号是关键。MATLAB 对向量做乘方、乘除时,必须用点运算,否则会当成矩阵运算直接报错。linspace生成等间距波长点,点数取 2000 是为了让曲线平滑,太少会看到折线。温度改成 5000 或 6000,你会看到峰值往短波方向移动,这就是维恩位移定律的直观体现。3. 普朗克公式和它的“亲戚们”:别把近似当原式3.1 维恩近似与瑞利-金斯近似普朗克公式有两个常用的近似版本。短波区域,指数项远大于 1,分母里的减 1 可以忽略,得到维恩近似;长波区域,指数项很小,展开后得到瑞利-金斯近似。这两个近似在各自区间里和普朗克公式吻合得很好,但一旦跨区间使用就会出问题。初学者最容易犯的错,就是拿维恩近似去算远红外,或者拿瑞利-金斯近似去算可见光短波。前者会偏小,后者会偏大,而且偏差不是一点点。判断用哪个近似,先看 ( hc/(\lambda k T) ) 这个无量纲量的值:远大于 1 用维恩,远小于 1 用瑞利-金斯,接近 1 就老老实实用原式。3.2 斯特藩-玻尔兹曼定律是积分结果斯特藩-玻尔兹曼定律说,总辐射度正比于 ( T^4 )。它不是独立于普朗克公式的另一个规律,而是把普朗克公式对所有波长积分之后得到的结果。换句话说,普朗克公式是“每一条波长上分多少”,斯特藩-玻尔兹曼是“所有波长加起来一共多少”。在 MATLAB 里验证这件事很简单:把上面算出来的 ( B ) 对 ( \lambda ) 做数值积分,再和 ( \sigma T^4 ) 对比。如果波长范围取得足够宽,两者应该很接近。这个练习能帮你建立“光谱量”和“总量”之间的换算直觉。3.3 常见误区:普朗克公式不是“黑体才有用”很多人以为普朗克公式只适用于理想黑体,实际物体用不上。这个说法只对了一半。实际物体的辐射度确实不等于黑体,但可以通过发射率 ( \varepsilon(\lambda, T) ) 把黑体辐射度修正过来:( B_{\text{real}} = \varepsilon \cdot B_{\text{planck}} )。发射率小于 1,且随波长和温度变化。所以普朗克公式仍然是计算实际物体热辐射的起点。做红外测温时,如果忽略发射率修正,读出来的温度会明显偏离真实值。这也是为什么红外热像仪都要设置发射率参数,本质上就是在普朗克公式前面乘一个系数。4. 在 MATLAB 里算普朗克公式:容易翻车的几个点4.1 单位不统一是头号杀手普朗克常数用 J·s,光速用 m/s,玻尔兹曼常数用 J/K,波长却经常有人填成纳米。一旦波长用纳米代入,( \lambda^5 ) 会小得离谱,指数项也会大得离谱,结果要么是 0 要么是 Inf。血泪经验是:所有输入量先统一到国际单位制,波长用米,温度用开尔文,最后画图时再把横轴换成纳米。温度也一样,摄氏度不能直接代。3000 K 是 2727 摄氏度左右,如果误填 3000 当成摄氏度,实际温度差了将近 3000 K,曲线峰值位置会完全不对。写代码时最好在变量名里带上单位,比如T_K、lambda_m,减少自己坑自己的概率。4.2 指数溢出与数值稳定当 ( \lambda ) 很小、( T ) 很低时,( hc/(\lambda k T) ) 可能是一个非常大的数,exp直接溢出成 Inf,分母变成 Inf,结果变成 0。这在物理上是合理的,因为短波方向辐射度确实趋近于零,但数值上会给出警告。如果不想看到警告,可以对指数项做截断,或者用对数域计算后再取指数。另一个坑是波长向量从 0 开始。( \lambda = 0 ) 会导致除零,直接产生 NaN。波长范围应该从一个小正数开始,比如 1e-9 米,而不是 0。这些细节在写脚本时不起眼,但一旦批量跑参数扫描,就会变成一堆无效点。4.3 画图时的坐标选择普朗克曲线在波长轴上通常用纳米,在频率轴上用 THz,两者形状看起来是反的。如果横轴用波长,峰值随温度升高向左移动;如果横轴用频率,峰值随温度升高向右移动。这不是公式变了,而是横轴方向反了。画图前先想清楚自己要表达什么,别把两张图放在一起直接对比峰值位置。另外,纵轴用线性坐标时,短波方向的细节会被压扁;用对数坐标能看清整个量级变化。如果目的是展示峰值位置,线性坐标更直观;如果目的是展示数量级跨度,对数坐标更合适。MATLAB 里用semilogy或loglog切换,不需要改计算公式。5. 什么时候该用普朗克公式,什么时候别硬套普朗克公式的适用边界其实很清楚:它描述的是热平衡状态下的电磁辐射谱。只要物体处于热平衡,或者可以近似认为局部热平衡,它就能用。比如白炽灯灯丝、炉膛内壁、地表红外辐射、恒星光谱,这些场景下普朗克公式都是第一手工具。但下面几种情况就要小心。第一种是激光、LED 这类非热辐射光源,它们的发光机制不是热平衡辐射,光谱形状和普朗克曲线完全不是一回事,硬套只会得到错误结论。第二种是等离子体或荧光材料,存在非平衡过程,需要更复杂的辐射输运模型。第三种是极短时间尺度的瞬态辐射,热平衡还没建立起来,普朗克公式的前提就不成立。还有一个实际判断标准:看发射率是否接近常数。如果发射率随波长剧烈变化,比如金属在短波处发射率低、长波处发射率高,直接用黑体公式加一个常数修正就会带来较大误差。这时候要么用光谱发射率逐点修正,要么换用更精细的模型。我自己刚开始用 MATLAB 算这条曲线时,曾经把波长单位写成纳米,跑出来一条几乎贴地的直线,还以为是温度设低了。后来把单位统一成米,曲线立刻正常。从那以后,我每次写热辐射相关的脚本,都会在开头强制走一遍单位检查:波长是不是米、温度是不是开尔文、常数是不是国际单位制。这个习惯帮我省掉了不少返工时间。希望帮到你。本文还有配套的精品资源,点击获取
简介:这份资源面向从事红外仿真、物理模拟与科学计算的工程师及科研人员,聚焦如何用MATLAB实现普朗克公式的数值计算。普朗克公式是描述黑体辐射能量分布的基本定律,掌握其编程实现是红外仿真与辐射度分析的基础技能。资源包共5个文件,均为m脚本文件,压缩包约3KB,涵盖普朗克公式计算、辐射度计算、曲线拟合与映射函数等模块,便于读者直接运行、修改参数并对照理解各步骤的数值处理逻辑。代码中定义了普朗克常数、光速与玻尔兹曼常数,设定温度与波长范围后通过循环遍历组合计算辐射出射度,并借助可视化函数呈现温度、波长与辐射强度的关系,读者可据此快速搭建自己的黑体辐射计算流程。目前已有4854人学习下载,适合需要将物理公式落地为可执行脚本、并希望借助图形化结果分析数据的初中级MATLAB用户参考。1. 普朗克公式到底在算什么:从“烧红的铁块”说起一块铁放进炉子里加热,温度低的时候它只是微微发暗,继续升温会变成暗红、橙红,再高就发白发亮。这个“颜色随温度变化”的现象,背后就是热辐射。普朗克公式要算的,正是不同温度下,一个理想辐射体在每个波长上到底辐射出多少能量。它把“温度”和“光谱”这两件事用一条曲线绑在了一起。很多人第一次听到“普朗克 辐射度”会觉得这是量子力学里的古董,跟自己没关系。但只要涉及红外测温、遥感成像、热像仪标定、太阳能光谱模拟,甚至白炽灯的光色估算,这条公式就是绕不开的底层账本。搞懂它,你就能看懂一条光谱曲线为什么长成那个形状,也能明白为什么经典物理在这里会“翻车”。2. 为什么经典公式会崩:普朗克公式存在的理由2.1 从瑞利-金斯到“紫外灾难”在普朗克之前,物理学家用经典电磁学和统计力学推导过一个公式,叫瑞利-金斯公式。它的思路很自然:把空腔里的电磁波看成无数个驻波模式,每个模式按能量均分定理分到一份能量。短波长时模式数量急剧增加,算出来的辐射度就一路飙升,波长趋近于零时直接冲到无穷大。这个结果显然不对。实验测出来的曲线在短波方向是往下掉的,不是往上炸的。因为这件事发生在紫外波段附近,大家把它叫做“紫外灾难”。它不是实验误差,而是经典理论框架本身出了问题。普朗克公式就是为了解决这个矛盾而出现的。2.2 能量不是连续的:普朗克的关键假设普朗克的破局点在于一个当时看起来很“玄学”的假设:振子的能量不能连续变化,只能一份一份地取,每份的大小是 ( h\nu )。( h ) 就是普朗克常数,( \nu ) 是频率。这个“能量量子化”的假设,直接掐断了短波方向能量无限堆积的可能。通俗地说,经典理论认为能量像水龙头里的水,想放多少放多少;普朗克说不对,能量像硬币,只能一枚一枚地给。波长越短,频率越高,一枚“硬币”的面值就越大,能分到硬币的模式就越少,辐射度自然就掉下来了。这条公式后来成了量子力学的起点之一,但它本身只是一个关于热辐射能量分布的计算式。2.3 公式长什么样:每个符号都有物理含义普朗克公式常见的形式有两种,一种按波长写,一种按频率写。做数值计算时,按波长写更直观,因为实验数据通常以波长为横轴。它的光谱辐射度形式是:[ B(\lambda, T) = \frac{2hc^2}{\lambda^5} \cdot \frac{1}{e^{hc/(\lambda k T)} - 1} ]其中 ( B ) 是光谱辐射度,单位是 ( \mathrm{W \cdot m^{-2} \cdot sr^{-1} \cdot m^{-1}} );( \lambda ) 是波长;( T ) 是绝对温度;( h ) 是普朗克常数;( c ) 是光速;( k ) 是玻尔兹曼常数。分母里的指数项决定了曲线的形状,( \lambda^5 ) 决定了短波方向的衰减。在 MATLAB 里算这条曲线,核心就是把这几个常数代进去,然后对波长向量做逐元素运算。下面是一段可以直接运行的代码:% 普朗克光谱辐射度计算(按波长) h = 6.62607015e-34; % 普朗克常数,单位 J·s c = 2.99792458e8; % 光速,单位 m/s k = 1.380649e-23; % 玻尔兹曼常数,单位 J/K T = 3000; % 温度,单位 K lambda = linspace(100e-9, 5000e-9, 2000); % 波长范围 100nm 到 5000nm % 逐元素计算,注意用点乘和点除 B = (2*h*c^2) ./ (lambda.^5) ./ (exp(h*c./(lambda*k*T)) - 1); plot(lambda*1e9, B); xlabel('波长 (nm)'); ylabel('光谱辐射度 (W·m^{-2}·sr^{-1}·m^{-1})'); title(['普朗克曲线,T = ' num2str(T) ' K']);这段代码里,lambda.^5和exp(...)前面的点号是关键。MATLAB 对向量做乘方、乘除时,必须用点运算,否则会当成矩阵运算直接报错。linspace生成等间距波长点,点数取 2000 是为了让曲线平滑,太少会看到折线。温度改成 5000 或 6000,你会看到峰值往短波方向移动,这就是维恩位移定律的直观体现。3. 普朗克公式和它的“亲戚们”:别把近似当原式3.1 维恩近似与瑞利-金斯近似普朗克公式有两个常用的近似版本。短波区域,指数项远大于 1,分母里的减 1 可以忽略,得到维恩近似;长波区域,指数项很小,展开后得到瑞利-金斯近似。这两个近似在各自区间里和普朗克公式吻合得很好,但一旦跨区间使用就会出问题。初学者最容易犯的错,就是拿维恩近似去算远红外,或者拿瑞利-金斯近似去算可见光短波。前者会偏小,后者会偏大,而且偏差不是一点点。判断用哪个近似,先看 ( hc/(\lambda k T) ) 这个无量纲量的值:远大于 1 用维恩,远小于 1 用瑞利-金斯,接近 1 就老老实实用原式。3.2 斯特藩-玻尔兹曼定律是积分结果斯特藩-玻尔兹曼定律说,总辐射度正比于 ( T^4 )。它不是独立于普朗克公式的另一个规律,而是把普朗克公式对所有波长积分之后得到的结果。换句话说,普朗克公式是“每一条波长上分多少”,斯特藩-玻尔兹曼是“所有波长加起来一共多少”。在 MATLAB 里验证这件事很简单:把上面算出来的 ( B ) 对 ( \lambda ) 做数值积分,再和 ( \sigma T^4 ) 对比。如果波长范围取得足够宽,两者应该很接近。这个练习能帮你建立“光谱量”和“总量”之间的换算直觉。3.3 常见误区:普朗克公式不是“黑体才有用”很多人以为普朗克公式只适用于理想黑体,实际物体用不上。这个说法只对了一半。实际物体的辐射度确实不等于黑体,但可以通过发射率 ( \varepsilon(\lambda, T) ) 把黑体辐射度修正过来:( B_{\text{real}} = \varepsilon \cdot B_{\text{planck}} )。发射率小于 1,且随波长和温度变化。所以普朗克公式仍然是计算实际物体热辐射的起点。做红外测温时,如果忽略发射率修正,读出来的温度会明显偏离真实值。这也是为什么红外热像仪都要设置发射率参数,本质上就是在普朗克公式前面乘一个系数。4. 在 MATLAB 里算普朗克公式:容易翻车的几个点4.1 单位不统一是头号杀手普朗克常数用 J·s,光速用 m/s,玻尔兹曼常数用 J/K,波长却经常有人填成纳米。一旦波长用纳米代入,( \lambda^5 ) 会小得离谱,指数项也会大得离谱,结果要么是 0 要么是 Inf。血泪经验是:所有输入量先统一到国际单位制,波长用米,温度用开尔文,最后画图时再把横轴换成纳米。温度也一样,摄氏度不能直接代。3000 K 是 2727 摄氏度左右,如果误填 3000 当成摄氏度,实际温度差了将近 3000 K,曲线峰值位置会完全不对。写代码时最好在变量名里带上单位,比如T_K、lambda_m,减少自己坑自己的概率。4.2 指数溢出与数值稳定当 ( \lambda ) 很小、( T ) 很低时,( hc/(\lambda k T) ) 可能是一个非常大的数,exp直接溢出成 Inf,分母变成 Inf,结果变成 0。这在物理上是合理的,因为短波方向辐射度确实趋近于零,但数值上会给出警告。如果不想看到警告,可以对指数项做截断,或者用对数域计算后再取指数。另一个坑是波长向量从 0 开始。( \lambda = 0 ) 会导致除零,直接产生 NaN。波长范围应该从一个小正数开始,比如 1e-9 米,而不是 0。这些细节在写脚本时不起眼,但一旦批量跑参数扫描,就会变成一堆无效点。4.3 画图时的坐标选择普朗克曲线在波长轴上通常用纳米,在频率轴上用 THz,两者形状看起来是反的。如果横轴用波长,峰值随温度升高向左移动;如果横轴用频率,峰值随温度升高向右移动。这不是公式变了,而是横轴方向反了。画图前先想清楚自己要表达什么,别把两张图放在一起直接对比峰值位置。另外,纵轴用线性坐标时,短波方向的细节会被压扁;用对数坐标能看清整个量级变化。如果目的是展示峰值位置,线性坐标更直观;如果目的是展示数量级跨度,对数坐标更合适。MATLAB 里用semilogy或loglog切换,不需要改计算公式。5. 什么时候该用普朗克公式,什么时候别硬套普朗克公式的适用边界其实很清楚:它描述的是热平衡状态下的电磁辐射谱。只要物体处于热平衡,或者可以近似认为局部热平衡,它就能用。比如白炽灯灯丝、炉膛内壁、地表红外辐射、恒星光谱,这些场景下普朗克公式都是第一手工具。但下面几种情况就要小心。第一种是激光、LED 这类非热辐射光源,它们的发光机制不是热平衡辐射,光谱形状和普朗克曲线完全不是一回事,硬套只会得到错误结论。第二种是等离子体或荧光材料,存在非平衡过程,需要更复杂的辐射输运模型。第三种是极短时间尺度的瞬态辐射,热平衡还没建立起来,普朗克公式的前提就不成立。还有一个实际判断标准:看发射率是否接近常数。如果发射率随波长剧烈变化,比如金属在短波处发射率低、长波处发射率高,直接用黑体公式加一个常数修正就会带来较大误差。这时候要么用光谱发射率逐点修正,要么换用更精细的模型。我自己刚开始用 MATLAB 算这条曲线时,曾经把波长单位写成纳米,跑出来一条几乎贴地的直线,还以为是温度设低了。后来把单位统一成米,曲线立刻正常。从那以后,我每次写热辐射相关的脚本,都会在开头强制走一遍单位检查:波长是不是米、温度是不是开尔文、常数是不是国际单位制。这个习惯帮我省掉了不少返工时间。希望帮到你。本文还有配套的精品资源,点击获取