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

news2024/12/23 9:27:02

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]

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/975285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1801. 积压订单中的订单总数;1567. 乘积为正数的最长子数组长度;923. 三数之和的多种可能

1801. 积压订单中的订单总数 核心思想:维护一个最小堆sell和一个最大堆buy,然后模拟即可。 1567. 乘积为正数的最长子数组长度 核心思想:动态规划,z表示以当前数字num结尾的乘积为正的最长子数组长度,f表示以当前数字num结尾的乘…

论文开题:成功之门的五大关键策略

研究生、博士生、学者或任何从事研究的人都会面临一个不可避免的环节——论文开题。这一阶段不仅定义了接下来研究的方向,还可能影响到整个项目的成功与否。那么,如何确保你的开题过程能够无瑕通过,还能打动评审人呢?本文将揭示论…

‘无法启动此程序,因为计算机中丢失dll’的多种解决方法分享,最有靠谱的修复方案

当你尝试启动某个程序时,可能会收到类似于"无法启动此程序,因为计算机中丢失DLL"的错误消息。这种错误可能会导致程序无法正常运行,给用户带来不便。在本文中,我们将详细介绍多种解决计算机中丢失DLL的方法,…

rk3568 SDK的buildroot添加package

开发源码工程 首先进入<SDK>/app 目录下&#xff0c;在该目录下创建一个名为“mypackage”的文件夹。 在 mypackage 目录下创建一个.c 源文件 main.c&#xff0c;以及一个 Makefile 文件。 大家可以自己在 main.c 源文件中编写一个简单的测试代码&#xff0c;譬如打印一…

韶音的耳机怎么样,韶音骨传导耳机值得入手吗

韶音关于骨传导耳机的产品在质量方面还是有着不错的表现&#xff0c;其最具代表性的骨传导耳机就是韶音OpenRun Pro&#xff0c;在国产骨传导耳机中是具备了一定的知名度&#xff0c;有着自主研发的声学技术。 最突出的点就在于颜色上多样化&#xff0c;有着经典的黑色&#xf…

Yapi接口一键生成Java代码

Yapi上定义好接口之后,转换成Java代码时费时费力,都是重复劳动,毫无意义,所以有了这个工具把程序员从大量重复劳动中解放出来。 1:修改application.properties yapi.project.token=f1a0ea09031f41e1adfa18a 获取方法如下: yapi.api.interface.ids和yapi.api.cat.id只配置…

爱校对:让法律、医疗、教育行业的文本更加无懈可击

在今天这个信息爆炸的世界里&#xff0c;文本准确性成了法律、医疗和教育这些严谨行业中一个不能忽视的要点。一个小错误可能造成严重的后果&#xff0c;甚至影响人们的生命和事业。这正是为什么更多的专业人士开始选择使用“爱校对”来确保他们的文档、研究和通讯无懈可击。 法…

Vue组件之间传值

聊一聊vue里面组件之间的传值 首先总结一下vue里面传值的几种关系&#xff1a; 如上图所示, A与B、A与C、B与D、C与F组件之间是父子关系&#xff1b; B与C之间是兄弟关系&#xff1b;A与D、A与E之间是隔代关系&#xff1b; D与F是堂兄关系&#xff0c;针对以上关系 我们把组件…

【C++模拟实现】反向迭代器的实现

【C模拟实现】反向迭代器的实现 目录 【C模拟实现】反向迭代器的实现反向迭代器的代码示例反向迭代器的模拟实现要点引入iterator模版参数rbegin()和rend()的实现 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9.5 前言&#xff1a;本篇博客主要介绍反向迭代器的实现&…

数字孪生与GIS:智慧城市的未来之路

数字孪生和地理信息系统&#xff08;GIS&#xff09;是两个在现代科技中崭露头角的概念&#xff0c;它们的融合为智慧城市项目带来了革命性的机会。本文将解释数字孪生为何需要融合GIS&#xff0c;并以智慧城市项目为例进行说明。 数字孪生是一种虚拟模型&#xff0c;它精确地…

