用C求解一个超越方程

时间:2013-03-25 16:03:56

标签: c math equation

我需要在C中解决这个超越方程:

x = 2.0 - 0.5sen(x)

我试过了:

double x, newx, delta;

x = 2.0 - 0.5; 
newx = sin(x);
delta = fabs(newx * x);

printf("%f", delta);

这是对的吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用数值方法来解决方程,例如Newton's method或(更容易使用,而且实践中不要太慢)secant method。对于最后一个,重写下一个x的表达式,它是这样编写的,以便舍入错误(根目录附近的问题)不会影响太多。

答案 1 :(得分:1)

最简单的解决方案是迭代已经给出的公式,直到它收敛到解决方案。这是fixed-point iteration method用于求解x = f(x)类型的方程式。

#define TOLERANCE 1e-8
#define MAX_ITER 50

double solve_equation() {
    double x = 1.0; /* 1.0 is our initial guess */
    double x_old;
    int i = 0;      /* iteration counter */
    do {
        x_old = x;
        x = 2 - 0.5*sin(x); /* magic! */
        i++;
    } while (fabs(x-x_old)/x > TOLERANCE && i < MAX_ITER);

    return x;
}

在这种特殊情况下,该方法快速收敛,并且迭代计数的上限是不必要的。答案结果是1.50121007326。

对于一般root finding,您可能会发现其他算法更有用,例如bisection methodsecant methodNewton'sHalley's方法。