C#最小二乘法直线拟合算法

測試數據:

x23456
y0.220.380.550.650.70
Terminal(粗體為輸出,其它為輸入):
請輸入樣本點的數目:5
請輸入樣本點的坐標。
x,y=
2,0.22
x,y=3,0.38
x,y=4,0.55
x,y=5,0.65
x,y=6,0.70
x_bar=4
y_bar=0.5
sigma(xi*yi)=11.23
n*x_bar*y_bar=10
sigma(xi*xi)=90
n*x_bar*x_bar=80
b=(sigma(xi*yi)-n*x_bar*y_bar)/(sigma(xi*xi)-n*x_bar*x_bar)=(11.23-10)/(90-80)
=0.123
a=y_bar-b*x_bar=0.5-0.123*4=0.008
直綫方程:y=0.123x+0.008


Source Code:
#include <stdio.h>

int main () {
double tx,ty;
double sigma_xy=0;
double sigma_xx=0;
int counter;
double sum_x=0;
double sum_y=0;
int n=0;
INPUT:
printf("請輸入樣本點的數目:");
if (scanf("%d",&counter)!=1) {
printf("格式錯誤。\n");
goto INPUT;
} else if (counter<2) {
printf("樣本點數目不能小於2。\n");
goto INPUT;
}
printf("請輸入樣本點的坐標。\n");

while (n<counter) {
printf("x,y=");
if ((scanf("%lf,%lf",&tx,&ty)!=2)) {
printf("格式輸入錯誤,請重新輸入。\n");
continue;
}
n++;
sigma_xy+=tx*ty;
sigma_xx+=tx*tx;
sum_x+=tx;
sum_y+=ty;

}

double x_bar=sum_x/((double)counter);
double y_bar=sum_y/((double)counter);
double nxy_bar=((double)counter)*x_bar*y_bar;
double nxx=((double)counter)*x_bar*x_bar;
printf("x_bar=%g\n",x_bar);
printf("y_bar=%g\n",y_bar);
printf("sigma(xi*yi)=%g\n",sigma_xy);
printf("n*x_bar*y_bar=%g\n",nxy_bar);
printf("sigma(xi*xi)=%g\n",sigma_xx);
printf("n*x_bar*x_bar=%g\n",nxx);
printf("b=(sigma(xi*yi)-n*x_bar*y_bar)/(sigma(xi*xi)-n*x_bar*x_bar)=(%g-%g)/(%g-%g)\n",sigma_xy,nxy_bar,sigma_xx,nxx);
double b=(sigma_xy-nxy_bar)/(sigma_xx-nxx);
printf(" =%g\n",b);
double a=y_bar-b*x_bar;
printf("a=y_bar-b*x_bar=%g-%g*%g=%g\n",y_bar,b,x_bar,a);

if (a>0) {
printf("直綫方程:y=%gx+%g\n",b,a);
} else if (a==0) {
printf("直綫方程:y=%gx\n",b);
} else {
printf("直綫方程:y=%gx%g\n",b,a);
}
return 0;
}

转自:

http://equinox1993.blog.163.com/blog/static/32205137201091611386204/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值