{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "060b109a",
   "metadata": {},
   "source": [
    "# 7 septembre 2023 : les matrices et le calcul matriciel\n",
    "\n",
    "Dans cette séance, nous allons prendre en main `numpy` pour créer quelques matrices et manipuler des vecteurs (on les appelle aussi des `numpy.array`). Ensuite, nous effectuerons plusieurs opérations matricielles (dont certaines interdites) pour mettre en pratique la théorie vue dans les slides.\n",
    "\n",
    "Dans un premier temps, on charge les modules nécessaires. On n'aura besoin que de `numpy`, cette fois. La version la plus récente fera l'affaire."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6695aad5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a08d519",
   "metadata": {},
   "source": [
    "#### Exercice 1 : caractériser des matrices\n",
    "Observez les matrices suivantes et déterminez le type de matrice dont il s'agit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f577b81a",
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.array([[1,2,1],\n",
    "              [1,2,3],\n",
    "              [2,4,3]])\n",
    "B = np.array([[1,2,2],\n",
    "              [0,1,1],\n",
    "              [0,0,4]])\n",
    "C = np.eye(4)\n",
    "D = np.ones([1,5])\n",
    "E = np.tile([1,2,3],[5,1])\n",
    "F = np.zeros(4,1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "c07fe965",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 1]\n",
      " [1 2 3]\n",
      " [2 4 3]]\n"
     ]
    }
   ],
   "source": [
    "# Une this box to print the matrices\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e01b9fa",
   "metadata": {},
   "source": [
    "#### Exercice 2 : quelques opérations matricielles simples\n",
    "[Tirées de : G. Strang, Introduction à l’algèbre linéaire, Presses polytechniques de Montréal, 2015]\n",
    "\n",
    "On considère les matrices A, B et C suivantes : \n",
    "$$\n",
    "    A = \\begin{bmatrix}\n",
    "        1 & 5  \\\\\n",
    "        2 & 3\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    B = \\begin{bmatrix}\n",
    "        0 & 2 \\\\\n",
    "        0 & 1\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    C = \\begin{bmatrix}\n",
    "        3 & 1 \\\\\n",
    "        0 & 0\n",
    "    \\end{bmatrix}.\n",
    "$$\n",
    "\n",
    "Encodez ces matrices comme des `numpy.array`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d1ee31e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Insert here your code\n",
    "# A = ...\n",
    "# B = ...\n",
    "# C = ..."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fab8016c",
   "metadata": {},
   "source": [
    "Effectuez les opérations matricielles suivantes (à la main) puis vérifier avec python.\n",
    "  1. $A+B$\n",
    "  2. $A+B+C$\n",
    "  3. $AB$. Comparez avec $BA$.\n",
    "  4. $AC$\n",
    "  5. $AB+AC$. Comparez avec $A(B+C)$. Que constatez-vous ?\n",
    "  6. Multipliez $A$ avec $BC$. Comparez avec la multiplication de $AB$ avec $C$.\n",
    "\n",
    "Attention, multiplier des matrices selon les règles du calcul matriciel ne se fait pas si facilement que ça, avec python. Une petite recherche Google sera peut-être nécessaire..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75aa4f6f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Verify here your values"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc51ff32",
   "metadata": {},
   "source": [
    "Considerez quatre matrices supplémentaires\n",
    "$$\n",
    "    D = \\begin{bmatrix}\n",
    "        0 & 0  \\\\\n",
    "        1 & 0\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    E = \\begin{bmatrix}\n",
    "        1 & 0  \\\\\n",
    "        0 & 1\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    F = \\begin{bmatrix}\n",
    "        0 & 0 \\\\\n",
    "        0 & 1\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    G = \\begin{bmatrix}\n",
    "        0 & 0 \\\\\n",
    "        1 & 1\n",
    "    \\end{bmatrix}.\n",
    "$$\n",
    "\n",
    "7. Calculez $DF$ et $FD$. Que constatez-vous ?\n",
    "8. Calculez $DG$ et comparez avec $DF$.\n",
    "9. Effectuez les opérations $AE$, $EA$, $BE$, $EB$, $CE$ et $EC$. Que constatez-vous en comparant avec, respectivement, $A$, $B$ et $C$?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "0c41ce06",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Insert code here"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93bc0498",
   "metadata": {},
   "source": [
    "On considère maintenant les matrices suivantes :\n",
    "$$\n",
    "    A = \\begin{bmatrix}\n",
    "        2 & -1 & 1 \\\\\n",
    "        1 & 0 & 2\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    B = \\begin{bmatrix}\n",
    "        2 & 0 & 1 & 0 \\\\\n",
    "        1 & 1 & 2 & 2 \\\\\n",
    "        1 & 2 & 1 & 0\n",
    "    \\end{bmatrix}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "3d5ee3f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Encode here matrices A and B"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32aea8cd",
   "metadata": {},
   "source": [
    "Calculez le produit $AB$ puis le produit $BA$ en prédisant la taille de la matrice obtenue. Que constatez-vous ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "ea25301a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Insert your code here to verify the calculus"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd9fdd13",
   "metadata": {},
   "source": [
    "#### Exercice 3 : transposées et inverses\n",
    "Toujours en réalisant l'exercice à la main d'abord, et sur Python ensuite, déterminer la transposée et l'inverse des matrices suivantes :\n",
    "$$\n",
    "    A = \\begin{bmatrix}\n",
    "        1 & 2  \\\\\n",
    "        0 & 4\n",
    "    \\end{bmatrix},\n",
    "    \\qquad\n",
    "    B = \\begin{bmatrix}\n",
    "        1 & 0 & 0  \\\\\n",
    "        0 & 2 & 0 \\\\\n",
    "        0 & 0 & 4\n",
    "    \\end{bmatrix}.\n",
    "$$\n",
    "Vérifiez ensuite que l'inverse est correct en le multipliant avec la matrice de base.\n",
    "\n",
    "Le méthodes de numpy sont `numpy.transpose` et `numpy.linalg.inv`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "27e21d7f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Insert code here to verify the calculus."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "vscode": {
   "interpreter": {
    "hash": "4a2701644a567983fe4c710d2a706eee629c52060847d7c704aa57db76d57a44"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
