2013-03-25 69 views
0

我需要解決這個超越方程在C:解決一個超越方程用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

檢查你自己? – Alon 2013-03-25 16:05:11

+0

你實際上發現'f(x)= x'與'g(x)= 2 - sin(x)/ 2'相交。你可以畫出來看看解決方案。 – jxh 2013-03-25 16:20:13

回答

1

最簡單的解決方案是迭代你已經給出的公式,直到它收斂到解決方案。這是用於求解x = f(x)類型方程的fixed-point iteration method

#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 method,或Newton'sHalley's方法。

+0

真酷!謝謝! – GabrielBiga 2013-03-25 19:04:16

2

使用數字方法來解決您的方程式,如Newton's method或(使用起來更容易,實踐中也不會太慢)secant method。對於最後一個,不要重寫下一個x的表達式,這樣寫就會使舍入錯誤(靠近根的問題)不會太多影響。