2011-10-07 71 views
1

我试图找到这样的P,对于给定函数f(P),我们有平等定点迭代

P = F(P); 这里是代码

#include <iostream> 
#include<math.h> 
using namespace std; 
float fixed(float x){ 
    return (float)(pow(x,3)-4*pow(x,2)-10); 
} 

int main(){ 
    float p=0.0; 
    float p0=1.5; 
    float tol=(float).001; 
    int N=25; 
    int i=1; 
    while(i<N){ 
     p=(float)fixed(p0); 
     if((p-p0)<tol){ 
      cout<<p<<endl; 
      break; 
     } 
     i=i+1; 
     p0=p; 
     if(i>N){ 
      cout<<"solution not found "; 
      break; 
     } 
    } 
    return 0; 
} 

我已经尝试了不同的初始点,也有不同的公差,但结果很扯淡-16或-15.something,那么什么是错了吗?是的代码是否正确?请帮

回答

3

我认为你根本没有一种迭代算法适用的情况。 See here对于某些条件。你的函数在1.5附近没有一个有吸引力的固定点,算法发散。

但是为什么数字:你的函数是f(x) = x^3 - 4x - 10,所以求解f(x) = x等于找到f(x) - x的零,并且在5.35附近只有一个实数零。 Howevever,f'(x)在这一点是非常大的,所以即使那里的迭代算法是不可用的。

数值找根算法可能是一个更合适的方法。

3

我不知道你想什么来实现,但可能使用:的

if(fabs(p-p0)<tol){ 

代替:

if((p-p0)<tol){ 

会让你更接近你想去的地方。

原因是所有的负值都小于.001,所以如果函数的结果是负值(如本例中那样),您将立即停止。

BTW:此检查:

if(i>N){ 

永远不会为真。您可能打算使用==>=而不是>

+0

uiiiiiiiiiii我忘了它,非常感谢,我会更正它 –

1
fabs(p - p0) <= tol * fabs(p); 

是相等值的正确公式。在特殊范围的情况下,您还必须关心NaN和Inf。

#include <limits> 
#include <cfloat> 

inline bool Equal(const double& x, const double& y) 
{ 
    const int classX (_fpclass(x)); 

    if(classX != _fpclass(y)) { 
    return false; 
    } 

    switch(classX) { 
     case _FPCLASS_SNAN: 
     case _FPCLASS_QNAN: 
     case _FPCLASS_NINF: 
     case _FPCLASS_NZ : 
     case _FPCLASS_PZ : 
     case _FPCLASS_PINF: 
     return true; 
     break; 
     case _FPCLASS_NN : 
     case _FPCLASS_ND : 
     case _FPCLASS_PD : 
     case _FPCLASS_PN : 
     default: 
     break; 
    } 

    return fabs(x - y) <= std::numeric_limits<double>::epsilon() * fabs(x); 
}