《数值分析》实验指导书附代码.docx
《《数值分析》实验指导书附代码.docx》由会员分享,可在线阅读,更多相关《《数值分析》实验指导书附代码.docx(34页珍藏版)》请在冰豆网上搜索。
![《数值分析》实验指导书附代码.docx](https://file1.bdocx.com/fileroot1/2022-12/31/b060ed4b-3d51-4b1b-ba30-6fd0acf691a8/b060ed4b-3d51-4b1b-ba30-6fd0acf691a81.gif)
《数值分析》实验指导书附代码
中南林业科技大学《数值分析》实验指导书
一、本实验课程教学目的
《数值分析》实验课程是其理论课程的辅助手段,通过实验课程,让学生更好地理解相关理论和算法思想,并加强学生的实际动手能力。
二、实验项目
实验一Lagrange插值算法实现
1、实验目的
熟悉Lagrange插值算法,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
见教材
4、实验内容
1.用C/C++语言实现Lagrange插值算法。
5、实验步骤
1.认真熟悉教材关于Lagrange算法的理论分析;
2.以书中P.28例2为实例进行数据测试。
[附:
参考程序]
#include"stdio.h"//输入输出scanf(),printf(),可改成输入输出流cin,cout
#include"conio.h"//清除屏幕clrscr()
//定义并输入各个初始数据,根据各个题目不同修改
doublex[]={0.32,0.34,0.36};
doubley[]={0.314567,0.333487,0.352274};
doublexx=0.3367;
doubleLagrange(doublexxx)
{
//采用算法计算出近似函数(多项式)
//此处采用Lagrange插值法,利用循环计算对称的基函数和最终结果
doubleresult=0,temp;
for(inti=0;i<=2;i++)
{
temp=1;
for(intj=0;j<=2;j++)
{
if(j!
=i)
{
temp=temp*(xxx-x[j])/(x[i]-x[j]);
}
}
result=result+temp*y[i];
}
returnresult;
}
voidmain()
{
printf("Sin(%f)=%f\n",xx,Lagrange(xx));
}
实验二Newton均差插值算法的实现
1、实验目的
熟悉Newton均差插值算法,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
见教材
4、实验内容
用C/C++语言实现Newton均差插值算法
5、实验步骤
1.认真熟悉教材关于Newton均差插值的理论分析;
2.以书中P.32例4为实例进行数据测试。
[附:
参考程序]
#include"stdio.h"
#include"conio.h"
#defineN10
doublef[N][N];
doublex[]={0.4,0.55,0.65,0.80,0.90,1.05};
doubley[]={0.41075,0.57815,0.69675,0.88811,1.02652,1.25382};
doublefx(inti,intj);
doubleS(intstart,intend,doublexx);
main()
{
intloopi,loopj,n;
doubleresult,xx;
scanf("%d",&n);
scanf("%lf",&xx);
for(loopi=0;loopi<=n;loopi++)
{
f[loopi][0]=y[loopi];//零阶均差作为均差表二维数组的第0列
}
for(loopi=1;loopi<=n;loopi++)
{
for(loopj=1;loopj<=loopi;loopj++)
{
f[loopi][loopj]=fx(loopi,loopj);
}
}
result=S(0,n,xx);
printf("Resultis:
%f",result);
getch();
return1;
}
//求均差表
doublefx(inti,intj)
{
if(j==0)
{
returnf[i][j];
}
else
{
return(fx(i,j-1)-fx(i-1,j-1))/(x[i]-x[i-j]);//这种表示方法需要注意两个x的下标
}
}
//用秦九韶算法计算差值多项式结果
doubleS(intstart,intend,doublexx)
{
if(start==end)
{
returnf[end][end];
}
else
{
return(S(start+1,end,xx)*(xx-x[start])+f[start][start]);
}
}
实验三NEWTON差分插值算法实现
1、实验目的
熟悉NEWTON差分插值算法,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
差分:
(向前差分)
(向后差分)
NEWTON差分插值公式(此处为前插公式)
如果插值节点
,要计算
附近点
的函数值
,则可令
,于是相应的公式为:
4、实验内容
1.用C/C++语言实现NEWTON前插公式
5、实验步骤
1.认真熟悉教材关于NEWTON差分插值算法的理论分析;
2.以书中P.34例5为实例进行数据测试。
[附:
参考程序]
#include"stdio.h"
#include"conio.h"
floatf[10][10];
floatfx(inti,intj);
floatS(intn,floatt,intend);
main()
{
intn=0,loopi,loopj;
floatx,a,b,h,t;
floatresult;
clrscr();
printf("Pleaseinputa&b&h(a,b,h):
");
scanf("%f,%f,%f",&a,&b,&h);
printf("\n");
printf("Pleaseinputcishu:
");
scanf("%d",&n);
printf("\n");
printf("Pleaseinputjiedianzhi(>=n+1ge):
\n");
for(loopj=0;loopj<=n;loopj++)
{
scanf("%f",&f[0][loopj]);
}
printf("\n");
printf("**********************************************************");
printf("\n");
printf("PleaseinputtheX:
");
scanf("%f",&x);
printf("\n**********************************************************");
printf("\n");
t=(x-a)/h;
for(loopi=1;loopi<=n;loopi++)
{
for(loopj=0;loopj<=n-1;loopj++)
{
f[loopi][loopj]=fx(loopi,loopj);
}
}
printf("a=%f\n",a);
printf("b=%f\n",b);
printf("h=%f\n",h);
printf("t=%f\n",t);
printf("x=%f\n",x);
for(loopj=0;loopj<=n;loopj++)
{
for(loopi=0;loopi<=n-loopj;loopi++)
{
printf("%f",f[loopi][loopj]);
}
printf("\n");
}
result=S(0,t,n);
printf("\n**********************************************************\n");
printf("Resultis:
%f",result);
getch();
return1;
}
floatfx(inti,intj)
{
if(i==0)
{
returnf[i][j];
}
else
{
return(fx(i-1,j+1)-fx(i-1,j));
}
}
floatS(intn,floatt,intend)
{
if(n==end)
{
returnf[n][0];
}
else
{
returnS(n+1,t,end)*(t-n)/(n+1)+f[n][0];
}
}
实验四最小二乘法的法方程算法实现
1、实验目的
熟悉最小二乘法的原理和基本思想,理解法方程的构造过程,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
见教材
4、实验内容
用C/C++语言依据最小二乘法构造其中的法方程。
(以后学习方程组的数值解法后增加解法方程的模块)
5、实验步骤
1.认真熟悉教材关于最小二乘法的理论分析;理解法方程的构造过程;
2.以书中P.75例9为实例构造法方程,并输出方程组(不用求解)
[附:
参考程序]
#include
#defineN4
#defineM1
doublea[N][N],d[N];
doublex[]={19.0,25.0,31.0,38.0,44.0},y[]={19.0,32.3,49.0,73.3,97.8},w[]={1.0,1.0,1.0,1.0,1.0};
#include//setw()用于设置输出数据宽度。
doubleFI(intc,intt)
{
switch(c)
{//分情况确定FI(k)的表达式
case0:
return1;
case1:
returnx[t]*x[t];
}
//....
return1;
}
voidcal()
{
for(intk=0;k<=M;k++)
{
//算K行系数
for(intj=0;j<=M;j++)
{
a[k][j]=0;
for(intt=0;t<=N;t++)
{
a[k][j]=a[k][j]+w[t]*FI(k,t)*FI(j,t);
}
}
d[k]=0;
//算第K个常数
for(j=0;j<=N;j++)
{
d[k]=d[k]+w[j]*FI(k,j)*y[j];
}
}
}
voidmain()
{
cout<<"TheMatrixis:
\n";
cal();
//输出方程组
for(inti=0;i<=M;i++)
{
for(intj=0;j<=M;j++)
{
cout<if(jelsecout<<"=";
}
cout<cout<<"\n";
}
}
实验五Romberg求积算法的实现
1、实验目的
熟悉Romberg求积算法,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
数值求积的基本思想是通过积分中值定理将积分转化为函数的四则运算。
利用梯形公式、Simpson公式、Cotes公式、Romberg公式间的关系,可构造出由梯形公式计算Romberg公式的方法。
对于积分
,将积分区间[a,b]划分为n等分,分点
,则相应的复化梯形公式为:
,
Simpson公式与复化梯形公式关系:
Cotes公式与Simpson公式关系:
Romberg公式与Cotes公式关系:
4、实验内容
用C/C++语言实现Romberg求积算法
5、实验步骤
1.认真熟悉教材关于求积算法的理论分析;
2.以书中P.108例3为实例进行数据测试。
[附:
参考程序]
#include"stdio.h"
#include"math.h"
floatT(intn,floata,floatb);
floatS(intn,floata,floatb);
floatC(intn,floata,floatb);
floatR(intn,floata,floatb);
floatf[100];
main()
{
intn;
floata,b,result;
printf("Pleaseinputn,a,b:
");
scanf("%d,%f,%f",&n,&a,&b);
printf("\n");
result=R(n,a,b);//求最后的Romberg公式计算结果
}
floatT(intn,floata,floatb)
{
floath,s=0;
floatx;
h=(b-a)/n;
for(inti=0;i<=n;i++)
{
x=a+i*h;
if(x==0)
{
f[i]=1;
}
else
{
f[i]=sin(x)/x;//此处是计算函数f(x)在xi这点的函数值
}
if(i==0||i==n)
{
s=s+f[i];
}
else
{
s=s+2*f[i];//除了首尾节点,其他节点计算2次
}
}
return(h/2*s);
}
floatS(intn,floata,floatb)
{
floattemp=0;
temp=4.0/3*T(2*n,a,b)-1.0/3*T(n,a,b);
returntemp;
}
floatC(intn,floata,floatb)
{
floattemp=0;
temp=16.0/15*S(2*n,a,b)-1.0/15*S(n,a,b);
returntemp;
}
floatR(intn,floata,floatb)
{
floattemp=0;
temp=64.0/63*C(2*n,a,b)-1.0/63*C(n,a,b);
returntemp;
}
实验六高斯列主元素消去法算法实现
1、实验目的
熟悉消去法解方程组的原理和基本思想,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
高斯消去法解线性方程组是最常用的解线性方程组的方法。
而高斯列主元素消去法只是为了避免选用绝对值小的元素作为主元的一种改进方法。
对于线性方程组
来说,可以通过将系数矩阵化为上三角形矩阵,从而采用回代过程求解出线性方程组的解来。
4、实验内容
用C/C++语言实现高斯列主元素消去法算法
5、实验步骤
1.认真熟悉教材关于高斯消去法的理论分析;并理解其算法过程描述。
2.以书中P.148例4为实例进行数据测试。
[附:
参考程序]
#include"math.h"//fabs()
#include"stdlib.h"//exit()
#include"stdio.h"//scanf(),printf()
#include"conio.h"//clrscr()
floata[10][10];
floatb[10];
floatdet;
floatexchange(inti,intj,intn);
voidmyexit(inti);
main()
{
intn,loopi,loopj,k,maxi;
floatmax,sum;
clrscr();
printf("Pleaseinputjieshun:
");
scanf("%d",&n);
printf("\nPleaseinputa[i][j]:
");
for(loopi=1;loopi<=n;loopi++)
{
for(loopj=1;loopj<=n;loopj++)
{
scanf("%f",&a[loopi][loopj]);
}
}
printf("\nPleaseinputb[i]:
");
for(loopi=1;loopi<=n;loopi++)
{
scanf("%f",&b[loopi]);
}
printf("\n");
printf("**********************************************************");
printf("\n");
printf("yourformuleris:
\n");
for(loopi=1;loopi<=n;loopi++)
{
for(loopj=1;loopj<=n;loopj++)
{
if(loopj==n)
{
printf("%6.3fx%d=%6.3f\n",a[loopi][loopj],loopj,b[loopi]);
}
else
{
printf("%6.3fx%d+",a[loopi][loopj],loopj);
}
}
}
printf("\n");
printf("**********************************************************");
printf("\n");
/***************************************************
now,let'sbegintocalculatetheresult!
***************************************************/
det=1.0;
for(k=1;k<=n-1;k++)
{
maxi=k;
max=a[k][k];
for(loopi=k+1;loopi<=n;loopi++)
{
if(fabs(a[loopi][k])>fabs(max))
{
max=a[loopi][k];
maxi=loopi;
}
}
if(max==0)
{
det=0;
myexit(k);
}
if(maxi!
=k)
{
exchange(maxi,k,n);
}
for(loopi=k+1;loopi<=n;loopi++)
{
a[loopi][k]=a[loopi][k]/a[k][k];
for(loopj=k+1;loopj<=n;loopj++)
{
a[loopi][loopj]=a[loopi][loopj]-a[loopi][k]*a[k][loopj];
}
b[loopi]=b[loopi]-a[loopi][k]*b[k];
}
det=a[k][k]*det;
}
if(a[n][n]==0)
{
det=0;
myexit(n);
}
b[n]=b[n]/a[n][n];
for(loopi=n-1;loopi>=1;loopi--)
{
sum=0;
for(loopj=loopi+1;loopj<=n;loopj++)
{
sum=sum+a[loopi][loopj]*b[loopj];
}
b[loopi]=(b[loopi]-sum)/a[loopi][loopi];
}
det=a[n][n]*det;
printf("\n**********************************************************\n");
printf("Resultis:
\n");
for(loopj=1;loopj<=n;loopj++)
{
printf("x%d=%10.5f",loopj,b[loopj]);
printf("\n");
}
printf("det(A)=%10.5f",det);
getch();
return1;
}
floatexchange(inti,intj,intn)
{
intloopk;
floattemp;
for(loopk=1;loopk<=n;loopk++)
{
temp=a[i][loopk];
a[i][loopk]=a[j][loopk];
a[j][loopk]=temp;
}
temp=b[i];
b[i]=b[j];
b[j]=temp;
det=-det;
return0;
}
voidmyexit(inti)
{
printf("\nTheDET(A)=0,somea[%d][%d]is0!
",i,i);
exit(0);
}
实验七追赶法算法实现
1、实验目的
熟悉追赶法解对角占优的三对角线方程组的原理和基本思想,并能用计算机语言实现。
2、实验环境
TC3.0/VC++6.0编程环境。
3、相关理论
见教材
4、实验内容
用C/C++语言实现追赶法算法
5、实验步骤
1.认真熟悉教材关于追赶法的理论分析;并理解其算法过程描述。
2.以书中P.177第9题为实例进行数据测试。
[附:
参考程序]
#include"stdio.h"//scanf(),printf()
#defineN10
floata[N],b[N],c[N],f[N],Beta[N],x[N],y[N];
main()
{
intn,i,j;
floattemp;
//输入数据
printf("Pleaseinputjieshun:
");
scanf("%d",&n);
printf("\nPleaseinputa[i]:
");
for(i=2;i<=n;i++)
{
scanf("%f",&a[i]);
}
printf("\nPleaseinputb[i]:
");
for(i=1;i<=n;i++)
{