Jump to content

Resolução da equação do 3º grau


tonux

Recommended Posts

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.

Link to comment
Share on other sites

Olá

Há tempos criei este código para determinação de raízes de equações de grau n até ao 3 grau algebricamente e mais graus graficamente, em basic. Pretendo, agora, fazer a tradução para c++ 

Concretamente, não me baseei em qualquer referência online do programa no seu todo. Foi do conhecimento adquirido ao longo do tempo.

Edited by tonux
Link to comment
Share on other sites

Este programa em C++, nos casos das equações de 1º e 2º graus, trabalha perfeitamente. Onde entra a trigonometria é que há problema. O arctan entra num dos métodos. Não me recordo de onde o tirei (já foi há muitos anos!). Na literatura actual, de facto, não encontro. Mas se resolve em BASIC, também deve servir para C++.😕

Edited by tonux
Link to comment
Share on other sites

Vou continuar à procura deste método que, aparentemente, diverge dos métodos que eu tenho consultado agora, Cardano-Tartaglia e outros.

Mas, continuo a não entender esta divergência entre linguagens, quando as operações são as mesmas. já tentei recolocar os parêntises, mas não deu resultado.Vou escrever o programa em FORTRAN para ver o que se passa.😕

Edited by tonux
Link to comment
Share on other sites

Problema resolvido:                                                            

fórmula, em Free BASIC, para o cálculo do ângulo teta:

Teta=(1/3)*(pi/2-atn(tt/(sqr(-tt*tt+1)))), isto é,   

teta=(1/3)*(pi/2-arctan⁡(tt/√((-tt*tt+1))) , --> inicialmente com o formato do editor de matemática do Word

fazendo as contas temos:

teta=pi/6-(arctan⁡(tt/√((-tt*tt+1))))/3 --> inicialmente com o formato do editor de matemática do Word

De onde, programando em C**:

Teta=pi/6-(atan(tt/sqrt(-tt*tt+1))))/3

Utilizei o Editor de matemática do Word, mas não consegui copiar fielmente, aparecendo em código de programação o que não era para sê-lo.

Agora já obtenho cálculos correctos. Diferenças subtis entre o BASIC (neste caso o Free BASIC), o C++ e o FORTRAN, na hierarquia dos cálculos.

Obrigado pelo interesse mostrado.🙂

Servi-me do editor Word para tentar reconstruir a fórmula original.

Edited by tonux
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.