- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数值计算实验三
附:报告封面要求
计算方法C
(2014-2015-2)
【 插值法 】实验报告
、
实验三 插值法的稳定性
实验目的:
掌握插值法的思想,掌握拉格朗日插值、牛顿插值和分段低次插值,分析这些插值法的稳定性。
实验题目:
已知y=cos x,对区间[0,1]作等距划分,节点为,试对下面两种情况分别按指定方案求cos x在0.73333点的近似值(
n=10,40,160)。
⑴以给定节点为插值节点;
⑵仍以给定节点为插值节点,但在cos 0.5上人为增加一个误差0.05。
方案一:用拉格朗日插值公式。
方案二:用牛顿插值公式。
方案三:用分段三次插值。
试比较同一方案对不同的n、不同方案对相同的n的精度情况,分析人为增加的误差对不同方案计算结果的影响。
算法流程图如下:
源程序清单如下:
Lagrange.c
#include stdio.h
#include malloc.h
float lagrange(float *x,float *y,float xx,int n)
{
int i,j;
float *a,yy=0.0;
for(i=0;i=n-1;i++)
{
a[i]=y[i]; for(j=0;j=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i]; } free(a); return yy; }
int main() { int i; int n;
float x[20],y[20],xx,yy;
printf(Input n:); scanf(%d,n);
if(n=20) {
printf(Error!The value of n must in (0,20).); getch();return 1;
}
if(n=0) { printf(Error! The value of n must in (0,20).);
getch();
return 1; }
for(i=0;i=n-1;i++)
{
printf(x[%d]:,i);
scanf(%f,x[i]);
}
printf(\n);
for(i=0;i=n-1;i++)
{
printf(y[%d]:,i);
scanf(%f,y[i]);
}
printf(\n);
printf(Input xx:);
scanf(%f,xx);
yy=lagrange(x,y,xx,n);
newton.c
#include iostream
using namespace std;
#define F(x) (cos(x))
#define Type double
//xi为待求的函数值的x值
Type Newton(Type *x, Type *y, int n, Type xi);
int main() {
int n;
cout Newton n= ;
cin n;
Type *x, *y;
x = new Type[n];
y = new Type[n];
for (int i = 0; i n; i++) {
x[i] = i*1.0 / n;
y[i] = F(x[i]);
}
cout Newton(x, y, n, 0.73333) endl;
delete[]x;
delete[]y;
return 0;
}
Type Newton(Type *x, Type *y, int n, Type xi) {
Type yi = y[0];
Type *dc = new Type[n + 1];//difference coefficient差商
Type t = 1.0;
dc[0] = 0;
for (int i = 1; i n; i++) {
for (int j = i; j n; j++) {
dc[j] = (y[j] - y[j - 1]) / (x[j] - x[j - i]);
}
t *= (xi - x[i - 1]);
yi += t*dc[i];
for (int j = i; j n; j++) {
y[j] = dc[j];
}
}
return yi;
}
方案三
#include iostream
using namespace std;
#define F(x) (cos(x))
#define F1(x) (-sin(x))//F(x)的导数
#define Type double
//xi
文档评论(0)