hdu2728 最佳擬合直線

最佳擬合直線

Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裏^_^

題目描述

在很多情況下,天文觀測得到的數據是一組包含很大數量的序列點圖象,每一點用x值和y值定義。這就可能需要畫一條通過這些點的最佳擬合曲線。

爲了避免只對個別數據分析,需要進行最佳曲線擬合。考慮N個數據點,它們的座標是(X1,Y1)(X2,Y2)...(XN,YN)。假設這些值中的X是嚴格的精確值,Y的值是測量值(含有一些誤差)
         

對於一個給定的X,如X1,對應的值Y1與曲線C上對應的Y值將存在一個差值。我們用D1表示這個差值,有時我們也稱這個差值爲偏差、誤差或殘差,它可能是正、負或零。類似的,X2...,XN,對應的差值爲D2,....,DN

 我們用D1+ D2+ ... + DN2 作爲衡量曲線C擬合的“最佳”程度,這個值越小越好,越大則越不好。因此,我們做以下定義:任何一種類型的曲線,它們都有一個共同的特性,當ΣDi2最小時,稱爲最佳擬合曲線。注:∑指“取和”計算。 一條曲線具有這一特性時,稱之爲“最小二乘擬合”,這樣的曲線稱爲“最小二乘曲線”。

本次的計算任務是擬合爲一條直線,數學上稱之爲“線性迴歸”。“迴歸”一詞看起來有點陌生,因爲計算最佳曲線沒什麼好“迴歸”的,最好的術語就是“曲線似合”,在直線情況下就是“線性曲線擬合”。

你的任務是編寫程序用最小二乘法計算出以下線性方程的係數(斜率a以及y軸的截距b):

 y = a*x + b   (4.1)

 a和b可以使用以下公式計算:
 
式中N是數據點的個數。注意,以上兩式具有相同的分母,∑指逐項加法計算(取和)。∑x指對所有的x值求和,∑y指對所以的y值求和,∑(x^2)指對所有x的平方求和。∑xy指對所有的積xy進行取和計算。應注意,∑xy 與 ∑x*∑y是不相同的(“積的和”與“和的積”是不同的),同樣(∑x)^2與∑(x^2)也是不相同的(“和的平方”與“平方的和”是不相同的)。


輸入

 n組整數表示xiyi ,期中|x|<=106,|y|<=106, n < 15

輸出

 最佳擬合曲線參數abab各佔一行,b精確到小數點後3位。

示例輸入

4
1  6
2  5
3  7
4  10

示例輸出

1.400
3.500

#include<stdio.h>
int main()
{
	int n,i,x,y;
	long long A,B,C,D,E;
	double a,b;
	while(scanf("%d",&n)!=EOF)
	{
		A=B=C=D=E=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&x,&y);
			A+=x*y;
			B+=x;
			C+=y;
			D+=x*x;
		}
		E=n*D-B*B;
		a=((double)n*A-B*C)/E;
		b=((double)C*D-B*A)/E;
		printf("%.3f\n",a);
		printf("%.3f\n",b);
	}
	return 0;
}


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