如何在MATLAB中将最佳拟合线(polyfit)扩展为在y轴上穿过y轴

时间:2016-01-30 06:55:19

标签: matlab plot regression linear-regression

在MATLAB中,我想用回归绘制散点图数据。

a = [2004.4 2005.6 2002.1 2002.1 2004.8 2002.6 2003.5 2001.3 2003.5 2002.6];
b = [0.1006 0.0848 0.0502 0.0502 0.0909 0.0385 0.0732 0.0732 0.0896 0.0772];
scatter(a, b, 6);
hold on
p = polyfit(a,b,1);
f = polyval(p,a);
plot(a,f,'Color',[0.7500    0.7500    0.7500],'linewidth',1.5)

但是,我想扩展直线(和x轴),使得直线穿过y=0并在其原点与x轴交叉,这样它看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:2)

您只需将输入点数组更改为polyval即可。您只使用a中定义的点,并通过这些点绘制最佳拟合线。因此,定义更多点,您可以指定y=0a中的最后一个点发生的点。鉴于最佳拟合线为y = mx + b,其中m为斜率,b为截距,生成x的{​​{1}}值仅为y=0。因此,起始点在MATLAB语法中只是-b/m引用您的代码。 -p(2)/p(1)的输出是两个值的数组(正如您指定的拟合顺序为1),其中第一个是斜率polyfit,最后一个是截距p(1)。 / p>

因此,尝试这样做。我保留了您的代码,并在我修改过的地方放置了评论:

p(2)

linspace生成从最小值到最大值的线性间隔点阵列。默认情况下,点数为100.最小值为a = [2004.4 2005.6 2002.1 2002.1 2004.8 2002.6 2003.5 2001.3 2003.5 2002.6]; b = [0.1006 0.0848 0.0502 0.0502 0.0909 0.0385 0.0732 0.0732 0.0896 0.0772]; scatter(a, b, 6); hold on p = polyfit(a,b,1); xx = linspace(-p(2)/p(1), max(a)); %// Change yy = polyval(p, xx); %// Change plot(xx,yy,'Color',[0.7500 0.7500 0.7500],'linewidth',1.5) %// Change xlim([-p(2)/p(1), max(a)]); %// Change ,最大值为-b/m中的最大值。一旦我们生成了这个数组,然后我们使用a并评估该行中每个值对于该行的点。我还修改了对您polyval的调用,以便我使用这些新点并使图形整齐,我更改了显示的plot值的限制其中x拦截达到x中的最大值。完成了xlim,我们可以在图中指定要关注的最小和最大a值。

我们得到以下图表:

enter image description here