前情提要


CsI 闪烁体晶体+PD+前放输出信号满足:

$U(t) = \frac{N_f\tau_p}{\tau_p-\tau_f} \left[ e^{-\frac{t}{\tau_p}}-e^{-\frac{t}{\tau_f}} \right] + \frac{N_s\tau_p}{\tau_p-\tau_s} \left[ e^{-\frac{t}{\tau_p}}-e^{-\frac{t}{\tau_s}} \right] $

其中,U(t) 表示信号输出,电压单位,N 表示闪烁体晶体发出的光中快慢成分的强度,$\tau$ 表示快慢成分的衰减时间,$\tau_p$ 表示前放衰减时间,即前放 RC 常数。

现已有 U(t) 数据,需要拟合给出快慢成分的衰减时间 $\tau$。

实现代码


# -*- coding: utf-8 -*-
"""
Created on Mon Jun 15 15:28:17 2020 @author: kurrrr
""" import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit '''
t_pre : preamplifier tau
b: number of fast photons
c: number of slow photons
p: tau of fast photons
q: tau of slow photons
u: x offset
v: y offset
''' t_pre = 26.0 def pre_func_1(x, v):
return v def pre_func_2(x, b, c, p, q, u, v):
global t_pre
return (b*t_pre/(t_pre-p) *
(np.exp(-(x-u)/t_pre)-np.exp(-(x-u)/p))
+ c*t_pre/(t_pre-q) *
(np.exp(-(x-u)/t_pre)-np.exp(-(x-u)/q))
+ v) def pre_func(x, b, c, p, q, u, v):
return np.piecewise(x, [x < u, x >= u], [lambda x: pre_func_1(x, v),
lambda x: pre_func_2(x, b, c, p, q, u, v)]) alpha_file = open("./gamma_csi.txt", "r")
data_str = alpha_file.read()
data_str = data_str.split()
data = list(map(float, data_str))
x = data[0::2]
y = data[1::2] popt, pcov = curve_fit(pre_func, x, y, [0.6, 1.2, 1, 1, 2, 0], maxfev=5000)
print(popt) plt.scatter(x, y, marker='.', label="original data")
y_fit = ([pre_func(xx, popt[0], popt[1], popt[2], popt[3], popt[4], popt[5])
for xx in x])
plt.plot(x, y_fit, label="Fitted Curve", color='red')
plt.legend(loc='upper right')
plt.show() # show the fit result
p_str = "Tf = " + str(min(popt[2], popt[3])+0.0005)[:5]
q_str = "Ts = " + str(max(popt[2], popt[3])+0.0005)[:5]
plt.text(60, 0.8, "fit result", fontdict={'size': 16, 'color': 'b'})
plt.text(60, 0.7, p_str, fontdict={'size': 16, 'color': 'b'})
plt.text(60, 0.6, q_str, fontdict={'size': 16, 'color': 'b'})
  • 使用global全局变量。
  • numpy 库的 piecewise() 函数写分段函数。注意这里的函数输入 x 是数组,输出也是数组。
  • 从 txt 文件中读取,去空格,去换行符,转数字,切片。
  • 在 curve_fit() 函数设置拟合的迭代次数。
  • y_fit 列表生成器初始化列表。
  • 在图片中加入文字。

$\alpha$ 信号拟合结果:

$\gamma$ 信号拟合结果:

python应用 曲线拟合 02的更多相关文章

  1. Python web前端 02 CSS

    Python web前端 02 CSS 一.选择器 1.CSS的几种样式(CSS用来修饰.美化网页的) #建立模板 复制内容--->SETTING---> Editor -----> ...

  2. python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程

    python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...

  3. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  4. python应用 曲线拟合04

    python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...

  5. Python数学建模-02.数据导入

    数据导入是所有数模编程的第一步,比你想象的更重要. 先要学会一种未必最佳,但是通用.安全.简单.好学的方法. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数据导入 ...

  6. 【python】insertDB1.02

    #------------------------------------------------------------------------------------ # insertDB1.02 ...

  7. Python标准库02 时间与日期 (time, datetime包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有良好的时间和日期管理功能.实际上,计算机只会维护一个挂钟时间(wa ...

  8. Python获取当前时间 分类: python 2014-11-08 19:02 132人阅读 评论(0) 收藏

    Python有专门的time模块可以供调用. <span style="font-size:14px;">import time print time.time()&l ...

  9. 【python学习笔记02】python的数据类型2

    列表和元组之间的主要区别是:列表括在括号([])和它们的元素和大小是可以改变的,而元组在圆括号(),不能被更新.元组可以被认为是只读列表. 存储在一个列表中的值可以使用切片操作符来访问([]和[:]) ...

随机推荐

  1. 图计算实现ID_Mapping、Oneid打通数据孤岛

    图计算实现ID_Mapping.Oneid打通数据孤岛 ID_Mapping与Oneid的作用 大神告诉我们Oneid能用来做什么 输入数据源格式样例 实现原理 当日代码生成 引用jar包 启动命令 ...

  2. js 打开新窗体

    function nw(repId,formulaId){ if(!repId){ repId='0' } if(!formulaId){ formulaId='0' } var url='/slsi ...

  3. C++实现哈夫曼编码/译码器(数据结构)

    设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...

  4. C#LeetCode刷题之#53-最大子序和(Maximum Subarray)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4012 访问. 给定一个整数数组 nums ,找到一个具有最大和的 ...

  5. 对于python装饰器结合递归的进一步理解

    对于python装饰器结合递归的进一步理解 代码如下: import functools def memoize(fn): print('start memoize') known = dict() ...

  6. 【luogu4137】 Rmq Problem / mex - 莫队

    题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 思路 莫队水过去了 233 #include <bits/stdc++.h> ...

  7. 虚拟化技术之kvm虚拟机创建工具virt-install

    在前边的博客中,我们创建KVM虚拟机用到了virt-manager,这个工具是一个图形化工具,创建虚拟机很方便:除此我们还是用virsh define/create +虚拟机配置文件来创建虚拟机,这种 ...

  8. 方便c号

    sf+1 amrica 7133521154 6787834569 9209397021 good 3252404966 canda 9024002798 5484815680 3438037735

  9. .NET Core + K8S + Apollo 玩转配置中心

    1.引言 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...

  10. Jmeter系列(55)- 详解 Throughput Controller 吞吐量控制器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 自行调整该控制器下的子项的执 ...