1

解を関数(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("\n\nEnter the accuracy required : ");

   scanf("%lf", &newtonaccuracy);

   _flushall();


   if (converged == 1) 
      {
        printf("\n\nNewton's Method required %d iterations for accuracy to %lf.\n", iter, newtonaccuracy);

        printf("\n\nThe root using Newton's Method is x = %.16lf\n", 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("\n\nNewton's Method required %d iterations for accuracy to %lf.\n", iter, newtonaccuracy);

それは私に問題を与えています。このプログラムを実行するたびに、「ニュートン法には2686764回の反復が必要です...」と表示されますが、正しくコーディングしていれば、これは当てはまりません(コードで許可される反復の最大数は100です)。

4

1 に答える 1

2

iterで使用される変数mainは、初期化されていないかnewton、ローカル変数を使用する関数で使用されていませんiter。参照渡しするかiternewton関数から返す方法を見つける必要があります。

以下は、いくつかのパラメーターを参照によって受け取り、それらを変更する関数の例です。

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);
于 2012-11-17T17:06:59.957 に答える