最小二乘法直线拟合的C语言及matlab实现

最小二乘法直线拟合的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]);

喜欢就点个赞吧,希望能帮助陌生的你:)

猜你喜欢

转载自blog.csdn.net/weixin_38604589/article/details/90400592