C++ 最小二乘多项式拟合仅适用于偶数个坐标

C++ 最小二乘多项式拟合仅适用于偶数个坐标,c++,least-squares,C++,Least Squares,我写了一个程序,通过给出一些坐标来计算抛物线方程,但它只适用于偶数个坐标。如果我输入一个不均匀的数字,它将显示一些无意义的B 以下是代码(由于某些格式问题,我无法将代码复制到此处): #包括 #包括 #包括 使用名称空间std; int main() { inti,j,k,n,n; n=2; cout N; double*x=新的double[N]; 双精度*y=新双精度[N]; cout已经发布的评论指出,一些索引超出了范围(超出了矩阵的大小)。我更愿意将x,y数据作为每行一对值、一个x值和一

我写了一个程序,通过给出一些坐标来计算抛物线方程,但它只适用于偶数个坐标。如果我输入一个不均匀的数字,它将显示一些无意义的B

以下是代码(由于某些格式问题,我无法将代码复制到此处):

#包括
#包括
#包括
使用名称空间std;
int main()
{
inti,j,k,n,n;
n=2;
cout N;
double*x=新的double[N];
双精度*y=新双精度[N];

cout已经发布的评论指出,一些索引超出了范围(超出了矩阵的大小)。我更愿意将x,y数据作为每行一对值、一个x值和一个y值输入,这是一个很容易的更改(cin>>x[I]>>y[I]),但下面的示例使用了原始问题的顺序

二次方程拟合的常规方法示例代码:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    int i, j, k, N;
    cout << "Number of data pairs:" << endl;
    cin >> N;
    double * x = new double[N]; 
    double * y = new double[N];
    cout << endl << "Enter the x-axis values:" << endl;
    for (i = 0; i<N; i++)
        cin >> x[i];
    cout << endl << "Enter the y-axis values:" << endl;
    for (i = 0; i<N; i++)
        cin >> y[i];
    double B[3][4] = {0.0};         // generate augmented matrix
    for(k = 0; k < 3; k++){
        for (i = 0; i < N; i++) {
            for (j = 0; j < 3; j++) {
                B[k][j] += pow(x[i], j + k);}
            B[k][3] += y[i]*pow(x[i], k);}}
    for(k = 0; k < 3; k++){         // invert matrix
        double q = B[k][k];         //   divide row by B[k][k]
        for(i = 0; i < 4; i++){
            B[k][i] /= q;}
        for(j = 0; j < 3; j++){     //   zero out column B[][k]
            if(j == k)
                continue;
            double m = B[j][k];         
            for(i = 0; i < 4; i++){
                B[j][i] -= m*B[k][i];}}}
    cout << endl << "The equation is the following:" << endl;;
    cout << B[2][3] << " x^2 + " << B[1][3] << " x + " << B[0][3];
    cout << endl;
    delete[]x;
    delete[]y;
    system("pause");
    return 0;
}
我通常使用另一种算法来避免矩阵求逆,这对于高阶多项式更好,但对于二次方程则不需要

如果对另一种算法感兴趣,这里有一个pdf文件的链接,该文件描述了该算法并包含伪代码。我有旧的工作代码,但需要转换(它使用cgets(),现在很少支持)

示例代码。它非常旧,最初在Atari ST上运行。我将其转换为与Visual Studio一起使用。所有静态的原因是减少链接器必须处理的符号数

/*------------------------------------------------------*/
/*      fit4.c          polynomial fit program          */
/*      originally written in 1990, minimal updates     */
/*------------------------------------------------------*/
/* disable Visual Studio warnings for old functions */
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

/*                              mmax = max # coefficients */
/*                              nmax = max # points */
/*                              bfrsz = bfr size */
/*                              linsz = size of line bfr */
#define mmax 11
#define nmax 300
#define bfrsz 0x2000
#define linsz 64

static void polyf();
static void gcoef();
static void gvar();
static void calc();
static void calcx();
static void rdata();
static void gdata();
static int  gtlin();
static char gtchr();
static int  conrs();

