最小二乘法資料擬合演算法設計,用c或者c程式設計出來,急

2021-03-03 21:40:13 字數 4603 閱讀 8088

1樓:明天威威去旅行

#include

#include

void guass(int n,float array[10])for(i=0;i

}int main()

guass(n,array);

return 0;}

求c或c++語言編寫的用最小二乘法進行曲線擬合

2樓:匿名使用者

你的近似解析表示式為y=at+bt^2+ct^2

是不是想寫成為y=at+bt^2+ct^3

但是實際擬合出來的表示式為y=a[3]+a[2]t+a[1]t^2+a[0]t^3會有個常數項的。

簡單的講,所謂擬合是指已知某函式的若干離散函式值,通過調整該函式中若干待定係數f(λ1, λ2,...,λ3), 使得該函式與已知點集的差別(最小二乘意義)最小。如果待定函式是線性,就叫線性擬合或者線性回歸(主要在統計中),否則叫作非線性擬合或者非線性回歸。表示式也可以是分段函式,這種情況下叫作樣條擬合。

曲線擬合:

#include

#include

#include

#include

**ooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3);

void main()

y = (double *)calloc(n,sizeof(double));

if(y == null)

a = (double *)calloc(n,sizeof(double));

if(a == null)

for(i=1;i<=n;i++)

y[0]=0;

y[1]=1.27;

y[2]=2.16;

y[3]=2.86;

y[4]=3.44;

y[5]=3.87;

y[6]=4.15;

y[7]=4.37;

y[8]=4.51;

y[9]=4.58;

y[10]=4.02;

y[11]=4.64;

/*x[i-1]點對應的y值是擬合已知值*/

呼叫擬合函式*/

for(i=1;i<=m;i++)

printf("a[%d] = %.10f\n",(i-1),a[i-1]);

printf("擬合多項式與資料點偏差的平方和為:\n");

printf("%.10e\n",dt1);

printf("擬合多項式與資料點偏差的絕對值之和為:\n");

printf("%.10e\n",dt2);

printf("擬合多項式與資料點偏差的絕對值最大值為:\n");

printf("%.10e\n",dt3);

free(x); /*釋放儲存空間*/

free(y); /*釋放儲存空間*/

free(a); /*釋放儲存空間*/

} **ooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3)//(x,y,a,n,m,dt1,dt2,dt3 )

//double *x; /*實型一維陣列,輸入引數,存放節點的xi值*/

//double *y; /*實型一維陣列,輸入引數,存放節點的yi值*/

//double *a; /*雙精度實型一維陣列,長度為m。返回m一1次擬合多項式的m個係數*/

//int n; /*整型變數,輸入引數,給定資料點的個數*/

//int m; /*整型變數,輸入引數,擬合多項式的項數*/

//double *dt1; /*實型變數,輸出引數,擬合多項式與資料點偏差的平方和*/

//double *dt2; /*實型變數,輸出引數,擬合多項式與資料點偏差的絕對值之和*/

//double *dt3; /*實型變數,輸出引數,擬合多項式與資料點偏差的絕對值最大值*/

t = (double *)calloc(n,sizeof(double));

if(t == null)

b = (double *)calloc(n,sizeof(double));

if(b == null)

z = 0;

for(i=1;i<=n;i++)

z=z+x[i-1]/n; /*z為各個x的平均值*/

b[0]=1;

d1=n;

p=0;

c=0;

for(i=1;i<=n;i++)

c=c/d1;

p=p/d1;

a[0]=c*b[0];

if(m>1)

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[1]=c*t[1];

a[0]=c*t[0]+a[0];

} for(j=3;j<=m;j++)

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[j-1]=c*s[j-1];

t[j-1]=s[j-1];

for(k=j-1;k>=1;k--) }

*dt1=0;

*dt2=0;

*dt3=0;

for(i=1;i<=n;i++)

/*釋放儲存空間*/

