@Tree 2022-02-24 21:39 采纳率: 100%
浏览 101
已结题

已知n次函数图像上n+1个点的坐标,求解析式各项的系数

点值表示怎么转系数表示?
请不要盲目回答FFT中的那些公式
可以没有代码,但请讲清楚一个中学生能理解的思路谢谢

  • 写回答

1条回答 默认 最新

  • 开发者小峰 2022-02-25 01:45
    关注

    用矩阵很方便
    k[0]*x[0]^0+k[1]*x[0]^1+...+k[n]*x[0]^n=y[0]
    k[0]*x[1]^0+k[1]*x[1]^1+...+k[n]*x[1]^n=y[1]
    .
    .
    .
    k[0]*x[n]^0+k[1]*x[n]^1+...+k[n]*x[n]^n=y[n]

    等价于

    img


    系数k等于y左乘x的逆

    #include <stdio.h>
    #include <malloc.h>
    #include <math.h>
    #ifndef NULL
    #define NULL ((void *)0)
    #endif
    /**
     * 求矩阵的余子矩阵
     * @param sm 原矩阵
     * @param row 行数
     * @param col 列数
     * @param l 行
     * @param r 列
     */
    double *minor(double *sm,int row,int col,int l, int r) {
        if(row<1||col<1) {
            return NULL;
        }
        double *dm=(double *)malloc(sizeof(double)*(row-1)*(col-1));
        int i,j,li,rj;
        for (i = 0; i < row - 1; i++) {
            for (j = 0; j < col - 1; j++) {
                li = i;
                rj = j;
                if (i >= l) {
                    li++;
                }
                if (j >= r) {
                    rj++;
                }
                if (rj < col) {
                    dm[i*(col-1)+j] = sm[li*col+rj];
                } else {
                    dm[i*(col-1)+j] = 0;
                }
            }
        }
        return dm;
    }
    /**
     * 求矩阵的行列式值
     * @param m 矩阵
     * @param row 行数
     * @param col 列数
     */
    double det(double *m,int row,int col) {
        double sum = 0;
        double *rm;
        if (row > 1) {
            int i;
            for (i = 0; i < row; i++) {
                rm = minor(m, row, col, i, 0);
                sum += det(rm,row-1,col-1) * m[i*col+0] * (i%2==0?1:-1);
                free(rm);
            }
        } else {
            sum += m[0];
        }
        return sum;
    }
    /**
     * 求矩阵的数乘
     * @param sm 原矩阵
     * @param n 倍数
     * @param row 行数
     * @param col 列数
     */
    double *amass(double *sm, int row, int col, double n) {
        double *dm;
        dm = (double *)malloc(sizeof(double)*row*col);
        int i,j;
        for (i = 0; i < row; i++) {
            for (j = 0; j < col; j++) {
                dm[i*col+j] = sm[i*col+j] * n;
            }
        }
        return dm;
    }
    /**
     * 求两矩阵的乘积
     * @param lm 左矩阵
     * @param lRow 左矩阵行数
     * @param lCol 左矩阵列数
     * @param rm 右矩阵
     * @param rRow 右矩阵行数
     * @param rCol 右矩阵列数
     */
    double *multiply(double *lm, int lRow, int lCol, double *rm, int rRow, int rCol) {
        double *dm;
        double numb;
        dm = (double *)malloc(sizeof(double)*lRow*rCol);
        int i,j,k;
        for (i = 0; i < lRow; i++) {
            for (j = 0; j < rCol; j++) {
                numb = 0;
                for (k = 0; k < rRow; k++) {
                    if (k < lCol && j < rCol) {
                        numb += lm[i*lCol+k] * rm[k*rCol+j];
                    }
                }
                dm[i*rCol+j] = numb;
            }
        }
        return dm;
    }
    /**
     * 求矩阵的伴随矩阵
     * @param sm 原矩阵
     * @param row 行数
     * @param col 列数
     */
    double *adjoint(double *sm, int row, int col) {
        double *dm, *rm;
        dm = (double *)malloc(sizeof(double)*row*col);
        int i,j;
        for (i = 0; i < row; i++) {
            for (j = 0; j < row; j++) {
                rm = minor(sm, row, col, i, j);
                dm[i*col+j] = ((i+j)%2==0?1:-1) * det(rm, row, col);
                free(rm);
            }
        }
        return dm;
    }
    /**
     * 求矩阵的逆矩阵
     * @param sm 原矩阵
     * @param row 行数
     * @param col 列数
     */
    double *inverse(double *sm, int row, int col) {
        double *dm=NULL,*am;
        double smDet;
        smDet = det(sm, row, col);
        if (smDet != 0) {
            am=adjoint(sm,row,col);
            dm = amass(am,row,col, 1.0 / smDet);
            free(am);
        }
        return dm;
    }
    /**
     * 输出矩阵
     * @param m 矩阵
     * @param row 行数
     * @param col 列数
     */
    void outputMatrix(double *m, int row, int col) {
        int i,j;
        for(i=0; i<row; i++) {
            printf("[");
            for(j=0; j<col; j++) {
                printf("%f",m[i*col+j]);
                if(j<col-1) {
                    printf("\t");
                }
            }
            printf("]\n");
        }
    }
    int main() {
        int n,i,j;
        double *xm,*ym,*km,*rexm;
        printf("多少个点:");
        scanf("%d",&n);
        xm=(double *)malloc(sizeof(double)*n*n);
        ym=(double *)malloc(sizeof(double)*n);
        for(i=0; i<n; i++) {
            printf("第%d个点x坐标:",i);
            xm[i*n+0]=1;
            scanf("%lf",&xm[i*n+1]);
            for(j=2; j<n; j++) {
                xm[i*n+j]=pow(xm[i*n+1],j);
            }
            printf("第%d个点y坐标:",i);
            scanf("%lf",&ym[i]);
        }
        rexm=inverse(xm,n,n);
        if(rexm!=NULL) {
            km=multiply(rexm,n,n,ym,n,1);
            for(i=0; i<n; i++) {
                printf("k[%d]:%lf\n",i,km[i]);
            }
            printf("函数式为:\ny=");
            for(i=n; i>1; i--) {
                printf("(%lf)*x^%d+",km[i],i);
            }
            printf("(%lf)*x+",km[1],1);
            printf("%lf",km[0]);
        } else {
            printf("无特殊解");
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月26日
  • 已采纳回答 2月25日
  • 修改了问题 2月24日
  • 创建了问题 2月24日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号