计算机数值方法实验报告Word格式文档下载.docx
- 文档编号:21355550
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:38
- 大小:521.11KB
计算机数值方法实验报告Word格式文档下载.docx
《计算机数值方法实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机数值方法实验报告Word格式文档下载.docx(38页珍藏版)》请在冰豆网上搜索。
1实验项目:
lagrange插值多项式指导教师_孙峪怀
雷小慧学号:
2011060115实验成绩:
一、实验目的及要求
实验目的:
体会使用Lagrange插值基函数构造插值多项式的特点,熟悉使用一次或二次Lagrange插值多项式近似函数y=f(x)的算法。
掌握Lagrange插值多项式近似函数f(x)的误差表达式,并会熟练应用。
实验要求:
1.给出一次、二次Lagrange插值算法
2.用C语言实现算法
二、实验内容
用下列插值节点数据,构造一次和二次Lagrange插值多项式,并计算f(11.5),f(12.5)的值。
(f(x)=sinx)
x
11
12
13
F(x)
0.190809
0.207912
0.224951
要求:
所需数据都从键盘读入,最后输出结果.
三、实验步骤(该部分不够填写.请填写附页)
1.算法分析:
下面用伪码描述Lagrange插值多项式的算法:
Step1输入:
插值节点控制数n,插值点序列(xi,yi),i=0,1,……n,,要计算的函数
点x.
Step2fori=0ton/*控制Lagrange基函数序列*/
{{
forj=0ton
/*对于给定x,计算Lagrange函数li(x)=
*/
if(j<
>
i)li(x)=li(x)*(x-xj)/(xi-xj);
}
Ln(x)=Ln(x)+li(x)*yi/*计算Ln(x)=
2.用C语言实现算法的程序代码
#include<
stdio.h>
#defineMAX_N20/*定义点的最大个数为20*/
typedefstructtagPOINT/*对点的结构化定义,一个点包括x和y*/
{
doublex;
doubley;
}POINT;
intmain(void)
intn;
/*n表示输入的点的个数,大于0小于20*/
inti,j,k;
POINTpoints[MAX_N+1];
doublex,temp,Lagrange=0;
clrscr();
printf("
\nPleaseinputnvalue:
"
);
scanf("
%d"
&
n);
if(n>
MAX_N)
{
TheinputnislargerthanMAX_N,pleaseredfinetheMAX_N.\n"
return1;
if(n<
=0)
Pleaseinputanumberbetween1and%d.\n"
MAX_N);
Nowinputthe(x_i,y_i),i=0,...,%d:
\n"
n);
/*输入每个点的x和y*/
for(i=0;
i<
n;
i++)
%lf,%lf"
points[i].x,&
points[i].y);
Nowinputthexvalue:
/*输入要求的x值*/
%lf"
x);
for(k=0;
k<
k++)
temp=1;
for(j=0;
j<
j++)
if(k!
=j)
temp=temp*(x-points[j].x)/(points[k].x-points[j].x);
Lagrange=Lagrange+temp*points[k].y;
Lagrange(%lf)=%lf\n"
x,Lagrange);
/*输出结果*/
return0;
}
3.在TC环境中运行如下:
4.运行结果:
F(11.5)的结果是:
F(12.5)的结果是:
2实验项目:
Newton插值多项式指导教师__孙峪怀
1、实验目的及要求
掌握Newton插值多项式的算法,理解Newton插值多项式构造过程中基函数的继承特点,掌握差商表的计算特点。
1.给出Newton插值算法
1.用下列插值节点数据,构造Newton插值多项式,并计算N2(0.9),N3(0.9)的值。
-2
1
f(x)
17
19
2.用下列插值节点数据,构造一个三次Newton插值多项式,并计算f(1.2)的值。
-1.00
2.00
3.00
4.00
5.00
7.00
Step1输入插值节点数n,插值点序列{x(i),f(i)},i=1,2,……,n,要计算的插值点x.
Step2形成差商表
fori=0ton
forj=ntoif(j)=((f(j)-f(j-1)/(x(j)-x(j-1-i));
Step3置初始值temp=1,newton=f(0)
Step4fori=1ton
temp=(x-x(i-1))*temp/*由temp(k)=(x-x(k-1))*temp(k-1)形成(x-x(0).....(x-x(i-1)*/
Newton=newton+temp*f(i);
Step5输出f(x)的近似数值newton(x)=newton.
5.用C语言实现算法的程序代码
#defineMAX_N20/*点的最大个数为20*/
typedefstructtagPOINT/*结构化定义点包括x和y*/
intn,n1,i,j;
doublex,tmp,newton=0;
\nPleaseinputthetimeofnewton:
/*输入牛顿插值的阶数*/
n1);
TheinputnislargerthanMAX_N,pleaseredefinetheMAX_N.\n"
Nowinputthe(xi,yi),i=0,...,%d:
for(j=n-1;
j>
i;
j--)
points[j].y=((points[j].y-points[j-1].y)/(points[j].x-points[j-1-i].x));
tmp=1;
newton=points[0].y;
n1;
tmp=tmp*(x-points[i].x);
newton=newton+tmp*points[i+1].y;
newton(%lf)=%lf\n"
x,newton);
6.在TC环境中运行如下:
7.运行结果
1.N2(0.9)的运行结果是:
N3(0.9)的运行结果是:
2.f(1.2)的运行结果是:
3实验项目:
分段插值多项式指导教师__孙峪怀
1.体会分段低次插值在不增加结点的情况下,提高插值精度的思想和这种用低代价换取高回报的手段。
2.熟练掌握分段一次、分段二次插值多项式公式;
3.掌握分段插值多项式算法设计的特点。
1.给出分段一次、二次插值算法;
用下列插值节点数据,构造分段线性插值多项式,并计算f(1.075),f(1.175)的值。
1.05
1.10
1.15
1.20
2.12
2.20
2.17
2.32
下面用伪码描述分段插值多项式的算法:
Step1输入插值节点数n,插值点序列{x(i),f(i)},i=1,2,……,n,要计算的插
值点x.
Step2将输入的插值点x与每一个点对应的x作比较,比较出比它大的时完成。
if(x<
points[i].x)
a=points[i-1].x;
f1=points[i-1].y;
b=points[i].x;
f2=points[i].y;
break;
Step3输出值
#defineMAX_N20/*定义的点的最大个数为20*/
typedefstructtagPOINT/*结构化定义点,包括x和y*/
intn,i,j;
doublex,a,b,P,f1,f2;
Pleaseinputnvalue:
points[0].x||x>
points[n-1].x)/*如果x比第一个点的x小或x比
最后一个点的x大时*/
Inputxvalueerror!
exit(0);
i++)/*记录下插值区间的左端点和右端点*/
points[i].x)
P=((x-b)/(a-b))*f1+((x-a)/(b-a))*f2;
/*插值函数*/
\nShowtheresult:
%f"
P);
3.用C语在TC环境中运行如下:
3.运行结果
f(1.075)的运行结果是:
f(1.175)的运行结果是:
2013年5月29日
数学与应用数学班级:
4实验项目:
romberg算法指导教师__孙峪怀
熟练掌握数值积分的基本思想和动手推导积分公式的能力,并写出自己设计的变步长算法,用此算法解决实际问题。
主要锻炼分析问题及对数值方法产生的误差在实际执行算法中的变化,体会事前误差和事后误差的不同之处。
写出Romberg算法的描述,并用次算法计算下列定积分的值,要求满足给定误差。
二、实验内容。
(1)用变步长的Romberg方法计算定积分:
给定误差限为
下面用伪码描述Romberg的算法:
Sstep1输入区间端点a,b,精度控制值e,循环次数M,定义函数f(x),取n=1,
h=b-a;
Step2R1,1=(f(a)+f(b))*h/2;
Step3fork=2toM
{Rk,1=(R(k-1),1+h(k-1)*
/*
forj=2tok
if
退出循环
Step4输出
.
math.h>
#definef(x)(sin(x))/*定义的函数sin(x)*/
#defineN_H20
#defineMAXREPT10/*循环的最大次数*/
#definea0.0/*积分的下线*/
#defineb1.0/*积分的下线*/
#defineepsilon0.0005/*误差值*/
doublecomputeT(doubleaa,doublebb,longintn)/*复化梯形公式*/
inti;
doublesum=0,h=(bb-aa)/n;
for(i=1;
sum+=f(aa+i*h);
sum+=(f(aa)+f(bb))/2;
return(h*sum);
longintn=N_H,m=0;
doubleT[MAXREPT+1][2];
T[0][1]=computeT(a,b,n);
n*=2;
for(m=1;
m<
MAXREPT;
m++)
m;
T[i][0]=T[i][1];
/*计算T^{m-1}(h/2)*/
=m;
T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
if((T[m-1][1]<
T[m][1]+epsilon)&
&
(T[m-1][1]>
T[m][1]-epsilon))
TheIntegrateis%lf\n"
T[m][1]);
return;
Returnnosolved...\n"
5实验项目:
二分法求根指导教师__孙峪怀
熟练掌握使用对分法求解非线性方程的根
写出二分法的算法描述并使用C语言实现二分法。
已知
,用二分法求f(x)在[0,1]上的根。
计算f(x)=0的一般计算步骤:
Step1输入求根区间[a,b]和误差控制量
,定义函数f(x),
if(f(a)f(b)<
0then做step2
else选用其他求根方法
Step2while|a-b|>
时
计算中点x=(a+b)/2以及f(x)的值。
分情况处理
|(f(x)|<
:
停止计算x*=x,转向step4
f(a)*f(x)<
0:
修正区间[a,x]->
[a,b]
f(x)*f(b)<
修正区间[x,b]->
Endwhile
Step3x*=(a+b)/2
Step4输出近似根x*
#definef(x)(x*x*x+x*x-1)/*f(x)函数*/
#defineepsilon0.001/*求解精度*/
doublex,a=0,b=1;
if(f(a)*f(b)<
0)/*用二分法求解根*/
while(a-b>
epsilon||a-b<
-epsilon)
x=(a+b)/2;
if(f(x)<
epsilon&
f(x)>
-epsilon)/*满足精度要求则完成任务,输出结果*/
\nThe%fvalueis%f"
x,f(x));
/*输出根和根对应的函数值*/
break;
if(f(a)*f(x)<
0)/*修正区间*/
\na=%fb=%ff(x)=%f"
a,b,f(x));
/*输出修正前的区间*/
b=x;
if(f(x)*f(b)<
{
a=x;
else
Don'
tcanclution!
当a=0,b=1时的结果:
6实验项目:
newton迭代指导教师__孙峪怀
一、实验目的及要求
熟练掌握使用牛顿迭代法求解非线性方程的根
写出牛顿迭代的算法描述并使用C语言实现牛顿迭代法。
已知方程x^2-11=0,在x0=4附近的根。
1.算法描述:
Step1定义函数f(x),g(x),输入迭代初始值x0和控制精度epsilon
Step2fork=1toMAXREPT
x1=g(x0)/*g(x)=x-f(x)/f'
(x)*/
if(|x1-x0|<
epsilon)
then{输出满足给定精度的近似解x1,结束}
x0=x1;
endfor
Step3输出:
在x0附近f(x)无根
3.用C语言实现算法的程序代码
stdio.h>
#definef(x)(x*x-11)
#defineg(x)(0.5*(x+11/x))/*g(x)=x-f(x)/f'
#defineMAXREPT1000/*循环的最大次数*/
#defineepsilon0.0001/*精度为0.0001*/
#definex04/*迭代初始值为4*/
doublex_k1,x_k0=x0;
x_k1=g(x_k0);
if(x_k1-x_k0<
x_k1-x_k0>
\nThevalueis%f"
x_k1);
/*输出在4附近的近似根*/
\nx_k1=%f"
x_k0=x_k1;
5.在TC环境中运行如下:
数学与应用数学班
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 数值 方法 实验 报告