static char cbfr[64];           /* console response bfr */
static char line[linsz];
static int  lineno;

static char sbfr[bfrsz];        /* file params */
static FILE *sfp;
static char *sptr, *send;
static int gteof;

static int wf;

static int m, n;                /* input values */
static double x[nmax];
static double y[nmax];
static double w[nmax];
static double b[mmax];          /* generated values */
static double A[mmax];
static double B[mmax];
static double L[mmax];
static double W[mmax];
static double p2[nmax];
static double p1[nmax];
static double p0[nmax];
static double c[mmax];          /* coefficients for y(x) */
static double z[nmax];          /* calculated y[] */
static double xi, zi, vr;
static double D0, D1;           /* constants */

static double *pp2;             /* pointers to logical p2, p1, p0 */
static double *pp1;
static double *pp0;
static double *ppx;

static double *px, *pf, *pw;    /* for gdata */

main()
{
int i;

name0:
    printf("\nEnter name of data file: "); /* get file name */
    if(!conrs())
        return(0);
    sfp = fopen(&cbfr[2], "rb"); /* open file */
    if(sfp == (FILE *)0){
        printf("\nfile not found");
        goto name0;}

    wf = 0;                     /* ask for weighting */
    printf("\nUsing weights (Y/N)? ");
    if(!conrs())
        return(0);
    if('Y' == (cbfr[2]&0x5f))
        wf = 1;

deg0:
    printf("\nEnter degree of equation (1-n): ");  /* get # terms */
    if(!conrs())
        return(0);
    sscanf(&cbfr[2], "%d", &m);
    if(m >= mmax)
        goto deg0;

    sptr = send = (char *)0;
    gteof = 0;
    lineno = 0;

    gdata();                    /* get data */

    printf("\n%5d points found ", n);

    polyf();                    /* generate b[], A[], B[] */
    gcoef();                    /* generate coefficients */
    gvar();                     /* generate variance */

    for(i = 0; i <= m; i++){
        printf("\n%3d  b%12.4le  A%12.4le  B%12.4le",
                i, b[i], A[i], B[i]);
        printf("  L%12.4le  W%12.4le", L[i], W[i]);}

    printf("\nvariance = %12.4le\n", vr);

    for(i = m; i; i--)
        printf("%12.4le X**%1d + ", c[i], i);
    printf("%12.4le\n", c[0]);

    for(i = 0; i < n; i++){     /* calculate results */
        xi = x[i];
        calc();
        z[i] = zi;}

    for(i = 0; i < n; i += 1)   /* display results */
        printf("\n%14.6le  %14.6le  %14.6le  %14.6le",
                x[i], y[i], z[i], y[i]-z[i]);
    printf("\n");
    return(0);
}

/*------------------------------------------------------*/
/*      polyf           poly fit                        */
/*      in:             x[], y[], w[], n, m             */
/*      out:            b[], A[], B[], L[], W[]         */
/*------------------------------------------------------*/
static void polyf()
{
int i, j;

    D0 = (double)0.;            /* init */
    D1 = (double)1.;
    pp2 = p2;
    pp1 = p1;
    pp0 = p0;

    j = 0;
    A[j] = D0;                  /* calc A, p[j], p[j-1], L, W */
    L[j] = D0;                  /* note A[0] not used */
    W[j] = D0;
    for(i = 0; i < n; i++){
        pp0[i] = D1;
        pp1[i] = D0;
        L[j] += w[i];
        W[j] += w[i]*y[i];}
    B[0] = D0;
    b[j] = W[j]/L[j];

    for(j = 1; j <= m; j++){
        ppx = pp2;              /* save old p[j], p[j-1] */
        pp2 = pp1;
        pp1 = pp0;
        pp0 = ppx;
        A[j] = D0;              /* calc A */
        for(i = 0; i < n; i++){
            A[j] += w[i]*x[i]*pp1[i]*pp1[i]/L[j-1];}
        L[j] = D0;              /* calc p[j], L, W */
        W[j] = D0;
        for(i = 0; i < n; i++){
            pp0[i] = (x[i]-A[j])*pp1[i]-B[j-1]*pp2[i];
            L[j] += w[i]*pp0[i]*pp0[i];
            W[j] += w[i]*y[i]*pp0[i];}
        B[j] = L[j]/L[j-1];     /* calc B[], b[] */
        b[j] = W[j]/L[j];}
}

