Cálculo Vectorial.



Especificación
Escribir un programa que lea una matriz tridimensional y un vector tridimensional, para después mostrar el producto de la matriz por el vector. Este ejercicio se codificará posteriormente emplendo otras estructuras de datos y de control.


Análisis del problema (¿Qué hay que hacer?)
Poco es lo que se debe analizar, al ser la especificaciónuna indicación matemática de los objetivos del programa,que efectúa un cálculo del tipoAx=bdonde A es una matriz y tanto x como b son vectores. En efecto, se indica una matriz y un vector tridimensional; por tanto se precisaráuna simple operación de multiplicación matricial para matrices 3x3.

Diseño del programa (¿Cómo vamos a hacerlo?)
Como es habitual, hay una fase de lectura de datos (la matriz y el vector), otra fase de cálculo y una de impresión de resultados.La única fase no trivial es de cálculo; se trata de recordar que b i = sumatorio en j de a ij x j .

Implementación
Se trata de scribir un programa que lea una matriz tridimensional y un vector tridimensional, para después mostrar el producto de la matriz por el vector. Este ejercicio se codificará posteriormente emplenado otras estructuras de datos y de control. La forma de este problema es Ax = b, donde:


Una posible versión de este programa es la siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
    /* Declaración (pedestre) de la matriz */

    float a11, a12, a13, a21, a22, a23, a31, a32, a33;

    /* Declaración de vectores */

    float x1, x2, x3, b1, b2, b3;

    /* Fase de lectura de datos */
    puts("Multiplicación de matrices por vectores.");
    printf("\nEscriba la primera fila de la matriz: ");
    scanf("%f %f %f", &a11, &a12, &a13);
    
    printf("\nEscriba la segunda fila de la matriz: ");
    scanf("%f %f %f", &a21, &a22, &a23);
    
    printf("\nEscriba la tercera fila de la matriz: ");
    scanf("%f %f %f", &a31, &a32, &a33);
    
    printf("\n\n La matriz A es como sigue:\n\n");
    printf("|%4.2f %4.2f %4.2f|\n", a11, a12, a13);
    printf("|%4.2f %4.2f %4.2f|\n", a21, a22, a33);
    printf("|%4.2f %4.2f %4.2f|\n", a31, a22, a33);
    
    printf("\n\nPor favor, ahora escriba el vector (en fila aunque es columna: ");
    scanf("%f %f %f",&x1, &x2, &x3);
    
    printf("\n\nVector introducido :\n\n");
    printf("|%4.2f|\n",x1);
    printf("|%4.2f|\n",x2);
    printf("|%4.2f|\n",x3);
    
    /* Fase de cálculo */
    b1 = a11*x1 + a12*x2 + a13*x3;
    b2 = a21*x1 + a22*x2 + a23*x3;
    b3 = a31*x1 + a32*x2 + a33*x3;
    
    /* En general, bj = sumatorio en j de aijxj */
    
    /* Fase de impresión de resultados */
    
    printf("\n\nEl producto del vector por la matriz es como sigue:\n\n");
    
    printf("|%4.2f|\n",b1);
    printf("|%4.2f|\n",b2);
    printf("|%4.2f|\n",b3);

    printf("\n\nTerminación normal del programa.\n");
    return 0;
}

Comentarios .- Los cálculos no son excesivamente complejos pero el código resultante es más bien voluminoso. Se aprecia fácilmente la existencia de un gran número de sentencias de impresión en las cuales varían las variables y no las cadenas de descriptores. Esto nos hace apreciar la necesidad de las funciones o subprogramas, que eliminan las repeticiones al permitirnos parametrizar las partes variables y escribir una sola vez las partes constantes.

Comprobación y Depuración Los resultados del programa son correctos cuando se emplean como datos de prueba la matriz 2 I y el vector columna x = (1, 2, 3). Esto no significa que el programa sea correcto; se puede demostrar que un programa es incorrecto mediante un juego de datos de prueba que produczcan resultados incorrectos, pero no es viable utilizar todos los posibles juegos de datos para verificar que, en todos los casos, el resultado es correcto.
/*
        Resultados:
        
Multiplicación de matrices por vectores.

Escriba la primera fila de la matriz: 2 0 0

Escriba la segunda fila de la matriz: 0 2 0

Escriba la tercera fila de la matriz: 0 0 2


 La matriz A es como sigue:

|2.00 0.00 0.00|
|0.00 2.00 2.00|
|0.00 2.00 2.00|


Por favor, ahora escriba el vector (en fila aunque es columna: 1 2 3


Vector introducido :

|1.00|
|2.00|
|3.00|


El producto del vector por la matriz es como sigue:

|2.00|
|4.00|
|6.00|


Terminación normal del programa.
*/
Comentarios .- Este ejemplo produce resultados correctos. ¿Basta esto para garantizar que siempre lo serán (para todo vector x)? Ejercicio algo más difícil: introducir deliberadamente un error de programa que produzca resultados correctos para un determinado valor del vector x. Ejercicio más abstracto: razonar por qué bastaría estudiar la corrección del producto para vectores de la base de x para demostrar la corrección (o incorrección) del programa.

Documentación
Este programa admite una matriz tridimensional por filas y un vectortridimensional; produce el producto de la matriz por el vector. No se admitecorrección de errores tipográficos. Se muestra en pantallalos datos introducidos y los resultados obtenidos. El programa se ejecutauna sola vez (código secuencial) y emite un mensaje al finalizar.