137 lines
5.3 KiB
Python
137 lines
5.3 KiB
Python
# 打开文件
|
||
from scipy.optimize import curve_fit
|
||
import numpy as np
|
||
import matplotlib.pyplot as plt
|
||
import pandas as pd
|
||
import warnings
|
||
warnings.filterwarnings("ignore")
|
||
class TempModel:
|
||
def __init__(self, amfg, tcc, tcfl, tctl, fmin, fmin_temp):
|
||
self.amfg = amfg
|
||
self.tcc = tcc
|
||
self.tcfl = tcfl
|
||
self.tctl = tctl
|
||
self.fmin = fmin
|
||
self.fmin_temp = fmin_temp
|
||
|
||
def _tcf(self, f, df, dt, tctl):
|
||
tctl = self.tctl if tctl is None else tctl
|
||
tc = self.tcc + self.tcfl * df + tctl * df * df
|
||
return f + self.amfg * tc * dt * f
|
||
|
||
def compensate(self, freq, temp_source, temp_target, tctl=None):
|
||
dt = temp_target - temp_source
|
||
dfmin = self.fmin * self.amfg * self.tcc * \
|
||
(temp_source - self.fmin_temp)
|
||
df = freq - (self.fmin + dfmin)
|
||
if dt < 0.:
|
||
f2 = self._tcf(freq, df, dt, tctl)
|
||
dfmin2 = self.fmin * self.amfg * self.tcc * \
|
||
(temp_target - self.fmin_temp)
|
||
df2 = f2 - (self.fmin + dfmin2)
|
||
f3 = self._tcf(f2, df2, -dt, tctl)
|
||
ferror = freq - f3
|
||
freq = freq + ferror
|
||
df = freq - (self.fmin + dfmin)
|
||
return self._tcf(freq, df, dt, tctl)
|
||
def line_fit(x,a,b,c):
|
||
return a*x**2+b*x+c
|
||
def fit(data,tcc,tcfl,tctl):
|
||
result=[]
|
||
model.tcc=tcc
|
||
model.tcfl=tcfl
|
||
model.tctl-tctl
|
||
for j in range(len(datas)):
|
||
for i in range(len(data)):
|
||
result.append(model.compensate(datas[j][3000],35,data[i]))
|
||
return result
|
||
def area_find(temp,freq):
|
||
middle=int(len(temp)/100/2)*100
|
||
i=j=100
|
||
i_flag=True
|
||
j_flag=True
|
||
for c in range(100):
|
||
if(i_flag):
|
||
i=i+100
|
||
if middle-i>=0:
|
||
linear_params, params_covariance = curve_fit(line_fit, temp[middle-i:middle+j],freq[middle-i:middle+j],maxfev=100000,ftol=1e-10,xtol=1e-20)
|
||
minus=line_fit(temp[middle-i:middle+j],linear_params[0],linear_params[1],linear_params[2])-freq[middle-i:middle+j]
|
||
if np.sum(np.square(minus))/len(minus)>threshold:
|
||
i=i-100
|
||
i_flag=False
|
||
if(j_flag):
|
||
j=j+100
|
||
if middle+j<=len(freq):
|
||
linear_params, params_covariance = curve_fit(line_fit, temp[middle-i:middle+j],freq[middle-i:middle+j],maxfev=100000,ftol=1e-10,xtol=1e-20)
|
||
minus=line_fit(temp[middle-i:middle+j],linear_params[0],linear_params[1],linear_params[2])-freq[middle-i:middle+j]
|
||
if np.sum(np.square(minus))/len(minus)>threshold:
|
||
j=j-100
|
||
j_flag=False
|
||
linear_params, params_covariance = curve_fit(line_fit, temp[middle-i:middle+j],freq[middle-i:middle+j],maxfev=100000,ftol=1e-10,xtol=1e-20)
|
||
return linear_params
|
||
def data_process(path):
|
||
data=[]
|
||
file_path = path # 替换为你的文件路径
|
||
with open(file_path, 'r') as file:
|
||
# 逐行读取文件内容
|
||
lines = file.readlines()
|
||
# 遍历每行内容
|
||
for line in lines:
|
||
data.append(line.split(','))
|
||
file.close()
|
||
full_data=pd.DataFrame(data[1:-1],columns=data[0])
|
||
temp=np.array(full_data['temp']).astype(np.float32)
|
||
freq=np.array(full_data['freq']).astype(np.float32)
|
||
freq=freq[::100]
|
||
temp=temp[::100]
|
||
plt.plot(temp[10:],freq[10:])
|
||
linear_params=area_find(temp,freq)
|
||
plt.plot(temp,line_fit(temp,linear_params[0],linear_params[1],linear_params[2]))
|
||
data0=line_fit(np.arange(5,80,0.01),linear_params[0],linear_params[1],linear_params[2])
|
||
return data0
|
||
def main():
|
||
plt.figure(figsize=(25, 15))
|
||
paths=['./data1','./data2','./data3','./data4']
|
||
datas=[]
|
||
num=241
|
||
threshold=int(input('threshold set(recommend start from 250):\n请输入阈值设置(默认推荐250):\n'))
|
||
try:
|
||
for path in paths:
|
||
plt.subplot(num)
|
||
num+=1
|
||
datas.append(data_process(path))
|
||
except:
|
||
print("please make sure you have move the 4 data file to IDM folder\n请确认你有把4个文件拷到IDM文件夹内")
|
||
return
|
||
#反向求值
|
||
model=TempModel(1,-2.1429828e-05,-1.8980091e-10,3.6738370e-16,2943053.84,20.33)
|
||
p0=[-2.1429828e-05,-1.8980091e-10,3.6738370e-16]
|
||
params, params_covariance = curve_fit(fit,np.arange(5,80,0.01),np.hstack(datas),p0=p0,maxfev=1000000,ftol=1e-10,xtol=1e-10)
|
||
for path in paths:
|
||
plt.subplot(num)
|
||
num+=1
|
||
data=[]
|
||
file_path = path # 替换为你的文件路径
|
||
with open(file_path, 'r') as file:
|
||
# 逐行读取文件内容
|
||
lines = file.readlines()
|
||
# 遍历每行内容
|
||
for line in lines:
|
||
data.append(line.split(','))
|
||
file.close()
|
||
full_data=pd.DataFrame(data[1:-1],columns=data[0])
|
||
temp=np.array(full_data['temp']).astype(np.float32)
|
||
freq=np.array(full_data['freq']).astype(np.float32)
|
||
freq=freq[::100]
|
||
temp=temp[::100]
|
||
result0=[]
|
||
for i in range(len(temp)):
|
||
result0.append(model.compensate(freq[i],temp[i],20.66))
|
||
plt.plot(temp[10:],result0[10:])
|
||
plt.savefig('fit.png')
|
||
print('fit result:')
|
||
print('tc_tcc:'+str(params[0])+'\ntc_tcfl:'+str(params[1])+'\ntc_tctl:'+str(params[2]))
|
||
|
||
if __name__== "__main__" :
|
||
threshold=250
|
||
main() |