Sei sulla pagina 1di 3

Ejercicio 2.

cpp
1 #include <iostream> //Salida por pantalla
2 const int N = 4; //Constante global entera N
3 bool tridiagonal(double A[][N]); //Cabecera de la funcin tridiagonal
4 int main() {
5
//Se comprueba si N es mayor que 2
6
if (N <= 2) {
7
std::cout<< "N no es mayor que 2. Aqu termina la ejecucin del
programa"
8
<< std::endl;
9
return -1;
10
}
11
//Declaracin de la matriz A y los vectores z e y
12
double A[N][N], y[N], z[N];
13
//Inicializacin de los vectores A y z
14
std::cout << "Introduzca los valores de A." << std::endl;
15
for (int i = 0; i < N; i++) {
16
for (int j = 0; j < N; j++) {
17
std::cout << "A(" << i << "," << j << "): ";
18
std::cin >> A[i][j];
19
if (std::cin.fail() && !std::cin.eof()) {
20
std::cout
21
<< "El elemento introducido en la matriz A no es
vlido. Fin del programa."
22
<< std::endl;
23
return -1;
24
}
25
}
26
}
27
//Se comprueba si A es tridiagonal
28
if (!tridiagonal(A)) {
29
std::cout
30
<< "La matriz no es tridiagonal. Aqu finaliza la
ejecucin del programa"
31
<< std::endl;
32
return -1;
33
}
34
std::cout << "Introduzca los valores de z." << std::endl;
35
for (int i = 0; i < N; i++) {
36
std::cout << "z(" << i << "): ";
37
std::cin >> z[i];
38
if (std::cin.fail() && !std::cin.eof()) {
39
std::cout
40
<< "El elemento introducido en el vector z no es
vlido. Fin del programa."
41
<< std::endl;
42
return -1;
43
}
44
}
45
//Desarrollo del algoritmo
46
if (A[0][0] == 0) { //Se comprueba si A(0,0)=w vale 0
47
std::cout
48
<< "Error: divisin por cero. Aqu finaliza la ejecucin
del programa"
Page 1

Ejercicio 2.cpp
49
50
51
52
53
54
55
56
57
58

<< std::endl;
return -1;

}
double w = A[0][0]; //Se inicializa w!=0
y[0] = z[0] / w;
double v[N], a, b, c;
for (int i = 1; i < N; i++) { //Comienza el primer bucle del algoritmo
a = A[i][i]; //Para facilitar la escritura del cdigo
b = A[i][i - 1];
c = A[i - 1][i]; //Directamente la c que se va a usar para calcular
v(i), esto es, c(i-1)
59
v[i] = c / w;
60
w = a - b * v[i];
61
if (w == 0) { //Si w llegase a ponerse a 0 se termina el programa
62
std::cout
63
<< "Error: divisin por cero.A no es invertible. Aqu
finaliza la ejecucin del programa"
64
<< std::endl;
65
return -1;
66
}
67
y[i] = (z[i] - b * y[i - 1]) / w;
68
}
69
for (int j = N - 2; j >= 0; j--) //Segundo bucle del algoritmo
70
y[j] -= v[j + 1] * y[j + 1];
71 // Se calcula la diferencia Ay-z y se muestran las componentes del vector
y y del vector diferencia d=A*y-z
72
std::cout << "Componentes del vector y y del vector diferencia d=Ay-z:"
73
<< std::endl;
74
double diferencia[N], producto; //Vector diferencia y variable
producto que ir almacenando el producto A*y
75
for (int k = 0; k < N; k++) {
76
producto = 0; //Se pone a 0 cada vez que empieza una fila nueva
77
for (int j = 0; j < N; j++) {
78
producto += A[k][j] * y[j]; //Desarrollo del producto de la
matriz A por el vector y
79
}
80
diferencia[k] = producto - z[k]; //Componente k del vector
diferencia
81
std::cout << "y(" << k << ")= " << y[k] << "\td(" << k << ")= "
82
<< diferencia[k] << std::endl;
83
}
84
return 0;
85 }
86 bool tridiagonal(double A[][N]) {
87
for (int i = 0; i < N; i++) {
88
for (int j = 0; j < N; j++) {
89
if (i == j - 1 || i == j || i == j + 1) //Se evaluan los
valores fuera de la tridiagonal
90
continue;
91
else if (A[i][j] != 0) //Si el elemento es distinto de 0, la
matriz no es tridiagonal
92
return false;
93
}
Page 2

Ejercicio 2.cpp
94
95

}
return true;/*Si sale del bucle, la matriz es tridiagonal, luego se
devuelve true*/
96 }
97

Page 3