我將在“ACM--SOJ總結(jié)”中寫關(guān)于二分法逼近求方程的解(尤其是不能顯化的).這篇是pengkuny C++ blog中的一篇,我覺得很有必要摘錄一下,供大家參詳。
/**
? 牛頓迭代法求方程的一個實根
? 牛頓公式:x(k+1) = x(k) - f(x(k)) / f '(x(k))
? 迭代函數(shù):Ф(x) = x - f(x) / f'(x)
? 屬性:方程求根迭代法
?
? 此時的迭代函數(shù)必須保證X(k)有極限,即迭代收斂。
**/
代碼如下:
#include
<
iostream
>
#include
<
cmath
>
using
?
namespace
?std;

#define
?f(x)?(x*x*(x-1.0)-1.0)??
//
舉例函數(shù)x^3-x^2-1
#define
?g(x)?(3.0*x*x-2.0*x)??
//
導(dǎo)函數(shù)3x^2-2x
#define
?epsilon?0.0000001??
//
精度
#define
?MAXREAPT?100
bool
?RootNewton(
double
?
&
x)

{
????
double
?xk1,xk0;

????xk0?
=
?x;
????
for
?(
int
?k
=
0
;?k
<
MAXREAPT;?k
++
)

????
{
????????
if
?(g(xk0)?
==
?
0.0
)
//
牛頓迭代法缺陷在于:收斂是否與初值x0密切相關(guān)
????????
{
//
如果g(xk0)數(shù)值特別小時,有可能發(fā)生從一個根跳到另一個根附近的情況
????????????cout
<<
"
迭代過程中導(dǎo)數(shù)為0.
"
<<
endl;
????????????
return
?
false
;
????????}
????????xk1?
=
?xk0?
-
?f(xk0)
/
g(xk0);
//
key?step
????????
if
?(fabs(xk1
-
xk0)?
<
?epsilon?
&&
?fabs(f(xk1))?
<
?epsilon)

????????
{
//
注意迭代結(jié)束條件是:?|f(xk1)|?<?ε和|xk1-xk0|?<?ε同時成立,防止根跳躍
????????????x?
=
?xk1;
????????????
return
?
true
;
????????}
????????
else
????????
{
????????????xk0?
=
?xk1;
????????}
????}
????
//
迭代失敗
????cout
<<
"
迭代次數(shù)超過預(yù)期.
"
<<
endl;
????
return
?
false
;
}
int
?main()

{
????
double
?x;
????cout
<<
"
牛頓迭代法求方程根,請輸入初始迭代x0值:
"
<<
endl;
????cin
>>
x;

????
if
(RootNewton(x))

????
{
????????cout
<<
"
該值附近的根為:
"
<<
x
<<
endl;
????}
????
else
????
{
????????cout
<<
"
迭代失敗!
"
<<
endl;
????}
????system(
"
pause
"
);
????
return
?
0
;
}
#include
<
iostream
>
#include
<
cmath
>
using
?
namespace
?std;
#define
?f(x)?(x*x*(x-1.0)-1.0)??
//
舉例函數(shù)x^3-x^2-1
#define
?g(x)?(3.0*x*x-2.0*x)??
//
導(dǎo)函數(shù)3x^2-2x
#define
?epsilon?0.0000001??
//
精度
#define
?MAXREAPT?100
bool
?RootNewton(
double
?
&
x)
{
????
double
?xk1,xk0;
????xk0?
=
?x;
????
for
?(
int
?k
=
0
;?k
<
MAXREAPT;?k
++
)
????
{
????????
if
?(g(xk0)?
==
?
0.0
)
//
牛頓迭代法缺陷在于:收斂是否與初值x0密切相關(guān)
????????
{
//
如果g(xk0)數(shù)值特別小時,有可能發(fā)生從一個根跳到另一個根附近的情況
????????????cout
<<
"
迭代過程中導(dǎo)數(shù)為0.
"
<<
endl;
????????????
return
?
false
;
????????}
????????xk1?
=
?xk0?
-
?f(xk0)
/
g(xk0);
//
key?step
????????
if
?(fabs(xk1
-
xk0)?
<
?epsilon?
&&
?fabs(f(xk1))?
<
?epsilon)
????????
{
//
注意迭代結(jié)束條件是:?|f(xk1)|?<?ε和|xk1-xk0|?<?ε同時成立,防止根跳躍
????????????x?
=
?xk1;
????????????
return
?
true
;
????????}
????????
else
????????
{
????????????xk0?
=
?xk1;
????????}
????}
????
//
迭代失敗
????cout
<<
"
迭代次數(shù)超過預(yù)期.
"
<<
endl;
????
return
?
false
;
}
int
?main()
{
????
double
?x;
????cout
<<
"
牛頓迭代法求方程根,請輸入初始迭代x0值:
"
<<
endl;
????cin
>>
x;
????
if
(RootNewton(x))
????
{
????????cout
<<
"
該值附近的根為:
"
<<
x
<<
endl;
????}
????
else
????
{
????????cout
<<
"
迭代失敗!
"
<<
endl;
????}
????system(
"
pause
"
);
????
return
?
0
;
}