1樓:匿名使用者
/******************************************
//參考 《常用演算法程式集 (c語言描述 第三版)》
//最小二乘法
//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;}
最小二乘法三次多項式曲線擬合 演算法 c++ 實現,該怎麼處理
2樓:有問必答
//最小二乘法
//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;}
3樓:
先求解一個最小二乘問題,即解一個超定方程組(得到三次曲線係數)再用mfc中的畫圖函式離散的畫出這個三次曲線(注意mfc中的座標是矩陣座標,也就是說原點位於左上角)
求c或c++語言編寫的用最小二乘法進行曲線擬合
4樓:匿名使用者
你的近似解析表示式為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);}
5樓:
#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) }
最小二乘法曲線擬合公式
6樓:匿名使用者
老弟,公式打不出來的
一般都是用matlab搞定的,它裡面有現成的函式供使用的
典型程式解析:
x=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];%input xi data
y=[1.978 3.28 6.
16 7.08 7.34 7.
66 9.56 9.48 9.
30 11.2]; % input yi data
n=2; % polynomial order
p=polyfit(x, y, n)% polyfit 的輸出是一個多項式係數的行向量(擬合二項式的係數)
ezplot('-9.8108*x*x+20.1293*x-0.0317')%對擬合的函式作圖
xi=linspace(0,1,100); % x-axis data for plotting
z=polyval(p, xi);% 為了計算在xi資料點的多項式值,呼叫matlab的函式polyval
plot(x,y, 'o' ,x,y,xi,z,':')%在同一個圖形裡看他們的擬合程度
典型例題:對以下資料分別作二次,三次多項式擬合,並畫出圖形.
x=1:16;
y=[4, 6.4, 8, 8.4, 9.
28, 9.5, 9.7, 9.
86, 10, 10.2, 10.32, 10.
42, 10.5, 10.55, 10.
58, 10.6];
源程式:二次多項式擬合
x=1:1:16;
y=[4, 6.4, 8, 8.4, 9.
28, 9.5, 9.7, 9.
86, 10, 10.2, 10.32, 10.
42, 10.5, 10.55, 10.
58, 10.6];
a=polyfit(x,y,2)
a =-0.0445 1.0711 4.3252
ezplot('-0.0445*x^2+1.0711*x+4.3252')
三次多項式擬合
x=1:1:16;
y=[4, 6.4, 8, 8.4, 9.
28, 9.5, 9.7, 9.
86, 10, 10.2, 10.32, 10.
42, 10.5, 10.55, 10.
58, 10.6];
a=polyfit(x,y,3)
a =0.0060 -0.1963 2.1346 2.5952
ezplot('0.0060*x^3-0.1963*x^2+2.1346*x+2.5952')
最小二乘法的擬合,最小二乘法曲線擬合公式
對給定資料點集合,在取定的函式類中,求,使誤差的平方和最小,從幾何意義上講,就是尋求與給定點集的距離平方和為最小的曲線y p x 函式p x 稱為擬合函式或最小二乘解,求擬合函式p x 的方法稱為曲線擬合的最小二乘法。最小二乘法的矩陣形式 最小二乘法的矩陣形式為 其中 為 的矩陣,為 的列向量,為 ...
什麼是最小二乘原理,什麼是最小二乘法及其原理?
最小二乘法是一種數學優化技術 它通過最小化誤差的平方和尋找資料的最佳函式匹配。最小二來乘法是一種數自學優化技術,它通過bai最小化誤差的平方du 和找到一組數zhi據的最dao 佳函式匹配。最小二乘法是用最簡的方法求得一些絕對不可知的真值,而令誤差平方之和為最小。最小二乘法通常用於曲線擬合。很多其他...
怎樣用最小二乘法求y a bx,怎樣用最小二乘法求y a bx
例 x 19,25,31,38,44 y 19.0,32.3,49.0,73.3,97.8 fun1 inline c 1 c 2 x.2 c x 擬合函式 c lsqcurvefit fun1,0,0 x,y 求擬合係數 y num2str c 1 num2str c 2 x 2 擬合函式表示式 ...