Files
IDM/arg_fit.py
Sgr A* VMT b975348ec9 update arg_fit.py.
Signed-off-by: Sgr A* VMT <1611902585@qq.com>
2023-11-27 03:18:39 +00:00

137 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 打开文件
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__" :
threshold250
main()