最小二乘法原理与计算方法

12 篇文章 5 订阅

可以先通过这里来理解一下 线性拟合和二次拟合方程

http://wenku.baidu.com/link?url=cr0U9oPZ4KxO-s34ORBolH42hjux2dwH2DtRJEKTI0xsiDk2y28wyU6ZLlbRSQfCNhtdlz0nORxEYQ94n-MLITaMFR2PbVel-s_KJXpV1mG


随后可以通过这里

http://wenku.baidu.com/link?url=Y8RWDFJMQKbRkQeNTfMqeFhexr15CZkK7cywH3--igHKbQ0_ROrcNs12nHBDC2T51P4FpPcbvbYQCkzBkvupunOCkk1b0igW1GjLuWptRCS


里面有C 得 code 什么得可以应用


代码如下  一阶和二阶

#include<stdio.h>
#include<cmath>

double sum_1(double *p, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i<m; i++)
	{
		sum += *(p+i);
	}
	
	return sum;
}

double sum_2(double *p, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i<m; i++)
	{
		sum += (*(p+i)*(*(p+i)));
	}
	return sum;
}


double sum_3(double *p,double *q, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i<m; i++)
	{
		sum += (*(p+i)*(*(q+i)));
	}
	return sum;
}

double sum_4(double *p,double *q, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i<m; i++)
	{
		sum += (( *(p+i) ) * ( *(p+i) )*( *(q+i)) );
	}
	return sum;
}

double sum_5(double *p, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i < m; i++)
	{
		 sum += pow(*(p+i),3);
	}
	return sum;
}

double sum_6(double *p, int m)
{
	int i;
	double sum = 0.0;
	for(i = 0; i < m; i++)
	{
		 sum += pow(*(p+i),4);
	}
	return sum;
}

int main()
{
	double x[50],y[50],a0 = 0, a1 = 0, a = 0;
	double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0, sum_y = 0, sum_xy = 0, sum_x2y = 0;
	int i, c = 0;
	double k = 0, k1 = 0,k2 = 0, b0 = 0, b1 = 0, b2 = 0;
	printf("请输入数据少于50个多于2个且小数位数不超过3位,不必输入括号,输入完毕后按回车确认,全部输入完毕请输入字符e确认结束:\n");
	for(i = 0;i<50; i++)
	{
		printf("(x:%d,y:%d):", i+1,i+1);
		if(scanf("%lf %lf",&x[i],&y[i]) == 2)
		{
			c++;
		}
		else if(getchar() == 'e')
		{
			printf("\n");
			break;
		}
		else 
			{	
				printf("您输入的数据中有非数字,且不是e, 请重新输入地%d个数据:\n",i+1);
				x[i]==y[i] == 0;
				i--;

			}
	}

	if(c>1)
	{
		printf("您输入的数据如下:\n");
		for(i = 0; i<c; i++)
		{
			if(i%3 == 0)
			{
				printf("\n");
			}
				printf("(%0.3f,%0.3f)\n", x[i],y[i]);
		}
		printf("\n\n");
		sum_x = sum_1(x,c);
		sum_x2 = sum_2(x,c);
		sum_x3 = sum_5(x,c);
		sum_x4 = sum_6(x,c);
		sum_y  = sum_1(y,c);
		sum_xy = sum_3(x,y,c);
		sum_x2y = sum_4(x,y,c);

		a = c*sum_x2 - sum_x*sum_x;
		a0 = (sum_y* sum_x2 - sum_xy*sum_x)/a;
		a1 = (c*sum_xy - sum_x*sum_y)/a;

		printf("按照最小二乘法求得拟合1阶直线方程: y = %0.3f x+ (%0.3f) \n\n",a1,a0);
	}
	
	if (c>2)
	{
		k = sum_x/c;
		k1 = sum_x2/c;
		k2 = (sum_x3 - k1*sum_x)/(sum_x2-k*sum_x);
		b2 = (sum_x2y-k1*sum_y-k2*(sum_xy-k*sum_y))/( (sum_x4-k1*sum_x2)-k2*(sum_x3-k*sum_x2) );
		b1 = (sum_xy-k*sum_y-(sum_x3-k*sum_x2)*b2)/(sum_x2-k*sum_x);
		b0 = (sum_y-sum_x2*b2-sum_x*b1)/c;
		printf("按照最小二乘法求得拟合2阶曲线方程: y = %0.3f x^2+(%0.3f)x+(%0.3f)\n\n", b2,b1,b0);
	}


	return 0;
}


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值