{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "#### TD L3 Algèbre et géométrie - Feuille 2 ex. 3 avec Sagemath\n",
    "\n",
    "*F-X. Dehon - 3 oct. 2020 - dehon[@]unice.fr*\n",
    "\n",
    "Enoncé :<br>\n",
    "\n",
    "<img src=\"f2ex3.svg\" width=\"500\" style=\"object-position:left top;border:2px solid black\"> \n",
    "\n",
    "\n",
    "<!--\n",
    "![f2ex3.svg](f2ex3.svg)\n",
    "-->\n",
    "\n",
    "<br>\n",
    "Les éléments de $E=\\mathbb{R}_2[X]$ dans l'énoncé sont ici déclarés comme des fonctions de la variable x sans précision sur son type.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "a=1/sqrt(2);\n",
    "print a.parent(),\",\",a.category()\n",
    "print a,AA(a),RR(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "Plusieurs façons de déclarer une fonction, pas strictement équivalentes :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "a=1/sqrt(2)\n",
    "P0(x)=x+a\n",
    "Q0=lambda x:x+a\n",
    "def R0(x):return(x+a)\n",
    "print P0,\",\",Q0,\",\",R0\n",
    "print P0==Q0,bool(P0(x)==Q0(x))\n",
    "print P0==R0,bool(P0(x)==R0(x))\n",
    "\n",
    "print P0.derivative()\n",
    "try:print Q0.derivative()\n",
    "except Exception as e: print \"Q0.derivative() :\",e\n",
    "print Q0(x).derivative(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "##### Définition de la forme $\\langle-,-\\rangle$ nommée $B$ ci-dessous, de l'application $u$, coordonnées et matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def B(P,Q):return(integrate(P(x)*Q(x),x,-1,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "print B(lambda x:x, lambda x:x^3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "A=matrix(3,3,lambda i,j:B(lambda x:x^i,lambda x:x^j));pretty_print(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "var('a b c')\n",
    "X=matrix([a,b,c]).transpose();pretty_print(X)\n",
    "print (X.transpose()*A*X)[0,0].expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "P(x)=a+b*x+c*x^2\n",
    "print B(P,P).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def u(P):return((1-x^2)*(P.derivative(x))+(2*x+1)*P(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "print u(P)(x).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "print B(u(P),u(P)).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def coef(P):return([P(0),P.derivative(x)(0),P.derivative(x,2)(0)/2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "print coef(P)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "P1(x)=1;P2(x)=x;P3(x)=x^2\n",
    "Base=[P1,P2,P3]\n",
    "Mu=matrix([coef(u(e)) for e in Base]).transpose();pretty_print(Mu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "print (X.transpose()*Mu.transpose()*A*Mu*X)[0,0].expand()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "##### Orthonormalisation de Gram-Schmidt de $(P1,P2,P3)$, coordonnées dans la nouvelle base"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def N(P):return(P/sqrt(B(P,P)))\n",
    "def proj(P,base):return(sum(B(P,L)*L for L in base))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "L1=N(P1);print L1(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "L2p=P2-proj(P2,[L1])\n",
    "L2=N(P2);print L2(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "L3p=P3-proj(P3,[L1,L2])\n",
    "L3=N(L3p);print L3(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def coefL(P):return([B(P,L) for L in [L1,L2,L3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "MLu=matrix([coefL(u(L)) for L in [L1,L2,L3]]).transpose()\n",
    "pretty_print(MLu)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "baseL=[L1,L2,L3]\n",
    "pretty_print(matrix(3,3,lambda i,j:B(baseL[i],baseL[j])))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "P=a*L1+b*L2+c*L3\n",
    "print B(u(P),u(P)).expand()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "X=matrix([a,b,c]).transpose()\n",
    "print (X.transpose()*MLu.transpose()*MLu*X)[0,0].expand()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "##### Autre définition de $E$ dans Sagemath"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
   ],
   "source": [
    "print sqrt(2).parent()\n",
    "print SR,\",\",AA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "S.<X>=SR[] #AA[]\n",
    "print 1.parent(),\",\",S(1).parent()\n",
    "print 1==S(1)\n",
    "try:print 1.derivative()\n",
    "except Exception as e:print(e)\n",
    "print S(1).derivative()\n",
    "P=1+X+X^2;print integrate(P(x),x,-1,1)\n",
    "print B(P,P)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "def u(P):return((1-X^2)*(P.derivative())+(2*X+1)*P)\n",
    "print u(X^2)\n",
    "v(P)=(1-X^2)*(P.derivative())+(2*X+1)*P\n",
    "print v(X^2),\"bizarre !!\"\n",
    "w(P)=derivative(P);print w(X^3);print derivative(X^3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "##### Scholies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
   ],
   "source": [
    "reset('P Q R')\n",
    "try:print P.parent()\n",
    "except Exception as e: print(e)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "SageMath (system-wide)",
   "language": "sagemath",
   "metadata": {
    "cocalc": {
     "description": "Open-source mathematical software system",
     "priority": -1,
     "url": "https://www.sagemath.org/"
    }
   },
   "name": "sagemath"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}