点值表示怎么转系数表示?
请不要盲目回答FFT中的那些公式
可以没有代码,但请讲清楚一个中学生能理解的思路谢谢
已知n次函数图像上n+1个点的坐标,求解析式各项的系数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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]等价于
系数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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥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 支付宝网页转账系统不识别账号