数值计算二分法简单迭代法Newton迭代法弦截法割线法双点弦法
精品文档---下载后可任意编辑 实验课程 数值计算方法 学院名称信息科学与技术学院 专业名称计算机科学与技术 学生姓名 学生学号 指导老师 实验地点 实验成绩 二〇一六年 五 月二〇一六 年 五 月 实验一 非线性方程求根 问题描述 实验目的掌握非线性方程求根的基本步骤及方法,。 实验内容试分别用二分法、简单迭代法、Newton迭代法、弦截法割线法、双点弦法,求x5-3x3x-1 0 在区间 [-8,8]上的全部实根,误差限为10-6。 要求讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较, 第2章 算法思想 思想在函数的单调有根区间内,将有根区间不断的二分,寻找方程的解。 中点midx0x1/2 2.若fmid0,则mid为方程的根,否则比较与两端的符号,若与fx0 异号,则根在[x0,mid]之间,否则在[mid,x1]之间。 3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。 2.2 简单迭代法 思想迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。 迭代公式fx,迭代公式必须是收敛的。 2.计算x1,x1fx0. 3.推断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。 4.输出x1,即为方程的近似解。 2.3 Newton迭代法 思想设r是的根,选取作为r的初始近似值,过点做曲线的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线 的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列,其中,称为r的 次近似值 原函数的导数f’x;构造牛顿迭代公式 2.计算 ,若f’x00,退出计算,否则继续向下迭代。 3.若|x1-x0|满足精度要求,x1即为方程的近似解。 思想为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f’x。 双点弦法的公式 2.计算x2x1-fx1x1-x0/fx1-fx0; 3.推断fx2是否满足精度要求,若没有则根据上述步骤继续迭代,否则输出x2.x2即为方程的近似解。 第3章 测试结果及分析 测试结果 函数图像 函数 Yx5-3x3x-1 二分法表1-1,1-2,1-3 [-1.6,-1.3] k xk k xk k xk 0 5 10 1 6 11 2 7 12 3 8 13 4 9 14 表1-1 区间[-1.2,-] k xk k xk k xk 0 5 10 1 6 11 2 7 12 3 8 13 4 9 14 -1 表1-2 区间] k xk k xk k xk 0 7 14 1 8 15 2 9 16 3 10 17 4 11 18 5 12 6 13 表1-3 简单迭代法(表2-1.2-2.2-3) 初值 k xk k xk k xk 1 7 13 2 8 14 3 9 15 4 10 16 5 11 17 6 12 18 表2-1 初值-1 k x 1 -1 2 -1 表2-2 结果 k xk k xk k xk 1 8 15 2 9 16 3 10 17 4 11 18 5 12 19 6 13 20 7 14 表2-3 牛顿迭代法(表3-1.3-2,3-3) 初值结果 x k xk k xk 1 4 2 5 3 6 表3-1 初值-1结果 x k x 1 -1 2 -1 表3-2 结果 x k xk k xk 1 5 2 6 3 7 4 8 表3-3 双点弦法(表4-1.4-2,4-3) 区间[-1.6,-1.3]结果 x k xk fxk k xk fxk 1 5 2 49 6 3 7 4 8 表4-1 区间[-1.2,-]结果 x -1 k xk fxk 1 2 3 4 -1 表4-2 区间[1.]结果 x k xk fxk 1 2 3 4 5 表4-3 从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦截法的收敛速度。二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然收敛高,但要求导数,计算的复杂度高双点弦法随稍慢于牛顿跌代法,可以用差商代替牛顿迭代法中的导数,降低了计算的复杂度 附录源程序清单 includeiostream includemath.h usingnamespace std; double foot ;//定义寻根步长 int a-8,b8; double*rnnewdouble[5];//解的区间 double*r newdouble[5];// 方程近似解 int m0;//根的个数 int x_count; double precision;//精度要求 //函数的表达式(x5-3x3x-1) double fdouble x{ returnpowx,5-3*powx,3x-1; } void init{//根据函数图像确定根的区间和迭代初值 r[0]-; r[1]-1; r[2]; rn[0]-; rn[1]-; rn[2]; } //寻找根的区间 void search{//若没有给出区间和初值,进行逐步搜索有根区间 forint i0;i*foot-88;i{ iffi*foot-8*fi1*foot-80{ rn[m]i*foot-8; m; } } } //二分法