财报解读:多品牌故事下,贝泰妮能否持续领航功效护肤?

2023年上半年&#xff0c;在消费品零售大盘整体上行之际&#xff0c;我国化妆品零售市场也实现了回暖。据国家统计局数据&#xff0c;上半年&#xff0c;全国社会消费品零售总额为227588亿元&#xff0c;同比增长8.2%。其中&#xff0c;化妆品零售总额为2071亿元&#xff0c;同…

苹果电脑系统性能检测 Geekbench 6 for Mac

Geekbench 是一款流行的跨平台基准测试工具&#xff0c;用于评估计算机和移动设备的性能。它可以测量处理器、内存、图形处理器和存储设备等硬件的性能&#xff0c;并生成相应的性能评分。 Geekbench 提供了简单易用的用户界面&#xff0c;用户只需点击运行测试即可开始评估设…

攻防世界-Hear-with-your-Eyes

原题 解题思路 是一个没有后缀的文件&#xff0c;题目提示要用眼睛看这段音频&#xff0c;notepad打开文件&#xff0c;没什么东西。 加后缀zip再解压看看。 使用Audacity打开音频文件

使用 Web HID API 在浏览器中进行HID设备交互(纯前端)

文章目录 目的基础说明示例工程&#xff08;HID透传测试工具&#xff09;总结 目的 最近再搞HID透传 《STM32 USB使用记录&#xff1a;HID类设备&#xff08;后篇&#xff09;》 。 市面上的各种测试工具都或多或少存在问题&#xff0c;所以就自己写一个工具进行测试。目前来…

运动耳机选购攻略、好的运动耳机推荐

如今&#xff0c;蓝牙耳机不仅是手机的最佳伴侣&#xff0c;也成为了运动爱好者的必备装备。但是&#xff0c;在如此众多的蓝牙耳机中&#xff0c;你是否对选购感到困惑呢&#xff1f;实际上&#xff0c;选择适合运动的蓝牙耳机需要考虑许多因素&#xff0c;如舒适度、稳固性、…

app自动化测试(Android)

Capability 是一组键值对的集合&#xff08;比如&#xff1a;"platformName": "Android"&#xff09;。Capability 主要用于通知 Appium 服务端建立 Session 需要的信息。客户端使用特定语言生成 Capabilities&#xff0c;最终会以 JSON 对象的形式发送给 …

气象站的构成及功能应用

气象站是一种用于观测、记录和报告天气数据的设备。它是由数据采集系统、通讯系统、供电系统和立杆支架构成。 一、气象站的构成&#xff1a; 数据采集系统&#xff1a;用于测量气温、湿度、风速、风向、气压、降雨量、雪深等气象参数。 通讯系统&#xff1a;收集和处理传感…

深度解析lettuce,为什么单连接也可以处理高并发redis请求

简介 什么是lettuce Spring Boot自2.0版本开始默认使用Lettuce作为Redis的客户端&#xff08;注1&#xff09;。Lettuce客户端基于Netty的NIO框架实现&#xff0c;对于大多数的Redis操作&#xff0c;只需要维持单一的连接即可高效支持业务端的并发请求 —— 这点与Jedis的连接…

电子科大软件系统架构设计——面向对象建模基础

文章目录 面向对象建模基础UML建模语言UML模型图用例图活动图类图顺序图通信图状态机图构件图部署图包图对象图组合结构图扩展图交互概览图时间图 BPMN建模语言业务建模定义模型元素流对象活动事件网关 流数据人工制品泳池和泳道 建模案例订单采购流程建模电商系统订货业务流程…

ITIL重大事件管理综合指南

什么是ITIL中的重大事件 重大事件是一个高影响力的紧急问题&#xff0c;通常影响整个组织或其主要部分。重大事件几乎总是导致组织的服务变得不可用&#xff0c;从而导致该组织的业务受到打击&#xff0c;并最终影响其财务状况。重大事件可以通过两种方式影响组织的服务&#…