Jump to content
tonux

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

Recommended Posts

tonux

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

não vou estar a ver o código, porque está ilegível.

do pouco que vi, não parece estar nada de criticamente errado, no entanto, pergunto : tens alguma referência online onde explica passo a passo o que estás a tentar implementar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tonux

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

digo isso porque das soluções que envontrei nenhuma engloba o arctan


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tonux

 

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++.:confused:

 

 

Edited by tonux

Share this post


Link to post
Share on other sites
tonux

Ainda agora experimentei com uma calculadora (Casio) que resolve raízes da equação do 3º e a versão de BASIC bate certinho com a calculadora.

Share this post


Link to post
Share on other sites
HappyHippyHippo

a conversão do código parece bem ... mas sem uma referência do método é complicado validar por completo ... pode ser um problema de precedência de operadores ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tonux

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.:confused:

Edited by tonux

Share this post


Link to post
Share on other sites
tonux

Já experimentei com FORTRAN, dois compiladores -Frost e GNU - e os resultados são idênticos aos do C++.

Mistério.:confused:  Vou continuar a pesquisa. Tem que haver uma explicação. No BASIC (FB) resolve correctamente; Em FORTRAN e C++, não!!

Share this post


Link to post
Share on other sites
HappyHippyHippo

como disse, pode ser um problema de precedência de operadores. mas para ter a certeza, só mesmo com as fórumlas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tonux

 

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

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Podias postar o código resolvido para referência para outras pessoas! :)


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
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.