多项式拟合

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数值计算》实验报告

学院:软件学院专业:软件工程班级:12级1班

实验名称

多项式拟合

姓名杜倩学号1402120110 成绩

实验报告内容要求:

实验三:编写多项式拟合程序。并用该程序解决下列问题:假定某天的气温变化记录如下表,试用最小二乘方法找出这一天的气温变化规律。

h

t/ 1 2 3 4 5 6 7 8 9 10 11 12 13 C

T︒/14 14 14 14 15 16 18 20 22 23 25 28 31 h

t/14 15 16 17 18 19 20 21 22 23 24 C

T︒/32 31 29 27 25 24 22 20 18 17 16

考虑下列类型函数,计算误差平方和,并作图比较效果。

1.二次函数

2.三次函数

3.四次函数

4.函数

)

)

(

(2

c

t

b

ae

C-

-

=(提高:非线性拟合问题)

一.实验目的通过比较不同次数的多项式拟合效果,了解多项式拟合原理。

二.实验原理最小二乘法

三.实验环境 vc6.0

四.实验过程(编写的程序)

#include "stdafx.h"

#include "stdlib.h"

#include "string.h"

#include "math.h"

static double * qr_fraction(double *a, int m, int n, double **q);//QR分解

static double * up_tria_inv_n_ord(double *t,int n);//n阶上三角矩阵求逆

static double * array_mut(double *A, double *x, int m, int n);//m * n型,矩阵乘以向量static double * array_trans_mut(double *A, double *x, int m, int n);//m * n型矩阵转置乘

以向量

static double * polyfit(double *x, double *y, int len,int order);//根据待拟合向量,给出拟合的order阶多项式系数

static double polyval(double *coef, int order, double x);//多项式带入数值进行插值运算

static double *matrix_trans_mul(double *A, double *B,int order);

static double *inv(double *A, int order);// order阶矩阵求逆

int main()

{

double x[10] = {1,2,3,4,5,6,7,8,9,10};

double y[10] = {1,3,7,8,5,3.5,1,-2.5,-8,-16};

double *coef = NULL;

int i = 0;

/* 拟合多项式f(t) = coef[0]*t^3 + coef[1]*t^2 + coef[2]*t^1 + coef[3] */

coef = polyfit(x, y, sizeof(x)/sizeof(x[0]), 5);//5阶多项式拟合

//以下结果与matlab拟合的结果一致printf("coef[0-5]=%lf%lf%lf%lf%lf%lf\n",coef[0],coef[1],coef[2],coef[3],coef[4],coef[5]); double yy = polyval(coef, 5, 11);

free(coef);//polyfit 返回的是堆内存

double A[4][4] = {{1,2,3,4},{2,3,4,7},{1,1,0,11},{-1,7,0,11}};

double *INV_A = inv(&A[0][0], 4);

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

{

printf("%lf %lf %lf %lf\n",INV_A[4*i+0],INV_A[4*i+1],INV_A[4*i+2],INV_A[4*i+3]); }

return 0;

}

static double * qr_fraction(double *a, int m, int n, double **q)//m >= n,列满秩

{

int i = 0;

int j = 0;

int k = 0;

//调用malloc()必须自己free(),不然多次调用就会内存泄露的

double *Q = (double *)malloc(sizeof(double)*m*n); //Qm*n

double *R = (double *)malloc(sizeof(double)*n*n); //Rn*n

memset(R,0,sizeof(double)*n*n);

for(i = 0; i < n; i++) //A矩阵共n列

{

double tmp = 0;

for(j = 0; j < m; j++)//求A矩阵各列的模,m个元素平方和,再开方

{

tmp += a[n*j + i]*a[n*j + i]; // i = 0时,a[0] a[n] a[2*n] ... a[(m-1)*n]

}

tmp = sqrt(tmp);//得到矩阵列的模

R[i*n + i] = tmp;//R[i][i] 即R矩阵的对角元

相关文档
最新文档