使用python对光谱数据进行lorentz峰值拟合(bounds限定拟合参数范围)

2023-11-19

1、lorentz峰值拟合

发光光谱是一种用于表征二维半导体材料光学性质的重要技术,它可以反映出材料中的载流子密度、缺陷态、激子束缚能等信息。

由于二维半导体材料的厚度极其薄,其发光信号往往很弱,且受到基底、环境和测量设备等因素的干扰,因此需要对发光光谱进行合理的数据处理和分析,以提取出准确和可靠的物理参数。

Lorentz峰值拟合是一种常用的数据处理方法,原理是假设每个峰值都是由一个或多个激子态产生的,每个激子态都可以用一个复数表示其能量和寿命,然后利用最小二乘法求解出最佳拟合参数,可以用来描述二维半导体材料发光谱的单个或者多个峰值,从而得到峰值位置、强度、宽度等参数。

对光谱进行Lorentz峰值拟合可以有效地提高数据质量和分析精度,能够更精确地确定激子峰的位置和强度,从而研究材料的特征。

函数形式如下:

L ( x ) = A π 1 2 Γ ( x − x 0 ) 2 + ( 1 2 Γ ) 2 L(x) = \frac{A}{\pi} \frac{\frac{1}{2}\Gamma}{(x-x_0)^2 + (\frac{1}{2}\Gamma)^2} L(x)=πA(xx0)2+(21Γ)221Γ

其中,x是光谱的横坐标(波长或波数), x 0 x_0 x0是峰值的位置,A是峰值的幅度, Γ \Gamma Γ是峰值的半宽度(与峰值的展宽程度有关)。

拟合过程通过调节参数 x 0 x_0 x0、A和 Γ \Gamma Γ来使得lorentzian函数尽可能拟合实际的光谱峰值。

在实际的拟合过程中,可以用下面的简易形式:

L ( x ) = A Γ 2 ( x − x 0 ) 2 + Γ 2 L(x) = \frac{A\Gamma^2}{(x-x_0)^2 + \Gamma^2} L(x)=(xx0)2+Γ2AΓ2

注意:我的csv文件,第一列为波长,第二列为光子数(光强)。

2、单峰拟合

# 在Python中,可以使用科学计算库SciPy来实现对光谱数据的Lorentz峰值拟合。
# 我们首先定义了一个Lorentzian函数,并生成了一个模拟的光谱数据,其中加入了一些随机噪声。
# 然后,我们使用curve_fit函数进行拟合,其中p0参数是初始猜测的参数。
# 最后,我们绘制了原始数据和拟合结果的图像,并打印出拟合得到的参数。

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

# 定义Lorentzian函数
def lorentzian(x, x0, A, gamma):
    return A * gamma**2 / ((x - x0)**2 + gamma**2)

# # 生成模拟的光谱数据
# x_data = np.linspace(500, 700, 200)
# true_params = [600, 1000, 20]  # 真实的参数:x0:峰值位置; A:峰值幅度; gamma:峰值的半宽度
# y_data = lorentzian(x_data, *true_params) + np.random.normal(0, 50, len(x_data))  # 加入噪声
# wavelength = x_data
# intensity = y_data


# 读取光谱数据
file_path = r'your-path-of-csv'
data = pd.read_csv(file_path, header=None)

wavelength = data.iloc[:, 0]
intensity = data.iloc[:, 1]


# 进行拟合
'''
初始猜测的参数,根据实际数据和仿真结果对initial_guess进行调整
注意:如果遇到下面的错误:
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1400.
默认情况下curve_fit函数的最大迭代次数是1400次,如果出现这样的报错,
可以尝试提供更合理的初始猜测值,有时候初始猜测值不合适可能会导致拟合无法收敛。

要确保得到的 Lorentz 峰的基数为正值且为 0,可以在拟合参数中限制 A(峰值幅度)的范围。
在 curve_fit 函数中,使用 bounds 参数来限制拟合参数的范围。
设置一个较小的正数作为峰值幅度的下限,确保其为正值。 

bounds 参数是一个包含两个元组的列表,每个元组表示一个参数的范围。
元组中的第一个值表示参数的下界(最小值),第二个值表示参数的上界(最大值)。
拟合算法会在这个范围内搜索最优的参数值。
'''

initial_guess = [1170, 100, 20]  # 初始猜测的参数:x0, A, gamma

# 设置参数范围
x0_lower_bound = 1100  # x0 的下界
x0_upper_bound = 1300  # x0 的上界
A_lower_bound = 0  # A 的下界,确保为正值
A_upper_bound = np.inf  # A 的上界,根据需要设置
gamma_lower_bound = 0  # gamma 的下界,可以为 0
gamma_upper_bound = np.inf  # gamma 的上界,根据需要设置

# 将参数范围转换为 bounds 参数格式
bounds = ([x0_lower_bound, A_lower_bound, gamma_lower_bound],
          [x0_upper_bound, A_upper_bound, gamma_upper_bound])
