matlab使用polyfit拟合一次函数时的注意事项

在做数据处理时我们常常会使用matlab中的曲线拟合函数polyfit,然而使用polyfit的工程中遇到了一些坑。鉴于网上大部分文章只说明了polyfit的使用方法,并没有谈这个问题,所以分享一下这个坑点。

polyfit简介

polyfit是专门用来拟合多项式的一个函数,函数用法如下:

p = polyfit(x,y,n);
[p,S] = polyfit(x,y,n);
[p,S,mu] = polyfit(x,y,n);

一般我们直接使用第一种方式就够了,返回的p为多项式系数数组,即P(1)*X^N + P(2)*X^(N-1) +...+ P(N)*X + P(N+1)

polyfit注意点

在实际使用polyfit拟合一次函数时发现,该函数更倾向于拟合出斜率小于1的一次函数,如图所示,当数据点明显趋于纵向排列时,拟合出的直线仍趋于水平

matlab使用polyfit拟合一次函数时的注意事项_第1张图片

明显该拟合的直线并不是我们期望的直线,改进方法如下:

先判断数据点x与y的范围,然后比较范围大小,得到数据点大概是纵向排列还是横向排列。若纵向排列,则交换x,y,再用polyfit进行拟合,得到的斜率取负倒数即为原来的斜率,代码如下:

acc_right = max(facc(:,1));
acc_left = min(facc(:,1));
accy_up = max(facc(:,2));
accy_down = min(facc(:,2));
if acc_right - acc_left > accy_up - accy_down
    pk = polyfit(facc(:,1),facc(:,2),1); 
else
    pk = polyfit(facc(:,2),facc(:,1),1);
    pk(1) = -1/pk(1);
end
zcx = -1:0.1:1;
zcy = pk(1)*zcx+pk(2);

拟合效果如下:

matlab使用polyfit拟合一次函数时的注意事项_第2张图片

你可能感兴趣的:(算法)