我需要解決這個超越方程在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);
這是正確的嗎?
謝謝!
我需要解決這個超越方程在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);
這是正確的嗎?
謝謝!
最簡單的解決方案是迭代你已經給出的公式,直到它收斂到解決方案。這是用於求解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 method的secant method,或Newton's或Halley's方法。
真酷!謝謝! – GabrielBiga 2013-03-25 19:04:16
使用數字方法來解決您的方程式,如Newton's method或(使用起來更容易,實踐中也不會太慢)secant method。對於最後一個,不要重寫下一個x的表達式,這樣寫就會使舍入錯誤(靠近根的問題)不會太多影響。
檢查你自己? – Alon 2013-03-25 16:05:11
你實際上發現'f(x)= x'與'g(x)= 2 - sin(x)/ 2'相交。你可以畫出來看看解決方案。 – jxh 2013-03-25 16:20:13