一般最小二乘法 c语言,最小二乘法C语言的实现(7页)-原创力文档
實驗三 .最小二乘法C語言的實現
1.實驗目的:
進一步熟悉曲線擬合的最小二乘法。
掌握編程語言字符處理程序的設計和調試技術。
2.實驗要求:
輸入:已知點的數目以及各點坐標 。
輸出:根據最小二乘法原理以及各點坐標求出擬合曲線 。
3.程序流程:
(1)輸入已知點的個數;
(2)分別輸入已知點的X坐標;
(3)分別輸入已知點的Y坐標;
(4)通過調用函數,求出擬合曲線。
最小二乘法原理如下:
根據一組給定的實驗數據,求出自變量x與因變量y的函數關系,只要求在給定點上的誤差的平方和最小.當時,即 (4.4.1)這里是線性無關的函數族,假定在上給出一組數據,以及對應的一組權,這里為權系數,要求使最小,其中 (4.4.2)
(4.4.2)中實際上是關于的多元函數,求I的最小值就是求多元函數I的極值,由極值必要條件,可得 (4.4.3)根據內積定義引入相應帶權內積記號 (4.4.4)則(4.4.3)可改寫為
這是關于參數的線性方程組,用矩陣表示為 (4.4.5)(4.4.5)稱為法方程.當線性無關,且在點集上至多只有n個不同零點,則稱在X上滿足Haar條件,此時(4.4.5)的解存在唯一。記(4.4.5)的解為 從而得到最小二乘擬合曲線 (4.4.6)可以證明對,有 故(4.4.6)得到的即為所求的最小二乘解.它的平方誤差為 (4.4.7)均方誤差為 在最小二乘逼近中,若取,則,表示為 (4.4.8)此時關于系數的法方程(4.4.5)是病態方程,通常當n≥3時都不直接取作為基。?
程序流程圖:
開始
開始
↓
輸入已知點個數n
輸入已知點個數n
輸入已知點的X坐標 ↓
輸入已知點的X坐標
輸入已知點的Y坐標↓
輸入已知點的Y坐標
輸出結果↓
輸出結果
程序:
#include
#include
#include
#include
float average(int n,float *x)
{int i;
float av;
av=0;
for(i=0;i
av+=*(x+i);
av=av/n;
return(av);
}
//平方和
float spfh(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a+=(*(x+i))*(*(x+i));
return(a);
}
//和平方
float shpf(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a=a+*(x+i);
b=a*a/n;
return(b);
}
//兩數先相乘,再相加
float dcj(int n,float *x,float *y)
{int i;
float a;
a=0;
for(i=0;i
a+=(*(x+i))*(*(y+i));
return(a);
}
//兩數先相加,再相乘
float djc(int n,float *x,float *y)
{int i;
float a=0,b=0;
for(i=0;i
{a=a+*(x+i);
b=b+*(y+i);
}
a=a*b/n;
return(a);
}
//系數a
float xsa(int n,float *x,float *y)
{float a,b,c,d,e;
a=spfh(n,x);
b=shpf(n,x);
c=dcj(n,x,y);
d=djc(n,x,y);
e=(c-d)/(a-b);
//printf("%f %f %f %f
總結
以上是生活随笔為你收集整理的一般最小二乘法 c语言,最小二乘法C语言的实现(7页)-原创力文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab int8 函数,未定义与
- 下一篇: java语言sql接口_Java语言SQ