fit_params, _ = curve_fit(lorentzian, wavelength, intensity, p0=initial_guess, bounds=bounds)

# 绘制拟合结果
plt.plot(wavelength, intensity, label='Original Spectrum')
plt.plot(wavelength, lorentzian(wavelength, *fit_params), color='red', label='Fit peak: ' + "{:.1f}".format(fit_params[0]))
plt.legend()
plt.xlabel('Wavelength')
plt.ylabel('Intensity')
plt.title('Lorentzian Peak Fitting')
plt.show()

print('Fit parameters:', fit_params)

输出:

Fit parameters: [1173.7909121   117.90768115   18.34664239]

在这里插入图片描述

2、双峰拟合

在单峰的基础上增加一个双洛伦兹函数:

# 定义双Lorentzian函数作为拟合模型
def double_lorentzian(x, x1, A1, gamma1, x2, A2, gamma2):
    return lorentzian(x, x1, A1, gamma1) + lorentzian(x, x2, A2, gamma2)

然后再进行拟合:

fit_params, _ = curve_fit(double_lorentzian, wavelength, intensity, p0=initial_guess)

最后打印出结果:

Fit parameters: [1163.66742694  370.85710156   19.65005682 1188.70437071  416.71761075
   28.27593917]

在这里插入图片描述

如果不加上bounds的限定,可能会出现下面的情况:

Fit parameters: [1158.58048679  455.68236771   30.18819224 1138.46591814 -137.99431639
   54.30198123]

在这里插入图片描述
显然,lorentz峰值为负数并不符合预期、也不具有物理意义。

因此,需要针对拟合函数的形式加上bounds的限定:


# 设置参数范围
x0_lower_bound = 1100  # x0 的下界
x0_upper_bound = 1300  # x0 的上界
A_lower_bound = 0  # A 的下界,确保为正值
A_upper_bound = np.inf  # A 的上界,根据需要设置
gamma_lower_bound = 0  # gamma 的下界,可以为 0
gamma_upper_bound = np.inf  # gamma 的上界,根据需要设置

# 将参数范围转换为 bounds 参数格式
bounds = ([x0_lower_bound, A_lower_bound, gamma_lower_bound,
           x0_lower_bound, A_lower_bound, gamma_lower_bound],
          [x0_upper_bound, A_upper_bound, gamma_upper_bound,
           x0_upper_bound, A_upper_bound, gamma_upper_bound])

fit_params, _ = curve_fit(double_lorentzian, wavelength, intensity, p0=initial_guess, bounds=bounds)

得到的结果如下:

