tonux Posted December 10, 2016 at 11:14 PM Report Share #601167 Posted December 10, 2016 at 11:14 PM 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 More sharing options...
HappyHippyHippo Posted December 11, 2016 at 01:21 PM Report Share #601174 Posted December 11, 2016 at 01:21 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
tonux Posted December 11, 2016 at 02:07 PM Author Report Share #601176 Posted December 11, 2016 at 02:07 PM (edited) 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 December 11, 2016 at 02:11 PM by tonux Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 11, 2016 at 02:51 PM Report Share #601177 Posted December 11, 2016 at 02:51 PM digo isso porque das soluções que envontrei nenhuma engloba o arctan IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
tonux Posted December 11, 2016 at 06:38 PM Author Report Share #601179 Posted December 11, 2016 at 06:38 PM (edited) 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 December 11, 2016 at 06:40 PM by tonux Link to comment Share on other sites More sharing options...
tonux Posted December 11, 2016 at 10:46 PM Author Report Share #601187 Posted December 11, 2016 at 10:46 PM 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 12, 2016 at 11:56 AM Report Share #601194 Posted December 12, 2016 at 11:56 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
tonux Posted December 12, 2016 at 07:12 PM Author Report Share #601205 Posted December 12, 2016 at 07:12 PM (edited) 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 December 12, 2016 at 07:14 PM by tonux Link to comment Share on other sites More sharing options...
tonux Posted December 12, 2016 at 11:39 PM Author Report Share #601210 Posted December 12, 2016 at 11:39 PM Já experimentei com FORTRAN, dois compiladores -Frost e GNU - e os resultados são idênticos aos do C++. Mistério.😕 Vou continuar a pesquisa. Tem que haver uma explicação. No BASIC (FB) resolve correctamente; Em FORTRAN e C++, não!! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted December 13, 2016 at 09:54 AM Report Share #601214 Posted December 13, 2016 at 09:54 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
tonux Posted December 15, 2016 at 03:52 AM Author Report Share #601256 Posted December 15, 2016 at 03:52 AM (edited) 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 December 15, 2016 at 05:24 PM by tonux Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted December 16, 2016 at 10:41 AM Report Share #601288 Posted December 16, 2016 at 10:41 AM Podias postar o código resolvido para referência para outras pessoas! 🙂 Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now