當前位置:首頁 » 編程軟體 » 最小二乘法編程

最小二乘法編程

發布時間: 2022-10-23 08:14:30

㈠ 求助,關於最小二乘法的matlab編程

在MATLAB中,用polyfit函數來求得最小二乘擬合多項式的系數。調用格式如下;
[P,S]=polyfit(X,Y,m)
函數根據數據采樣點X和采樣點函數值Y,產生一個m次多項式P及其在采樣點的誤差S。

㈡ 最小二乘法的matlab程序是怎樣的

我給你個最小二乘擬合的例子自己體會一下:
下面給定的是烏魯木齊最近1個月早晨7:00左右(新疆時間)的天氣預報所得到的溫度數據表,按照數據找出任意次曲線擬合方程和它的圖像。
(2008年10月26~11月26)
天數 1 2 3 4 5 6 7 8 9 10
溫度 9 10 11 12 13 14 13 12 11 9
天數 11 12 13 14 15 16 17 18 19 20
溫度 10 11 12 13 14 12 11 10 9 8
天數 21 22 23 24 25 26 27 28 29 30
溫度 7 8 9 11 9 7 6 5 3 1

下面應用Matlab編程對上述數據進行最小二乘擬合
Matlab程序代碼:
x=[1:1:30];
y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1];
a1=polyfit(x,y,3) %三次多項式擬合%
a2= polyfit(x,y,9) %九次多項式擬合%
a3= polyfit(x,y,15) %十五次多項式擬合%
b1= polyval(a1,x)
b2= polyval(a2,x)
b3= polyval(a3,x)
r1= sum((y-b1).^2) %三次多項式誤差平方和%
r2= sum((y-b2).^2) %九次次多項式誤差平方和%
r3= sum((y-b3).^2) %十五次多項式誤差平方和%
plot(x,y,'*') %用*畫出x,y圖像%
hold on
plot(x,b1, 'r') %用紅色線畫出x,b1圖像%
hold on
plot(x,b2, 'g') %用綠色線畫出x,b2圖像%
hold on
plot(x,b3, 'b:o') %用藍色o線畫出x,b3圖像%

