最近课设经常要插值,拟合什么的,觉得需要总结下使用的工具,我主要使用了三种方式来实现。
matlab
1.首选matlab工具箱
将我们准备好的数据事先给变量(这里应该叫什么不记得了,这里放下我的数据)
x = [760,2240,3480,3805,4720,5960,7200,9920]
y1 = [273,215,153.5,111.5,83,64,53,47.5]
之后输入
cftool
之后就就进入工具箱界面了,拟合参数意思以及选用什么拟合这里不介绍了,可自由选择
按照如下选择,进入平时绘图的页面
就可以跟普通画图一样看图形了
2.使用拟合函数ployfit
polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值。
这里我用的样例如下:
x=[760,2240,3480,3805,4720,5960,7200,9920];
y1=[273,215,153.5,111.5,83,64,53,47.5];
y2=[215,211.5,172.5,125,98,80,69,64.5];
y3=[153.5,172.5,182.5,154.5,113.5,87.5,71.5,64];
y4=[111.5,125,154.5,171.5,149,113.5,93,83];P1 = polyfit(x,y1,3); % 得到多项式,后面是多项式的次数
P2 = polyfit(x,y2,3); % 得到多项式
P3 = polyfit(x,y3,3); % 得到多项式
P4 = polyfit(x,y4,3); % 得到多项式
%绘图
xi = 0:100:10000;
yy1 = polyval(P1,xi);
yy2 = polyval(P2,xi);
yy3 = polyval(P3,xi);
yy4 = polyval(P4,xi);subplot(2,2,1)
plot(xi,yy1,x,y1,'r*');
subplot(2,2,2)
plot(xi,yy2,x,y2,'r*');
subplot(2,2,3)
plot(xi,yy3,x,y3,'r*');
subplot(2,2,4)
plot(xi,yy4,x,y4,'r*');hold on
图像结果如下
可以看出拟合效果也是不错的。
excle
首先还是先准备好需要的数据
趋势线里面选择更多,进入丰富的设置页面
最下面可以显示公式和R平方,R平方跟相关系数有关,这里不做推导,基本上只需要知道这个数值和1越接近拟合的效果越好就是了。
python
python也是很好用的拟合工具了,拟合函数和matlab非常像
import numpy as np
import matplotlib.pyplot as pltx = [760,2240,3480,3805,4720,5960,7200,9920]
y = [273,215,153.5,111.5,83,64,53,47.5]plt.scatter(x,y,color="red")
plt.title("demo")
plt.xlabel("X")
plt.ylabel("Y")linear_model=np.polyfit(x,y,3) # 三次拟合
linear_model_fn=np.poly1d(linear_model) # 得到拟合函数x_s=np.arange(0,10000) #生成点
plt.plot(x_s,linear_model_fn(x_s),color="green") #画拟合曲线plt.show()
拟合结果如下,这里我们可以直接鼠标移动,就能看到坐标,这个比matlab方便点。
添加水平竖直的曲线,观看需要的数据
import numpy as np
import matplotlib.pyplot as pltx = [760,2240,3480,3805,4720,5960,7200,9920]
y = [273,215,153.5,111.5,83,64,53,47.5]plt.scatter(x,y,color="red")
plt.title("demo")
plt.xlabel("X")
plt.ylabel("Y")linear_model=np.polyfit(x,y,3) # 三次拟合
linear_model_fn=np.poly1d(linear_model) # 得到拟合函数x_s=np.arange(0,10500,100) #生成点
plt.plot(x_s,linear_model_fn(x_s),color="green",linewidth=2) #画拟合曲线x1 = [375,875,2675,3975,5775,7075,8875,10125]
y1 = linear_model_fn(x1)
for x in x1:plt.plot([x,x],[0,linear_model_fn(x)],color="black",linewidth=1)
plt.plot([0,x1[-1]],[0,0],color="black",linewidth=1)
plt.plot([0,0],[0,linear_model_fn(0)],color="black",linewidth=1)plt.show()
只要对需要的点一一遍历即可
这基本已经够我课设用了