注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Equinox's Blog.

My Naughty Corner

 
 
 

日志

 
 

[C]最小二乘法直線擬合  

2010-10-16 11:44:18|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
好久沒用標准C了,現在當是復習一下,不過寫這個東西居然用了1個多H。我一開始的想法是不需要手動輸入樣本點數目,而是在scanf過程中使用自增變量計數。然後我想直接輸入回車的時候可以結束scanf過程,但是scanf貌似會忽略出現在開頭的回車,於是就把它改成這個樣子了。
測試數據:
x 2 3 4 5 6
y 0.22 0.38 0.55 0.65 0.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;
}
  评论这张
 
阅读(947)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017