㈢ 用最小二乘法編程 matlab或c++的

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <process.h>
#define N 5 //N個點
#define T 3 //T次擬合
#define W 1 //權函數
#define PRECISION 0.00001
float pow_n(float a,int n)
{
int i;
if(n==0)
return(1);
float res=a;
for(i=1;i <n;i++)
{
res*=a;
}
return(res);
}
void mutiple(float a[][N],float b[][T+1],float c[][T+1])
{
float res=0;
int i,j,k;
for(i=0;i <T+1;i++)
for(j=0;j <T+1;j++)
{
res=0;
for(k=0;k <N;k++)
{
res+=a[i][k]*b[k][j];
c[i][j]=res;
}
}
}
void matrix_trans(float a[][T+1],float b[][N])
{
int i,j;
for(i=0;i <N;i++)
{
for(j=0;j <T+1;j++)
{
b[j][i]=a[i][j];
}
}
}
void init(float x_y[][2],int n)
{
int i;
printf( "請輸入%d個已知點:\n ",N);
for(i=0;i <n;i++)
{
printf( "(x%d y%d): ",i,i);
scanf( "%f %f ",&x_y[i][0],&x_y[i][1]);
}
}
void get_A(float matrix_A[][T+1],float x_y[][2],int n)
{
int i,j;
for(i=0;i <N;i++)
{
for(j=0;j <T+1;j++)
{
matrix_A[i][j]=W*pow_n(x_y[i][0],j);
}
}
}
void print_array(float array[][T+1],int n)
{
int i,j;
for(i=0;i <n;i++)
{
for(j=0;j <T+1;j++)
{
printf( "%-g ",array[i][j]);
}
printf( "\n ");
}
}
void convert(float argu[][T+2],int n)
{
int i,j,k,p,t;
float rate,temp;
for(i=1;i <n;i++)
{
for(j=i;j <n;j++)
{
if(argu[i-1][i-1]==0)
{
for(p=i;p <n;p++)
{
if(argu[p][i-1]!=0)
break;
}
if(p==n)
{
printf( "方程組無解!\n ");
exit(0);
}
for(t=0;t <n+1;t++)
{
temp=argu[i-1][t];
argu[i-1][t]=argu[p][t];
argu[p][t]=temp;
}
}
rate=argu[j][i-1]/argu[i-1][i-1];
for(k=i-1;k <n+1;k++)
{
argu[j][k]-=argu[i-1][k]*rate;
if(fabs(argu[j][k]) <=PRECISION)
argu[j][k]=0;
}
}
}
}
void compute(float argu[][T+2],int n,float root[])
{
int i,j;
float temp;
for(i=n-1;i> =0;i--)
{
temp=argu[i][n];
for(j=n-1;j> i;j--)
{
temp-=argu[i][j]*root[j];
}
root[i]=temp/argu[i][i];
}
}
void get_y(float trans_A[][N],float x_y[][2],float y[],int n)
{
int i,j;
float temp;
for(i=0;i <n;i++)
{
temp=0;
for(j=0;j <N;j++)
{
temp+=trans_A[i][j]*x_y[j][1];
}
y[i]=temp;
}
}
void cons_formula(float coef_A[][T+1],float y[],float coef_form[][T+2])
{
int i,j;
for(i=0;i <T+1;i++)
{
for(j=0;j <T+2;j++)
{
if(j==T+1)
coef_form[i][j]=y[i];
else
coef_form[i][j]=coef_A[i][j];
}
}
}
void print_root(float a[],int n)
{
int i,j;
printf( "%d個點的%d次擬合的多項式系數為:\n ",N,T);
for(i=0;i <n;i++)
{
printf( "a[%d]=%g, ",i+1,a[i]);
}
printf( "\n ");
printf( "擬合曲線方程為:\ny(x)=%g ",a[0]);
for(i=1;i <n;i++)
{
printf( " + %g ",a[i]);
for(j=0;j <i;j++)
{
printf( "*X ");
}
}
printf( "\n ");
}
void process()
{
float x_y[N][2],matrix_A[N][T+1],trans_A[T+1][N],coef_A[T+1][T+1],coef_formu[T+1][T+2],y[T+1],a[T+1];
init(x_y , N);
get_A(matrix_A , x_y,N);
printf( "矩陣A為:\n ");
print_array(matrix_A,N);
matrix_trans(matrix_A , trans_A);
mutiple(trans_A , matrix_A , coef_A);
printf( "法矩陣為:\n ");
print_array(coef_A,T+1);
get_y(trans_A , x_y , y , T+1);
cons_formula(coef_A , y , coef_formu);
convert(coef_formu , T+1);
compute(coef_formu , T+1 , a);
print_root(a , T+1);
}
void main()
{
process();
}

㈣ 最小二乘法 C程序演算法

聯系我,我可以把幾種擬合方式的代碼法給你

㈤ 最小二乘法編程

很高興再次為你解答,希望我的答案能夠對你有所幫助……