/*------------------------------------------------------*/
/*      gcoef   generate coefficients                   */
/*      in:     b[], A[], B[]                           */
/*      out:    c[]                                     */
/*      uses:   p0[], p1[], p2[]                        */
/*------------------------------------------------------*/
static void gcoef()
{
int i, j;
    for(i = 0; i <= m; i++){            /* init */
        c[i] = p2[i] = p1[i] = p0[i] = 0.;}
    p0[0] = D1;
    c[0] += b[0]*p0[0];
    for(j = 1; j <= m; j++){            /* generate coefs */
        p2[0] = p1[0];
        p1[0] = p0[0];
        p0[0] = -A[j]*p1[0]-B[j-1]*p2[0];
        c[0] += b[j]*p0[0];
        for(i = 1; i <= j; i++){
            p2[i] = p1[i];
            p1[i] = p0[i];
            p0[i] = p1[i-1]-A[j]*p1[i]-B[j-1]*p2[i];
            c[i] += b[j]*p0[i];}}
}

/*------------------------------------------------------*/
/*      gvar    generate variance                       */
/*------------------------------------------------------*/
static void gvar()
{
int i;
double tt;
    vr = 0.;
    for(i = 0; i < n; i++){
        xi = x[i];
        calc();
        tt = y[i]-zi;
        vr += tt*tt;}
    vr /= n-m-1;
}

/*------------------------------------------------------*/
/*      calc            calc zi, given xi               */
/*      in:             c[]                             */
/*------------------------------------------------------*/
static void calc ()
{
int i;
    zi = c[m];
    for(i = m-1; i >= 0; i--)
        zi = zi*xi + c[i];
}

/*------------------------------------------------------*/
/*      calcx           calc zi, given xi               */
/*      in:             b[], A[], B[]                   */
/*------------------------------------------------------*/
static void calcx()
{
int i;
double q2, q1, q0;
    if(m == 0){
        zi = b[0];
        return;}
    if(m == 1){
        zi = b[0]+(xi-A[1])*b[1];
        return;}
    q1 = b[m];
    q0 = b[m-1]+(xi-A[m])*q1;
    for(i = m-2; i >= 0; i--){
        q2 = q1;
        q1 = q0;
        q0 = b[i]+(xi-A[i+1])*q1-B[i+1]*q2;}
    zi = q0;
}

/*------------------------------------------------------*/
/*      gdata   get data                                */
/*------------------------------------------------------*/
static void gdata()
{
    px = &x[0];
    pf = &y[0];
    pw = &w[0];
    while(1){
        gtlin();                /* get a line */
        if(gteof)
            break;
        if(lineno == nmax){
            printf("\ntoo many points\n");
            break;}
        if(wf){                 /* stuff values */
            sscanf(line, "%le%le%le", px, pf, pw);}
        else{
            sscanf(line, "%le%le", px, pf);
            *pw = 1.0;}
        px++;                   /* bump ptrs */
        pf++;
        pw++;}
    fclose(sfp);                /* close file */
    n = lineno;                 /* set # points */
}

/*------------------------------------------------------*/
/*      gtlin   get a line of data                      */
/*------------------------------------------------------*/
static int gtlin()
{
char chr;
int col;
    col = 0;
    while(1){
        chr = gtchr();
        switch(chr){
          case 0x0a:            /* line feed */
            lineno++;
            return(col);
          case 0x1a:
            return(col);
          default:
            line[col] = chr;
            col++;
            if(col >= linsz){
                printf("line # %d too long\n%s",lineno, line);
                return(col);}}}
}

