You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

光谱仪数据拟合Planck曲线失败求助:强度刻度问题排查

解决Planck曲线拟合失败的问题

你的拟合失败核心原因是Planck函数的输出量纲和实验强度不匹配:实验数据是相对强度值,而标准Planck公式计算的是绝对光谱辐出度,两者量级差数个数量级,且缺少缩放因子来匹配数据。另外你只以温度作为拟合参数,没有考虑强度比例的差异,导致曲线完全无法对齐实验数据。

关键修改点

  • 给Planck函数添加强度缩放因子A,用来匹配实验数据的强度量级
  • 调整拟合初始参数,同时给出温度和缩放因子的初始猜测值
  • 给拟合参数设置合理边界,避免出现无意义的负数结果

修正后的代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

h = 6.62607015e-34
c = 299792458
kb = 1.380649e-23

# 修改Planck函数,加入强度缩放因子A
def planck_curve(wavelength, T, A):
    # 计算标准Planck光谱辐出度
    spectral_radiance = (2 * h * c ** 2 / wavelength ** 5) * (1 / (np.exp(h * c / (wavelength * kb * T)) - 1))
    # 用缩放因子匹配实验强度量级
    return A * spectral_radiance

# 读取数据(替换为你的数据文件路径,或直接导入pastebin中的数据内容)
data = pd.read_csv('your_data.csv')
wavelength = data['Wavelength'] / 1e9  # 将纳米转换为米,匹配Planck公式单位
intensity = data['Intensity']

# 设置初始参数:温度初始猜测3000K,缩放因子根据数据量级设为1e-12
# 添加参数边界:温度>0,缩放因子>0,避免无意义的拟合结果
popt, pcov = curve_fit(planck_curve, wavelength, intensity, 
                       p0=(3000, 1e-12), 
                       bounds=((2000, 1e-15), (5000, 1e-10)))

plt.plot(wavelength, intensity, label='实验数据')
plt.plot(wavelength, planck_curve(wavelength, *popt), label='Planck拟合曲线', color='red')
plt.xlabel('波长 (m)')
plt.ylabel('强度')
plt.title('波长-强度关系与Planck曲线拟合')
plt.legend()
plt.grid(True)
plt.show()

T_fit, A_fit = popt
print(f"拟合温度: {T_fit:.1f} K")
print(f"强度缩放因子: {A_fit:.2e}")

额外提示

  1. 若你的数据是相对强度,缩放因子A仅用于匹配曲线比例,无实际物理意义
  2. 可以用维恩位移定律估算温度初始值:T = 2.898e-3 / lambda_peak(lambda_peak为数据峰值波长,单位米),能提升拟合效率
  3. 确保全程波长单位统一(代码中已转换为米,与Planck公式要求一致)

内容的提问来源于stack exchange,提问作者flowist9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:46:12