Está en la página 1de 2

Archivo: /home/daniel/Escritorio/programas/Bai.

c Pgina 1 de 2

1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4
5 // se definio un numero maximo de arreglos//
6 #define Term_max 21
7 int Error;
8 double a[Term_max],b[Term_max],c[Term_max],d[Term_max];
9
10 //se programo el metodo de Bairstow
11 int Bairstow (int n)
12 {
13 double r,s,dn,dr,ds,drn,dsn,tol;
14 int i,inter;
15 r = s = 0;
16 dr = 1.0;
17 ds = 0;
18 tol= 1e-14;
19 inter = 1;
20
21 while ((fabs(dr)+fabs(ds)) > tol) {
22 if ((inter % 200) == 0) {
23 r=(double)rand()/16000.;
24 }
25 if ((inter % 500) == 0) {
26 tol*=10.0;
27 Error=1;
28 printf("Perdida de presicion\n");
29 }
30 b[1] = a[1] - r;
31 c[1] = b[1] - r;
32
33 for (i=2;i<=n;i++){
34 b[i] = a[i] - r * b[i-1] - s * b
[i-2];
35 c[i] = b[i] - r * c[i-1] - s * c
[i-2];
36 }
37 dn=c[n-1] * c[n-3] - c[n-2] * c[n-2];
38 drn=b[n] * c[n-3] - b[n-1] * c[n-2];
39 dsn=b[n-1] * c[n-1] - b[n] * c[n-2];
40
41 if (fabs(dn) < 1e-16) {
42 dn = 1;
43 drn = 1;
44 dsn = 1;
45 }
46 dr = drn / dn;
47 ds = dsn / dn;
48
49 r += dr;
50 s += ds;
51 inter++;
52 }
53 for (i=0;i<n-1;i++)
54 a[i] = b[i];
55 a[n] = s;
56 a[n-1]= r;
57 }
58
59 // Se hace una funcion que calcule las raices de la formula cuadratica, hay un
error que no logre detecatar para me salierna las raices, compare con el
Archivo: /home/daniel/Escritorio/programas/Bai.c Pgina 2 de 2

ejercicio del libro y si le saco las raices con una calculadora los resultados
son correctos//
60 double formula_general(double b, double c){
61
62 double d,t1,t2,im;
63 t1=0;
64 t2=0;
65 d=(b*b)-(4*c);
66 if(d>0){
67 t1=(-b+sqrt(d))/2;
68 t2=(-b-sqrt(d))/2;
69 printf("t1= %lf y t2= %lf\n",t1,t2);}
70 else
71 t1=(-b/2);
72 im= sqrt(fabs(d))/2;
73 printf("t1=%lf + %lf i y t2= %lf - %lf i\n",t1,im,t1,im);
74
75 }
76
77 //funcion principal
78
79 int main()
80 {
81 int i,n,orden=0;
82 double ter;
83
84 while ((orden < 2) || (orden > Term_max-1)) {
85 printf("Escriba el orden del polinomio minimo de
grado 2 maximo de grado 20\n");
86 scanf("%d",&orden);
87 }
88 printf("Entrodusca los coeficientes de izquierda a derecha, es
decir, el coefiente del exponente mayor al menor.\n");
89 for (i=0;i<=orden;i++){
90 printf("a(%d)=",i);
91 scanf("%lf",&a[i]);
92 if (i==0) {
93 ter=a[i];
94 a[i]=1.0;
95 }
96 else a[i]/=ter;
97 d[i]=a[i];
98 }
99 b[0]=c[0]=1.0;
100 n=orden;
101 Error=0;
102 while (n > 2) {
103 Bairstow(n);
104 n-=2;
105 }
106 printf("La ecuacion cuadratica:\n");
107
108 for (i=orden;i>=2;i-=2)
109
110 printf("t^2 %+.15lg t %+.15lg =0 \n",a[i-1],a
[i]);
111 printf("Las raices son\n");
112
113 if ((n % 2) == 1)
114 printf("termino lineal \n t %+.15lg =0 \n",a[1]);
115
116 }

También podría gustarte