最小二乘法直线拟合的C语言及matlab实现
这里直接上代码,理论推导参看普通最小二乘法的推导证明
C语言实现
#include <stdio.h>
//最小二乘法求散点拟合函数y=a+bx的参数a和b
void LFM(double x[],double y[],int n)
{
int i;
double a=0,b=0;
double sum1=0,sum2=0;
double mean_x=0,mean_y=0;
//计算平均值
for(i=0;i<n;i++)
{
sum1+=x[i];
sum2+=y[i];
}
mean_x=sum1/n;
mean_y=sum2/n;
//计算b
sum1=sum2=0;
for(i=0;i<n;i++)
{
sum1+=(x[i]-mean_x)*(y[i]-mean_y);
sum2+=(x[i]-mean_x)*(x[i]-mean_x);
}
b=sum1/sum2;
//计算a
a=mean_y-b*mean_x;
//输出
printf("拟合的直线方程为y=%f+(%f)*x",a,b);
}
int main()
{
double x[14]={-0.5,-1.0,-1.5,-2.0,-2.5,-3,-3.5,-5,-7,-10,-0.1,-0.2,-0.3,-0.4};
double y[14]={0.528453,1.04233,1.51821,2.03788,2.50965,3.01868,3.48255,4.99680,6.98300,9.98355,0.133300,0.232100,0.325205,0.422272};
LFM(x,y,14);
return 0;
}
MATLAB实现
clc;clear;close all
%% 载入数据
x=[-0.5,-1.0,-1.5,-2.0,-2.5,-3,-3.5,-5,-7,-10,-0.1,-0.2,-0.3,-0.4];
y=[0.528453,1.04233,1.51821,2.03788,2.50965,3.01868,3.48255,4.99680,6.98300,9.98355,0.133300,0.232100,0.325205,0.422272];
%% 最小二乘法
%求散点拟合函数y=a+bx的参数a和b
para=polyfit(x,y,1);
b=para(1);
a=para(2);
%曲线拟合
y_hat=a+b*x;
%% 绘图
fig= figure(1);
ax = axes('Parent',fig);
p = plot(x,[y',y_hat']);
set(p(1),'DisplayName','实验数据','Marker','*','LineStyle','none','Color',[0 0 0]);
set(p(2),'DisplayName','拟合直线','Color',[1 0 0]);
ylabel('输出频率(单位:KHz)');
xlabel('输入电压(单位:V)');
title('电压频率转换散点拟合图');
leg = legend(ax,'show');
set(leg,'Position',[0.75 0.8 0.1 0.1]);
axis tight;
axis([-10 0 0 10]);
喜欢就点个赞吧,希望能帮助陌生的你:)