/*------------------------------------------------------*/
/*      gtchr   get a char                              */
/*------------------------------------------------------*/
static char gtchr()
{
int cnt;
    if(gteof)                   /* check for eof */
        return(0x1a);
    if(sptr == send){
        if(!(cnt = (int) fread(sbfr, 1, bfrsz, sfp))){
            fclose(sfp);
            gteof = 1;
            return(0x1a);}
        sptr = sbfr;
        send = sbfr+cnt;}
    return(*sptr++);
}

/*------------------------------------------------------*/
/*      conrs           get string from console         */
/*------------------------------------------------------*/
static int conrs()
{
int i;
    memset(cbfr, 0, sizeof(cbfr));  /* get a line */
    cbfr[0] = sizeof(cbfr)-2;
    fgets(cbfr+2, sizeof(cbfr)-2, stdin);
    cbfr[1] = (char)(strlen(&cbfr[2])-1);
    i = cbfr[1];
    cbfr[2+i] = 0;
    return(i);
}

编译并运行该程序。输入数据文件的名称,然后在提示使用权重时输入N,然后输入要生成的方程阶数的2。(如果使用权重,第一列将是权重因子,权重2将是相同的,并且有两个相同数据点的实例,但权重可以是类似于1.5的值).

已经发布的评论指出,一些索引超出了范围(超出了矩阵的大小)。我更愿意将x,y数据作为每行一对值、一个x值和一个y值输入,这是一个很容易的更改(cin>>x[I]>>y[I]),但下面的示例使用了原始问题的顺序

二次方程拟合的常规方法示例代码:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
    int i, j, k, N;
    cout << "Number of data pairs:" << endl;
    cin >> N;
    double * x = new double[N]; 
    double * y = new double[N];
    cout << endl << "Enter the x-axis values:" << endl;
    for (i = 0; i<N; i++)
        cin >> x[i];
    cout << endl << "Enter the y-axis values:" << endl;
    for (i = 0; i<N; i++)
        cin >> y[i];
    double B[3][4] = {0.0};         // generate augmented matrix
    for(k = 0; k < 3; k++){
        for (i = 0; i < N; i++) {
            for (j = 0; j < 3; j++) {
                B[k][j] += pow(x[i], j + k);}
            B[k][3] += y[i]*pow(x[i], k);}}
    for(k = 0; k < 3; k++){         // invert matrix
        double q = B[k][k];         //   divide row by B[k][k]
        for(i = 0; i < 4; i++){
            B[k][i] /= q;}
        for(j = 0; j < 3; j++){     //   zero out column B[][k]
            if(j == k)
                continue;
            double m = B[j][k];         
            for(i = 0; i < 4; i++){
                B[j][i] -= m*B[k][i];}}}
    cout << endl << "The equation is the following:" << endl;;
    cout << B[2][3] << " x^2 + " << B[1][3] << " x + " << B[0][3];
    cout << endl;
    delete[]x;
    delete[]y;
    system("pause");
    return 0;
}
我通常使用另一种算法来避免矩阵求逆,这对于高阶多项式更好,但对于二次方程则不需要

如果对另一种算法感兴趣,这里有一个pdf文件的链接,该文件描述了该算法并包含伪代码。我有旧的工作代码,但需要转换(它使用cgets(),现在很少支持)

示例代码。它非常旧,最初在Atari ST上运行。我将其转换为与Visual Studio一起使用。所有静态的原因是减少链接器必须处理的符号数

/*------------------------------------------------------*/
/*      fit4.c          polynomial fit program          */
/*      originally written in 1990, minimal updates     */
/*------------------------------------------------------*/
/* disable Visual Studio warnings for old functions */
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

/*                              mmax = max # coefficients */
/*                              nmax = max # points */
/*                              bfrsz = bfr size */
/*                              linsz = size of line bfr */
#define mmax 11
#define nmax 300
#define bfrsz 0x2000
#define linsz 64

static void polyf();
static void gcoef();
static void gvar();
static void calc();
static void calcx();
static void rdata();
static void gdata();
static int  gtlin();
static char gtchr();
static int  conrs();

