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

线性组合拟合中允许组分x轴(能量轴)偏移的实现方法咨询

线性组合拟合中允许组分x轴(能量轴)偏移的实现方法咨询

当然可以实现!让组分的x轴(能量)偏移来优化拟合是很常见的需求,核心思路就是给每个组分添加能量偏移参数,然后在计算拟合强度前,通过插值把偏移后的组分数据对齐到待拟合数据的能量轴上,再进行线性组合计算。

我帮你调整了代码,同时解释下关键的修改点:

第一步:保留能量轴数据

之前的代码只提取了强度,现在要保留每个组分和待拟合数据的能量列,因为我们需要基于能量轴做偏移和插值:

import pandas as pd
import numpy as np
from lmfit import Parameters, minimize

header_list=['Energy','Intensity']

# 读取三个组分数据,完整保留Energy和Intensity列
component_1 = pd.read_csv('Lineshape_average.txt', delimiter="\t", skiprows=1, names=header_list)
component_2 = pd.read_csv('Morb_11.txt', delimiter="\t", skiprows=1, names=header_list)
component_3 = pd.read_csv('PM224.txt', delimiter="\t", skiprows=1, names=header_list)

# 读取待拟合数据,明确提取目标能量轴、强度和不确定度
df1 = pd.read_csv(file_name, delimiter="\t", skiprows=1, names=header_list)
df1['unc'] = 0.1
target_energy = df1['Energy'].values
target_intensity = df1['Intensity'].values
target_unc = df1['unc'].values

第二步:添加能量偏移参数

在参数列表里给每个组分加一个偏移参数,记得设置合理的范围(比如根据你的能量数据范围,我这里假设偏移在-2到2之间,你可以根据实际情况调整):

params = Parameters()
# 线性组合系数,保持0-1的约束
params.add('a', value=0.33, min=0, max=1)
params.add('b', value=0.33, min=0, max=1)
params.add('c', value=0.33, min=0, max=1)
# 每个组分的能量偏移参数,初始值设为0(从无偏移状态开始拟合)
params.add('shift1', value=0, min=-2, max=2)
params.add('shift2', value=0, min=-2, max=2)
params.add('shift3', value=0, min=-2, max=2)

第三步:修改拟合方程,加入偏移和插值

核心就是对每个组分的能量轴做偏移,然后用插值把组分的强度数据映射到目标能量轴上,保证所有数据的能量轴一致后再计算线性组合:

def equation(params, target_energy, target_intensity, target_unc):
    a = params['a']
    b = params['b']
    c = params['c']
    s1 = params['shift1']
    s2 = params['shift2']
    s3 = params['shift3']
    
    # 对偏移后的组分能量轴做线性插值,匹配目标能量轴的强度
    # np.interp是线性插值,超出组分能量范围的部分会用边缘值填充
    c1_shifted = np.interp(target_energy, component_1['Energy'].values + s1, component_1['Intensity'].values)
    c2_shifted = np.interp(target_energy, component_2['Energy'].values + s2, component_2['Intensity'].values)
    c3_shifted = np.interp(target_energy, component_3['Energy'].values + s3, component_3['Intensity'].values)
    
    # 计算拟合强度
    calc_intensity = a * c1_shifted + b * c2_shifted + c * c3_shifted
    
    # 返回归一化后的残差
    return (target_intensity - calc_intensity) / target_unc

第四步:运行拟合并查看结果

result = minimize(equation, params, args=(target_energy, target_intensity, target_unc), nan_policy='omit')

# 打印详细拟合报告,包括参数值和误差
print(result.fit_report())

一些额外的实用建议

  • 插值方法选择:如果你的数据需要更高精度,可以用scipy.interpolate.interp1d选择三次样条插值(kind='cubic'),但要注意避免过拟合。
  • 系数约束优化:如果你的线性组合需要满足a+b+c=1(比如归一化的组分占比),可以去掉参数c,在方程里用c = 1 - a - b,同时调整a和b的范围为min=0,max=1,且a+b ≤1,这样能减少参数数量,提升拟合稳定性。
  • 偏移范围调整:一定要根据你的实际能量数据范围设置偏移的min和max,比如如果能量是0-100,偏移设为-5到5就比较合理,防止拟合出无意义的大偏移。

备注:内容来源于stack exchange,提问作者Anme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:03:05