精华内容
下载资源
问答
  • 最小二乘法,递推最小二乘法C语言源程序//init input#define row_y 29#define col_y 4double uk[31]={ 0,1.147,0.201,-0.787,-1.589,-1.052,0.866,1.152,1.573,0.626,0.433,-0.958,0.810,-0.044,0.947,-1.474,-0.719,...

    最小二乘法,递推最小二乘法C语言源程序

    //init input

    #define row_y 29

    #define col_y 4

    double uk[31]={ 0,1.147,0.201,-0.787,-1.589,-1.052,0.866,1.152,1.573,0.626,0.433,

    -0.958,0.810,-0.044,0.947,-1.474,-0.719,-0.086,-1.099,1.450,1.151,

    0.485,1.633,0.043,1.326,1.706,-0.340,0.890,1.144,1.177,-0.390};

    double yk[31];

    double **fai;

    void initinput(void)

    {

    //ifstream inFile;

    int temp = 0;

    ofstream outFile;

    outFile.open("yk.txt");

    yk[0] = yk[1] = yk[2] = 0;

    for(int i = 3; i < 32; i++)yk[i]=-1.642*yk[i-1]-0.715*yk[i-2]+0.39*uk[i-1]+0.35*uk[i-2];

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

    {

    temp++;

    outFile<

    //if(i%5==0)outFile<

    }

    outFile<

    outFile.close;

    cout << "Over!" <

    //inFile.open("yk.txt");

    fai = new double *[row_y];

    for(i = 0; i < row_y; i++)

    fai[i] =new double [col_y];

    double *pyk = yk;

    double *puk = uk;

    double *pfai = *fai;

    pyk = &yk[1];

    puk = &uk[1];

    for(int j = 0; j < row_y; j++)

    {

    pfai = &fai[j][0];

    *pfai = -(*(pyk+1));

    *(pfai+1) = -(*pyk);

    *(pfai+2) = *(puk+1);

    *(pfai+3) = *puk;

    pyk++;

    puk++;

    }

    }

    //iterative least square method

    #define rowPn 4

    #define colPn 9

    void iterative_least_square_method(void)

    {

    double **Pn,*En_1,*Pn_En_1,*En_Pn_1,**PE,**Pn_1,**Pn_En_0;

    double En_Pn_En_1 = 0;

    double *pPn1;

    double *pPn2;

    double *Kn;

    double *siit0,En_siit0,*En_0,BB,*siit1;

    Pn = new double *[rowPn];

    for(int j1 = 0; j1 < rowPn; j1++)

    Pn[j1] = new double [rowPn];

    Pn_En_1 = new double [rowPn];

    En_1 = new double [colPn];

    En_1 = &a[colPn][0];

    Pn_En_1 = new double [colPn];

    Pn_En_0 = new double *[rowPn];

    for(j1 = 0; j1 < rowPn; j1++)

    Pn_En_0[j1] = new double [colPn];

    En_Pn_1 = new double [colPn];

    Kn = new double [colPn];

    PE = new double *[colPn];

    for (j1 = 0; j1 < colPn; j1++)

    PE[j1] = new double [colPn];

    Pn_1 = new double *[colPn];

    for(j1 = 0; j1 < colPn; j1++)

    Pn_1[j1] = new double [colPn];

    siit0 = new double [colPn];

    siit1 = new double [colPn];

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

    for(j1 = 0; j1 < rowPn; j1++)

    {

    for(int j2 = 0; j2 < rowPn; j2++)

    {

    if( j1 == j2)Pn[j1][j2] = 1e6;

    else Pn[j1][j2] = 0;

    }

    }

    for(j1 = 0; j1 < rowPn; j1++)

    {

    for(int j2 = 0; j2 < rowPn; j2++)

    {

    if( j1 == j2)Pn_1[j1][j2] = 1e6;

    else Pn_1[j1][j2] = 0;

    }

    cout << endl;

    }

    for(j1 = 0; j1 < rowPn; j1++)

    {

    *(siit1 + j1) = 1e-6;

    }

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

    for(int i = 1; i < 28 ;i++)

    {

    En_1 = &a[i][0];

    for(j1 = 0; j1 < rowPn; j1++)

    {

    for(int j2 = 0; j2 < rowPn; j2++)

    {

    Pn[j1][j2] = Pn_1[j1][j2];

    }

    }

    for(j1 = 0; j1 < rowPn; j1++)

    {

    *(Pn_En_1 + j1) = 0;

    for(int j2 = 0; j2 < rowPn; j2++)

    {

    *(Pn_En_1 + j1) += Pn[j1][j2]*(*(En_1 + j2));

    }

    }

    for(j1 = 0; j1 < rowPn; j1++)

    {

    *(En_Pn_1 + j1) = 0;

    展开全文
  • 最小二乘法C语言编程#include /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */float a[3][3]={0};float a8[]={1,2,3,4,5,6,7,8,9,10,11,12,9,10,11,12,13,14,15,1.....

    最小二乘法C语言编程

    #include /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */float a[3][3]={0};float a8[]={1,2,3,4,5,6,7,8,9,10,11,12,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27} ;float a9[]={147,155,146,146,144,146,145,144,143,146,146,149,147,148,150,152,155,157,160,163,168,173,175,177,180,199,203} ; float b[3][1]={0}; float b3[3][1]; float b4[3][3]; float b1[3][3]={0}; float a1[3][3]={0}; float x,x1,x2,x3,x4,x5,x6,x7,x8,x9,c,*p,*pp,*ppp; int i,j,ii,jj,d1=0;void main(void) { /最小二乘初始化// x=0;p=a9;for(i=0;i<10;i++)x+=*(p++);pp=*(b+0);*(pp++)=x; x=0; p=a8; for(ii=0;ii<3;ii++) { if(ii==0){ pp=*(a+0); *(pp++)=10; for(i=0;i<10;i++) x1=x+=*(p++); *(pp++)=x; p=a8; for(i=0;i<10;i++) { x=*(p++); x2+=x*x; } *(pp++)=x2; } if(ii==1){ pp=*(a+1); *(pp++)=x1; *(pp++)=x2; p=a8; x1=0; for(i=0;i<10;i++) { x=*(p++); x1+=x*x*x; } *(pp++)=x1; } if(ii==2) { pp=*(a+2); *(pp++)=x2; *(pp++)=x1; x3=0; p=a8; for(i=0;i<10;i++) { x=*(p++); x2=x*x*x*x; x3+=x2; } *(pp++)=x3; } }pp=*(b+1); p=a9; ppp=a8; x3=0; for(i=0;i<10;i++) { x=*(p++); x2=*(ppp++); x3+=x*x2; } *pp=x3; pp=*(b+2); p=a9; ppp=a8; x3=0; for(i=0;i<10;i++) { x=*(p++); x2=*(ppp++); x3+=x*x2*x2; } *pp=x3; ///求矩阵的模 p=*(a+0); c=*p; p=*(a+1); p++; for(i=1;i<3;i++) {for( j=1;j<3;j++) {switch (d1) { case 0:x=x1= *(p++); d1++;break; case 1:x4=x5= *(p++); d1++;break; case 2:x2= *(++p); d1++;break; case 3:x3= *(++p); break; } } }x7=c*(x1*x3-x5*x2); p=*(a+1); c=*p; p=*(a+0); p++; x1=*(p++); x5=*p; x8=c*(x1*x3-x5*x2); p=*(a+2); c=*p; x9=c*(x1*x4-x5*x); c=1/(x7-x8+x9);/求伴随阵// p=*(a+0); x1=*(p++); x2=*(p++); x3=*(p++); p=*(a+1); x4=*(p++); x5=*(p++); x6=*(p++); p=*(a+2); x7=*(p++); x8=*(p++); x9=*(p++); p=*(b1+0); *(p++)=(x5*x9-x6*x8); *(p++)=-1*(x2*x9-x3*x8); *(p++)=(x2*x6-x3*x5); p=*(b1+1); *(p++

    展开全文
  • 最小二乘法C语言的实现《传感器技术》题目要求:使用最小二乘法求线性度的拟合直线方程程序:#include #include #include #includefloat average(int n,float *x){int i;float av;av=0;for(i=0;iav+=*(x+i);av=av/n;...

    最小二乘法C语言的实现

    《传感器技术》

    题目要求:使用最小二乘法求线性度的拟合直线方程

    程序:

    #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",a,b,c,d);

    return(e);

    }

    float he(int n,float *y)

    {int i;

    float a;

    a=0;

    for(i=0;i

    a=a+*(y+i);

    return(a);

    }

    float xsb(int n,float *x,float *y,float a)

    { float b,c,d;

    b=he(n,y);

    c=he(n,x);

    d=(b-a*c)/n;

    return(d);

    }

    void main()

    { int n,i;

    float *x,*y,a,b;

    printf("请输入将要输入的有效数值组数n的值:");

    scanf("%d",&n);

    x=(float*)calloc(n,sizeof(float));

    if(x==NULL)

    {printf("内存分配失败");

    exit(1);

    }

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

    if(y==NULL)

    {printf("内存分配失败");

    exit(1);

    }

    printf("请输入x的值\n");

    for(i=0;i

    printf("请输入y的值,请注意与x的值一一对应:\n");

    for(i=0;i

    for(i=0;i

    { printf("x[%d]=%3.2f ",i,*(x+i));

    printf("y[%d]=%3.2f\n",i,*(y+i));

    }

    a=xsa(n,x,y);

    b=xsb(n,x,y,a);

    printf("经最小二乘法拟合得到的一元线性方程为:\n");

    printf("f(x)=%3.2fx+%3.2f\n",a,b);

    }

    运行:按照程序要求来,输入两数之间用空格号区分。

    运行结果如下:

    注意:不要直接引用运行结果图片,窗口标题会暴露上级目录,例如:熊新昊pc

    展开全文
  • 最小二乘法C语言的实现.doc
  • 最小二乘法简介:1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始...

    最小二乘法简介:1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星。

    高斯使用的最小二乘法的方法发表于1809年他的著作《天体运动论》中,而法国科学家勒让德于1806年独立发现“最小二乘法”,但因不为时人所知而默默无闻。两人曾为谁最早创立最小二乘法原理发生争执。

    1829年,高斯提供了最小二乘法的优化效果强于其他方法的证明,见高斯-马尔可夫定理。计算方法是门联系计算机技术与数学的学科,它提供了用计算机的思维解决数学问题的方法。C语言是应用广泛的编程语言,它虽是高级语言但也可进行底层编程。本代码结合了基本的最小二乘法思想,求解正规方程用的是列主元消去的思想。

    #include

    #include

    int M;

    int N;

    double x[20],a[10];

    double y[20],xx[10][10],yy[10];

    void Q_liheF(int m,int n);

    void Q_zhi(int m);

    void S_chu(int m);

    void B_jiao(int m,int k);

    void S_qu(int m,int k);

    void huidai(int m);

    void main()

    {

    int i;

    printf("已知M为拟合的次数,N+1为数据个数,输入M,N的值:\n");

    scanf("%d,%d",&M,&N);

    for(i=0;i<=N;i++)

    scanf("%lf,%lf",&x[i],&y[i]);

    printf("\n拟合原始数据:\n");

    for(i=0;i<=N;i++)

    printf("f(%lf)=%lf\n",x[i],y[i]);

    for(i=0;i<=M;i++)

    a[i]=0;

    Q_liheF(M,N);

    Q_zhi(M);

    S_chu(M);

    }

    void S_chu(int m)

    {

    int i;

    printf("\n\tf(x)=");

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

    {

    if(a[i]>=0)

    {

    if(i!=0)

    printf("+%.4lfx^%d",a[i],i);

    else

    printf("%.4lf",a[i]);

    }

    else

    {

    if(i!=0)

    printf("%.4lfx^%d",a[i],i);

    else

    printf("%.4lf",a[i]);

    }

    }

    printf("\n\n");

    }

    void Q_liheF(int m,int n)

    {

    int i,j,k;

    double t1,t2;

    float h;

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

    {

    t1=0;

    t2=0;

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

    {

    t1=0;

    for(k=0;k<=n;k++)

    {

    h=i+j;

    t1+=pow(x[k],h);

    }

    xx[i][j]=t1;

    xx[j][i]=t1;

    }

    for(k=0;k<=n;k++)

    {

    h=i;

    t2+=y[k]*pow(x[k],h);

    }

    yy[i]=t2;

    }

    printf("\n正规方程组:\n");

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

    {

    for(j=0;j<=m;j++)

    printf("%.4lf ",xx[i][j]);

    printf("**%.4lf\n",yy[i]);

    }

    }

    void Q_zhi(int m)

    {

    int i,flag;

    flag=0;

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

    {

    B_jiao(m,i);

    if(xx[i][i]==0)

    {

    flag=1;

    break;

    }

    S_qu(m,i);

    }

    if(flag!=1)

    huidai(m);

    else

    printf("\n******拟合有误无法求解!*****\n");

    }

    void B_jiao(int m,int k)

    {

    int i,j,q;

    double t;

    for(i=k,q=i;i<=m-1;i++)

    {

    if(fabs(xx[i][k])

    q=i+1;

    }

    if(q!=k)

    {

    for(j=k;j<=m;j++)

    {

    t=xx[k][j];

    xx[k][j]=xx[q][j];

    xx[q][j]=t;

    }

    t=yy[k];

    yy[k]=yy[q];

    yy[q]=t;

    }

    }

    void S_qu(int m,int k)

    {

    int i,j;

    double l;

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

    {

    l=xx[i][k]/xx[k][k];

    for(j=k;j<=m;j++)

    {

    xx[i][j]=xx[i][j]-l*xx[k][j];

    }

    yy[i]=yy[i]-l*yy[k];

    }

    }

    void huidai(int m)

    {

    int i,j;

    double A=0;

    a[m]=yy[m]/xx[m][m];

    for(i=m-1;i>=0;i--)

    {

    for(j=m;j>=i+1;j--)

    A+=a[j]*xx[i][j];

    a[i]=(yy[i]-A)/xx[i][i];

    A=0;

    }

    }

    运行结果:

    a4c26d1e5885305701be709a3d33442f.png

    展开全文
  • 非线性最小二乘法C语言代码

    热门讨论 2011-10-10 21:09:01
    非线性最小二乘法C语言代码 main () { int n,i,flag2; char flag1='y'; float ar[50],br[50],x,y,xe,ye,xye,xxe,sx,sy,sxy,sxx,a,b; printf ("\n欢迎使用最小二乘法数据处理程序\n");
  • 最小二乘法c语言自编

    2014-11-04 19:22:56
    c语言的自编最小二乘法代码,给出最终拟合得的直线方程,和准确度
  • 采用线性回归的方式,Y=bx+a,求出系数 #include#includeintmain(){//floatx[6]={0.0,1.0,2.0,3.0,4.0,5.0};//floaty[6]={1.1,1.9,3.1,3.9,4.4,4.9};/*floatx[6]={0.0,1.0,2.0,3.0,4.0,5.0};floaty[6]={0.0,1.0,2.0,...
  • 实验目的:进一步熟悉曲线拟合的最小二乘法。掌握编程语言字符处理程序的设计和调试技术。2.实验要求:输入:已知点的数目以及各点坐标 。输出:根据最小二乘法原理以及各点坐标求出拟合曲线 。3.程序流程:(1)输入...
  • 曲线拟合的最小二乘法c语言

    热门讨论 2012-12-16 14:30:34
    曲线拟合的最小二乘法c语言 计算方法 #include #include #define N 9 #define M 3 void main() { int i,j; float a[2][N],b[5][N],c[7]={0,0,0,0,0,0,0};; printf("请输入%d个点的X坐标\n",N); for(j=0;j;j++) ...
  • 拉格朗日和牛顿插值方法c语言实现 最小二乘法
  • ////a0x^2+a1x+a2 = y//r:相关系数^2bool Parabola(double* x, double* y, int n, double* a, double* r){const int CURVE_INDEX = 3;double B[CURVE_INDEX];double **A =new double*[CURVE_INDEX];...
  • 最小二乘法C语言的实现

    万次阅读 2015-12-26 14:53:50
    进一步熟悉曲线拟合的最小二乘法。 掌握编程语言字符处理程序的设计和调试技术。   2.实验要求: 输入:已知点的数目以及各点坐标 。 输出:根据最小二乘法原理以及各点坐标求出拟合曲线 。   3.程序流程:...
  • 数值分析最小二乘法 本人是用C语言 在实验课上编的,时间有限,还有不足,请多指教!
  • 前两天发了一个关于最小二乘法C语言算法的帖子(http://www.amobbs.com/thread-5535084-1-1.html),这次重新发一个,但是绝对不是属于重复发帖,如果你对算法感兴趣,这个绝对适合你的口味,这次综合了最小二乘法高阶...
  • 最小二乘法的应用-C语言实现线损电压补偿最小二乘法的应用-C语言实现线损电压补偿-最小二乘法的基本原理最小二乘法的基本原理转载 马同学高等数学 的文章一段不可精确测出的回路电阻回路电阻的实验数据求出最小二...
  • 最小二乘法的应用-C语言实现线损电压补偿最小二乘法的应用-C语言实现线损电压补偿-一段不可精确测出的回路电阻最小二乘法的基本原理一段不可精确测出的回路电阻回路电阻的实验数据通过中间层把两个存在线性关系的可...
  • 1. 最小二乘法首先举个例子。针对线性最小二乘法即直线拟合,如下图(来自维基百科)所示: 根据已有的数据(图中的点),来做出一条最贴近数据发展趋势的直线。通过这条直线,我们可以对未来的数据进行预测,因为基本会...
  • #include #include#include#include#include#include#include#include#includevoid fitLine(const TColgp_Array1OfPnt2d&thePoints,const std::string&theFileName,gp_Lin2d&theLine){math_Vector aB(1,...
  • 1、实验二:实现自适应的递归最小二乘法(RLS)一、实验目的利用 matlab 实现自适应的递归最小二乘法(RLS)二、实验过程首先掌握 RLS 算法原理;然后利用 matlab 实现;最后得出结果;三、实验程序%RLS 算法randn(seed,...
  • 线性回归,最小二乘法 C语言实现

    千次阅读 2016-03-08 11:09:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 一、线性最小二乘拟合使用一个简单函数在整体上逼近已知函数,使其在整体上尽可能与原始数据曲线近似。记为:称之为拟合曲线,若该函数为插值多项式,则所有偏差为零。但实际情况中,我们不可能要求近似曲线y =严格...
  • 最小二乘法C实现

    2017-10-12 15:50:01
    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法...
  • 最小二乘法 C代码 飞思卡尔 黑线拟合
  • 拟合直线 #include #include #include #include float average(int n,float *x) {int i; float av;... printf("经最小二乘法拟合得到的一元线性方程为:\n"); printf("f(x)=%5.4fx+%5.4f\n",a,b); }
  • 很多同学会问不应该是最小平方和吗?为什么不是func(params, x) - y * func(params, x) - y?原因是名为lasts的方法中帮我们做了。看一下sklearn中源码的注释就知道什么情况了: Minimize the sum of squares of a ...
  • 最小二乘法C程序,比较完整简洁的 最小二乘法程序代码 main () {int n,i; char flag='y'; float ar[50][2],x,y,xe,ye,xye,xxe,sx,sy,sxy,sxx,a,b; printf ("\n****************************************************...
  • 最小二乘法c实现

    千次阅读 2017-08-16 14:22:56
    一.背景  5月9号到北大去听hulu的讲座...后来主讲人在讲座中提到了最小二乘法,说这个是机器学习最基础的算法。神马,最基础,我咋不知道呢! 看来以后还是要对自己有清晰认识。  回来赶紧上百度,搜了下什么
  • /*** 最小二乘法拟合圆* 拟合出的圆以圆心坐标和半径的形式表示* 此代码改编自 newsmth.net 的 jingxing 在 Graphics 版贴出的代码。* 版权归 jingxing, 我只是搬运工外加一些简单的修改工作。*/typedef complex ...
  • 一、递归最小二乘法 递推最小二乘法:当矩阵维数增加时,矩阵求逆运算计算量过大,而且不适合在线辨识。为了减少计算量,并且可以实时地辨识出动态系统的特性,可以将最小二乘法转换成参数递推的估计。 取前N组数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,342
精华内容 5,736
关键字:

最小二乘法c