python应用 曲线拟合 02
前情提要
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的更多相关文章
- Python web前端 02 CSS
Python web前端 02 CSS 一.选择器 1.CSS的几种样式(CSS用来修饰.美化网页的) #建立模板 复制内容--->SETTING---> Editor -----> ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
- python应用 曲线拟合04
python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...
- Python数学建模-02.数据导入
数据导入是所有数模编程的第一步,比你想象的更重要. 先要学会一种未必最佳,但是通用.安全.简单.好学的方法. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数据导入 ...
- 【python】insertDB1.02
#------------------------------------------------------------------------------------ # insertDB1.02 ...
- Python标准库02 时间与日期 (time, datetime包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有良好的时间和日期管理功能.实际上,计算机只会维护一个挂钟时间(wa ...
- Python获取当前时间 分类: python 2014-11-08 19:02 132人阅读 评论(0) 收藏
Python有专门的time模块可以供调用. <span style="font-size:14px;">import time print time.time()&l ...
- 【python学习笔记02】python的数据类型2
列表和元组之间的主要区别是:列表括在括号([])和它们的元素和大小是可以改变的,而元组在圆括号(),不能被更新.元组可以被认为是只读列表. 存储在一个列表中的值可以使用切片操作符来访问([]和[:]) ...
随机推荐
- Socket 模拟HTTP客户端请求
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...
- MySQL数据库——查询数据
增加数据: insert into "表名" values( '字段'',字段'); 或insert into '表名'( '字段'',字段') values( '字段'',字段 ...
- C++二分查找:lower_bound( )和upper_bound( )
#include<algorithm>//头文件 //标准形式 lower_bound(int* first,int* last,val); upper_bound(int* first, ...
- 2020-06-13:Redis底层数据结构?
福哥答案2020-06-13: 福哥口诀法:简链字跳整 压快压 SDS simple synamic string:简单动态字符串.支持自动动态扩容的字节数组 .list :链表 .双端链表.dict ...
- C#LeetCode刷题之#852-山脉数组的峰顶索引(Peak Index in a Mountain Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4003 访问. 我们把符合下列属性的数组 A 称作山脉: A.le ...
- LeetCode 873. 最长的斐波那契子序列的长度 题目详解
题目详情 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_ ...
- 用WindowsAPI实现文件复制功能
用WindowsAPI实现文件复制功能 1. c代码 注释也在里面 文件名为 copyfile.c 运行出来的exe为 copyfile.exe #include <windows.h> ...
- 一、常用的Dos命令
# 查看目录下所有文件 dir # 切换目录 cd cd .. //返回上一级 # 清理屏幕 cls # 查询电脑ip地址 ipconfig # 退出终端 exit # 创建文件夹 md test # ...
- vue+vant 上传图片需要注意的事项
<van-uploader v-model="fileList" multiple :after-read="afterRead" :max-count= ...
- Python基础入门知识点——深浅拷贝
深浅拷贝 对象引用.浅拷贝.深拷贝(拓展.难点.重点) Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 拷贝 ...