【发布时间】:2018-08-21 04:34:21
【问题描述】:
我从轮廓仪收集数据并尝试将收集的数据拟合到理想曲线。目的是得到曲率半径。
我编写的代码将拟合所有原始数据的曲线。
适合整个范围
问题是要指定一个范围来进行拟合。即:所有轮廓仪数据都不适合拟合。在下面的例子中,我想从 x= 180 到 x = 380
在指定范围内拟合
当然,点击指定x_start和x_end会更有帮助,但我未能从onclick中提取数据
奖励:如果我可以在更改拟合范围的同时显示 R²,那就太棒了!
感谢您的帮助
这是我想出的代码:
#importing modules
import tkinter.filedialog as tk
import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy.optimize import curve_fit
from matplotlib.widgets import Slider
#Graphic properties
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.15, bottom=0.45)
#Search and open desired file:
def openfile():
opennm = tk.askopenfile()
f = open(opennm.name,"r")
data=np.genfromtxt(f,
skip_header=6,
names=True,
dtype=None,
delimiter=',')
x=[]
y=[]
for i in range(0,len(data)-1):
x.append(data[i][0])
y.append(data[i][1])
return x,y
#after opening the file, x and y data are plotted
x,y=openfile()
k,= plt.plot(x,y)
#Define the fitting function
def func(x,ROC,x_shift,y_shift):
return ((ROC*1000)-((ROC*1000)**2-(x-x_shift)**2)**0.5-y_shift)*1000
popt, pcov = curve_fit(func, x, y, p0=[45,250,0.8],bounds=((1,100,0),(100,300,2))) #, bounds=((-np.inf,10**-8,-np.inf,-np.inf),(np.inf,3.,np.inf,np.inf))
#The fitted curve will be overlaid on raw data
l, = plt.plot(x,func(x,*popt),'r--')
list_of_para=['ROC','X shift','Y shift']
list_of_units=['mm','a.u.','um']
for i in range (0,3):
print (list_of_para[i],'= ',"%.2f" %popt[i],' ', list_of_units[i])
#definig initial values
ROC0 = popt[0]
x_shift0 = popt[1]
y_shift0 = popt[2]
#defining sliders
axcolor = 'lightgoldenrodyellow'
axROC= plt.axes([0.15, 0.05, 0.75, 0.02], facecolor=axcolor)
axx_shift= plt.axes([0.15, 0.15, 0.75, 0.02], facecolor=axcolor)
axy_shift= plt.axes([0.15, 0.25, 0.75, 0.02], facecolor=axcolor)
#define slider limites
sROC = Slider(axROC, 'ROC', popt[0]-np.absolute(popt[0]),popt[0]+np.absolute(popt[0]), valinit=ROC0)
sx_shift = Slider(axx_shift, 'X Shift', popt[1]-np.absolute(popt[1]), popt[1]+np.absolute(popt[1]), valinit=x_shift0)
sy_shift = Slider(axy_shift, 'Y shift', popt[2]-np.absolute(popt[2]), popt[2]+np.absolute(popt[2]), valinit=y_shift0)
#define slider update values
def update(val):
ROC = sROC.val
x_shift = sx_shift.val
y_shift = sy_shift.val
l.set_ydata(((ROC*1000)-((ROC*1000)**2-(x-x_shift)**2)**0.5-y_shift)*1000)
fig.canvas.draw_idle()
sROC.on_changed(update)
sx_shift.on_changed(update)
sy_shift.on_changed(update)
plt.show()
注意:您可以从此处获取轮廓仪数据示例:https://1drv.ms/u/s!AgMbHdCbxV3LatCuPSJpioDD0w0
【问题讨论】:
-
截断原始数据怎么样?请说明您的问题。
-
很难截断数据,因为从样本到样本,“感兴趣的数据”可能位于不同的 Xs 基本上我想学习如何直接从我的图表中选择一系列数据(使用指向和单击,或使用滑块)并在该特定范围内执行拟合对不起,如果我的问题不清楚
-
我的开源 Python 3 tkinter GUI 曲线和曲面拟合器可能有一些你会觉得有用的代码,并且它是 BSD 许可的。 URL 是 bitbucket.org/zunzuncode/tkinterFit - 您可以尝试使用源代码作为已经在 GUI 应用程序中创建 matplotlib 散点图和拟合模型图的起点。
-
使用您发布的数据,我发现了一个包含 5 个参数的方程,如 y = f(x),这可能有用:y= B0 + ((B1 - B0) / (1.0 + exp( (B2 + x + (B4 * x * x)) * B3))) 参数值 B0 = -7.9384178397884671E+02, B1 = -1.5270563536702939E+01, B2 = -1.1124759182908538E+02, B3 = 1.3469645323833809 01, B4 = -1.7928899581288380E-03
标签: python python-3.x curve-fitting