3

二分法を使用して 2 つの関数のルートを比較するために、この C コードを作成しました。最初の関数 (g(x)) は正しく実行されますが、2 番目の関数 (h(x)) は画面に「#1QO」を出力します。コードで何が間違っていたのかわかりません。

説明していただけますか?どんな種類の助けでも大歓迎です。ありがとう!

#include <stdio.h>
#include <math.h>

typedef double (*DFD) (double);

double g (double x) 
{
   double y;
   y = pow (x,3) - pow (x,2)-1;
   return y;
}

double h (double x)
{
  double k;
  k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
  return k;
}

double bisection (DFD f, double x0, double x1,double tol)
{
   int i;
   double middle;
     for (i=1;i<=50;) {
     middle = (x0+x1)/2.0;
     if (fabs (middle - x0) <tol) return middle;
     if (f(middle)* f(x0) <0.0) x1 = middle;
     else x0 = middle;
     }
 }

 int main () {
 double root_gx, root_hx = 0.0;

 root_gx = bisection (g,0,2,0.0005);
 printf ("Root found using g(x) = %.3lf\n",root_gx);

 root_hx = bisection (h,1,2,0.0005);
 printf ("Root found using h(x) = %.3lf\n",root_hx);

 printf ("Difference between the two roots = %.3lf\n", (fabs (root_gx- root_hx)));

return 0;

} 

編集二分でi = 1を初期化し、に変更bisection (h,0,2,0.0005)するbisection (h,1,2,0.0005)と動作します皆さんありがとう!

4

2 に答える 2

4

未定義の動作につながる初期化されていない値。何らかの値に設定します。

// int i;
int i = 0;
...
for (;i<=50;) {

i増加することはありません。
50 任意です。

各反復で のバイナリ精度を半分にすることをお勧めしdoubleます。bisection()

for (i=0; i <= DBL_MANT_DIG; i++) {
  ...
}
return middle;

|difference| の変更を許可するアルゴリズムの変更も推奨します。0.0 の公差を満たすために 0.0 の

// if (fabs (middle - x0) <tol) return middle;
if (fabs (middle - x0) <= tol) return middle;
于 2015-12-19T22:56:33.120 に答える
1
double h (double x)
{
  double k;
  k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
  return k;
}

の場合、ゼロ除算を返しますx==0.0。を呼び出すときにこれを行います。これは、この場合はbisection (h,0,2,0.0005);を呼び出します。f(x0)h(0.0);

関数で入力パラメータを除算する場合は、入力パラメータの実際の値が と等しくないかどうかを常に確認する必要があります0.0

double h (double x)
{
  if ( x == 0.0 ) return 1e99; // infinite
  double k;
  k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
  return k;
}
于 2015-12-19T19:56:33.347 に答える