1

regula falsi メソッドを実装しました。正割法になるように修正しようとしています。私が読んだ pdf は、それが 1 つの変更だけで本質的に同じであると述べました。私の「m」値の将来の推測は、次の代わりに、わずかに異なる式を持つ必要があります。

m = a - f(a) * ( (b-a)/( f(b)-f(a) ) );

そのはず:

m = a - f(a) * ( (m-a)/( f(m)-f(a) ) );

残念ながら、それは機能しません (ルートが見つかりません)。これを正割法に入れるには何を修正すればよいですか?

ソースコードは次のとおりです。

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


void
secant(double a, double b, double e, double (*f)(double), int maxiter ) {
  double m, fm, fa, fb;
  int i;

  fa=(*f)(a);
  fb=(*f)(b);

  m = a - fa * ( (b-a)/( fb - fa ) );

  fm=(*f)(m);


   for(i=0; i<maxiter; i++) {
    if ( fabs(fm) <= e ) {                               
      printf("f(%f) = %f\n", m, fm);
      return;
    } else if ((fa*fm) < 0) {
      b=m;
      fb=fm;
    } else {
      a=m;
      fa=fm;
    }

     // the guess below works for regula falsi method:   
     // m = a - fa * ( (b-a)/(fb - fa)); 

     //this was supposed to be the change to turn this into the secant method 
     m = a - fa * ( (m-a)/(fm - fa) ); 

     fm=(*f)(m);
  }
}

int main(){
secant(1,4,0.0001,sin,500);
return 0;
}

前もって感謝します

編集:ペンと紙で遊んだ後、最初に考えたような単純な変更ではなかったことが最終的にわかりました:

void secant(double a, double b, double e, double (*f)(double), int maxiter ) {
  double m, fm, fa, fb;
  int i;
  fa=(*f)(a);
  fb=(*f)(b);

   for(i=0; i<maxiter; i++) {
     m = a - fa * ( (b-a)/(fb - fa) );
     fm=(*f)(m);
     if ( fabs(fm) <= e ) {                               
        printf("f(%f)=%f, iter: %d\n", m,fm,i);
         return;
     }
     a=b;
     b=m;
     fa=fb;
     fb=fm;
  }
}
4

3 に答える 3

1

正割法では根が見つからない方が簡単です。あなたはそれを見つけるべきだと確信していますか?

テストのために、ここに例を示します: http://www.mathcs.emory.edu/ccs/ccs315/ccs315/node18.html (example 4.7) その例を実行したいでしょう ( f(x)=x^6 -x-1 、x0=1 x1=2、ルート x=1.347)

于 2011-06-09T19:15:52.030 に答える
0

PDFが間違っているか、誤解しています。PDF を読まなければ、どれを言うか、またはさらに説明することは不可能です。両方の方法を説明するとき、regula falsi と正割法の違いは、a と b を更新するためのルールだと言います。

正割法の最初の 2 つの反復を手動で計算します。次に、反復ごとに a、b、および m の値を出力するようにプログラムを変更します (またはデバッガーを使用します)。これにより、何が起こっているかのヒントが得られるはずです。

あなたの例では、正割法は数回の反復で収束するはずです。

于 2011-06-10T11:38:09.430 に答える
0

正割法は開括弧法ですが、Regula-Falsi は閉括弧法です。したがって、あなたのPDFは正しいです。Regula-Falsi 法を正割法に変更するには、閉括弧を開型に変更する必要があります。

Regula-Falsi 法については、この例を参照してください。ここで、符号化は、1 つの間隔が常に一定になるように行われます。

さて、これがセカント法のサンプルプログラムです。ここでは、Regula 法と同様に、2 つの初期推測が行われますが、正しい根が得られるまで両方の区間が変化し続けます。最初の 2 つの推測を手動で取得します。

また、収束率については、Secant 法では超線形ですが、Regula では線形です。したがって、正割法ははるかに高速に収束します。

于 2014-04-09T07:42:51.350 に答える