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()
 

以上这篇Python 做曲线拟合和求积分的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现数值积分方式

    原理: 利用复化梯形公式,复化Simpson公式,计算积分. 步骤: import math """测试函数""" def f(x,i): if i == 1: return (4 - (math.sin(x)) ** 2) ** 0.5 if i == 2: if x == 0: return 1 else: return math.sin(x) / x if i == 3: return (math.exp(x)) / (4 + x ** 2

  • 利用python求积分的实例

    python的numpy库集成了很多的函数.利用其中的函数可以很方便的解决一些数学问题.本篇介绍如何使用python的numpy来求解积分. 代码如下: # -*- coding: utf-8 -*- import numpy as np from scipy.integrate import quad,dblquad,nquad def main(): print quad(lambda x:np.exp(-x),0,np.inf) '''求积分,np.inf代表正无穷. 结果第一个数值代表运

  • python编程通过蒙特卡洛法计算定积分详解

    想当初,考研的时候要是知道有这么个好东西,计算定积分...开玩笑,那时候计算定积分根本没有这么简单的.但这确实给我打开了一种思路,用编程语言去解决更多更复杂的数学问题.下面进入正题. 如上图所示,计算区间[a b]上f(x)的积分即求曲线与X轴围成红色区域的面积.下面使用蒙特卡洛法计算区间[2 3]上的定积分:∫(x2+4*x*sin(x))dx # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt

  • Python超越函数积分运算以及绘图实现代码

    编译环境:ubuntu17.04 Python3.5 所需库:numpy.scipy.matplotlib 下面是理想平面的辐射强度计算(课程大作业---) 1.超越函数积分运算 def integral(x,c1,c2,T): return ((c1*0.98)/(x**5))*(1/((np.e**(c2/(x*T)))-1)) resut,err = integrate.quad(integral, 3, 5, args=(c1,c2,T)) 2.绘图实现 plt.figure(1) ax

  • python 计算积分图和haar特征的实例代码

    下面的代码通过积分图计算一张图片的一种haar特征的所有可能的值.初步学习图像处理并尝试写代码,如有错误,欢迎指出. import cv2 import numpy as np import matplotlib.pyplot as plt # #计算积分图 # def integral(img): integ_graph = np.zeros((img.shape[0],img.shape[1]),dtype = np.int32) for x in range(img.shape[0]):

  • Python 做曲线拟合和求积分的方法

    这是一个由加油站油罐传感器测量的油罐高度数据和出油体积,根据体积和高度的倒数,用截面积来描述油罐形状,求出拟合曲线,再用标准数据,求积分来验证拟合曲线效果和误差的一个小项目. 主要的就是首先要安装Anaconda  python库,然后来运用这些数学工具. ###最小二乘法试验### import numpy as np import pymysql from scipy.optimize import leastsq from scipy import integrate ###绘图,看拟合效

  • python做反被爬保护的方法

    网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护.于是,很多网站开始反网络爬虫,想方设法保护自己的内容. 一: User-Agent +Referer检测 User-Agent 是HTTP协议的中的一个字段, 其作用是描述发出HTTP请求的终端的一些信息. 使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等. 服务器通过这个字

  • 复化梯形求积分实例——用Python进行数值计算

    用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式. 学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上在大部分场景下这是行不通的. 插值函数一般是一个不超过n次的多项式,如果用插值函数来求积分的话,就会引进高次多项式求积分的问题.这样会将原来的求积分问题带到另一个求积分问题:如何求n次多项式的积分,而且当次数变高时,会出现龙悲歌现象,误差反而可能会增大,并且高次的插值求积公式有可能会变得不稳定:详细原因不赘述. 牛顿-科特斯公式解决这一问题的办法是将大的插

  • Python实现CET查分的方法

    Python CET自动查询方法需要用到的python方法模块有:sys.urllib2 本文实例讲述了Python实现CET查分的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #!/usr/bin/python # -*- coding: utf-8 -*- import sys, urllib2 def CetQuery(band, exam_id):     """CETQuery version 0.2  2009.2.28     An Ex

  • 使用python将图片按标签分入不同文件夹的方法

    给定图像集如下,所有类别的图片均在一个文件夹内: 给定与图片名相匹配的表格,声明每张图片对应的类别(共有20个类别): 那么,如何根据表格中所给的类别将图片分入对应的文件夹内呢?以我的情况为例,我想将图片分为20类(CATEGORY_ID有0-19共20类),可利用下面的代码进行分类(经细心网友指正,代码已做出修改). #引入相关库 import pandas as pd import os import shutil #用于移动文件 #打开表格文件并读取 f=open("list.csv&qu

  • Python龙贝格法求积分实例

    我就废话不多说了,直接上代码吧! # 龙贝格法求积分 import math a=0 # 积分下限 b=1 # 积分上限 eps=10**-5 # 精度 T=[] # 复化梯形序列 S=[] # Simpson序列 C=[] # Cotes序列 R=[] # Romberg序列 def func(x): # 被积函数 y=math.exp(-x) return y def Romberg(a,b,eps,func): h = b - a T.append(h * (func(a) + func(

  • python之PyAutoGui教你做个自动脚本计算器的方法

    前提环境准备 python3+pillow+pyautogui 先提前安装好python3以及pillow和pyautogui模块 这里介绍一下模块安装方法 pip install pillow pip install pyautogui pip install opencv-python 最终效果是利用python脚本模拟电脑计算器进行自动计算,相当于模拟人去点击自带的计算器进行运算,想要做到这一点需要有两个条件: 1.模拟鼠标和键盘的输入工作 2.识别计算器按钮的位置 先来看一下win10电

  • python tkinter 做个简单的计算器的方法

    背景 最近本菜鸡在学习 python GUI,从 tkinter 入门,想先做个小软件练习一下 思来想去,决定做一个 计算器 设计思路 首先,导入我们需要的包 - tkinter,并通过 实例化一个 Tk 对象 创建窗口 因为我有点菜,目前还把控不好各组件的位置,所以窗口使用自动默认的大小 import tkinter as tk import tkinter.messagebox win = tkinter.Tk() win.title("计算器") win.mainloop() 大

  • Python做文本按行去重的实现方法

    文本: 每行在promotion后面包含一些数字,如果这些数字是相同的,则认为是相同的行,对于相同的行,只保留一行. 思路: 根据字典和字符串切割. 建立一个空字典. 读入文本,并对每行切割前半部分,在读入文本的过程中循环在这个字典中查找,如果没找到,则写入该行到字典.否则,则表示该行已经被写入过字典了(即出现重复的行了),不再写入字典,这就实现了对于重复的行只保留一行的目的. 文本如下: /promotion/232 utm_source /promotion/237 LandingPage/

随机推荐