Olá, boa tarde
Para a determinação das 3 raízes reais de uma equação do 3º grau, caso a condição se verifique, tenho sempre erro em C++, ao contrário do BASIC que me dá resultado certos.
O método usado foi o chamado método trigonométrico, para o caso de 3 raízes reais.
Código em BASIC
'Cálculo do valor das raízes de uma eq do 3º grau
const pi=3.141593
dim as single yy,p,pp,q,cc,tt,teta,x1,x2,x3,z1,z2,r1,i1,a,b,c,d,aa,bb
print "entrada dos coeficientes:"
input a:input b:input c:input d
If a=0 Then
Print
Print "O coeficiente 'a' TEM QUE SER DIFERENTE DE 0"
Print
Print "carregue numa tecla para finalizar"
Sleep
End
EndIf
yy=b/(3*a)
p=(c/(3*a))-(b^2/(9*(a^2)))
q=((2*b^3)/(27*a^3)-(b*c/(3*(a^2))))+(d/a)
cc=q^2+(4*(p)^3)
if cc<0 then
tt=q/(2*sqr((-p)^3))
teta=(1/3)*(pi/2-atn(tt/(sqr(-tt*tt+1))))
pp=-2*sqr(-p)
x1=pp*cos(teta)-yy
x2=pp*cos(teta+(120/180*pi))-yy
x3=pp*cos(teta+(240/180*pi))-yy
print
print "3 raizes reais"
print
print "x1= ";x1
print "x2= ";x2
print "x3= ";x3
print
print "f(x1)= ";a*x1^3+(b*x1^2)+(c*x1)+d
print "f(x2)= ";a*x2^3+(b*x2^2)+(c*x2)+d
print "f(x3)= ";a*x3^3+(b*x3^2)+(c*x3)+d
Código em C++
int tergrau()
{
float p,q,cc,a,b,c,d,tt,teta,pp,x1,x2,x3,yy;
cout<<"Resolução da equação do 3º grau";
cout<<endl;
cout<<"Faca entrar os coeficientes:"<<endl;
cin>>a;cin>>b;cin>>c;cin>>d;cout<<endl;
yy=b/(3*a);cout<<"yy= "<<yy<<endl;
p=(c/(3*a))-(pow(b,2)/(9*(pow(a,2))));
cout<<"p= "<<p;
q=((2*(pow(b,3)/(27*pow(a,3)))-(b*c/(3*pow(a,2))))+(d/a));
cout<<"q= "<<q<<endl;
cc=pow(q,2)+(4*pow(p,3));
cout<<"cc= "<<cc<<endl;
if (cc<0){
tt=q/(2*sqrt(pow(-p,3))); cout<<"tt= "<<tt<<endl;
teta=(1/3)*(pi/2-atan(tt/(sqrt(-tt*tt+1))));
cout<<"teta= "<<teta<<endl;cout<<"pi= "<<pi<<endl;
pp=-2*sqrt(-p); cout<<"pp= "<<pp<<endl;
x1=pp*cos(teta)-yy;
x2=pp*cos(teta+(120/180*pi))-yy;
x3=pp*cos(teta+(240/180*pi))-yy;
cout<<endl;
cout<<"3 raizes reais"<<endl<<endl;
cout<<"x1= "<<x1<<endl;
cout<<"x2= "<<x2<<endl;
cout<<"x3= "<<x3<<endl<<endl;
cout<<"f(x1)= "<<a*pow(x1,3)+(b*pow(x1,2))+(c*x1)+d<<endl;
cout<<"f(x2)= "<<a*pow(x2,3)+(b*pow(x2,2))+(c*x2)+d<<endl;
cout<<"f(x3)= "<<a*pow(x3,3)+(b*pow(x1,3))+(c*x3)+d<<endl;
}
return 0;
}
No caso do código c++, inseri somente a rotina de cálculo de equaçõas do 3º grau ( o programa tem, ainda, outras rotinas que calculam as equações do 1º grau e do 2º grau)
Pois, estranhamente, não obtenho os valores correctos com o programa c++, ao contrário do BASIC. Aparentemente, a maior diferença é no cálculo da variável teta. Problemas de cálculos trigonométricos por parte do compilador (GNU)? Ou problemas na construção das expressões em c++?
(Acrescentei impressões auxiliares para tentar resolver o problema - debug)
Obrigado pela atenção.
↧