你的近似解析表達式為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會有個常數項的。
簡單的講,所謂擬合是指已知某函數的若干離散函數值{f1,f2,…,fn},通過調整該函數中若干待定系數f(λ1, λ2,…,λ3), 使得該函數與已知點集的差別(最小二乘意義)最小。如果待定函數是線性,就叫線性擬合或者線性回歸(主要在統計中),否則叫作非線性擬合或者非線性回歸。表達式也可以是分段函數,這種情況下叫作樣條擬合。
曲線擬合:
#include
#include
#include
#include

Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3);
void main()
{
int i ,n ,m ;
double *x,*y,*a,dt1,dt2,dt3,b;
n = 12;// 12個樣點
m = 4; //3次多項式擬合
b = 0; //x的初值為0
/*分別為x,y,a分配存貯空間*/
x = (double *)calloc(n,sizeof(double));
if(x == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
y = (double *)calloc(n,sizeof(double));
if(y == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
a = (double *)calloc(n,sizeof(double));
if(a == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
for(i=1;i<=n;i++)
{
x[i-1]=b+(i-1)*5;
/*每隔5取一個點,這樣連續取12個點*/
}
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值是擬合已知值*/

Smooth(x,y,a,n,m,&dt1,&dt2,&dt3); /*調用擬合函數*/
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); /*釋放存儲空間*/
}

Smooth(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; /*實型變數,輸出參數,擬合多項式與數據點偏差的絕對值最大值*/
{
int i ,j ,k ;
double *s,*t,*b,z,d1,p,c,d2,g,q,dt;
/*分別為s ,t ,b分配存貯空間*/
s = (double *)calloc(n,sizeof(double));
if(s == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
t = (double *)calloc(n,sizeof(double));
if(t == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
b = (double *)calloc(n,sizeof(double));
if(b == NULL)
{
printf("內存分配失敗\n");
exit (0);
}
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++)
{
p=p+x[i-1]-z;
c=c+y[i-1];
}
c=c/d1;
p=p/d1;
a[0]=c*b[0];
if(m>1)
{
t[1]=1;
t[0]=-p;
d2=0;
c=0;
g=0;
for(i=1;i<=n;i++)
{
q=x[i-1]-z-p;
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
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++)
{
s[j-1]=t[j-2];
s[j-2]=-p*t[j-2]+t[j-3];
if(j>=4)
for(k=j-2;k>=2;k--)
s[k-1]=-p*t[k-1]+t[k-2]-q*b[k-1];
s[0]=-p*t[0]-q*b[0];
d2=0;
c=0;
g=0;
for(i=1;i<=n;i++)
{
q=s[j-1];
for(k=j-1;k>=1;k--)
q=q*(x[i-1]-z)+s[k-1];
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
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--)
{
a[k-1]=c*s[k-1]+a[k-1];
b[k-1]=t[k-1];
t[k-1]=s[k-1];
}
}
*dt1=0;
*dt2=0;
*dt3=0;
for(i=1;i<=n;i++)
{
q=a[m-1];
for(k=m-1;k>=1;k--)
q=q*(x[i-1]-z)+a[k-1];
dt=q-y[i-1];
if(fabs(dt)>*dt3)
*dt3=fabs(dt);
*dt1=*dt1+dt*dt;
*dt2=*dt2+fabs(dt);
}
/*釋放存儲空間*/
free(s);
free(t);
free(b);
return(1);

謝謝採納,祝你愉快!
}

㈥ 計算方法中最小二乘法如何用c語言編程

#include <stdio.h>
#include <math.h>
#define epsilon 1e-6
void nihe1(int n,int m,float sum_x,float sum_y,float sum_xy,float x2);
void nihe2(int n,int m,float sum_x,float sum_y,float sum_xy,float x2,float x2y,float x3,float x4);
int main(){
float x[100]={0.0};
float y[100]={0.0};
int n,i,flag=1;
float sum_y=0.0,sum_x=0,x2=0,sum_xy=0.0,x3=0,x4=0,x2y=0.0;
printf("請你輸入需要測試的數據(先輸入x[],後輸入y[])的個數:");
scanf("%d",&n);
for(i = 0; i < n; i++){
scanf("%f",&x[i]);}
for(i = 0; i < n; i++){
scanf("%f",&y[i]);}
for(i = 0; i < n; i++){
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i]*y[i];
x2 += x[i]*x[i];
x2y += x[i]*x[i]*y[i];
x3 += x[i]*x[i]*x[i];
x4 += x[i]*x[i]*x[i]*x[i];}
printf("---------------請你輸入的要擬合的函數------------------\n");
printf(" 1、擬合一次函數\n");
printf(" 2、擬合二次函數\n");
scanf("%d",&flag);
switch(flag){
case 1:
nihe1(n,flag+1,sum_x,sum_y,sum_xy,x2); break;
case 2:
nihe2(n,flag+1,sum_x,sum_y,sum_xy,x2,x2y,x3,x4); break;
default:
printf("ERROR\n");}
return 0;}
void nihe1(int n,int m,float sum_x,float sum_y,float sum_xy,float x2){
int i,k,j;
float t,s=0;
float a[2][3] = {{(float)n,sum_x,sum_y},{sum_x,x2,sum_xy}};
n=m;
//if(m == 3)
// a[3][4] = {{n,sum_x,sum_y},{sum_x,x2,x3,sum_xy},{x2,x3,x4,x2y}};
for(k=0;k<n-1;k++) {
for(i=k+1;i<n;i++)
if( abs((int)a[i][k]) > abs((int)a[k][k]) )
for(j=k;j<n+1;j++) {
t=a[k][j];
a[k][j]=a[i][j];
a[i][j]=t; }
if( abs((int)a[k][k]) < epsilon) {
printf("\nError,主元消去法 cann't be rable,break at %d!\n",k+1);
return; }
for(i=k+1;i<n;i++){
a[i][k]=a[i][k] / a[k][k];
for(j=k+1;j<n+1;j++)
a[i][j]=a[i][j]-a[i][k] * a[k][j]; }}
a[n-1][n]=a[n-1][n] / a[n-1][n-1];
for(k=n-2;k>=0;k--) {
s=0;
for(j=k+1;j<n;j++)
s+=a[k][j]*a[j][n];
a[k][n]=( a[k][n]-s ) / a[k][k]; }
printf("\n*****The Result*****\n");
for(i=0;i<n;i++)
printf(" x[%d]=%.4f\n",i+1,a[i][n]);
printf("函數為:p(x) = %.4f + (%.4f)*x\n",a[0][n],a[1][n]);
getchar();}
void nihe2(int n,int m,float sum_x,float sum_y,float sum_xy,float x2,float x2y,float x3,float x4){
int i,k,j;
float t,s=0;
float a[3][4]=
{{(float)n,sum_x,x2,sum_y},{sum_x,x2,x3,sum_xy},{x2,x3,x4,x2y}};
n=m;
for(k=0;k<n-1;k++) {
for(i=k+1;i<n;i++)
if( abs((int)a[i][k]) > abs((int)a[k][k]) )
for(j=k;j<n+1;j++) {
t=a[k][j];
a[k][j]=a[i][j];
a[i][j]=t; }
if( abs((int)a[k][k]) < epsilon) {
printf("\nError,主元消去法 cann't be rable,break at %d!\n",k+1);
return; }
for(i=k+1;i<n;i++){
a[i][k]=a[i][k] / a[k][k];
for(j=k+1;j<n+1;j++)
a[i][j]=a[i][j]-a[i][k] * a[k][j]; } }
a[n-1][n]=a[n-1][n] / a[n-1][n-1];
for(k=n-2;k>=0;k--) {
s=0;
for(j=k+1;j<n;j++)
s+=a[k][j]*a[j][n];
a[k][n]=( a[k][n]-s ) / a[k][k]; }
printf("\n*****The Result*****\n");
for(i=0;i<n;i++)
printf(" x[%d]=%.4f\n",i+1,a[i][n]);
printf("函數為:p(x) = %.4f + (%.4f)*x + (%.4f)*x*x\n",a[0][n],a[1][n],a[2][n]);
getchar();}

㈦ 最小二乘法的matlab程序

。。。。。從y裡面把b和c的部分剪掉,然後就不要用二次擬合了,用1次,p=polyfit(x^2,y-bx-c,1),這樣就行了!

㈧ 如何用MATLAB語言編程最小二乘法,具體內容如下

x=10:10:80
y=[96 188 290 382 489 583 681 784]
p=polyfit(x,y,1)
xx=10:80;
yy=polyval(p,xx);
plot(x,y,'o',xx,yy)

結果:
x =

10 20 30 40 50 60 70 80

y =

96 188 290 382 489 583 681 784

p =

9.8417 -6.2500

㈨ 單片機c語言的最小二乘法怎麼實現,求代碼

#include <stdio.h>
void main ()
{
int num,i;
float x,y,l,m,n,p,a,b;
i=1;
l=0.0;
m=0.0;
n=0.0;
p=0.0;
printf ("請輸入你想計算的x,y的個數:");
scanf("%d",&num);
if (num>=1)
{
while (i<=num);
{
printf("請輸入x的值");
scanf ("%lf",&x);
printf("請輸入y的值");
scanf ("%lf",&y);
l+=x;
m+=y;
n+=x*y;
p+=x*x;
i++;
}
a=(num*n-l*m)/(num*p-l*l);
b=(p*m-n*l)/(num*p-l*l);
printf("最小二乘法所算得的斜率和截距分別為%f和%f\n",a,b);
}
else printf("mun"輸入有誤!);
}

㈩ 最小二乘法求解方程系數,用C語言編程實現

直接套公式啊
找本數理統計的書來

熱點內容
ftp命令使用 發布:2025-07-18 18:13:05 瀏覽:44
辦稅密碼是什麼 發布:2025-07-18 18:12:32 瀏覽:486
linuxftp文件下載 發布:2025-07-18 18:12:30 瀏覽:940
互聯網網站伺服器搭建 發布:2025-07-18 18:01:06 瀏覽:478
安卓手機怎麼辮真偽 發布:2025-07-18 17:13:14 瀏覽:186
java後台json 發布:2025-07-18 17:12:21 瀏覽:680
手機游戲配置主要看哪些 發布:2025-07-18 17:00:47 瀏覽:148
微課源碼 發布:2025-07-18 16:34:44 瀏覽:1001
壓縮長抱枕 發布:2025-07-18 16:13:38 瀏覽:505
如何使用wifi熱點配置網路 發布:2025-07-18 16:06:25 瀏覽:970