logo资料库

二分法 迭代法 非线性方程求解 实验报告含源码.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
课程实验报告 课程名称 数值分析 班级 实验日期 2008 年 9 月 30 日 姓名 实验名称 学号 实验成绩 实验三 非线性方程求解 实 验 目 的 及 要 求 实 验 环 境 实 验 内 容 实验目的: 掌握二分法与牛顿法的基本原理及应用。 实验要求: 1.用二分法计算方程 在 (1, 2) 内的根的近似值 2.用迭代法计算方程 sin x  2 x 2  0 3 x x   1 0 在 (1, 1.5) 内的根的近似值 (   Windows xp 操作系统 VC++6.0 5 0.5 10 )   。 f x 在[ , ]a b 上连续, ( ) f a f b  且 ( ) ( ) 0 f c  ,则 c 恰为其根,否则,根据 ( ) 1.二分法: 假定 ( ) f x 在 ( , )a b 内仅有一实根 *x 取区间中点 c ,若 ( ) 0 ( ) 0 是否成立,可判断出根所属的新的有根子区间 ( , )a c 或 ( , )c b ,为节省 内存,仍称其为 ( , )a b 。运算重复进行,直到满足精度要求为止,即 | c 2.迭代法: 0x 为初始猜测,则由递推关系    。式中 ,a b 为新的有根子区间的端点。 | f a f c  b a   * x x k   1 x k  ( f x k  ( f x k ) ) 产生逼近解 *x 的迭代序列{ }kx ,这个递推公式就是 Newton 法。当 0x 距 *x 较近时,{ }kx 很快收敛于 *x 。但当 0x 选择不当时,会导致{ }kx 发散。 故我们事先规定迭代的最多次数。若超过这个次数,还不收敛,则停 止迭代另选初值。
实验步骤: 1、程序设计 2、计算实例 3、撰写实验报告 1、实验 1 的运行结果如图 算 法 描 述 及 实 验 步 骤 调 试 过 程 及 实 验 结 果 2、实验 2 的运行结果如图: 图一 图二
总 结 附 录 通过本次实验,加深了我对用二分法和迭代法求解非线性方程组 的理解。使我不仅掌握了它们的基本原理,而且能够熟练地应用它们 来解决实际问题。二分法与牛顿法是非常常用的求解方程组的方法, 很多实际问题通过建模都可以转化为类似的求解方程组的问题,所以 我们应该熟练掌握这两种方法,为以后能方便的解决实际问题做铺 垫。 Newton 法是一种行之有效的迭代法,在单根附近有较高的收敛 速度。但是 Newton 法的关键在于选取足够精确的初值,如果初值选 取不当,则此方法可能会发散。 源程序清单 1. 二分法 #include #include #include using namespace std; float Fangcheng(float x); void main() { float a,b; int n = 0; char A; do{ cout<<"计算如下: "<>a; cout<<"请输入 b 的值:"; cin>>b; cout<<"结果如下所示:"<
} else { } a = m; } else n++; break; printf("%d\t%2.10lf\t%2.10lf\t%2.10lf\t%2.10lf\n",n,a,b,(a+b)/2,Fan gcheng((a+b)/2)); } printf("\n 总 共 进 行 了 10 次 二 分 , 方 程 的 近 似 解 是 : x ≈%2.10lf",(a+b)/2); cout<<"\n 你还想重新进行计算吗?请按 Y 或 y 重新开始,其他键 退出。"<>A; }while(A=='Y'||A=='y'); } float Fangcheng(float x) { float y = 0; y = sin(x) - x*x/2; return y; } 2、迭代法 #include #include #include using namespace std; float Cuberoot(float x); void main() { float Xa; char A; do{ cout<<"请输入 Xa 的值:"; cin>>Xa; float Xb = Cuberoot(Xa+1);
int k = 0; k\t\tx\t\t\n"); cout<<"计算过程如下: "<0.00005) { k++; Xa= Xb; Xb = Cuberoot(Xa+1); printf(" %d\t%15.10lf\n",k,Xb); } printf("\n 总共进行%d 次迭代,结果为:x≈%.10f\n",k,Xb); cout<<"你还想重新进行计算吗?请按 Y 或 y 重新开始,其他键退 出"<>A; }while(A=='Y'||A=='y'); float Cuberoot(float x) { return(pow(x,1.0/3)); } }
分享到:
收藏