Fit parameters: [1155.27544155  241.21928542   15.87907758 1173.56139486  161.41922224
   22.41430758]

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python对光谱数据进行lorentz峰值拟合(bounds限定拟合参数范围) 的相关文章

  • numba 函数何时编译?

    我正在研究这个例子 http numba pydata org numba doc 0 15 1 examples html multi threading http numba pydata org numba doc 0 15 1 ex
  • Python Popen 与 psexec 挂起 - 不良结果

    我对 subprocess Popen 和我认为是管道的问题有疑问 我有以下代码块 从 cli 运行时 100 都不会出现问题 p subprocess Popen psexec serverName get cmd c ver echo
  • django_openid_auth TypeError openid.yadis.manager.YadisServiceManager 对象不是 JSON 可序列化

    I used django openid auth在我的项目上 一段时间以来它运行得很好 但今天 我测试了该应用程序并遇到了这个异常 Environment Request Method GET Request URL http local
  • 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

    我在 Cloud9 中使用 Python AWS CDK 并且我部署简单的 Lambda 函数那应该是发送 API 请求到 Atlassian 的 API当对象上传到 S3 存储桶时 也是由 CDK 创建的 这是我的 CDK 堆栈代码 fr
  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 掌握 Effective C++ : 条款01

    背景 Effective C 是每个 C 程序员都应该读的经典之作 书中涵盖了 C 编程中的一系列最佳实践 包括了面向对象设计 模板 STL 异常处理等方面的内容 由于 C 的发展非常迅速 书中的某些内容可能已经过时 但依然是值得好好学习的
  • abc300.com站点被注入脚本

    在进行abc300 com的页面SEO时发现 所有页面受到注入攻击 全部asp页最后被添加一页 弄了1个多小时 大部份页面被清除 目前已经获得www hulijie com的ftp 222 33 63 206 用户名admin 密码尚需分析
  • postgresql 高可用框架对比

    PostgreSQL 的高可用框架有许多种 每种都有其独特的优缺点 下面是一些常见的高可用框架的对比 Pgpool II 这是一个开源的负载均衡和数据库代理 支持主从复制和读写分离 它的优点在于易于安装和使用 缺点是不支持实时备份 Repm
  • Log4Net 日志管理

    Log4Net日志管理 A Log4Net日志管理 Log4Net的日志级别如下 级别 允许的方法 Boolean属性 优先级别 OFF Highest FATAL void Fatal bool IsFatalEnabled RROR v
  • 函数的节流与防抖

    1 节流 节流的意思是 规定时间内 只触发一次 比如我们设定500ms 在这个时间内 无论点击按钮多少次 它都只会触发一次 具体场景可以是抢购时候 由于有无数人 快速点击按钮 如果每次点击都发送请求 就会给服务器造成巨大的压力 但是我们进行
  • C语言-求因子和

    求因子和 题目描述 一个数的因子和不包括它本身的所有因子之和 如12的因子有1 2 3 4 6所以12的因子和是16 现在给定一个数n n lt 10 9 求它的因子和 输入格式 一个数 输出格式 一个数 样例输入 12 样例输出 16 提
  • 有趣的MyBatis——延迟加载

    为什么80 的码农都做不了架构师 gt gt gt 我们知道在resultMap中使用级联对于查找相关数据来说很方便 比如说查找雇员基本信息 顺便得到了雇员的体检信息 家庭信息 部门信息 但是有时我们不需要相关数据 那么在一些复杂的系统中
  • 初学MaxCompute

    MaxComputer是阿里云提供的一种全新的大数据计算服务 其具备更高效的计算及存储能力 本人的理解就是一个类似于HBase Hive的云上的数据仓库 参考官方文档系列 https yq aliyun com articles 85595
  • “ping“不是内部或外部命令,也不是可运行的程序 或批处理文件。

    输入ping 出现问题 ping 不是内部或外部命令 也不是可运行的程序或批处理文件 我的电脑 属性 高级系统设置 环境变量 系统变量 PATH 编辑 输入C Windows System32 再次输入ping 即表示可以了
  • 数据迁移时,需要大量set时的批量操作

    我遇到了一种情况 A类有很多的数据 需要迁移到新的A类或者和字段和A类相同的数据 例如 A1 A2 A3 A4 A100 需要进行批量操作 A1 gt 例 加密 A2 gt 加密 每个字段或部分字段都需要加密 那么正常的情况下需要有多少字段
  • C语言入门

    什么是C语言 C语言是一门通用计算机编程语言 广泛应用于底层开发 C语言的设计目标是提供一种能以简易 的方式编译 处理低级存储器 产生少量的机器码以及不需要任何运行环境支持便能运行的编程 语言 尽管C语言提供了许多低级处理的功能 但仍然保持
  • 谈谈BFC

    谈谈BFC 介绍 BFC Block Formatting Context 块级格式化上下文 它理解成一个独立的区域 此区域里面的子元素不会影响到外面的元素 反之也如此 BFC布局规则 内部的Box会在垂直方向 一个接一个地放置 Box垂直
  • 服务器选哪个系统,服务器选择哪个操作系统

    服务器选择哪个操作系统 内容精选 换一换 裸金属服务器在详情页面显示的云硬盘设备名称与操作系统内部的设备名称不一致 为防止设备名称变化对业务造成影响 建议通过UUID的方式使用云硬盘 当携带云硬盘创建裸金属服务器完成后 裸金属服务器详情界面
  • DenyHosts安装与部署

    DenyHosts是Python语言写的一个程序软件 运行于Linux上预防SSH暴力破解的 它会分析sshd的日志文件 var log secure 当发现重复的攻击时就会记录IP到 etc hosts deny文件 从而达到自动屏IP的
  • Http协议详解

    引入 超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 1960年美
  • 日赚4.12亿,腾讯最新员工薪酬公布:均薪破100万!!!

    近日 腾讯发布2023年第二季度财报 有一项数据冲上热搜 引起热议 据计算 腾讯人均年薪破100万 网友直呼 酸了酸了 这是认真的吗 跟随播妞一起来看看吧 腾讯员工平均年薪达100万 从大厂财报看互联网行业回暖之势 近日 腾讯发布截至6月3
  • [Python]保姆级win11环境安装Python

    1 下载安装包 https www python org downloads 选择自己的系统对应的安装包 我的是Windows系统 我就直接选择它了 选择64位安装包 根据自己系统对应的安装包 2 开始安装 去下载路径下 双击源文件 开始安
  • LeetCode第321场周赛题解

    这周周赛没有什么过多难的 也是可以自己写完的 芜湖 第一道题 6245 找出中枢整数 给你一个正整数 n 找出满足下述条件的 中枢整数 x 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和 返回中枢整数 x 如果不存在中枢整
  • Android之RecyclerView多布局

    做一个项目的主页面的时候 想要它呈现出来的效果 不单一 更丰富那就要使用多布局来展现出来 那么就要思考一个问题 他呈现的是多个布局 怎么才能展现出来不同的布局 逻辑很简单 通过设置几个flag 来表示这些布局当前显示的是哪个布局 接下来 和
  • 使用python对光谱数据进行lorentz峰值拟合(bounds限定拟合参数范围)

    1 lorentz峰值拟合 发光光谱是一种用于表征二维半导体材料光学性质的重要技术 它可以反映出材料中的载流子密度 缺陷态 激子束缚能等信息 由于二维半导体材料的厚度极其薄 其发光信号往往很弱 且受到基底 环境和测量设备等因素的干扰 因此需