C/C++ - 牛顿方法的迭代计数器

C/C++ - Iteration counter for Newton's Method

本文关键字:方法 迭代 计数器 C++      更新时间:2023-10-16

我创建了一个运行牛顿方法的函数,用于将解近似为函数(定义为f)。我的函数很好地返回了根的更好近似值,但是它不会正确显示函数中执行的迭代次数。

这是我的代码:

#include <stdio.h> 
#include <math.h> 
#include <cstdlib>
#include <iostream>
double newton(double x_0, double newtonaccuracy);
double f(double x);
double f_prime(double x);
int main() 
{
   double x_0;  
   double newtonaccuracy;  
   int converged;  
   int iter;
   printf("Enter the initial estimate for x : ");
   scanf("%lf", &x_0);
   _flushall();
   printf("nnEnter the accuracy required : ");
   scanf("%lf", &newtonaccuracy);
   _flushall();

   if (converged == 1) 
      {
        printf("nnNewton's Method required %d iterations for accuracy to %lf.n", iter, newtonaccuracy);
        printf("nnThe root using Newton's Method is x = %.16lfn", newton(x_0, newtonaccuracy));
      } 
   else 
      {
        printf("Newton algorithm didn't converge after %d steps.n", iter);
      }

      system("PAUSE");
} 

double newton(double x_0, double newtonaccuracy) 
{
   double x = x_0;
   double x_prev;
   int iter = 0;

   do 
   {
      iter++;

      x_prev = x;
      x = x_prev - f(x_prev)/f_prime(x_prev);
   } 
   while (fabs(x - x_prev) > newtonaccuracy && iter < 100);
   if (fabs(x - x_prev) <= newtonaccuracy)
   {
      int converged = 1;
   }  
   else
   {
      int converged = 0; 
   }   


    return x;
}  

double f(double x) {
       return ( cos(2*x) - x );
}  
double f_prime(double x) 
{
   return ( -2*sin(2*x)-1 ); 
}  

为了尽可能具体,它是以下行:

printf("nnNewton's Method required %d iterations for accuracy to %lf.n", iter, newtonaccuracy);

这给我带来了麻烦。每次我运行这个程序时,它都会说"牛顿方法需要2686764次迭代......"但是,如果我编码正确,这不可能是真的(我的代码允许的最大迭代次数是 100)。

main中使用的变量iter未在 newton 函数中初始化或使用,在该函数中使用局部变量 iter 。您需要通过引用将iter传递给newton,或者找到一种从函数中返回它的方法。

下面是一个函数通过引用获取一些参数并修改它们的示例:

double foo(double& initial_value, int& iterations)
{
  initial_value *= 3.14159;
  iterations = 42;
  return initial_value/2.;
}

从呼叫方:

double x + 12345.;
int iter = 0;
double y = foo(initial_value, iter);