实验2插值与拟合
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验报告
实验2 插值与拟合
2.1 实验目的
掌握牛顿插值法的基本思路和步骤;掌握最小二乘法的基本思路和拟合步骤。
培养编程与上机调试能力。
2.2 算法描述
2.2.1 牛顿插值法基本思路
给定插值点序列())(,i i x f x ,,,1,0,n i =构造牛顿插值多项式)(u N n 。
输入要计算的函数点,x 并计算)(x N n 的值,利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;另一方面)(x N n 的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。
2.2.2 牛顿插值法计算步骤
1. 输入n 值及())(,i i x f x ,,,1,0,n i =;要计算的函数点x 。
2. 对给定的,x 由
[][][]
00010101201101()()(),()(),,()
()(),,n n n N x f x x x f x x x x x x f x x x x x x x x x f x x x -=+-+--++--- 计算()n N x 的值。
3. 输出()n N x 。
2.2.3 最小二乘法基本思路
已知数据对()(),1,2,,j j x y j n = ,求多项式
0()()m i
i i p x a x m n ==<∑
使得2
0110(,,,)n m i
n i j j j i a a a a x y ==⎛⎫Φ=- ⎪⎝⎭∑∑ 为最小,这就是一个最小二乘问题。
2.2.4 最小二乘法计算步骤
用线性函数()p x a bx =+为例,拟合给定数据(),,1,2,,i i x y i m = 。
算法描述:
步骤1:输入m 值,及(),,1,2,,i i x y i m = 。
步骤2:建立法方程组T
A AX AY =。
步骤3:解法方程组。
步骤4:输出()p x a bx =+。
2.3 实验内容
1. 给定sin110.190809,sin120.207912,sin130.22491,o o o ===构造牛顿插值函
数计算'
sin1130o 。
2. 已知一组数据如下,求它的线性拟合曲线。
1
13125.8865.4454321i
i
i
w y x 2.4 实验步骤
牛顿插值: 步骤1:输入m 值,及(),,1,2,,i i x y i m = 。
步骤2:建立法方程组T
A AX AY =。
步骤3:解法方程组。
步骤4:输出()p x a bx =+
最小二乘法:
步骤1:输入m 值,及(),,1,2,,i i x y i m = 。
步骤2:建立法方程组T
A AX AY =。
步骤3:解法方程组。
步骤4:输出()p x a bx =+
2.4.1 代码
牛顿插值c 语言代码如下:
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define N 2
void difference(float *x,float *y,int n)
{ float *f;
int k,i;
f=(float *)malloc(n*sizeof(float));
for(k=1;k<=n;k++)
{ f[0]=y[k];
for(i=0;i<k;i++)
f[i+1]=(f[i]-y[i])/(x[k]-x[i]);
y[k]=f[k];
}
return;
}
main()
{ int i;
float x[N+1],y[N+1],xx,yy;
for(i=0;i<=N;i++)
{ printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
for(i=0;i<=N;i++)
{ printf("y[%d]:",i);scanf("%f",&y[i]);}
printf("\n");
difference(x,(float *)y,N);
printf("Input xx:");
scanf("%f",&xx);
yy=y[N];
for(i=N-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];
printf("NewtonInter(%f)=%f",xx,yy);
printf("\n");
}
最小二乘法:
#include "stdio.h"
#define N 4
main()
{
float a[3][N+1]={{1,2,3,4,5},{4,4.5,6,8,8.5},{2,1,3,1,1}};
float a0,a1,x,s1=0,s2=0,s3=0,s4=0,s5=0;
int j;
for(j=0;j<N+1;j++)
{
s1=s1+a[2][j];
s2=s2+a[2][j]*a[0][j];
s3=s3+a[2][j]*a[0][j]*a[0][j];
s4=s4+a[2][j]+a[1][j];
s5=s5+a[2][j]*a[0][j]*a[1][j];
}
printf("s1=%.2f, s2=%.2f, s3=%.2f, s4=%.2f, s5=%.2f\n",s1,s2,s3,s4,s5);
printf("输出法方程组:\n");
printf(" %.2f*a0+%.2f*a1=%.2f\n",s1,s2,s4);
printf(" %.2f*a0+%.2f*a1=%.2f\n",s2,s3,s5);
a1=(s4*s2-s1*s5)/(s2*s2-s1*s3);
a0=(s4-a1*s2)/s1;
printf(" a0=%.4f, a1=%.4f\n\n",a0,a1);
printf(" p(x)=%.4f+%.4f*x\n",a0,a1);
}
2.4.2 实验结果
2.5 实验体会
通过实验对牛顿插值和最小二乘有了更好的认识,为更好的学习以后的知识打下坚实的基础。
并且对C语言有个更高的提升。