数值分析实验报告 本文关键词:数值,实验,报告,分析
数值分析实验报告 本文简介:学生学号实验课成绩学生实验报告书实验课程名称数值分析开课学院计算机科学与技术学院指导教师姓名熊盛武学生姓名学生专业班级2013——2014学年第二学期实验课程名称:数值分析实验项目名称方程求根的数值方法实验成绩实验者专业班级组别同组者实验日期*年*月*日第一部分:实验分析与设计1.实验内容描述(包括
数值分析实验报告 本文内容:
学生学号
实验课成绩
学
生
实
验
报
告
书
实验课程名称
数值分析
开
课
学
院
计算机科学与技术学院
指导教师姓名
熊盛武
学
生
姓
名
学生专业班级
2013——
2014学年
第
二
学期
实验课程名称:数值分析
实验项目名称
方程求根的数值方法
实验成绩
实
验
者
专业班级
组
别
同
组
者
实验日期*年*月*日
第一部分:实验分析与设计
1.
实验内容描述(包括实验目的)
实验目的:
(1)通过编程计算实践,体会和理解二分法,简单迭代法,Newton迭代法和弦截法的算法思想
(2)通过编程计算实践,熟练各种算法的计算流程。
(3)通过各种方法对同一题目的求解,体会各种方法的精度差异。
(4)通过编程计算实践,深入领会和掌握迭代算法的改进思路,提高对算法改进技巧的本质的认识以及算法流程的实际控制技术。
二.实验基本原理与设计(实验基本原理与方法,,实验方案与技术路线等)
(1)分别画出二分法,简单迭代法,Newton迭代法和弦截法的算法流程图。
(2)分别用二分法和简单迭代法通过编程计算x*x*x-x-1=0在[1,2]内的近似根,要求精度达到0.0001和0.00001,并给出二分和迭代的次数,分析和比较算法的效率差异和精度差异,最后与理论估计的二分和迭代次数作比较。
(3)用Aitken算法通过编程计算x*x*x-x-1=0在[1,2]内的近似根,要求精度达到0.0001,并分析算法精度和与二分法的结果进行比较。
(4)分别用Newton迭代法和弦截法通过编程计算x*x*x-x-1=0在[1,2]内的近似根要求精度达到0.00001,并分析算法精度及不同方法的计算量。然后将程序应用于以下方程求根:?x=(2-e^x+x*x)/3,?3*x*x-e^x=0。分析和比较算法的效率差异:收敛速度和总计算量等之间的关系。
(5)写出实习报告
三.主要仪器设备及耗材
联想Y400
PC机一台
第二部分:实验调试与结果分析(可加页)(包括实验原始数据记录,实验现象记录,实验过程发现的问题,实验结果等)
(1)二分法计算流程图:
b-a>e
b=x
a=x
f(a)f(x)e
求根区间[a,b]循环次数i,i=0
否
是
是
否
是
否
(2)简单迭代法算法流程图:
开始
定义函数s(t)=t+1
方程x*x*x-x-1=0
输入迭代初始值x0,控制精度e.迭代次数i,i=
0
x1=pow(s(x0),1.0/3.0);
否
fabs(x1-x0)>e
是
i++;
x1=pow(s(x0),1.0/3.0);
x0=x1;
x1=pow(s(x0),1.0/3.0);
是
输出近似根x,迭代次数i
结束
x=(x1+x0)/2
fabs(x1-x0)>ee
否
(3)牛顿迭代法流程图:开始
定义函数s(t)=t-(t*t*t-t-1)/(3*t*t-1)
迭代初始值x0,控制精度e,迭代次数i,i=0
x1=x0
fabs(s(x1)-x1)>e
i++;
x2=s(x1);
x1=x2;
输出近似根x,迭代次数i
x=(x1+x2)/2;
结束
fabs(s(x1)-x1)>e
否
是
是
否
(4)弦截法算法程序流程图:
开始
定义函数s(t)=
t*t*t-1
输入迭代初始值x0
x1,控制精度e,循环次数i,i=0
fabs(x1-x0)>e
i++;
x2=x1-s(x1)*(x1-x0)/(s(x1)-s(x0));
x0=x1;
x1=x2;
x=(x1+x2)/2;
输出近似根x迭代次数i
结束
fabs(x1-x0)>e
否
是
是
否
二分法程序源代码:
#include
#include
#define
f(x)
(x*x*x-x-1)
using
namespace
std;
int
main()
{
int
i;
float
x,t,a,b,e;
cout>a>>b>>e;i=0;
while
((b-a)>e)
{
i++;
x=(a+b)/2;
if
(f(a)*f(x)0)
a=x;
}
t=(a+b)/2;
coute)改为while
((b-a)
#include
double
s(double
t)
{
return
(t+1);
}
using
namespace
std;
int
main()
{
int
i;
double
x,x0,x1,e;
cout>x0>>e;
i=0;
while
(fabs(x1-x0)>e)
{
i++;
x1=pow(s(x0),1.0/3.0);
x0=x1;
x1=pow(s(x0),1.0/3.0);
}
x=(x1+x0)/2;
cout
#include
double
s(double
t)
{
return
(t*t*t-1);
}
using
namespace
std;
int
main()
{
int
i;
double
x,x0,x1,x2,e;
cout>x0>>e;
i=0;
while(fabs(x0*x0*x0-x0-1)>e)
{
i++;
x1=s(x0);
x2=s(x1);
x0=x2-(x2-x1)*(x2-x1)/(x2-2*x1+pow((x1+1),1.0/3.0));
}
x=x0;
cout
#include
double
s(double
t)
{
return
t-(t*t*t-t-1)/(3*t*t-1);
}
using
namespace
std;
int
main()
{
int
i;
double
x,x0,x1,x2,e;
cout>x0>>e;
i=0;
x1=x0;
while(fabs(s(x1)-x1)>e)
{
i++;
x2=s(x1);
x1=x2;
}
x=(x1+x2)/2;
cout
#include
double
s(double
t)
{
return
t*t*t-t-1;
}
using
namespace
std;
int
main()
{
int
i;
double
x,x0,x1,x2,e;
cout>x0>>x1>>e;
i=0;
while(fabs(x1-x0)>e)
{
i++;
x2=x1-s(x1)*(x1-x0)/(s(x1)-s(x0));
x0=x1;
x1=x2;
}
x=(x1+x2)/2;
cout
#include
using
namespace
std;
int
main()
{
int
i,j,n;
double
a[100],b[100];
cout>n;
cout>a[i]>>b[i];
}
double
f,x,tmp;
cout>x;
f=0;
for(i=0;i
#include
using
namespace
std;
int
main()
{
int
i,j,n;
double
a[100],b[100];
cout>n;
cout>a[i]>>b[i];
}
double
f,x,tmp;
cout>x;
for(i=0;ii;j--)
{
b[j]=(b[j]-b[j-1])/(a[j]-a[j-1-i]);
}
tmp=1;
f=b[0];
{
for(i=0;i
#include
using
namespace
std;
int
main()
{
int
i,j,n;
double
a[10],b[10],x,f,tmp;
cout>n;
cout>a[i]>>b[i];
}
cout>x;
f=0;
if(x
#include
using
namespace
std;
int
main()
{
int
i,j,n;
double
a[10],b[10],x,f,tmp;
cout>n;
cout>a[i]>>b[i];
}
cout>x;
f=0;
if(x
#include
double
f(double
t)
{
return
1/(1+t*t);
}
using
namespace
std;
int
main()
{
int
i,n;
double
h,a,b,T,temp,Tn;
cout>a>>b;
cout>n;
h=(b-a)/n;
temp=0;
T=0;
for(i=1;i
#include
double
f(double
t)
{
return
1/(1+t*t);
}
using
namespace
std;
int
main()
{
int
i,n;
double
h,a,b,S1,S2,temp1,temp2,Sn;
cout>a>>b;
cout>n;
h=(b-a)/n;
temp1=0;
temp2=0;
S1=0;
S2=0;
for(i=0;i
#include
double
f(double
t)
{
return
1/(1+t*t);
}
using
namespace
std;
int
main()
{
int
i,n,N,dir;
double
h,a,b,T0,temp,temp1,temp2,temp3,T[180];
cout>a>>b;
cout>n;
h=(b-a)/n;
temp=0;
temp1=0;
temp2=0;
temp3=0;
T0=0;
N=1;
for(i=1;i1)
{
temp=0;
for(i=1;i>dir;
while(dir>0)
{
N++;
n=2*n;
h=(b-a)/n;
goto
loop;
}
if
(dir
#include
double
f(double
t)
{
return
1/(1+t*t);
}
using
namespace
std;
int
main()
{
int
i,j,n;
double
h,a,b,T0,temp,temp1,temp2,temp3,T[180],S[180],C[180],R[180];
cout>a>>b;
cout>n;
h=(b-a)/n;
temp=0;
temp1=0;
temp2=0;
temp3=0;
T0=0;
for(i=1;i
#include
using
namespace
std;
int
a,b,m;
doublex0;
void
Jacobi(double*c,doubled,int
n,double
eps);
void
Gauss(double*c,doubled,int
n,double
eps);
void
main()
{
int
n;
double*A,*B;
double
e;
cout>n;
cout>a>>b;
A=new
double*[b];
for(int
i=0;i>A[k][j];
}
cin>>B[k];
}
cout>m>>e;
cout>x0[j];
}
switch
(n)
{
case
0:Jacobi(A,B,m,e);
break;
case
1:Gauss(A,B,m,e);
break;
default:couttemp)
{
temp=fabs(x0[i]-s);
}
}
if(temptemp)
{
temp=fabs(x[i]-s);
}
}
if(temp { cout<<“迭代成功!迭代结果为:“< for(i=0;i { cout<<“y[“< =“< } break; } if(k==m) { cout<<“迭代失败!!“< break; } k+=1; for(i=0;i { x[i]=y[i]; } } } 用雅可比迭代法,程序运行结果如下: 用高斯赛德尔迭代法程序运行结果如下: 通过运行结果可以看出高斯赛德尔迭代法比雅可比迭代法所求结果精度高,收敛性好。 实验小结及体会: 1.高斯迭代法公式比较复杂,但在一般情况下比雅可比迭代法收敛快。 2.高斯迭代法是异步迭代法每次迭代时都会用到刚才已经迭代出来的数值,因此迭代对收敛情况有所改善。 3.迭代法要注意收敛条件,包括收敛的充分条件,必要条件。