定点迭代

时间:2011-10-07 09:50:18

标签: c++ numerical-methods

我试图找到这样的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 个答案:

答案 0 :(得分:3)

我不确定你想要实现什么,但可能使用:

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

而不是:

if((p-p0)<tol){

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

原因是所有负值都小于.001,因此如果函数的结果为负值(如本例所示),则会立即停止。

顺便说一下:这张支票:

if(i>N){

永远不会成真。您可能打算使用==>=代替>

答案 1 :(得分:3)

我认为您根本没有迭代算法适用的情况。 See here了解某些情况。你的函数在1.5附近没有一个有吸引力的固定点,算法也会发散。

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

数字根寻找算法可能是更合适的方法。

答案 2 :(得分: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);
}