sábado, 5 de noviembre de 2011

Raices de una ecuación cuadrática - Codigo C++

Una ecuación cuadrática es de la forma,
$$ax^{2} + bx + c = 0$$
para hallar las raíces de esta ecuación es común emplear la expresión,
$$x=\frac{-b \pm \sqrt{b^{2}-4ac}}{2a}$$
sin embargo, es conocido que la anterior expresión presenta perdida de precisión en la evaluación numérica de las raíces.


Una expresión alternativa que reduce esta perdida es la siguiente,
$$x = \frac{2c}{-b\mp \sqrt{b^{2}-4ac}}$$
si uno de tus pendientes consiste en desarrollar un código en C++ para la ultima expresión, te comparto un código fuente.


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Retorna el valor de Q para hallar la solucion cuadratica
double getQ(double a, double b, double c)
{ double q=-0.5*(b+(b/fabs(b))*sqrt(fabs(b*b-4*a*c)));
  return(q);
}// fin de la funcion


// Retorna la solucion cuadratica pedida
double getSolCuad(int op,double a, double b, double c)
{
  double sol;
  double q=getQ( a, b, c);
  switch(op)
  {
      case 1: sol=q/a; break;
      case 2: sol=c/q; break;
  }
  return(sol);
}// fin de la funcion


// Retorna el valor de la comprobacion
double getComprobacion(double a,double b,double c,double x)
{
  double res;
  res=a*x*x+b*x+c;
  return (res);
}// fin de la funcion


// Main
int main()
{
  double a,b,c,x;
  printf("\n Resuelve una ecuacion de la forma: Ax^2+Bx+C\n");
  printf("\n Teclee el valor de A: ");scanf("%lf",&a);
  printf("\n Teclee el valor de B: ");scanf("%lf",&b);
  printf("\n Teclee el valor de C: ");scanf("%lf",&c);
  if(b*b>=4*a*c)
  {
    x=getSolCuad(1, a, b, c);  printf("\n X1: %e",x);
    printf("\n Al comprobar se obtiene: %e",getComprobacion(a,b,c,x));
    x=getSolCuad(2, a, b, c);  printf("\n X2: %e",x);
    printf("\n Al comprobar se obtiene: %e",getComprobacion(a,b,c,x));
  }// fin if
  else // numeros imaginarios
  {
    x=sqrt(4*a*c-b*b);
    printf("\n X1= ( %e + %e i )/%e",(-1)*b,x,2*a);
    printf("\n X1= ( %e - %e i )/%e",(-1)*b,x,2*a);
  }// fin else


  return(0);
}// fin main

Espero sea de ayuda.

Saludos - FaithHeart

No hay comentarios:

Publicar un comentario