计算Newton-Raphson方法中的迭代次数

时间:2016-10-17 21:42:49

标签: c++ count newtons-method

我正在使用一个简单的程序,使用Newton-Raphson的方法计算任何给定函数的根。在这个程序中,我必须打印找到的根和迭代次数。程序本身很好,我可以找到任何给定函数的根,但我不能正确计算迭代次数。它总是超过5。迭代次数或比它少1。这是C ++中的代码:

(function() {
  'use strict';
  Polymer({
    is: 'content-el',
    _len: function(first, last) {
      return first.length + last.length;
    }
        });
    })();

我很确定错误出现在这段代码中:

#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

double f(float x)
{
  double function1;
  function1 = exp(x)- 4*pow(x,2); // given function
  return function1;
}

double derivative(float x)
{
  double derivative1;
  derivative1 = exp(x) - 8*x; // derivative of given function
  return derivative1;
}


void newtonMethod(double x0, double error, int N)
{
  double xNext, xPrevious, root;
  int k;

  xPrevious = x0;

  for(int i = 0; i < N || f(xNext) > error; i++)
  {
    xNext = xPrevious - (f(xPrevious)/derivative(xPrevious)); // calculates the next value of x
    xPrevious = xNext;
    root = xNext;
    k = i;
}
cout << endl;
cout << "Iterations made: " << k << endl;
cout << endl;
cout << endl;
cout << endl;
cout << "Root is:  " << root << endl;


}

int main()
{
  double x0, error;
  int N; // max. number of iterations you can do
  cout << "Enter x0: ";
  cin >> x0;
  cout << "Enter the error: ";
  cin >> error;
  cout << "Enter the max. number of iterations: ";
  cin >> N;
  newtonMethod(x0, error, N);
 }

如果我运行此程序并将N = 100,它会显示正确的根,但它会打印“Iterations made = 99”,但这是错误的。如何打印正确的迭代次数?例如,对于上面程序中的函数(e ^ x - 4x²),如果我输入x0 = 0.5且error = 0.0001,它应该在第四次迭代中停止。如何解决?

2 个答案:

答案 0 :(得分:1)

回答你的问题,这就是为什么以下代码不起作用的原因:

;i < N || f(xNext) > error;

这只是因为在for循环条件下,它是一个继续条件,它被评估,而不是停止条件。 在上面的代码中,您告诉编译器的是:继续循环,只要i < N为真或f(xNext) > error为真。因此,当您输入x0 = 0.5error = 0.0001N = 100时,循环的作用是它不会停止,直到两个条件都为假,即当我达到 N 和f(x)中的容差小于错误

现在,解决方案只是将||运算符交换为&&运算符。像这样:

i < N && f(xNext) > error;

但是,您的xNext未初始化。由于您的xNextxPrevious在每个循环结束时相同,我只需添加xPrevious。另外,正如@Rathat写的那样,用f(x)来评估你的公差应该取其绝对值,所以:

i < N && abs(f(xPrevious)) > error;

最后,自从k + 1开始以来,您应该将迭代次数输出为i = 0

这可以解决您的问题。

答案 1 :(得分:0)

感谢所有答案。除了@yuxiangDev解释得很好的for条件背后的逻辑之外,我发现了什么是错的。尽管@RatHat代码完全正确,但错误发生在我正在使用的math.h库中。我试过<cmath>并且效果非常好!洛尔。