# Python和C++热释光和光激发光朗伯W函数辉光曲线反卷积

<details>

<summary>关键词</summary>

Python | C++ | 热释光 | 光激发光 | 朗伯W函数 | 辉光曲线 | 反卷积 | 数学 | 方程 | 数值计算 | 拟合 | 模型 | 光谱 | 物理 | 动能

</details>

{% embed url="https://viadean.notion.site/Python-C-W-7c7fbba14ca14cf39bff3b21908d2ff0" %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}

### 🎯要点

1. Python辉光曲线反卷积计算：🎯热释光、线性调制和连续波光激发光：🖊朗伯W函数 | 🖊频率因子计算 | 🖊定义模型 | 🖊选择卷积方法 | 🖊计算品质因数 | 🎯一陷阱一复合中心模型、两陷阱一复合中心模型剂量反应曲线拟合：定义用户消息、模型分析方程、给定参数拟合曲线、计算品质因数、绘图可视化。
2. 🎯C++辉光曲线分析：🖊Levenberg-Marquardt 算法 | 🖊平均平滑算法和数据尖峰平滑 | 🖊拟合发光峰的拟合模型 | 🖊优化矩阵代数
3. 🎯[Python和R热释光和光激发光朗伯W函数辉光曲线反卷积](https://viadean.notion.site/Python-R-W-1dd02b3c90d147fabb64d321dd1ea8bd)。

### 🍇Python光谱反卷积

获取多个归一化分量发射光谱并将它们拟合到“实验”测量的发射光谱，这个过程通常被称为荧光光谱反卷积、分解或解混合。这是在利用荧光分子的生物工程和纳米技术的许多实例中出现的问题。 因为荧光团发射的相对变化可以用作读数来检测纳米尺度上的相互作用或漏斗能量。 通常，为了制造更坚固的传感器，多个荧光团将同时定位在单个支架上，这将增加分析测量光谱时的复杂性，特别是当荧光团发射峰重叠和“混合”时。

现在，我需要明确一个基本假设，即，测量的发射光谱是分量光谱的线性组合。

```python
 import numpy as np
 import matplotlib.pyplot as plt
 import pandas as pd
 ​
 from numpy import dot
 from numpy.linalg import inv 
 from numpy.linalg import qr
```

首先，我们假设所有实验数据都已准备在 csv 文件中。 也就是说，您需要分解测量的光谱，以及每种成分的归一化光谱。 每个都保存到 .csv 文件中，其中第一列是波长，第二列是每个相应波长处记录的发射。

```python
 A1 = pd.read_csv('component_1.csv', index_col=0)
 A2 = pd.read_csv('component_2.csv', index_col=0)
 A3 = pd.read_csv('component_3.csv', index_col=0)
 b = pd.read_csv('measured_spectrum.csv', index_col=0)
 wavelengths = b.index.values
```

在转换数据之前将数据可视化也是一个很好的做法。因此，我们定义一个绘图函数并根据需要添加轴和图例标签。

```python
 def plot_spectra():
     ax = plt.axes()
     
     ax.set_ylabel(<y label>)
     ax.set_xlabel(<x label>)
     ax.legend(<legend>)
 ​
     plt.tight_layout()
     
     return ax
```

首先，我们查看图 1 中要解卷积的测量频谱。

```python
 ax = plot_spectra()
 ​
 ax.plot(wavelengths, b, label='Measured Spectra')
 ​
 plt.show()
```

我们可以观察到它有点复杂，有多个峰值和一些实验噪声，我添加了一些实验噪声以使其更加真实。 接下来，我们将绘制每个组件的光谱，如图 2 所示。每个光谱都经过归一化，以便在相同范围内进行比较。

```python
 A1 = A1 / A1.max() 
 A2 = A2 / A2.max() 
 A3 = A3 / A3.max() 
 ​
 ax = plot_spectra()
 ​
 ax.plot(wavelengths, A1, label='Component 1')
 ax.plot(wavelengths, A2, label='Component 2')
 ax.plot(wavelengths, A3, label='Component 3')
 plt.show()
```

由于我们之前假设测量的光谱是各分量的线性组合，因此我们可以将问题安排为线性方程组，并用一些巧妙的线性代数来求解。具体来说，我们的目标是估计哪些因子 $$\left(\beta_n\right)$$ 将缩放我们的分量 $$\left(A_n\right)$$，使得加在一起时总和等于测量的频谱 (b)​​。

方程1：

\


$$
b=A_1 \beta_1+A_2 \beta_2+A_3 \beta_3
$$

线性方程组也可以写成矩阵形式（方程2）。其中 A 是 m x n 矩阵， m 是采样波长的数量（本例中为 415 nm 到 850 nm），n 是染料成分的数量 (3) ， x 是包含未知权重$$( \beta )$$ 的 1 x n 向量，b​ 是要反卷积的频谱。

方程2：



$$
A x=b
$$

可以使用 numpy 数组在代码中轻松构建 A 矩阵。使用下面的代码，分量光谱现在成为 A 的列向量。