static char cbfr[64];           /* console response bfr */
static char line[linsz];
static int  lineno;

static char sbfr[bfrsz];        /* file params */
static FILE *sfp;
static char *sptr, *send;
static int gteof;

static int wf;

static int m, n;                /* input values */
static double x[nmax];
static double y[nmax];
static double w[nmax];
static double b[mmax];          /* generated values */
static double A[mmax];
static double B[mmax];
static double L[mmax];
static double W[mmax];
static double p2[nmax];
static double p1[nmax];
static double p0[nmax];
static double c[mmax];          /* coefficients for y(x) */
static double z[nmax];          /* calculated y[] */
static double xi, zi, vr;
static double D0, D1;           /* constants */

static double *pp2;             /* pointers to logical p2, p1, p0 */
static double *pp1;
static double *pp0;
static double *ppx;

static double *px, *pf, *pw;    /* for gdata */

main()
{
int i;

name0:
    printf("\nEnter name of data file: "); /* get file name */
    if(!conrs())
        return(0);
    sfp = fopen(&cbfr[2], "rb"); /* open file */
    if(sfp == (FILE *)0){
        printf("\nfile not found");
        goto name0;}

    wf = 0;                     /* ask for weighting */
    printf("\nUsing weights (Y/N)? ");
    if(!conrs())
        return(0);
    if('Y' == (cbfr[2]&0x5f))
        wf = 1;

deg0:
    printf("\nEnter degree of equation (1-n): ");  /* get # terms */
    if(!conrs())
        return(0);
    sscanf(&cbfr[2], "%d", &m);
    if(m >= mmax)
        goto deg0;

    sptr = send = (char *)0;
    gteof = 0;
    lineno = 0;

    gdata();                    /* get data */

    printf("\n%5d points found ", n);

    polyf();                    /* generate b[], A[], B[] */
    gcoef();                    /* generate coefficients */
    gvar();                     /* generate variance */

    for(i = 0; i <= m; i++){
        printf("\n%3d  b%12.4le  A%12.4le  B%12.4le",
                i, b[i], A[i], B[i]);
        printf("  L%12.4le  W%12.4le", L[i], W[i]);}

    printf("\nvariance = %12.4le\n", vr);

    for(i = m; i; i--)
        printf("%12.4le X**%1d + ", c[i], i);
    printf("%12.4le\n", c[0]);

    for(i = 0; i < n; i++){     /* calculate results */
        xi = x[i];
        calc();
        z[i] = zi;}

    for(i = 0; i < n; i += 1)   /* display results */
        printf("\n%14.6le  %14.6le  %14.6le  %14.6le",
                x[i], y[i], z[i], y[i]-z[i]);
    printf("\n");
    return(0);
}

/*------------------------------------------------------*/
/*      polyf           poly fit                        */
/*      in:             x[], y[], w[], n, m             */
/*      out:            b[], A[], B[], L[], W[]         */
/*------------------------------------------------------*/
static void polyf()
{
int i, j;

    D0 = (double)0.;            /* init */
    D1 = (double)1.;
    pp2 = p2;
    pp1 = p1;
    pp0 = p0;

    j = 0;
    A[j] = D0;                  /* calc A, p[j], p[j-1], L, W */
    L[j] = D0;                  /* note A[0] not used */
    W[j] = D0;
    for(i = 0; i < n; i++){
        pp0[i] = D1;
        pp1[i] = D0;
        L[j] += w[i];
        W[j] += w[i]*y[i];}
    B[0] = D0;
    b[j] = W[j]/L[j];

    for(j = 1; j <= m; j++){
        ppx = pp2;              /* save old p[j], p[j-1] */
        pp2 = pp1;
        pp1 = pp0;
        pp0 = ppx;
        A[j] = D0;              /* calc A */
        for(i = 0; i < n; i++){
            A[j] += w[i]*x[i]*pp1[i]*pp1[i]/L[j-1];}
        L[j] = D0;              /* calc p[j], L, W */
        W[j] = D0;
        for(i = 0; i < n; i++){
            pp0[i] = (x[i]-A[j])*pp1[i]-B[j-1]*pp2[i];
            L[j] += w[i]*pp0[i]*pp0[i];
            W[j] += w[i]*y[i]*pp0[i];}
        B[j] = L[j]/L[j-1];     /* calc B[], b[] */
        b[j] = W[j]/L[j];}
}

