数值分析实验报告

  • 格式:doc
  • 大小:561.14 KB
  • 文档页数:40

学生学号实验课成绩学生实验报告书实验课程名称数值分析开课学院计算机科学与技术学院指导教师姓名熊盛武学生姓名学生专业班级2013—— 2014学年第二学期实验课程名称:数值分析#include<iostream>#include<cmath>#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"<<endl;cin>>a>>b>>e; i=0;while ((b-a)>e){i++;x=(a+b)/2;if (f(a)*f(x)<0) b=x;if (f(a)*f(x)>0) a=x;}t=(a+b)/2;cout<<"在求根区间a,b间近似根t="<<t<<endl;cout<<"所需二分法次数i="<<i<<endl;return 0;}调试过程,实验结果及分析:计算x*x*x-x-1=0 在[1,2]内的近似根。

当精度达到0.000001时,程序运行如下图:当精度达到0.001时,程序运行如下图:调试过程中如果把while ((b-a)>e)改为while ((b-a)<e),算然会出现程序运行之后的界面,但是输出的近似根是1.5,迭代次数i=0,也就是说程序的循环体没有执行,这是因为求根呢区间远远大于精度。

从而跳过循环体直接输出前面输入的数据。

当精度达到0.000001时,程序运行如下图:当循环体程序代码如下:x1=pow(s(x0),1/3);x0=x1;x1=pow(s(x0),1/3);时会出现程序运行结果的界面,但是输出的近似根是1,迭代次数是1,这是因为x1=pow(s(x0),1/3)与三次求根函数式的数据类型不符。

导致x1=pow(s(x0),1/3)不再是三次求根的函数式由运行结果看出:精度达到0.00001时,简单迭代法迭代次数为6精度达到0.000001时,简单迭代法迭代次数为8。

精度要求越高,简单迭代法迭代次数越多。

简单迭代法归结于找直线和曲线的交点的横坐标,其中迭代法的效果并不是总能令人满意的。

例如:该程序中简单迭代法另一种等价形式x=x*x*x-1对此建立迭代公式:x(k+1)=x(k)*x(k)*x(k)-1迭代初始值x0=1.5,则有x1=2.375, x2=12.39.继续迭代下去已经没有必要了,为结果显然会越来越大,不可能区域某个极限。

这种不收敛的迭代过程是发散的,一个发散的迭代过程,显然其结果是毫无价值的。

二分法和简单迭代法比较:当精度都是0.0001,所求结果为:1.32474时,简单迭代法迭代次数比二分法少9次,当精度都是0.00001,所求结果都为:1.32472时,简单迭代法迭代次数比二分法少11次。

简单迭代法逼近速度比二分法好,计算的效率比二分法提高了很多精度要求越高,简单迭代法的优势也越明显。

二分法不能用于求偶数重根和复根,多用于为其他求根方法提供初始近似值。

简单迭代法的迭代过程可能是收敛的也可能是发散的,简单迭代法对迭代公式有要求,迭代公式必须是收敛的,即结果逐渐趋近于某个极限。

Aitken算法程序源代码:#include<iostream>#include<cmath>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"<<endl;cin>>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<<"近似根x="<<x<<endl;cout<<"所需迭代次数i="<<i<<endl;return 0;}调试过程,实验结果及分析:计算x*x*x-x-1=0 在[1,2]内的近似根。

精度达到0.0001时,程序运行结果如下图:当将x=x0;改成x=x1,输出结果近似根为1.32517,迭代次数为5,这与要求得到的试验结果1.32472有一些差距,这是有循环语句i++;精度达到0.00001时,程序运行结果如下图:由运行结果看出:精度达到0。

00001时,牛顿迭代法迭代次数为3x2=s(x1);x1=x2;这两句顺序不能换过来,当换过来时,错误如下c:\program files\microsoft visual studio\myprojects\erww\q.cpp(26) : fatal error C1004: unexpected end of file found执行cl.exe 时出错.:这是因为在执行循环体之前没有对x2赋值,系统无法识别赋值到x1的值是多少,因此也无法的到想要的结果。

从运行结果看出:牛顿迭代法有很好的收敛性。

