Ejercicio obligatorio 2

Fecha de entrega: Lunes 10 de abril

Introducción

Cuando estaba cursando el CBC alguien me dijo que Álgebra era una materia puesta sólo para filtrar gente y que después no se usaba.

Trabajo

Nota

El 100% de los problemas puede y debe ser resuelto sin la creación de matrices auxiliares dentro de las funciones.

Recordar que en el curso no está permitida la declaración de vectores de longitud variable (VLA) v[n] siendo n una variable definida en tiempo de ejecución.

Identidad

Implementar una función void identidad(size_t n, double a[n][n]); que inicialice la matriz A como la identidad de \(\mathbb R^{n\times n}\).

Vector a matriz

Implementar una función void vector_a_matriz(size_t n, double a[n][n], const double v[n]); que inicialice la matriz A con los elementos de v como su diagonal principal. Es decir, si se tiene \(v = (v_0, v_1, \cdots v_{n-1})^T\) la matriz resultante será

\(A = \begin{bmatrix}v_0 & 0 & \cdots & 0 \\ 0 & v_1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & v_{n-1}\end{bmatrix}\).

Producto por escalar

Implementar una función void producto_por_escalar(size_t n, size_t m, double a[n][m], double c); que multiplique cada elemento de la matriz A de \(\mathbb R^{n\times m}\) por c; \(A' = c \cdot A\).

Suma de matrices

Implementar una función void sumar(size_t n, size_t m, double a[n][m], double b[n][m]); que le sume a A cada uno de los elementos de B; \(A' = A + B\).

Matriz con columna

Para un sistema de ecuaciones \(A x = b\), donde \(A\) es una matriz y \(x, b\) vectores, se define como \(A_j\) a la matriz donde se reemplaza la columna j-ésima de la matriz \(A\) por el vector \(b\).

Implementar una función void matriz_con_columna(size_t n, size_t m, double aj[n][m], double a[n][m], double b[n], size_t j); que genere la matriz \(A_j\) en base a los parámetros a, b e j.

Matriz achicada

Implementar una función void matriz_achicada(size_t n, size_t m, double r[n-1][m-1], double a[n][m], size_t i, size_t j); que genere una matriz como \(A\) pero sin la fila i y la columna j y la guarde en \(R\).

Multiplicación de matrices

Implementar una función void multiplicar(size_t n, size_t m, size_t p, double r[n][m], double a[n][p], double b[p][m]); que resuelva \(R = A \times B\).

Pruebas

Se provee el siguiente código:

#define N 3
#define DT 0.001

int main(void) {
    double k[N][N] = {{21, -11, 0},
        {-11, 23, -12},
        {0, -12, 12}};

    double ms[N] = {0.5, 0.25, 2};

    double uno[N][N];
    identidad(N, uno);

    double m[N][N];
    vector_a_matriz(N, m, ms);

    double aux[N][N];
    multiplicar(N, N, N, aux, m, k);

    producto_por_escalar(N, N, aux, DT*DT);
    sumar(N, N, aux, uno);

    double aj[N][N];
    matriz_con_columna(N, N, aj, k, ms, 1);

    double c[N-1][N-1];
    matriz_achicada(N, N, c, k, 1, 1);

    return 0;
}

Este código realiza un par de operaciones no sistemáticas sobre las funciones, notar que, principalmente, la dimensión es siempre N. Se proveen estas operaciones para explicitar la dinámica de las funciones a implementar, pero no son suficientes para testear la aplicación.

Después de realizar estas operaciones, las matrices resultantes son:

double aux[][] = {{1.0000105, -5.5e-6, 0},
    {-2.75e-6, 1.00000575, -3e-6},
    {0, -2.4e-5, 1.000024}};

double aj[][] = {{21, 0.5,  0},
    {-11, 0.25, -12},
    {0, 2, 12}};

double c[][] = {{21, 0},
    {0, 12}};

Entrega

Deberá entregarse el código fuente del programa desarrollado.

El programa debe compilar correctamente con los flags:

-Wall -Werror -std=c99 -pedantic

y validar los ejemplos dados.

La entrega se realiza a través del sistema de entregas.

El ejercicio es de entrega individual.