/*------------------------------------------------------*/
/*      gcoef   generate coefficients                   */
/*      in:     b[], A[], B[]                           */
/*      out:    c[]                                     */
/*      uses:   p0[], p1[], p2[]                        */
/*------------------------------------------------------*/
static void gcoef()
{
int i, j;
    for(i = 0; i <= m; i++){            /* init */
        c[i] = p2[i] = p1[i] = p0[i] = 0.;}
    p0[0] = D1;
    c[0] += b[0]*p0[0];
    for(j = 1; j <= m; j++){            /* generate coefs */
        p2[0] = p1[0];
        p1[0] = p0[0];
        p0[0] = -A[j]*p1[0]-B[j-1]*p2[0];
        c[0] += b[j]*p0[0];
        for(i = 1; i <= j; i++){
            p2[i] = p1[i];
            p1[i] = p0[i];
            p0[i] = p1[i-1]-A[j]*p1[i]-B[j-1]*p2[i];
            c[i] += b[j]*p0[i];}}
}

/*------------------------------------------------------*/
/*      gvar    generate variance                       */
/*------------------------------------------------------*/
static void gvar()
{
int i;
double tt;
    vr = 0.;
    for(i = 0; i < n; i++){
        xi = x[i];
        calc();
        tt = y[i]-zi;
        vr += tt*tt;}
    vr /= n-m-1;
}

/*------------------------------------------------------*/
/*      calc            calc zi, given xi               */
/*      in:             c[]                             */
/*------------------------------------------------------*/
static void calc ()
{
int i;
    zi = c[m];
    for(i = m-1; i >= 0; i--)
        zi = zi*xi + c[i];
}

/*------------------------------------------------------*/
/*      calcx           calc zi, given xi               */
/*      in:             b[], A[], B[]                   */
/*------------------------------------------------------*/
static void calcx()
{
int i;
double q2, q1, q0;
    if(m == 0){
        zi = b[0];
        return;}
    if(m == 1){
        zi = b[0]+(xi-A[1])*b[1];
        return;}
    q1 = b[m];
    q0 = b[m-1]+(xi-A[m])*q1;
    for(i = m-2; i >= 0; i--){
        q2 = q1;
        q1 = q0;
        q0 = b[i]+(xi-A[i+1])*q1-B[i+1]*q2;}
    zi = q0;
}

/*------------------------------------------------------*/
/*      gdata   get data                                */
/*------------------------------------------------------*/
static void gdata()
{
    px = &x[0];
    pf = &y[0];
    pw = &w[0];
    while(1){
        gtlin();                /* get a line */
        if(gteof)
            break;
        if(lineno == nmax){
            printf("\ntoo many points\n");
            break;}
        if(wf){                 /* stuff values */
            sscanf(line, "%le%le%le", px, pf, pw);}
        else{
            sscanf(line, "%le%le", px, pf);
            *pw = 1.0;}
        px++;                   /* bump ptrs */
        pf++;
        pw++;}
    fclose(sfp);                /* close file */
    n = lineno;                 /* set # points */
}

/*------------------------------------------------------*/
/*      gtlin   get a line of data                      */
/*------------------------------------------------------*/
static int gtlin()
{
char chr;
int col;
    col = 0;
    while(1){
        chr = gtchr();
        switch(chr){
          case 0x0a:            /* line feed */
            lineno++;
            return(col);
          case 0x1a:
            return(col);
          default:
            line[col] = chr;
            col++;
            if(col >= linsz){
                printf("line # %d too long\n%s",lineno, line);
                return(col);}}}
}

