2017-08-20 3 views
-2

私は4度でコンピュータサイエンスを学び、私はC++の二分法の実装に問題があります。 エラーがコードを実行して1回終了しましたが、いくつかの変更を試みましたが、良い結果を得ました:( 助けてくれれば助けてください 私はいくつかの代替コードを見ましたが、 。異なる私の二分法をC++で

私のコード以下:

#include <iostream> 
#include <math.h> 

using namespace std; 


double funcao(double x) 
{ 
    double resultado; 
    resultado = x*log10(x)-1; 
    return resultado; 
} 

double E(double xk,double xkAnt) 
{ 
    double resultado =0; 
    resultado= fabs((xk-(xkAnt))/xk); 
    cout<<"O resultado de E é: "<<resultado<<"\n\n"; 
    return resultado; 
} 

// 1)metodo da Bissecção: 
// Este programa implementa o método da bissecção para obter a raíz 
int main() 
{ 
    setlocale(LC_ALL,"Portuguese"); 
    double a,b,xk,xkAnt,erro; 

    xkAnt=0; 
    a=2.0; 
    b=3.0; 

    //cout<<"Digite o valor(double) para o erro \n"<<"Erro: "; 
    erro=0.005; 


    while(E(xk,xkAnt)>erro) 
    { 
     xk= (a+b)/2; 
     if((funcao(a)*funcao(xk))<0) 
     { 
      b=xk; 
      xkAnt=xk; 
      cout<<"Multiplicação das Func. <0 B = xk \n\n"; 
     } 
     else 
     { 
      a=xk; 
      xkAnt=xk; 
      cout<<"Multiplicação das Func. >0 A = xk \n\n"; 
     } 


     if(xkAnt==0) 
     { 
      cout<<"A: "<<a<<endl<<"B: "<<b<<endl<<"XK: "<<xk<<endl<<"Fun(XK): "<<funcao(xk)<<endl<<"Erro: *"<<endl<<endl; 
     } 
     else 
     { 
      cout<<"A: "<<a<<endl<<"B: "<<b<<endl<<"XK: "<<xk<<endl<<"Fun(XK): "<<funcao(xk)<<endl<<"Erro: "<<E(xk,xkAnt)<<endl<<endl; 
     } 

    } 

    return 0; 
} 
+0

コードが機能していて、レビューしたい場合は、[codereview.se]に投稿してください。 –

+0

あなたのデバッグセッションの結果をあなたの投稿に編集してください。どの声明が問題を引き起こしていますか?精度についての問題ですか?入力は何ですか?予想されるアウトプットと実際のアウトプットは何ですか? –

+0

'funcao(a)'を一時変数に、 'funcao(xk)'を 'if'文の前の別の変数に代入すると、デバッグ中にその値が分かりやすくなります。製品と同じです。 –

答えて

0

私はもっと読んできたし、これらのための私の解決策は、add int型変数のコールK(反復数)で構成され、if文kは後に、0に等しいとき、ウィッヒ無視xkAnterior = xkとプログラムが輝くように走っていることを、私は考えてくれたThomas Matthewsに感謝します。

#include <iostream> 
#include <math.h> 

using namespace std; 


    double funcao(double x){ 
     double resultado; 
     resultado = x*log10(x)-1; 
     return resultado; 
    } 

    double calculaErro(double xk,double xkAnterior){ 
     double resultado; 
     resultado= fabs((xk-xkAnterior)/xk); 
     return resultado; 
     cout<<"O resultado de e é: "<<resultado; 
    } 

// 1)metodo da Bissecção: 
// Este programa implementa o método da bissecção para obter a raíz 
int main() 
{ 
    setlocale(LC_ALL,"Portuguese"); 
    double a,b,xk,xkAnterior,k=0,e; 

    a=2.0; 
    b=3.0; 

     cout<<"Digite o valor(double) para o erro \n"<<"E: "; 
     cin>>e; 

     do 
      { 
      if(k==0) 
      { 
       xkAnterior=1; 
      } 
      else 
      { 
       xkAnterior=xk; 
      } 

      xk= (a+b)/2; 
     cout<<"A: "<<a<<endl<<"B: "<<b<<endl<<"XK: "<<xk<<endl<<"Fun(XK): "<<funcao(xk)<<endl<<"Erro: "<<calculaErro(xk,xkAnterior); 
     cout<<endl<<"XK: "<<xk<<endl<<"XK_Anterior: "<<xkAnterior<<endl; 

     if((funcao(a)*funcao(xk))<0) 
      { 
      b=xk; 
      cout<<"Multiplicação das Func. <0 B = xk \n\n"; 
      } 
     else 
      { 
      a=xk; 
      cout<<"Multiplicação das Func. >0 A = xk \n\n"; 
      } 
      k++; 
     }while(calculaErro(xk,xkAnterior)>e); 

    return 0; 
}