---
title: 'Matrius-guia19-v0.2: Matriu inversa'
author: "f.u., a.g."
date: "Març 30 2021"
output:
  pdf_document: default
  html_document: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
knitr::opts_chunk$set(comment = "")
```

## Definició i notacions

Calcular la inversa d'una matriu quadrada en R és ben fàcil, fem servir la funció **solve()**. Més endavant entendreu perquè calcular la inversa és el mateix que "resoldre".

```{r}
A <- matrix(c(2, 0, 3, 4, 7, 5,  5, 4, 9), ncol = 3)
A
solve(A)
```

R fa sempre els càlculs amb la versió decimal (se'n diu de coma flotant, vegeu el final de l'anterior guia) dels nombres implicats. Entre altres coses, això té l'aventatge de ser molt més eficient. I no importa massa la dimensió de la matriu.

```{r}
A <- matrix(sample(-24:24), nrow = 7) # són els nombres des de -24 fins a 24 reordenats aleatoriament
iA <- solve(A)
round(iA,4)
A %*% iA
```

Com veieu, aixó té l'inconvenient que de vegades no s'entén a la primera el què hem obtingut, aquesta matriu identitat no ho sembla gaire degut als petitissims errors que s'acumulen en els càlculs amb decimals.

Podem demanar el resultat arrodonit i ho veiem clar:

```{r}
round(A %*% iA,4)
```

### Resoldre un sistema d'equacions lineals és multiplicar per la inversa.

Com que un sistema d'equacions lineals es pot escriure matricialment com a ${\mathbf A}{\mathbf X}={\mathbf b}$, la solució serà ${\mathbf X}={\mathbf A}^{-1}{\mathbf b}$. Per tant, per resoldre el sistema 
$$\begin{array}{lcc} x+2y-z&=&-5\\2x-y+z&=&6\\x-y-3z&=&-3 \end{array}$$ farem:

```{r}
A <- matrix(c(1,2,1,2,-1,-1,-1,1,-3), nrow = 3)
A
b <- c(-5, 6, -3)
solve(A,b)
```

Observa que la funció **solve()** que hem fet servir per calcular la inversa, si li donem un segon argument, ens torna el producte de la inversa per aquest segon argument.

```{r}
solve(A) %*% b- solve(A,b)  # pràcticament zero, és el mateix
```

### Matrius ortogonals

La matriu de l'exemple de la guia:

```{r}
P<- matrix(c(1,-1,1,1),nrow = 2) / sqrt(2)
P
solve(P) # la inversa és la transposada
P %*% t(P)
t(P) %*% P
```

Per ortogonalitzar una matriu, R fa servir un mètode anomenat de Gram-Schmidt, disponible al paquet **pracma**. No hi entrem en aquest curs, però el podeu trobar força ben explicat a (https://ca.wikipedia.org/wiki/Proc%C3%A9s_d%27ortogonalitzaci%C3%B3_de_Gram-Schmidt).

L'apliquem a un exemple.

```{r}
library(pracma) # potser us cal fer install.packages("pracma") si no el teniu instal·lat

A <- matrix(sample(-12:12), nrow = 5) # són els nombres des de -12 fins a 12 reordenats aleatoriament
A
nA <- gramSchmidt(A)$Q
nA
round(nA %*% t(nA), 4)
```

## Els models input-output de Leontieff

Farem servir exemples del llibre Matemáticas aplicadas a la Administración y a la Economía de J.C. Arya i L.W. Lardner, Pearson, México 2009.


