用二分法求方程
2x^{3}-4x^{2}+3x-6=0
在(-10, 10)附近的根。
二分法: 先找到a、b, 使f(a)、f(b)异号, 说明在区间(a, b)内一定有零点; 然后求f[(a + b) /2], 现在假设f(a)0, a < b, 如果f[(a + b)2] =0, 该点就是零点, 如果f[(a + b) /2]<0, 则在区间((a + b) /2, b)内有零点; 按上述方法再求该区间中点的函数值, 通过每次把f(x)的零点所有小区间收缩一半的方法, 使区间的两个端点逐步迫近函数的零点, 以求得零点的近似值, 该值即是方程的根。
pow(x, n): 即x^{n}。
fabs(x): 即x的绝对值。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <stdio.h>
#include <math.h> void main() { double a, b, x, fa, fb, fx, z=0.1e-6; a = –10; b = 10; x = (a + b) / 2; fa = 2 * pow(a, 3) – 4 * pow(a, 2) + 3 * a –6; fb = 2 * pow(b, 3) – 4 * pow(b, 2) + 3 * b –6; fx = 2 * pow(x, 3) – 4 * pow(x, 2) + 3 * x –6; if(fx == 0) { printf("The root is: %lf\n", x); } else { do { x = (a + b) / 2; fx = 2 * pow(x, 3) – 4 * pow(x, 2) + 3 * x –6; if(fx < 0) { a = x; fa = 2 * pow(a, 3) – 4 * pow(a, 2) + 3 * a –6; } else { b = x; fb = 2 * pow(b, 3) – 4 * pow(b, 2) + 3 * b –6; } } while(fabs(fa – fb) > z); printf("The root is: %lf\n", x); } } |