大家好?我是Kepler哎学习,最近在工程中用到曲线拟合。一般我们都是用matlab来做,方便快捷。我们也可以尝试用python编写脚本来拟合数据,方便数据自动化处理。
曲线拟合分为一般多项式拟合和指定函数拟合。
准备工作:
1.建立python环境(https://www.jianshu.com/p/daf5d33ae62e)
2.安装模块numpy、matplotlib、scipy(自行百度)
代码编写:
多项式拟合
1.创建文件mult.py
import numpy as np # 导入模块
from sys import argv
import matplotlib.pyplot as plt
script,x_data,y_data,order = argv # 参数变量
x_data = x_data.split(",") # 将字符串拆分成字符列表
x_data = [float(i) for i in x_data] # 将字符列表转换为数字列表
y_data = y_data.split(",")
y_data = [float(i) for i in y_data]
x = np.array(x_data)
print("x is: \n",x)
y = np.array(y_data)
print("y is:\n",y)
f1 = np.polyfit(x,y,int(order)) # 获取拟合函数的系数
print("f1 is:\n",f1)
p1 = np.poly1d(f1)
print("p1 is:\n",p1)
yvals = p1(x)
print('yvals is:\n',yvals)
plot1 = plt.plot(x,y,'s',label = 'original values')
plot2 = plt.plot(x,yvals,'r',label = 'polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4)
plt.title('polyfitting')
plt.show()
2.进行测试:
在文件所在文件夹shift+鼠标右键打开PowershellShift+鼠标右键
在Powershell中输入程序执行命令两个点1阶多项式拟合
进行二阶拟合10个点 2阶拟合
进行八阶拟合8个点 8阶拟合
指定函数拟合
1.创建fxgiven.py:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit # 导入拟合函数
from sys import argv
script,x_data,y_data = argv # 参数变量
x_data = x_data.split(",") # 将字符串拆分成字符列表
x_data = [float(i) for i in x_data] # 将字符列表转换为数字列表
y_data = y_data.split(",")
y_data = [float(i) for i in y_data]
x = np.array(x_data)
y = np.array(y_data)
def fx(x,a,b):
return a*np.exp(b/x)
popt, pcov = curve_fit(fx, x, y) # pcov 估计的popt的协方差
print(popt) # popt满足函数参数最佳值
yvals=fx(x,popt[0] ,popt[1]) # 求出拟合后对应点
print(yvals)
p1=plt.plot(x, y, '*',label='original values')
p2=plt.plot(x, yvals, 'r',label='curve_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4) # 指定legend的位置,读者可以自己help它的用法
plt.title('curve_fit')
plt.savefig('p2.png')
plt.show()
2.进行测试:
在Powershell中输入程序执行命令6个点拟合y=a*exp(b/x)
专栏文章仅作个人学习记录,如有错误,欢迎批评指正。