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.