sexta-feira, 1 de janeiro de 2016

Publicado sexta-feira, janeiro 01, 2016 por com 0 comentário

Algoritmo da equação de 3º grau

Para facilitar minha vida fiz um algoritmo baseado nas fórmulas de Cardano e Tartaglia para calcular equações de 3º Grau. Estou disponibilizando o código em duas linguagens C e JavaScript.



Código em C:

 #include<stdio.h>   
 #include<stdlib.h>   
 #include<math.h>   
 void eq_3grau()   
 {   
    system("cls");   
    float a,b,c,d;   
    float r,q,s,discrim,dum1 ,term1, r13, t;   
    float x1,x2,x3;   
    float x11=0, x22=0,x33=0;    
    do{   
    printf("Digite o valor de a: "); scanf("%f",&a);   
    if(a==0)   
      printf("O coeficiente do cubo não pode ser 0.\n\n");   
    }while(a==0);   
    printf("Digite o valor de b: "); scanf("%f",&b);   
    printf("Digite o valor de c: "); scanf("%f",&c);   
    do{   
    printf("Digite o valor de d: "); scanf("%f",&d);   
    if(d==0)   
     printf("\n\nBem, uma raiz eh 0. Divida a equacao polinomial por x e você tem uma equacao do segundo grau. Aqui nada mais ha a ser feito.\n\n");   
   }while(d==0);   
    b /= a;    
    c /= a;    
    d /= a;    
    q = (3*c - (b*b))/9;   
    r = -(27*d) + b*(9*c - 2*(b*b));   
    r /= 54;   
    discrim = q*q*q + r*r;   
    printf("\n\ndiscri = %.20f\n\n", discrim);   
    x1 = 0; //A primeira raiz é sempre real.   
    term1 = (b/3.0);     
    if (discrim > 0) // uma real, duas imaginarias   
    {    
     printf("\n\nO discriminante eh maior que zero");   
     s = r + sqrt(discrim);   
     s = (s < 0) ? -cbrt(-s) : cbrt(s);   
     t = r - sqrt(discrim);   
     t = (t < 0) ? -cbrt(-t) : cbrt(t);   
     x1= -term1 + s + t;   
     term1 += (s + t)/2.0;   
     x33 = x22 = -term1; //parte real   
     term1 = sqrt(3.0)*(-t + s)/2;   
     x2 = term1;   
     x3 = -term1;   
   printf("\n\nx1 = %.8f\n", x1);   
   printf("x2 = %.8f + %.8f*i\n", x22,x2);   
   printf("x3 = %.8f + %.8f*i\n", x33, x3);   
   }   
   if (discrim == 0) // Todas as raizes sao reais.   
   {   
     printf("\n\nO discriminante eh igual a zero");   
     r13 = (r < 0) ? -cbrt(-r) : cbrt(r);   
     x1 = -term1 + 2.0*r13;   
     x3 = x2 = -(r13 + term1);   
   printf("\n\nx1 = %.8f\n", x1);   
   printf("x2 = %.8f\n", x2);   
   printf("x3 = %.8f\n", x3);   
   }   
   if(discrim < 0) //Opcao deixada para onde todas as raizes sao reais e distintas (q < 0)   
   {   
     printf("\n\nO discriminante eh menor que zero");   
   q = -q;   
   dum1 = q*q*q;   
   dum1 = acos(r/sqrt(dum1));   
   r13 = 2.0*sqrt(q);   
   x1 = -term1 + r13*cos(dum1/3.0);   
   x2 = -term1 + r13*cos((dum1 + 2.0*M_PI)/3.0);   
   x3 = -term1 + r13*cos((dum1 + 4.0*M_PI)/3.0);   
   printf("\n\nx1 = %.8f\n", x1);   
   printf("x2 = %.8f\n", x2);   
   printf("x3 = %.8f\n", x3);   
   }     
 }   
 int main ()   
 {   
 do{   
   system("cls");   
 eq_3grau();   
  printf("\n\n\nQuer continuar? (s/n) ");   
 }while (toupper(getch()) != 'N');   
    // by Bruh   
 }   



Código em JavaScript

 <!--Define JavaScript functions.-->   
 function Resolve(dataForm){   
 var a = parseFloat(dataForm.aIn.value);   
 var b = parseFloat(dataForm.bIn.value);   
 var c = parseFloat(dataForm.cIn.value);   
 var d = parseFloat(dataForm.dIn.value);   
 if (a == 0){   
  alert("O coeficiente do cubo não pode ser 0.");   
  return;   
 } //End if a == 0   
 if (d == 0){   
  alert("Bem, uma raiz eh 0. Divida a equacao polinomial por x e você tem uma equacao do segundo grau. Aqui nada mais ha a ser feito.");   
  return;   
 } //End if d == 0   
 b /= a;   
 c /= a;   
 d /= a;   
 var discrim, q, r, dum1, s, t, term1, r13;   
 q = (3.0*c - (b*b))/9.0;   
 r = -(27.0*d) + b*(9.0*c - 2.0*(b*b));   
 r /= 54.0;   
 discrim = q*q*q + r*r;   
 dataForm.x1Im.value = 0; //A primeira raiz é sempre real.   
 term1 = (b/3.0);   
 if (discrim > 0) { // uma real, duas imaginarias   
  s = r + Math.sqrt(discrim);   
  s = ((s < 0) ? -Math.pow(-s, (1.0/3.0)) : Math.pow(s, (1.0/3.0)));   
  t = r - Math.sqrt(discrim);   
  t = ((t < 0) ? -Math.pow(-t, (1.0/3.0)) : Math.pow(t, (1.0/3.0)));   
  dataForm.x1Re.value = -term1 + s + t;   
  term1 += (s + t)/2.0;   
  dataForm.x3Re.value = dataForm.x2Re.value = -term1;   
  term1 = Math.sqrt(3.0)*(-t + s)/2;   
  dataForm.x2Im.value = term1;   
  dataForm.x3Im.value = -term1;   
  return;   
 } // End if (discrim > 0)   
 dataForm.x3Im.value = dataForm.x2Im.value = 0;   
 if (discrim == 0){ // Todas as raizes sao reais.   
  r13 = ((r < 0) ? -Math.pow(-r,(1.0/3.0)) : Math.pow(r,(1.0/3.0)));   
  dataForm.x1Re.value = -term1 + 2.0*r13;   
  dataForm.x3Re.value = dataForm.x2Re.value = -(r13 + term1);   
  return;   
 } // End if (discrim == 0)   
 // Opcao deixada para onde todas as raizes sao reais e distintas (q < 0)   
 q = -q;   
 dum1 = q*q*q;   
 dum1 = Math.acos(r/Math.sqrt(dum1));   
 r13 = 2.0*Math.sqrt(q);   
 dataForm.x1Re.value = -term1 + r13*Math.cos(dum1/3.0);   
 dataForm.x2Re.value = -term1 + r13*Math.cos((dum1 + 2.0*Math.PI)/3.0);   
 dataForm.x3Re.value = -term1 + r13*Math.cos((dum1 + 4.0*Math.PI)/3.0);   
 return;   
 } //FIM do Resolve   
 // by Bruh   
 // end of JavaScript-->   



      edit

0 comentários:

Postar um comentário