Мой метод бисекции в переполнении стека

Я изучаю информатику в 4 степени, и у меня проблемы с реализацией метода деления пополам в 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;
}

-2

Решение

Я читал больше, и мое решение для них состоит в том, чтобы добавить переменную int вызова k (числа итераций) и оператор if, который игнорирует, когда k равно 0, после этого xkAnterior = xk и программа работает как блеск. Спасибо за Томаса Мэтьюса, который помог мне подумать.

    #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;
}
0

Другие решения

Других решений пока нет …