Python 做曲线拟合和求积分的方法
作者:vellerzheng 发布时间:2021-03-03 01:46:07
标签:Python,曲线,拟合,积分
这是一个由加油站油罐传感器测量的油罐高度数据和出油体积,根据体积和高度的倒数,用截面积来描述油罐形状,求出拟合曲线,再用标准数据,求积分来验证拟合曲线效果和误差的一个小项目。 主要的就是首先要安装Anaconda python库,然后来运用这些数学工具。
###最小二乘法试验###
import numpy as np
import pymysql
from scipy.optimize import leastsq
from scipy import integrate
###绘图,看拟合效果###
import matplotlib.pyplot as plt
from sympy import *
path='E:\PythonProgram\oildata.txt'
lieh0 =[] #初始第一列,油管高度
liev1 =[] #初始第二列,油枪记录的体积
h_median =[] # 高度相邻中位数
h_subtract =[] #相邻高度作差
v_subtract =[] #相邻体积作差
select_h_subtr =[] #筛选的高度作差 ########
select_v_subtr =[] #筛选的体积作差
VdtH=[] #筛选的V 和 t 的 倒数。
def loadData(Spath,lie0,lie1):
with open(Spath,'r') as f0:
for i in f0:
tmp=i.split()
lie0.append(float(tmp[0]))
lie1.append(float(tmp[2]))
print ("source lie0",len(lie0))
def connectMySQL():
db = pymysql.connect(host='10.**.**.**', user='root', passwd='***', db="zabbix", charset="utf8") # 校罐
cur = db.cursor()
try:
# 查询
cur.execute("SELECT * FROM station_snapshot limit 10 ")
for row in cur.fetchall():
# print(row)
id = row[0]
snapshot_id = row[1]
DateTime = row[13]
attr1V = row[5]
attr2H = row[6]
print("id=%d ,snapshot_id=%s,DateTime=%s,attr1V =%s, attr2H=%s ",
(id, snapshot_id, DateTime, attr1V, attr2H))
except:
print("Error: unable to fecth data of station_stock")
try:
cur.execute("SELECT * FROM can_stock limit 5");
for row in cur.fetchall():
# print(row)
stockid = row[0]
stationid = row[1]
DateTime = row[4]
Volume = row[5]
Height = row[8]
print("stockid=%d ,stationid=%s,DateTime=%s,Volume =%f, Height=%f ",
(stockid, stationid, DateTime, Volume, Height))
except:
print("Error: unable to fecth data of can_snapshot")
cur.close()
db.close()
def formatData(h_med,h_subtr,v_subtr):
lh0 = lieh0[:]
del lh0[0]
print("lh0 size(): ",len(lh0))
lh1 =lieh0[:]
del lh1[len(lh1)-1]
print("lh1 size() : ",len(lh1))
lv0 =liev1[:]
del lv0[0]
#print (liev1)
print ("Souce liev1 size() : ",len(liev1))
print ("lv1 size() :",len(lv0))
"""
lv1 =liev1[:]
del lv1[len(lv1)-1]
print("lv1 size(): ",len(lv1))
"""
h_med[:] =[(x+y)/2 for x,y in zip(lh0,lh1)] ###采样点(Xi,Yi)###
print("h_med size() : ", len(h_med))
h_subtr[:] = [(y-x) for x,y in zip(lh0,lh1)]
print("h_subtr size() : ", len(h_subtr))
# v_subtr[:] = [(y-x) for x,y in zip(lv0,lv1)]
v_subtr[:] = lv0
print("v_subtr size() : ", len(v_subtr))
def removeBadPoint(h_med,h_sub,v_sub):
for val in h_sub:
position=h_sub.index(val)
if 0.01 > val > -0.01:
del h_sub[position]
del h_med[position]
del v_sub[position]
v_dt_h_ay = [(y/x) for x, y in zip(h_sub, v_sub)]
return v_dt_h_ay
def selectRightPoint(h_med,h_subtr,v_dt_h_ay):
for val in v_dt_h_ay:
pos = v_dt_h_ay.index(val)
if val > 20 :
del v_dt_h_ay[pos]
del h_med[pos]
del h_subtr[pos]
for val in v_dt_h_ay:
ptr = v_dt_h_ay.index(val)
if val < 14:
del v_dt_h_ay[ptr]
del h_med[ptr]
del h_subtr[ptr]
def writeFile(h_mp, v_dt_h):
s='\n'.join(str(num)[1:-1] for num in h_mp)
v='\n'.join(str(vdt)[1:-1] for vdt in v_dt_h)
open(r'h_2.txt','w').write(s)
open(r'v_dt_h.txt','w').write(v)
print("write h_median: ",len(h_mp))
# print("V_dt also is (y-x) : ",v_dt_h,end="\n")
print("Write V_dt_h : ",len(v_dt_h))
# file=open('data.txt','w')
# file.write(str(h_mp));
# file.close
def integralCalculate(coeff,xspace):
vCalcute =[]
x = Symbol('x')
a, b, c, d = coeff[0]
y = a * x ** 3 + b * x ** 2 + c * x + d
i=0
while (i< len(xspace)-1) :
m = integrate(y, (x, xspace[i], xspace[i+1]))
vCalcute.append(abs(m))
i=i+1
print("求导结果:",vCalcute)
print("求导长度 len(VCalcute): ",len(vCalcute))
return vCalcute
###需要拟合的函数func及误差error###
def func(p,x):
a,b,c,d=p
return a*x**3+b*x**2+c*x+d #指明待拟合的函数的形状,设定的拟合函数。
def error(p,x,y):
return func(p,x)-y #x、y都是列表,故返回值也是个列表
def leastSquareFitting(h_mp,v_dt_hl):
p0=[1,2,6,10] #a,b,c 的假设初始值,随着迭代会越来越小
#print(error(p0,h_mp,v_dt_h,"cishu")) #目标是让error 不断减小
#s="Test the number of iteration" #试验最小二乘法函数leastsq得调用几次error函数才能找到使得均方误差之和最小的a~c
Para=leastsq(error,p0,args=(h_mp,v_dt_hl)) #把error函数中除了p以外的参数打包到args中
a,b,c,d=Para[0] #leastsq 返回的第一个值是a,b,c 的求解结果,leastsq返回类型相当于c++ 中的tuple
print(" a=",a," b=",b," c=",c," d=",d)
plt.figure(figsize=(8,6))
plt.scatter(h_mp,v_dt_hl,color="red",label="Sample Point",linewidth=3) #画样本点
x=np.linspace(200,2200,1000)
y=a*x**3+b*x**2+c*x+d
integralCalculate(Para,h_subtract)
plt.plot(x,y,color="orange",label="Fitting Curve",linewidth=2) #画拟合曲线
# plt.plot(h_mp, v_dt_hl,color="blue", label='Origin Line',linewidth=1) #画连接线
plt.legend()
plt.show()
def freeParameterFitting(h_mp,v_dt_hl):
z1 = np.polyfit(h_mp, v_dt_hl, 6) # 第一个拟合,自由度为6
# 生成多项式对象
p1 = np.poly1d(z1)
print("Z1:")
print(z1)
print("P1:")
print(p1)
print("\n")
x = np.linspace(400, 1700, 1000)
plt.plot(h_mp, v_dt_hl, color="blue", label='Origin Line', linewidth=1) # 画连接线
plt.plot(x, p1(x), 'gv--', color="black", label='Poly Fitting Line(deg=6)', linewidth=1)
plt.legend()
plt.show()
def main():
loadData(path, lieh0, liev1)
connectMySQL() # 读取oildata数据库
formatData(h_median, h_subtract, v_subtract)
# 去除被除数为0对应的点,并得到v 和 h 求导 值的列表
VdtH[:] = removeBadPoint(h_median, h_subtract, v_subtract)
print("h_median1:", len(h_median))
print("VdtH1 : ", len(VdtH))
# 赛选数据,去除异常点
selectRightPoint(h_median, h_subtract, VdtH)
print("h_median2:", len(h_median))
print("h_subtract: ", len(h_subtract))
print("VdtH2 : ", len(VdtH))
h_mp = np.array(h_median)
v_dt_h = np.array(VdtH)
writeFile(h_mp, v_dt_h)
# 最小二乘法作图
leastSquareFitting(h_mp, v_dt_h)
# 多项式自由参数法作图
freeParameterFitting(h_mp, v_dt_h)
if __name__ == '__main__':
main()
来源:https://blog.csdn.net/vellerzheng/article/details/71544511
0
投稿
猜你喜欢
- 一、在访客的内心深处做导航我讨厌迷失,不管是在道路上或是在线网络上。猜想一下?您的访客也是这样的。就像我们期望看到的道路上的路标一样,来帮助
- 一、定义新的自动求导函数在底层,每个原始的自动求导运算实际上是两个在Tensor上运行的函数。其中,forward函数计算从输入Tensor
- 前不久有个正要毕业的网友给我发邮件,他毕业设计需要实现锁屏的效果,但是他没有能看懂我之前发布的对话框源码,他问能不能把锁屏相关代码说明下,我
- 使用WSH调用系统的Ping命令,将Ping的结果重定向到一个文本文件中去,再把文本文件显示到网页中具体做法如下:首先, 建一个.BAT文件
- 过年前产假归来,jmeter很多知识生疏了,这两天打开jmeter摸索了几下,老了记不住,还是准备弄个jmeter系列随笔吧。言归正传,使用
- 本文实例讲述了python根据路径导入模块的方法,分享给大家供大家参考。具体方法如下:常规做法如下:import sys sys.path.
- 在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交
- 生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。这是
- 某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令‘de
- 按照本地时间的javascript date.getDate()方法返回月份的一天,在指定日期。由getDate返回的值是1到3
- mysql-connector-java.jar包的下载教程:1.首先我们打开mysql的官网:https://www.mysql.com/
- 本次案例使用OpenCV和selenium来解决一下滑块验证码先说一下思路:弹出滑块验证码后使用selenium元素截图将验证码整个背景图截
- 本文实例讲述了Python3爬虫爬取百姓网列表并保存为json功能。分享给大家供大家参考,具体如下:python3爬虫之爬取百姓网列表并保存
- 概述传入条件的不同,会执行不同的语句每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止。语法第一种【switch 带上表达式】sw
- 看代码吧~# 加载库import pandas as pd# 데이터프레임을 만듭니다.dataframe = pd.DataFrame()
- Js代码:vartempForm=document.createElement("form"); tempF
- 最近接触到Tencent的广告越来越多,户外广告牌和电视上都是,可以明显感觉到Tencent的扩张野心,以及对QQ品牌定位的重塑。摆脱低龄化
- Microsoft? SQL Server? 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存
- 在大三的时候,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了之,恰好最近比较有空,于是就自己参照网上的教程,搭建了属于自己的博
- 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过&ld