1、 实验报告学院(系)名称: 姓名学号专业班级实验项目方程求根课程名称数值计算方法课程代码实验时间实验地点批改意见:成绩教师签字:实验目的:熟悉用二分法,迭代法,牛顿法和弦截法求解非线性方程实验环境:硬件环境:IBMPC或兼容机软件环境:Windows操作系统编程语言:C语言实验内容:一用二分法求方程x2-x-1=0的正根,要求准确到小数点后第一位二用迭代法和牛顿法求解方程x=e-x在x=0.5附近的一个根,要求精确到小数点后三位三用双点弦截法求方程x3+3x2-x-9=0在区间1,2内的一个实根,精确到五位有效数字实验步骤:一二分法的步骤1计算f (x)在有解区间a, b端点处的函数值,f (
2、a),f (b)2计算f (x)在区间中点处的值f (x0) 3判断若f (x0) = 0,则 即是根,否则检验:(1)若f (x0)与f (a)异号,则知解位于区间a, x0,以x0代替b;(2)若f (x0)与f (a)同号,则知解位于区间x0, b,x0代替a 反复执行步骤2、3,便可得到一系列有根区间:a, b, a1, b1, , ak, bk, ,其中每个区间都是前一个区间的一半,因此区间长度为 二分法的流程图:实验结果:二 迭代法和牛顿迭代法的步骤1. 将方程f (x) = 0化为一个等价的方程 2. 从而构成序列 3. 如果 连续,迭代序列 收敛于x*,则x* 就是方程的解牛顿
3、迭代法与迭代法的不同之处是迭代公式不同,即:迭代法的流程图:牛顿迭代法的流程图只需将牛顿迭代法中的迭代公式替换迭代法中的迭代公式即可三 双点弦截法的步骤 将牛顿迭代法中的导数f (xk) 改用 来代替,就可以得到迭代公式 双点弦截法流程:实验结果:一 使用二分法求解方程方程的正根位于1,2之间,输入区间和精度后,输出的值为1.593750,精确到小数点后第一位,则答案为1.6。二 使用迭代法和牛顿迭代法求解方程迭代法中构造迭代公式很重要,迭代公式构造好后即可开始。输入初值和精度后,迭代法输出结果为0.567277,牛顿迭代法输出结果为0.567143,精确到小数点后第三位后,答案为0.567。
4、与迭代法相比,牛顿迭代法的收敛速度更快,且更加接近准确值三 双点弦截法构造迭代公式后,输入初始的两个点和精度,双点弦截法输出结果为1.525102,精确到五位有效数字后,答案为1.5251附录(源程序及运行结果):一二分法#include#includedouble f(double x)return x*x-x-1;void main()float a=0,b=0,x=1,m,e;int k;while(f(a)*f(b)0) printf(请输入区间a,b的值。以及精度en); scanf(%f,%f,%f,&a,&b,&e);k=0;if(f(a)*f(b)=0)if(f(a)=0)pr
5、intf(使用二分法输出:a=%f,k=%dn,a,k);elseprintf(使用二分法输出:b=%f,k=%dn,b,k);elsewhile(f(a)*f(b)!=0)m=(a+b)/2;if(fabs(a-b)/20) a=m; else b=m; k=k+1;运行结果:二迭代法与牛顿迭代法#include#includedouble f(double x)return exp(-x);double f1(double x)return (x*exp(x)-1);double ff(double x)return (exp(x)+x*exp(x);void diedaifa(doubl
6、e x0,double e,int N)double x1;int k=1;while(k!=N)x1=f(x0);if(fabs(x1-x0)=e)k+;if(k=N)printf(迭代失败!n);x0=x1;elseprintf(使用迭代法输出结果:%lfn,x1);break;void NDdiedaifa(double x0,double e,int N)int k=1;double x1;while(k!=N)if(ff(x0)=0)printf(公式f(x)奇异!n);elsex1=x0-f1(x0)/ff(x0);if(fabs(x1-x0)=e)k+;if(k=N) print
7、f(迭代失败!n);x0=x1;elseprintf(使用牛顿迭代法输出结果:%lfn,x1);break;void main()double x0,e;int N;printf(请输入初值:);scanf(%lf,&x0);printf(精度:);scanf(%lf,&e);printf(以及判定迭代失败的最大次数N:);scanf(%d,&N);diedaifa(x0,e,N);NDdiedaifa(x0,e,N);运行结果:四 双点弦截法#include#includedouble f(double x)return (x*x*x+3*x*x-x-9);void main()double x0,x1,x2,e;int N;int k=1;printf(请输入初值x0和x1:);scanf(%lf,%lf,&x0,&x1);printf(精度:);scanf(%lf,&e);printf(以及判定迭代失败的最大次数N:);scanf(%d,&N);while(k!=N)x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0);if(fabs(f(x2)=e)k+;if(k=N)printf(迭代失败!n);x0=x1;x1=x2;elseprintf(使用双点弦截法输出结果:%lfn,x2);break;运行结果:4