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.