Ceros de un polinomio

Fran Mengual

/*
Este programa halla los ceros de cualquier polinomio que introduzcamos entre [-100000,100000] = [-A,A] aplicando el teorema de Bolzano en intervalos de 0.1.
*/

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
using namespace std;

#define MAX 100000
#define A 1000000

void escribir (double c, int k, int n);

int main()
{
int N, i, j, k, h = -1*A;
double coef[MAX], a, b, aux, fa = 0, fb = 0, faux = 0, aprox;

cout << "\n";

//Pide el grado del polinomio.
do {
cout << " Introduce el grado del polinomio: ";
cin >> N;
cout << "\n";
} while (N < 0 || N > MAX);

//Pide los coeficientes.
for ( i=0; i<=N; i++ ){
cout << " Dame el coeficiente del monomio de grado " << i << ":\n ";
cin >> coef[i];
cout << "\n";
}

//Escribe el polinomio.
cout << " El polinomio es: ";
for( i=0; i<=N; i++ ){
escribir(coef[N-i],N-i,N);
}

cout << "\n\n\n";

// Empieza a bucar en intervalos de 0.1 a partir de x = -100000.
do {
//Busca en cada intervalo 2 valores de signo opuesto.
for ( k=h; k<=A; k++){
a = 0.1*k;
b = 0.1*k + 0.1;
fa = 0;
fb = 0;

for ( j=0; j<=N; j++ ){
fa = fa + coef[j]*pow(a,j);
fb = fb + coef[j]*pow(b,j);
}
if (fa==0){ cout << " El polinomio se hace cero en x = " << a << "\n\n"; h = k+1; break;}
if (fa<0 && fb>0 || fa>0 && fb<0){ h = k+1; break;}
}

//Aplica el teorema de Bolzano para hallar una aproximación.
if (fa<0 && fb>0){
for ( j=0; j<=MAX; j++ )
{
aux = 1.0*(a+b)/2;
for ( i=0; i<=N; i++ ){
faux = faux + 1.0*coef[i]*pow(aux,i);
}

if (faux == 0) {printf (" El polinomio se hace cero en x = %.10lf\n\n" , aux); break;}
if (faux < 0 ) a = aux;
if (faux > 0 ) b = aux;

aprox = 1.0*(a+b)/2;

if (j == MAX) {printf (" El polinomio se hace cero cerca de x = %.10lf\n\n" , aprox);}

faux = 0;
}
}

if (fa>0 && fb<0){
for ( j=0; j<=MAX; j++ )
{
aux = 1.0*(a+b)/2;
for ( i=0; i<=N; i++ ){
faux = faux + 1.0*coef[i]*pow(aux,i);
}

if (faux == 0) {printf (" El polinomio se hace cero en x = %.10lf\n\n" , aux); break;}
if (faux < 0 ) b = aux;
if (faux > 0 ) a = aux;

aprox = 1.0*(a+b)/2;

if (j == MAX) {printf (" El polinomio se hace cero cerca de x = %.10lf\n\n" , aprox);}

faux = 0;
}
}
}while (k<A);

cout << endl << endl;

return 0;
}

//Programa para escribir el polinomio.
void escribir (double c, int k, int n)
{
if (k==n && k!=0 && k!=1){
if (c>0) {
if (c==1) cout << "x^" << k;
else cout << c << "x^" << k;
}
if (c<0) {
if (c==-1) cout << " - " << "x^" << k;
else cout << " - " << -1*c << "x^" << k;
}
}

if (k>1 && k<n){
if (c>0) {
if (c==1) cout << " + " << "x^" << k;
else cout << " + " << c << "x^" << k;
}
if (c<0) {
if (c==-1) cout << " - " << "x^" << k;
else cout << " - " << -1*c << "x^" << k;
}
}

if (k==1 && k<n){
if (c>0) {
if (c==1) cout << " + " << "x";
else cout << " + " << c << "x";
}
if (c<0) {
if (c==-1) cout << " - " << "x";
else cout << " - " << -1*c << "x";
}
}

if (k==1 && k==n){
if (c>0) {
if (c==1) cout << "x";
else cout << c << "x";
}
if (c<0) {
if (c==-1) cout << " - " << "x";
else cout << " - " << -1*c << "x";
}
}
if (k==0 && k<n){
if (c>0) cout << " + " << c;
if (c<0) cout << " - " << -1*c;
}

if (k==0 && k==n){
if (c>0) cout << c;
if (c<0) cout << " - " << -1*c;
}
}
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s