插值法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二插值法
1、实验目的:
1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。
2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。
2、实验要求:
1)认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;
2)编写上机实验程序,作好上机前的准备工作;
3)上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);
4)分析和解释计算结果;
5)按照要求书写实验报告;
3、实验内容:
1) 用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。
已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。
2) 求满足插值条件的插值多项式及余项
1)
4、题目:插值法
5、原理:
拉格郎日插值原理:
n次拉格朗日插值多项式为:L
n (x)=y
l
(x)+y
1
l
1
(x)+y
2
l
2
(x)+…+y
n
l
n
(x)
n=1时,称为线性插值,
L 1(x)=y
(x-x
1
)/(x
-x
1
)+y
1
(x-x
)/(x
1
-x
)=y
+(y
1
-x
)(x-x
)/(x
1
-x
)
n=2时,称为二次插值或抛物线插值,
L 2(x)=y
(x-x
1
)(x-x
2
)/(x
-x
1
)/(x
-x
2
)+y
1
(x-x
)(x-x
2
)/(x
1
-x
)/(x
1
-x
2
)+y
2
(x
-x
0)(x-x
1
)/(x
2
-x
)/(x
2
-x
1
)
n=i时,
Li= (X-X0)……(X-X i-1)(x-x i+1) ……(x-x n)
(X-X0)……(X-X i-1)(x-x i+1) ……(x-x n)
6、设计思想:
拉格朗日插值法是根据n + 1个点x0, x1, ... x n(x0 < x1 < ... x n)的函数值f (x0), f (x1) , ... , f (x n)推出n次多項式p(x),然后n次多項式p (x)求出任意的点x对应的函数值f (x)的算法。
7、对应程序:
1 ) 三次拉格朗日插值多项式求x=0.5635时函数近似值
#include"stdio.h"
#define n 5
void main()
{
int i,j;
float x[n],y[n];
float x1;
float a=1;
float b=1;
float lx=0;
printf("\n请输入想要求解的X:\n x=");
scanf("%f",&x1);
printf("请输入所有点的横纵坐标:\n");
for(i=1;i { printf("x[%d]=",i); scanf("%f",&x[i]); printf("y[%d]=",i); scanf("%f",&y[i]); } for(i=0;i { for(j=0;j { if(j!=i) { b=b*(x1-x[j]); a=a*(x[i]-x[j]); } } lx=lx+b*y[i]/a; a=b=1; } printf("\n求得的解是l(%f)=%f",x1,lx); } 2 ) 满足插值条件的插值多项式及余项 #include #define m 0 #define n 1 float L0(float a,float x1,float x0) { return (a-x1)/(x0-x1); } float L1(float a,float x1,float x0) { return (a-x0)/(x1-x0); } float H(float x0,float x1,float y0,float y1,float m0,float m1,float a) { float b; b=y0*(1-2*(a-x0)/(x0-x1))*L0(a,x1,x0)*L0(a,x1,x0)+y1*(1-2*(a-x1)/ (x1-x0))*L1(a,x1,x0)*L1(a,x1,x0)+m0*(a-x0)*L0(a,x1,x0)*L0(a,x1,x0)+m1 *(a-x1)*L1(a,x1,x0)*L1(a,x1,x0); return b; } void main() { float x0=1,x1=2,y0=2,y1=3,m0=0,n1=-1,a1=1.5,a2=1.7; float k1,k2; printf("input a1: \n"); printf(" %f\n",a1); k1=H(x0,x1,y0,y1,m0,n1,a1); printf("%f的函数值为:%f\n\n\n",a1,k1); printf("input a2: \n");