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

如何修改普朗克函数实现读取CSV光谱数据并解决调用传参报错问题

错误原因分析

  • 最直接的报错原因:你修改后的planck_W方法定义仅接收self这1个类实例参数,但调用时你还传入了s.wavelength作为第二个参数,参数数量不匹配触发报错。
  • 另外你现有代码还有其他逻辑问题:
    • 每次调用planck_W都重复读取CSV文件,性能极低,完全没必要
    • 你读取的光谱数据存在self.spectra_list这个DataFrame里,直接调用self._xx是取不到值的,需要先指定你要使用的某一条光谱的_xx、_yy字段
    • interp1d返回的是插值函数对象,不是直接的辐亮度计算结果,需要调用这个返回的函数才能得到对应波长的数值

修改方案

第一步:调整类初始化逻辑,仅读取一次光谱并预生成插值函数

把CSV读取、插值函数生成的逻辑放到类的__init__方法里,避免重复执行:

from scipy.interpolate import interp1d
import pandas as pd
from ast import literal_eval
import numpy as np

# 你的类的__init__方法里添加以下逻辑
def __init__(self):
    # 其他原有初始化逻辑保留
    # 仅读取一次光谱CSV
    self.spectra_list = pd.read_csv('solar.csv', converters={'_xx': literal_eval, '_yy': literal_eval})
    # 选择你要使用的光谱:取第一行用iloc[0],按名称选可以替换为self.spectra_list.query("光谱名称列名 == '你要用的光谱名'").iloc[0]
    target_spectrum = self.spectra_list.iloc[0]
    xx = np.array(target_spectrum['_xx']) * 1e-9
    yy = np.array(target_spectrum['_yy'])
    # 预生成插值函数,存在实例属性里,不用每次调用都生成,fill_value参数避免输入波长超出范围报错
    self.solar_interp = interp1d(xx, yy, kind='linear', fill_value="extrapolate")

第二步:重写planck_W方法,支持传入波长参数返回对应辐亮度

def planck_W(self, x):
    # x为输入的波长数组,直接调用预生成的插值函数返回对应辐亮度
    return self.solar_interp(x)

第三步:调整调用逻辑

原来的调用代码删除传入的温度参数即可(实测光谱不需要温度输入),注意补全simpson积分需要的第二个自变量参数:

n0 = simpson(planck_W(s.wavelength), s.wavelength)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:06:04