free(s);

free(t);

free(b);

return(1);}

3樓:

#include

void main()

; double y[21] = ;

double midx;

double midy;

midx=0;

midy=0;

///求平均值

for(int i=0;i<21;++i)///求斜率

double linek;

linek=0;

double tempmu;

double tempzi;

tempmu=0;

tempzi=0;

for(int v=0;v<21;++v)if(tempmu==0)

linek=tempzi/tempmu;

////求截距

double lineb;

lineb=midy-linek*midx;

////////////

cout <<"直線方程:"<誤差

double delta;

for(int q=0;q<21;++q) }

最小二乘法三次多項式曲線擬合 演算法 c++ 實現,該怎麼處理

4樓:有問必答

//最小二乘法

//x[n] y[n] 已知輸入

//n輸入點個數

//a[m] 返回m-1次擬合多項

式的m個係數

//m 擬合多項式的項數,即擬合多項式的最高次為m-1//dt[3] dt[0]返回擬合多項式與各資料點誤差的平方和,dt[1]返回擬合多項式與各資料點誤差的絕對值之和dt[2]返回擬合多項式與各資料點誤差的絕對值的最大值////擬合多項式的輸出

//y(x) = a0 + a1(x-x) + a2(x-x)^2 + ...... am(x-x)^m

// 其中x為已知點x的平均值

******************************************/

#include "math.h"

void pir1(x,y,n,a,m,dt)int n,m;

double x,y,a,dt;

c=c/d1; p=p/d1;

a[0]=c*b[0];

if (m>1)

c=c/d2; p=g/d2; q=d2/d1;

d1=d2;

a[1]=c*t[1]; a[0]=c*t[0]+a[0];

}for (j=2; j<=m-1; j++)c=c/d2; p=g/d2; q=d2/d1;

d1=d2;

a[j]=c*s[j]; t[j]=s[j];

for (k=j-1; k>=0; k--)}dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;

for (i=0; i<=n-1; i++)return;}

5樓:

先求解乙個最小二乘問題,即解乙個超定方程組(得到三次曲線係數)再用mfc中的畫圖函式離散的畫出這個三次曲線(注意mfc中的座標是矩陣座標,也就是說原點位於左上角)

求用c++語言編寫的最小二乘法進行曲線擬合 10

6樓:匿名使用者

-lgsl -lgslcblas -lboost_program_options -lboost_system

其中gsl是 general public license 就是說你的軟體必須開源的

最小二乘法中,用什麼來衡量擬合的好壞

最小來二乘 法是一種數學方法,用於源曲線擬合.二乘,就是平方,是早年翻譯的沿用.當在實驗中獲得自變數與因變數的一系列對應資料,x1,y1 x2,y2 x3,y3 xn,yn 時,要找出乙個已知型別的函式,y f x 與之擬合,使得實際資料和理論曲線的離差平方 matlab中用最小二乘法擬合直線 用p...

怎樣理解最小二乘法公式,高中數學最小二乘法公式各個字母代表什麼意思尤其是西格瑪什麼意思

積分的一種,不用來怎樣記的,考源試很少考首先有很多組座標比如n組 x,y 先求出x的平均數,和y的平均數,再把對應的x1,x2,xn分別和x的平局數相減。和y2,y3。xn分別和y的平均數相減,再把兩組數的結果對應相乘,在把他們的成積全部加起來,除以 x減去x的平均數 的平方的中和就等於b了a就等於...

最小二乘法中XiYi怎麼算

最小二乘法中 xiyi x1y1 x2y2 xnyn,即已知的x與y的各對兒數值的乘積之和。這個是求和的意思,就是把它後面的因子多加起來。最小二乘法中 xiyi x1y1 x2y2 xnyn,即已知的x與y的各對兒數值的乘積之和。最小二乘法公式裡 是疊加的意思,一般會以角標的方式告訴起點值和終點值。...