循环结构实例011

用二分法求方程 [latex]2x^{3}-4x^{2}+3x-6=0 [/latex] 在(-10, 10)附近的根。

二分法: 先找到a、b, 使f(a)、f(b)异号, 说明在区间(a, b)内一定有零点; 然后求f[(a + b) /2], 现在假设f(a)<0, f(b)>0, a < b, 如果f[(a + b)2] =0, 该点就是零点, 如果f[(a + b) /2]<0, 则在区间((a + b) /2, b)内有零点; 按上述方法再求该区间中点的函数值, 通过每次把f(x)的零点所有小区间收缩一半的方法, 使区间的两个端点逐步迫近函数的零点, 以求得零点的近似值, 该值即是方程的根。

pow(x, n): 即[latex]x^{n}[/latex]。

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);
       
    }
}