实验10 lagrange插值

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

《数值分析》实验10
一.实验名称:Lagrange 插值
二、实验目的:
(1) 学会Lagrange 插值。

三、实验要求
(1)
按照题目要求完成实验内容 (2)
写出相应的实验原理与程序代码 (3) 给出实验结果(有相应的图像,对比真实函数与插值函数)
(4) 写出相应的实验报告。

四、实验题目
1、用六点Lagrange 插值计算sin(1)的近似值.
2、考虑函数2()1f x x
=+,[5,5]x ∈-, 在[-5,5]上取1n +个等距节点5k k x n =-+ (n k ,,2,1,0 =)作为插值节点构造n 次Lagrange 插值多项式。

(1) 做5次Lagrange 插值,计算()k f xi 的近似值(其中,105k k xi m =-+,0,1,2,,,20k m m ==)。

(2) 做10次Lagrange 插值,计算()k f xi 的近似值,并将结果与其真实值相比较。

1.程序:#include<math.h>
#include<stdio.h>
int main(){
int n = 6,m=20, start_n=0,end_n=n+start_n,i,kk, k; //n:对应插值选用的节点
double x[]={0.7,0.9,1.1,1.3,1.5,1.7} ,
y[]={0.6442,0.7833,0.8912,0.9636,0.9975,0.9917} ;
double xx=1;
double sum=0;
for(k=start_n;k<end_n;k++){
double p=y[k];
for(i=start_n;i<end_n;i++)
if(i!=k)
p*=(xx-x[i])/(x[k]-x[i]);
sum+=p;
}
printf("sin(%.0f)=%.4f,\n",xx,sum);
}
结果:sin(1)=0.8414,
2.(1)程序:#include<math.h>
#include<stdio.h>
int main(){
int n=5,m=20,start=0,end=n+start+1,i,k1,k;//n:对应n次插值
double x[n+1],y[n+1],z;
for(k=0;k<=n;k++){
x[k]=-5+10*k/n;
y[k]=1/(1+pow(x[k],2));
}
printf("%d次插值,\n");
for(k1=0;k1<=m;k1++){
z=double(-5+0.5*k1);
printf("f(%0.1f)=",z);
double sum=0;
for(k=start;k<end;k++){
double p=y[k];
for(i=start;i<end;i++)
if(i!=k)
p*=(z-x[i])/(x[k]-x[i]);
sum+=p;
}
printf("%f,\n",sum);
}
}
结果:5次插值,
f(-5.0)=0.038462,f(-4.5)=-0.046034,f(-4.0)=-0.048077,f(-3.5)=0.007813,f(-3.0)=0.100000,f(-2.5)= 0.209736,f(-2.0)=0.321154,f(-1.5)=0.421274,f(-1.0)=0.500000,f(-0.5)=0.550120,f(0.0)=0.567308, f(0.5)=0.550120,f(1.0)=0.500000,f(1.5)=0.421274,f(2.0)=0.321154,f(2.5)=0.209736,f(3.0)=0.100 000,f(3.5)=0.007813,f(4.0)=-0.048077,f(4.5)=-0.046034,f(5.0)=0.038462,
(2)程序:#include<math.h>
#include<stdio.h>
int main(){
int n=10,m=20,start=0,end=n+start+1,i,k1,k;//n:对应n次插值
double x[n+1],y[n+1],z;
for(k=0;k<=n;k++){
x[k]=-5+10*k/n;
y[k]=1/(1+pow(x[k],2));
}
printf("%d次插值,\n",n);
for(k1=0;k1<=m;k1++){
z=double(-5+0.5*k1);
double y_x=1/(1+pow(z,2));
printf("f(%0.1f)=",z);
double sum=0;
for(k=start;k<end;k++){
double p=y[k];
for(i=start;i<end;i++)
if(i!=k)
p*=(z-x[i])/(x[k]-x[i]);
sum+=p;
}
printf("%f,f(%.1f)-f*(%.1f)=%f\n",sum,z,z,sum-y_x);}
}
结果:10次插值,
f(-5.0)=0.038462,f(-5.0)-f*(-5.0)=0.000000,f(-4.5)=1.578721,f(-4.5)-f*(-4.5)=1.531662 f(-4.0)=0.058824,f(-4.0)-f*(-4.0)=0.000000,f(-3.5)=-0.226196,f(-3.5)-f*(-3.5)=-0.301668 f(-3.0)=0.100000,f(-3.0)-f*(-3.0)=0.000000,f(-2.5)=0.253755,f(-2.5)-f*(-2.5)=0.115824 f(-2.0)=0.200000,f(-2.0)-f*(-2.0)=0.000000,f(-1.5)=0.235347,f(-1.5)-f*(-1.5)=-0.072346 f(-1.0)=0.500000,f(-1.0)-f*(-1.0)=0.000000,f(-0.5)=0.843407,f(-0.5)-f*(-0.5)=0.043407 f(0.0)=1.000000,f(0.0)-f*(0.0)=0.000000,f(0.5)=0.843407,f(0.5)-f*(0.5)=0.043407
f(1.0)=0.500000,f(1.0)-f*(1.0)=0.000000,f(1.5)=0.235347,f(1.5)-f*(1.5)=-0.072346
f(2.0)=0.200000,f(2.0)-f*(2.0)=0.000000,f(2.5)=0.253755,f(2.5)-f*(2.5)=0.115824
f(3.0)=0.100000,f(3.0)-f*(3.0)=0.000000,f(3.5)=-0.226196,f(3.5)-f*(3.5)=-0.301668
f(4.0)=0.058824,f(4.0)-f*(4.0)=0.000000,f(4.5)=1.578721,f(4.5)-f*(4.5)=1.531662
f(5.0)=0.038462,f(5.0)-f*(5.0)=0.000000。

相关文档
最新文档