Post on 01-Feb-2016
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
Sea la función:
f ( x )=x 4−x3+6 x2−3 x+4
Encontrar sus raíces
Por lo tanto todas sus raíces son complejas
void lb() {
int n, m,w,np,contadorConver,k,z,nx,mx;
float r,s,e,dr,ds,error,newsize,r0,s0;
cout<<"Introduzca el grado del polinomo: "<<endl;
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
cin>>n;
n++;
w=contadorConver=z=0; //w es el contador de veces que se repite el proceso (no solo la division, todo el proceso)
m = n-1;
float C[n],Mr[n],Ms[n],Mat1[n],Mat2[m],raizReal[n],raizImaginaria[n];
float raiz;
for (int i = 0; i<n;i++)
{
Mr[i]=Ms[i]=Mat1[i]=raizReal[i]=raizImaginaria[i]=0;
}
cout<<"Introduzca los coeficientes del polinomio (deben de ir en orden descendednte segun el exponente y el primer coeficiente debe ser 1)"<<endl;
for(int i = 0; i < n; i++)
{
cout<<"Introduzca el coeficiente de x^"<<-i+(n-1)<<" :"<<endl;
cin>>C[i];
}
if (C[0] != 1)
{
cout<<"El coeficiente de x^"<<n-1<<" debe ser = 1 "<<endl;
}
else
{
cout<<"Introduzca el valor inicial de r : "<<endl;
cin>>r0;
cout<<"Introduzca el valor inicial de s : "<<endl;
cin>>s0;
cout<<"Introduzca el valor del error de convergencia: " <<endl;
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
cin>>error;
cout<<"Introduzca numero maximo de iteraciones : "<<endl;
cin>>k;
dr = ds = 1;
for(int j = 0; j < 2*(n-1) ; j=j+2) //Se necesita sumarle 2 al contador dado que en cada paso se guardan 2 valores en las raices (j y j+1)
{
dr=ds=1;
np = (n-1)- 2*w; //np es el grado del polinomio a dividir
nx = n-1 - 2*w;
mx = nx-1;
if (np <= 2)
{
if(np == 2)
{
raiz=(C[1]*C[1])-(4*C[2]);
if (raiz < 0)
{
raiz = abs(raiz);
raizReal[j]=(-C[1])/2;
raizReal[j+1]=(-C[1])/2;
raizImaginaria[j]=sqrt(raiz)/2;
raizImaginaria[j+1]=-sqrt(raiz)/2;
}
else
{
raizReal[j]=((-C[1])+(sqrt(raiz)))/2;
raizReal[j+1]=((-C[1])-(sqrt(raiz)))/2;
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
raizImaginaria[j]=0;
raizImaginaria[j+1]=0;
}
}
else
{
raizReal[j]=-C[1];
}
break;
}
else{
contadorConver=0;
r=r0;
s=s0;
for (int i = 0; i<= np;i++)
{
Mr[i]=Ms[i]=Mat1[i]=Mat2[i]=0; //regresa a 0 Mr y Ms
}
while (abs(dr) > error || abs(ds) > error){
for (int i = 0; i <= np ; i++)
{
Mat1[i]=C[i]+Mr[i]+Ms[i]; //hace la primera division sintetica
Mr[i+1]=(-r)*(Mat1[i]);
Ms[i+2]=(-s)*(Mat1[i]);
}
for (int i = 0; i<= np;i++)
{
Mr[i]=Ms[i]=0; //regresa a 0 Mr y Ms
}
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
for (int i = 0; i < np; i++) //segunda division sintetica
{
Mat2[i]=-Mat1[i]+Mr[i]+Ms[i];
Mr[i+1]=(-r)*(Mat2[i]);
Ms[i+2]=(-s)*(Mat2[i]);
}
dr = (((Mat2[mx-1])*(-Mat1[nx-1]))-((-Mat1[nx])*(Mat2[mx-2])))/(((Mat2[mx-1])*(Mat2[mx-1]))-((Mat2[mx]+Mat1[nx-1])*(Mat2[mx-2]))); //cramer
ds = (((-Mat1[nx])*(Mat2[mx-1]))-((Mat2[mx]+Mat1[nx-1])*(-Mat1[nx-1])))/(((Mat2[mx-1])*(Mat2[mx-1]))-((Mat2[mx]+Mat1[nx-1])*(Mat2[mx-2]))); //cramer
r = r+dr;
s = s+ds;
contadorConver++;
if (contadorConver > k)
{
cout<<"Fallo en la convergencia"<<endl;
break;
}
z++;
}
raiz = (r*r)-(4*s);
if (raiz < 0)
{
raiz = abs(raiz);
raizReal[j]=-r/2;
raizReal[j+1]=-r/2;
raizImaginaria[j]=sqrt(raiz)/2;
raizImaginaria[j+1]=-sqrt(raiz)/2;
}
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
else
{
raizReal[j]=((-r)+(sqrt(raiz)))/2;
raizReal[j+1]=((-r)-(sqrt(raiz)))/2;
raizImaginaria[j]=0;
raizImaginaria[j+1]=0;
}
w++;
newsize=(n-1)-(2*w);
for(int i = 0; i<=newsize ; i++)
{
C[i]=Mat1[i];
}
}
}
cout<<"Raices :"<<endl;
for (int i = 0 ;i < n-1; i ++)
{
if (raizImaginaria[i]==0)
{
cout<<"X"<<i<<" = "<<raizReal[i]<<endl;
}
else
{
cout<<"X"<<i<<" = "<<raizReal[i];
if(raizImaginaria[i]<0)
{
cout<<raizImaginaria[i]<<"i"<<endl;
}
BAUTISTA TORRES CARLOS ALBERTO 09SEP15ANÁLISIS NUMÉRICO TAREA 4
else
{
cout<<"+"<<raizImaginaria[i]<<"i"<<endl;
}
}
}
}
}