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

喜歡就點個贊吧,希望能幫助陌生的你:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章