1.1 实验内容和要求
在科学研究和工程技术中大量的实际问题是非线性的,求非线性方程
f(x)0满足一定精确度的近似根是工程计算与科学研究中诸多领域经常需要解决的问题。
实验目的:进一步理解掌握非线性方程求根的简单迭代法、埃特金Aitken加速法、牛顿迭代法的思想和构造。
实验内容: 求方程x23x2ex0的实根。 要求:
(1)设计一种简单迭代法,要使迭代序列收敛,然后再用埃特金Aitken加速迭代,计算到xkxk110-8为止。
(2)用牛顿迭代法,同样计算到xkxk110-8
(3)输出迭代初值、迭代次数k及各次迭代值,并比较算法的优劣。
1.2 算法描述
普通迭代法计算步骤: (1)给定初始近似值(2)用迭代公式x=
x0,eps为精确度。
3
𝑥2+2−𝑒𝑥
进行迭代,直到xkxk110-8为止。
埃特金Aitken加速迭代法计算步骤: (1)将f(x)0化成同解方程x(x)
yk(xk) ,zk(yk)
2(ykxk)2xkzkyk= xk1xkzk2ykxkzk2ykxk (2)计算到
xkxk110-8为止。
牛顿法计算步骤:
1
给定初始近似值x0,1为根的容许误差,2为f(x)的容许误差,N为迭代次数的容许值。 计算f(x0),f(x0)
(1)如果f(x0)0或者迭代次数大于N,则算法失败,结束;否则执行(2) (2)按公式x1x0f(x0)迭代一次,得到新的近似值x1,计算f(x1),f(x1) f(x0)(3)如果x1x01或者f(x1)2,则迭代终止,以x1作为所求的根,结束;否则执行(4)
(4)以(x1,f(x1),f(x1))代替(x0,f(x0),f(x0)),转步骤(1)继续迭代。
1.3程序代码清单
#include x[i] = (x[i] * x[i] + 2 - exp(x[i] )) / 3; e = fabs(x[i] - x[i - 1]); if (e < eqs) break; return (w*w + 2 - exp(w)) / 3; } printf(\"所求方程满足精度的根为:%lf,迭代次数为:%d\\n\//埃特金迭代 void Aitken() { } //迭代公式 double fun1(double x) { } double fun2(double x) { } //牛顿迭代法 void Newton() { double f1, f2, x, d; int cnt = 0; x = 1; printf(\"迭代初值为:%lf\\n\do { f1 = fun1(x);//方程的值 f2 = fun2(x);//方程的导数 d = f1 / f2;//\"斜率\" 3 return 2 * x - 3 - exp(x); return x*x - 3 * x + 2 - exp(x); int i; printf(\"迭代初值为:%lf\\n\for (i = 1;; i++) { } printf(\"总迭代次数:%d,最终的近似根为:%lf\\n\xx[i] = ffi(x[i - 1]); xx[i + 1] = ffi(xx[i]); x[i] = 1.0*(x[i - 1] * xx[i + 1] - xx[i] * xx[i]) / (x[i - 1] - 2 * xx[i] + xx[i + 1]); e = fabs(x[i] - x[i - 1]); printf(\"第%d次迭代方程的值为:%lf\\n\if (e 下图是方程x23x2ex0用埃特金Aitken加速迭代和牛顿Newton迭代法计算到xkxk110-8的根。输出迭代初值、迭代次数k及各次迭代值。 图2-1 方程1结果 4 表2-1 子函数 double ffi(double w) void fun() void Aitken() double fun1(double x) double fun2(double x) void Newton() 调用迭代公式 普通迭代 埃特金迭代 调用迭代公式1 调用迭代公式2 牛顿迭代 1.5 实验结果分析 对实验结果做分析,对实验做总结; 比如,在实验二中可在相同初始值、相同精度下,对比各迭代法的迭代次数。也可去了解MATLAB提供的求方程根的函数,比较你的函数与MATLAB函数计算效果与效率。 5 因篇幅问题不能全部显示,请点此查看更多更全内容