C ++でこの関数プロトタイプを使用して二等分法を実装するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/5369919

  •  27-10-2019
  •  | 
  •  

質問

double p1::root(double (*pf)(double k), int a, int b, double e)

どうやってそれをするべきかわからない、私は中間点などを特定するループをループしなければならないことを理解している

double p1::root(double (*pf)(double k), int a, int b, double e) {


  // void nrerror(char error_text[]);                                           
  int j;
  float dx, f, fmid, xmid, rtb;

  f = (*pf)(a);
  fmid = (*pf)(b);
  //if (f*fmid >= 0.0) nrerror("root must be bracketed for bisection in rtbis")\
;                                                                               
      rtb = f < 0.0 ? (dx=b-a,a) : (dx=a-b,b);
      for(j = 1;j <40; j++) {
        fmid = (*pf)(xmid = rtb+(dx *= .5));
      if (fmid <= 0.0) rtb = xmid;
      if (fabs(dx) < e || fmid == 0.0) return rtb;
      }
      // nrerror("too many bisections in rtbis");                               


  return 0.0;
}




double p1::test_function(double k) {
  return (pow(k, 3) -2);
}

それから主に私はこれを持っています

 double (*pf)(double k);
pf = &p1::test_function;

//double result = p1::root(pf, a, b, e);
役に立ちましたか?

解決

多分 数値レシピ あなたにアイデアを与えます。ヒント:それは再帰的です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top