matlab如何拟合直线并且根据坐标轴交点求出斜率?
这个问题不难,只需要用到plotfit函数
polyfit的使用方法:
[p,s] =polyfit(x,y,n)
其中,x为准备拟合的自变量,
y为应变量,
n为拟合的次数
p是拟合得到的多项式的系数矩阵,其元素依次为从最高次系数到0次系数(也就是常数项).
s用来计算拟合误差.
一般缺省s项直接:p=polyfit(x,y,n)
注:另外其中还用到函数y1=polyval(p,x),用法很好理解,看例子就能懂,具体自行百度或看matlab帮助。
下面直接上例子:
clear;clc; %不解释
a1=5:15; %自变量
a2=[89 78 71 59 44 32 22 10 -1 -5 -10];%因变量
xishu=polyfit(a1,a2,1) %拟合得到各项系数
k=xishu(1) %一次项系数即斜率
b=xishu(2) %零次项系数即截距
a_nihe=polyval(xishu,a1); %得到自变量对应的拟合函数值
plot(a1,a2,'k*',a1,a_nihe,'r-') %画图
legend('原始数据','拟合直线') %图中注释
axis([0 15 -50 150]) %限制方框大小
set(gca,'box','off') %不解释
set(gcf,'color',[1,1,1]) %白底
gridon %添加网格
拟合结果:斜率:-10.573;截距:141.09。
斜率和坐标轴焦点都是可以直接得到的,所以不需要“根据坐标轴交点求出斜率”。若需要横轴焦点请自行根据相关公式求解。
clc
clear all
x=1:9;
y=10-x;
ep=[];
plot(x,y,'color','black')%画一个通过(1,9)(9,1)两个点的直线line1,黑色的线
hold on
for i=1:9
ep(1,i)=rand(1,1)-0.5;
ep(2,i)=rand(1,1)-0.5;
end
plot(x+ep(1,x),y+ep(2,x),'*')%沿line1取9个取样点,在x轴和y轴上分别偏差(-0.5,0.5)之间,蓝色的点
hold on
x1=x+ep(1,x);
y1=y+ep(2,x);
s=size(x);
s=s(2);
d=0;
m=0;
sx=x1(1);
sy=y1(1);
for i=1:s-1
sx=x1(i+1)+sx;%将所有取样点的x加起来
sy=y1(i+1)+sy;%将所有取样点的y加起来
for h=i+1:s
d=(y1(i)-y1(h))/(x1(i)-x1(h))+d;%将所有取样点之间的斜率加起来
m=m+1;
end
end
d=d/m;%求所有斜率的平均值
sx=sx/s;%求所有取样x的平均值
sy=sy/s;%求所有取样y的平均值
y2=d*x-d*sx+sy;%以取样x的平均值,取样y的平均值为通过点,取样斜率的平均值为斜率画一条逼近直线,红色的线
plot(x,y2,'color','red')