在精度要求相同时,牛顿迭代法迭代次数比二分法,简单迭代法,Aitken迭代法都要少,牛顿迭代法是一种更快的迭代法。

牛顿迭代法是将非线性方程逐步转化为某些线性方程来求解,这是牛顿迭代法的基本思想。

将牛顿迭代法应用于以下方程求根:1x=(2-e^x+x*x)/323*x*x-e^x=0弦截法程序源代码:#include<iostream>#include<cmath>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"<<endl;cin >>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<<"近似根x="<<x<<endl;cout<<"所需迭代次数i="<<i<<endl;return 0;}调试过程,实验结果及分析:对于x0=1,x1=2 利用弦截法程序运行结果如下图:弦截法局部收敛的速度比牛顿法略慢一些,弦截法计算过程中没有导数的计算,弦截法的计算量比牛顿法少。

实验小结及体会:在含根区间内求单根最简单最可靠的方法是二分法;Newton法实质上是一种线性化方法,基本思想是将非线性方程逐步归结为某种线性方程来求解;弦割法的基本思想是避免计算导数,直接用两个连续的近似根的线性插值来近似。

尽管每种数值方法有它本身的局限性,但它们还是很有效的。

因此应该了解每一种方法的来龙去脉,尤其是它的困难所在,并通过计算机实习来熟悉和掌权这些方法.。

实验课程名称:数值分析实验项目名称插值方法实验成绩实验者专业班级组别同组者实验日期年月日{b[j]=(b[j]-b[j-1])/(a[j]-a[j-1-i]);}tmp=1;f=b[0];{for(i=0;i<n;i++){tmp=tmp*(x-a[i]);f=f+tmp*b[i+1];}cout<<"所求函数值为f_x="<<f<<endl;}return 0;}(三)调试过程,实验结果及分析:(1)利用拉格朗日插值对于f(x)=e^x, x0=0,x1=0.5 利用线性插值计算f(0.25)的近似值运行结果如下图:对于x0=0.5,x1=1.0 利用线性插值计算f(0.75)的近似值运行结果如下图:(2)利用牛顿插值对于f(x)=e^x, x0=0,x1=0.5 利用线性插值计算f(0.25)的近似值运行结果如下图:对于x0=0.5,x1=1 利用线性插值计算f(0.75)的近似值运行结果如下图:(3)运行结果的比较:①拉格朗日插值和牛顿插值计算出的结果相同,但是牛顿插值法的计算量较少。

拉格朗日法形式对称,结构简单,便于在计算机上实现,只是计算量大。

②二次插值因为在取点更准确和计算复杂,所得到的结果精确度更好。

编程计算f(x)=的近似值(一)分段插值:分段线性插值法程序源代码#include<iostream>#include<cmath>using namespace std;int main(){int i,j,n;double a[10],b[10],x,f,tmp;cout<<"请输入插值节点的个数:n"<<endl;cin>>n;cout<<"请输入n个插值节点:"<<endl;for(i=0;i<n;i++){{if(x<a[1])goto loop;}loop:for(i=0;i<=2;i++){tmp=1;for(j=0;j<=2;j++)if(i==j)continue;else tmp=tmp*(x-a[j])/(a[i]-a[j]);f=f+tmp*b[i];}cout<<"所求函数值为"<<f<<endl;return 0;}调试过程,实验结果及分析:1、分段线性插值程序运行结果如下:2、分段抛物线插值程序运行结果如下:实验课程名称:数值分析{int i,n;double h,a,b,T,temp,Tn;cout<<"请输入求积区间:"<<endl;cin>>a>>b;cout<<"请输入区间等分数:"<<endl;cin>>n;h=(b-a)/n;temp=0;T=0;for(i=1;i<n;i++){temp=f(a+i*h);T=T+2*temp;}Tn=(f(a)+f(b)+T)*h/2;cout<<"经过复化梯形求积所得积分值T"<<n<<"为: "<<Tn<<endl;return 0;}调试过程,实验结果及分析:1/(x*x)在区间[0,1]上8等分后,程序运行结果如下:对区间等分后求每个子区间上的积分值,然后将每个子区间的积分值相加,就得到整个积分区间上的积分值,梯形公式具有一次代数精度。