/*------------------------------------------------------*/
/*      gtchr   get a char                              */
/*------------------------------------------------------*/
static char gtchr()
{
int cnt;
    if(gteof)                   /* check for eof */
        return(0x1a);
    if(sptr == send){
        if(!(cnt = (int) fread(sbfr, 1, bfrsz, sfp))){
            fclose(sfp);
            gteof = 1;
            return(0x1a);}
        sptr = sbfr;
        send = sbfr+cnt;}
    return(*sptr++);
}

/*------------------------------------------------------*/
/*      conrs           get string from console         */
/*------------------------------------------------------*/
static int conrs()
{
int i;
    memset(cbfr, 0, sizeof(cbfr));  /* get a line */
    cbfr[0] = sizeof(cbfr)-2;
    fgets(cbfr+2, sizeof(cbfr)-2, stdin);
    cbfr[1] = (char)(strlen(&cbfr[2])-1);
    i = cbfr[1];
    cbfr[2+i] = 0;
    return(i);
}

编译并运行该程序。输入数据文件的名称,然后在提示使用权重时输入N,然后输入要生成的方程阶数的2。(如果使用权重,第一列将是权重因子,权重2将是相同的,并且有两个相同数据点的实例,但权重可以是类似于1.5的值).

这里您正在读取一个未初始化的值
a[j]

for (i = n - 1; i >= 0; i--) //back-substitution
{
    a[i] = B[i][n];
    for (j = 0; j < n; j++)
        if (j != i)
            a[i] = a[i] - B[i][j] * a[j];
    a[i] = a[i] / B[i][i];
}
(i=n-1;i>=0;i--)的
//反向替换
{
a[i]=B[i][n];
对于(j=0;j
这里您正在读取一个未初始化的值
a[j]

for (i = n - 1; i >= 0; i--) //back-substitution
{
    a[i] = B[i][n];
    for (j = 0; j < n; j++)
        if (j != i)
            a[i] = a[i] - B[i][j] * a[j];
    a[i] = a[i] / B[i][i];
}
(i=n-1;i>=0;i--)的
//反向替换
{
a[i]=B[i][n];
对于(j=0;j
只需使用
剪切
,然后将其粘贴到问题中。选择所有代码后,单击代码图标
{}
。是的,但它说有一些格式问题,但我没有发现任何问题。不要偷懒,将输出放在文本块中。当文本可以的时候,你不应该使用图像。如果我侮辱你,那不是故意的。抱歉@tobi303huh?别担心,侮辱我需要更多:P只是试图帮助你改进问题,似乎l我想你收到消息了。是时候删除一些垃圾评论了……只需使用
剪切
,然后
粘贴到问题中。选择所有代码后,单击代码图标
{}
。是的,但它说有一些格式问题,但我没有发现任何问题。不要偷懒,将输出放在文本块中。当文本可以的时候,你不应该使用图像。如果我侮辱你,那不是故意的。抱歉@tobi303huh?别担心,侮辱我需要更多:P只是试图帮助你改进问题,似乎l我知道了。该删除一些垃圾评论了……谢谢,我一定会查出来。@introvertbustardxd-我在我的答案中添加了常规最小二乘的示例代码。谢谢,我一定会查出来。@introvertbustardxd-我在我的答案中添加了常规最小二乘的示例代码。你是什么意思?
a
数组
j
以前已经初始化过。在此循环之前,数组a根本没有初始化。第一次阅读
a[j]
时,您有
j==0
i==2
。因此,只有
a[2]
被初始化,
a[0]
a[1]
不是。你是什么意思?
a
数组
j
以前已经初始化过。在这个循环之前,数组a根本没有初始化。当你第一次读
a[j]
时,你有
j==0
i==2
。因此,只有
a[2]
被初始化,
a[0]
a[1]
for (i = n - 1; i >= 0; i--) //back-substitution
{
    a[i] = B[i][n];
    for (j = 0; j < n; j++)
        if (j != i)
            a[i] = a[i] - B[i][j] * a[j];
    a[i] = a[i] / B[i][i];
}