点值表示怎么转系数表示?
请不要盲目回答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无用
悬赏问题
- ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
- ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
- ¥20 软件测试决策法疑问求解答
- ¥15 win11 23H2删除推荐的项目,支持注册表等
- ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
- ¥15 qt6.6.3 基于百度云的语音识别 不会改
- ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
- ¥15 神经网络怎么把隐含层变量融合到损失函数中?
- ¥15 lingo18勾选global solver求解使用的算法
- ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行