模块一:基于矩阵运算fiting curve
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 21 14:13:07 2022
@author: xujunkang
"""
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 21 13:50:54 2022
@author: xujunkang
"""
import matplotlib.pyplot as plt
import math
import numpy
import random
class LeastSqauresCF():
def __init__(self):
self.order = 1
self.Xvalues = None
self.Yvalues = None
self.fig = plt.figure()
self.subfig = self.fig.add_subplot(111)
#========================================
# Draw the input points/curve in a figure
#========================================
def ReadAnddrawInputPoints(self,Inputx=None,InputY=None, order=1):
try:
if Inputx is None or InputY is None:
return False
if(len(Inputx)!=len(InputY)):
return False
if order <=0:
return False
if type(order) !=int:
self.order = int(order)
else:
self.order = order
self.Xvalues = Inputx
self.Yvalues = InputY
self.subfig.plot(Inputx,InputY,color='r',linestyle='',marker='*')
return True
except Exception as e:
print(e)
return False
#========================================
# Calculate curve fitting factor matrix
#========================================
def produceFittingCurveFactors(self):
try:
#(1) Generate matrix [X]
matX=[]
for i in range(0,len(self.Xvalues)):
matx1=[]
for j in range(0,self.order+1):
dx=1.0
for l in range(0,j):
dx = dx * self.Xvalues[i]
matx1.append(dx)
matX.append(matx1)
#(2) Generate matrix [X]T.[X]
matX_Trans = numpy.matrix(matX).T
matX_FinalX = numpy.dot(numpy.matrix(matX_Trans),numpy.matrix(matX))
#(3) Generate matrix Y' =[X]T.[Y]
matFinalY = numpy.dot(matX_Trans,numpy.matrix(self.Yvalues).T)
#(4) Solve the function:[A] = [[X]T.[X]]**(-1).[X]T.[Y]
matAResult=numpy.linalg.solve(numpy.array(matX_FinalX),numpy.array(matFinalY))
return matAResult
except Exception as e:
print(e)
return None
#========================================
# Output fitting curve function
#========================================
def outputFittingCurveFunction(self, inputMatFactors=None):
if inputMatFactors is None:
return False
i = 0
strFitting= ""
for a in inputMatFactors:
#print(a[0])
if i==0:
strFitting +=str(a[0])
else:
strFitting +=("+"if a[0]>0 else"") +str(a[0])+(("x**"+str(i)) if i>1 else "x")
i+=1
return strFitting
print(strFitting)
#========================================
# draw the curve based on the result function
#========================================
def drawFittedCurve(self, xRangeMin=None,xRangeMax=None,matAResult=None,resolution=0.01):
try:
if matAResult is None:
return False
if xRangeMin is None or xRangeMax is None:
xRangeMin = self.Xvalues[0]
xRangeMax = self.Xvalues[-1]
#print('xRangeMin: ',xRangeMin, 'xRangeMax: ',xRangeMax)
xxa= numpy.arange(xRangeMin,xRangeMax,resolution)
yya=[]
for i in range(0,len(xxa)):
yy=0.0
for j in range(0,self.order+1):
dy=1.0
#x[i]**j
for k in range(0,j):
dy*=xxa[i]
#a[j]*(x[i]**j)
dy*=matAResult[j]
yy+=dy
yya.append(yy)
#print(xxa,yya)
self.subfig.plot(xxa,yya,color='g',linestyle='-',marker='')
self.subfig.legend()
plt.show()
return True
except Exception as e:
print(e)
return False
if __name__=="__main__":
LS = LeastSqauresCF()
#============================
#(1-1) Generate simulation data set
#============================
x = [1,2,3]
y = [2,3,4]
if LS.ReadAnddrawInputPoints(x,y,1): #plot the orginal data curve, set order=9
MatrixFactor = LS.produceFittingCurveFactors()
a=LS.outputFittingCurveFunction(MatrixFactor)
print(a)
LS.drawFittedCurve(matAResult=MatrixFactor)
模块二:利用正则表达式读取二进制文档作图
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import re
import os
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy import optimize
from curveFT import LeastSqauresCF as LCF
import random
f=open("/home/xujunkang/python/1.text")
a=f.read()
str= "[-, ][0-9].[0-9]{14}[A-Z][-,+][0-9][0-9]"
data= re.findall(str,a)
L=list(map(float, data))
N=len(L)
N2=N/32
N3=int(N2)
num= 18+(N3*33)-50
print(num)
GateV=[]
for i in range(18,num,33):
V=L[i]
GateV.append(V)
num2= 7+(N3*33)-50
DrainI=[]
for i in range(7,num2,33):
A=L[i]
DrainI.append(A)
if __name__=="__main__":
LS = LCF()
#============================
#(1-1) Generate simulation data set
#============================
x = GateV
print(x)
y = DrainI
print(y)
y1=np.log10(y)
print(y1)
if LS.ReadAnddrawInputPoints(x,y,8): #plot the orginal data curve, set order=9
MatrixFactor = LS.produceFittingCurveFactors()
a=LS.outputFittingCurveFunction(MatrixFactor)
print(a)
def fun(x):
result= -1.8379269947267623e-07+ 3.140534266406034e-05*x-0.000959143579403055*x**2+0.010720967466933243*x**3-0.055780642243223655*x**4+0.1481787577677457*x**5-0.20366287528100727*x**6+0.13898369178926293*x**7-0.03740690427393497*x**8
return result
result= fun(0.35)
print(result)
LS.drawFittedCurve(matAResult=MatrixFactor)