本实验代码均在Turbo C 2.0下实现。
一、目的与要求:
1、通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;
2、比较二者的计算速度和计算精度。
二、实验内容
1、二分法
- 算法
给定区间[a,b],并设与符号相反,取为根的容许误差。
- 令c=(a+b)/2
- 如果f(c)=0,则输出,结束;否则执行(3),
- 如果,则令;否则则令,重复(1),(2),(3)。
2、牛顿迭代法
- 算法
给定初值,为根的容许误差,为的容许误差,N为迭代次数的容许值。
- 如果=0或迭代次数大于N,则算法失败,结束;否则执行(2)。
- 计算=
- 若或,则输出,程序结束;否则执行(4)。
- 令,转向(1)。
三、程序代码
#include#include float f(float c) { return c * c * c + c*c - 3*c -3; } float f1(float c) { return 3 * c * c + 2*c - 3; } void func1(float a, float b, float e) { int epoch; epoch = 1; while (1) { float c = (a + b) / 2; printf("step %d , x=%.8fn",epoch, c); if (f(c) == 0 || (((b - a) / (pow(2, epoch + 1)) <= e))) break; else if ((f(c) < 0 && f(a) < 0) || (f(c) > 0 && f(a) > 0)) { a = c; } else { b = c; } epoch++; } } void func2(float x, int epoch, float e, float H) { int i; float x1; float x0; i = 1; x0 = x; while (1) { if (i > epoch || f1(x0) == 0) { printf("failed!"); break; } x1 = x0 - f(x0) / f1(x0); printf("epoch = %d, x = %.8fn", i,x1); if (fabs(x1 - x0) < e || fabs(f(x1)) < H) { if (fabs(x1 - x0) < e) { printf("x = %.6f,on condition e", x1); } else { printf("x = %.6f,on condition H", x1); } break; } x0 = x1; i++; } } int main() { float a, b, e, H, x0; int epoch; clrscr(); printf("Please enter the interval of Bisection a,b x tolerance error e, f(x) tolerance error H AND newtown epoch, Initial solution x0:n"); scanf("%f%f%f%f%d%f", &a, &b, &e, &H, &epoch, &x0); printf("Bisection :n"); func1(a, b, e); printf("Newtown:n"); func2(x0,epoch, e, H); getch(); return 0; }
四、实验结果
五、分析思考
本次实验通过C语言编程实现了二分法和牛顿法的求解过程,求解的目标函数为 ,可以发现牛顿法求解的速度要更快,仅用两次迭代就完成了求解。



