Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News Sign UpSign In
| Download
Project: Mat453
Views: 965
%auto typeset_mode(True)

Tutoriel SAGE

(Éte 2017)

Une introduction éclair.

Si vous lisez ceci c'est parce que vous avez ouvert une session du notebook de SAGE, ou encore que vous l'exécutez dans un des serveurs dédiés. Comme bien de logiciels, SAGE peut aussi être utilisé via le terminal, mais laissons de côté cette approche pour l'instant. Vous verrez plusieurs "cellules" où on doit entrer le code SAGE.

On peut entrer du texte en utilisant markdown, LaTeX\LaTeX, ou html ce qui est très bien si on veut écrire des équations.

  • Sur CoCalc, ave un fichier '.sagews' il suffit de commencer le texte par %md. Les commandes LaTeX\LaTeX incluses seront comprises.

  • La même chose s'applique sur un notebook JuPyteR.

Faites un double click sur ce texte, on trouvera la source et on pourra l'éditer. Corrigez ceci : 12+13=1+12+3=25\frac{1}{2} + \frac{1}{3} = \frac{1+1}{2+3} = \frac{2}{5}.

Bien entendu, le résultat est 56\frac{5}{6}. SAGE sait faire ceci, et bien d'autre choses. Pour exécuter les commandes / calculs d'une cellule, il faut faire Shift + Entrée. Faites-le après la cellule ci-bas, une fois directement, puis une autre après avoir coché la case

1/2+1/3
56\displaystyle \frac{5}{6}

Si on veut une valeur approximation décimale on doit faire:

5/6.n()
0.833333333333333\displaystyle 0.833333333333333

ou encore

5.0/6
0.833333333333333\displaystyle 0.833333333333333

Vous le devinez, SAGE sait reconnaître le type d'objets... pour les rationnels, il opère de façon exacte, on doit court-circuiter un peu ceci pour avoir une valeur décimale.

pi+1
π+1\displaystyle \pi + 1
4.14159265358979\displaystyle 4.14159265358979
pi+1.0
π+1.00000000000000\displaystyle \pi + 1.00000000000000
numerical_approx(pi+1,digits=50)
4.1415926535897932384626433832795028841971693993751\displaystyle 4.1415926535897932384626433832795028841971693993751

Deux astuces importantes quand on cherche à faire un calcul avec SAGE:

  • Tab si vous commencez à écrire une commande, puis appuyez sur la touche TAB, les commandes commençant comme celle que vous avez commencé à entrer s'afficheront. Vous pouvez alors en choisir une, puis

  • ? le point d'interrogation après une commande, suivi de Shift + Entrée ramène à la documentation de la commande en question, ce qui comporte des exemples.

Faites Tab dans la cellule ci-bas.

numerical_
Error in lines 1-1 Traceback (most recent call last): File "/projects/5f7308b9-2961-476d-840c-ab53b74c25d8/.sagemathcloud/sage_server.py", line 879, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> NameError: name 'numerical_' is not defined

Variables et quelques calculs symboliques

Faisons quelques calculs symboliques. Il faut déclarer les indéterminées, toutes sauf xx.

var('t,s') f(s,t)=s*cos(s*t)
(t\displaystyle t, s\displaystyle s)
diff(f(s,t),t)
s2sin(st)\displaystyle -s^{2} \sin\left(s t\right)
diff(f(s,t),s,2)
st2cos(st)2tsin(st)\displaystyle -s t^{2} \cos\left(s t\right) - 2 \, t \sin\left(s t\right)
integrate(f(s,t),s)
stsin(st)+cos(st)t2\displaystyle \frac{s t \sin\left(s t\right) + \cos\left(s t\right)}{t^{2}}
f(1,pi/4)
122\displaystyle \frac{1}{2} \, \sqrt{2}
integrate(1/t,t,1,2)
log(2)\displaystyle \log\left(2\right)
factor(x^2+2*x+1)
(x+1)2\displaystyle {\left(x + 1\right)}^{2}
%md Pour résoudre des équations, on entre la liste des équations (avec deux signes d'égalité), puis la liste des variables:

Pour résoudre des équations, on entre la liste des équations (avec deux signes d'égalité), puis la liste des variables:

solve([2*x+1==0],[x])
[x=(12)\displaystyle x = \left(-\frac{1}{2}\right)]
var('s,t') solve([s+t==3,s-t==1],[s,t])
(s\displaystyle s, t\displaystyle t)
[[s=2\displaystyle s = 2, t=1\displaystyle t = 1]]

Bien entendu on a intérêt à faire solve? puis Entrée.

Listes et repétition

Faire des listes ou des ensembles est très facile, la syntaxe est presque celle qu'on utilise en maths: {n20n10}\{n^2| 0\leq n \leq 10\} s'obtient au moyen de:

Liste = [n^2 for n in range(11)]
Liste
[0\displaystyle 0, 1\displaystyle 1, 4\displaystyle 4, 9\displaystyle 9, 16\displaystyle 16, 25\displaystyle 25, 36\displaystyle 36, 49\displaystyle 49, 64\displaystyle 64, 81\displaystyle 81, 100\displaystyle 100]

Le 00-ème élément de la liste est le premier... euh... un exemple!

Liste[3]
9\displaystyle 9
Liste[2:7]
[4\displaystyle 4, 9\displaystyle 9, 16\displaystyle 16, 25\displaystyle 25, 36\displaystyle 36]
sum(Liste)
385\displaystyle 385

Quelques graphiques

Quelques graphiques maintenant. En 2d, pour commencer.

C1=plot(sin(x),(x,-3* pi,3*pi),color='red', thickness=2)
show(C1,figsize=[4,2])
show(C1,aspect_ratio=1)

On peut créer les objets graphiques séparément, puis les montrer ensemble. Plus haut nous avons crée le graphique de la fonction xsinxx\mapsto \sin{x} pour x[3π,3π]x\in [-3\pi, 3\pi], en rouge. Traçons maintant la courbe de la fonction x12cos2xx\mapsto \frac{1}{2} \cos{2x} pour x[π,3π]x\in [- \pi, 3\pi], en bleu et pointillés.

C2=plot(0.5*cos(2*x),x,-pi,3*pi, color='blue',thickness=3,linestyle='dotted')
show(C1+C2,figsize=[3,3])

Disons que je veux calculer une approximation d'une intégrale, naïvement. Pensons à f(x)=xln2xf(x)= - x \ln{2 x} entre 00 et 22. On va commencer par définir la fonction, puis faire une somme de Riemann avec les points milieux.

  • nn va être le nonbre de divisions, le pas ici est donc Δx=2n\Delta x = \frac{2}{n}

  • Pour chaque ii entre 11 et nn, on construira xi=0+iΔx=2inx_i = 0+ i \Delta x = \frac{2i}{n}

  • Le point mileu de chaque intervale se construit facilement, c'est (xi+xi+1)/2(x_i + x_{i+1})/2

  • On doit après évaluer ff en ces points, multiplier par Δx\Delta x puis additionner.

On fera les choses avec des listes, mais bien sur, ça se fait avec des boucles.

var('a,b,n') # Déclaration de paramètres / variables / indéterminées a=0 b=2 n=100 dx=(b-a)/n f(x)=-x*log(2*x) PtsX=[2*j/n for j in range(n+1)]
(a\displaystyle a, b\displaystyle b, n\displaystyle n)

On crée la liste des points milieux.

Mil=[(b-a)/(2*n)+j*dx for j in range(n)]

On évalue ff en chacun de ces points.

F=[f(Mil[j])*dx for j in range(n)]

On calcule la somme, en mettant .n() à la fin, pour forcer un résultat en notation décimale.

sum(F).n()
1.77247377091234\displaystyle -1.77247377091234

Mais bien entendu SAGE peut faire le calcul exact de cette intégrale (et plusieurs autres).

reponse = integrate(-x*log(2*x),x,a,b) reponse reponse.n()
4log(2)+1\displaystyle -4 \, \log\left(2\right) + 1
1.77258872223978\displaystyle -1.77258872223978

COURBES ORTHOGONALES

Un autre exemple : dessiner les courbes orthogonales aux courbes y=csinxy=c\sin{x}. Pour chaque valeur de cRc\in \mathbb{R} on considère la courbe Sc\mathcal{S}_c d'équation y=csinxy=c\sin{x}.

Ci bas on a dessiné les courbes corerspondant aux valeurs de cc qui varient entre -4 et 4 par pas de .5 (la dernière valeur est exclue, il s'agit d'une liste) elles sont en bleu dans la figure plus bas.

var('c,x,y') F1=[plot(c*sin(x),(x,-2*pi,2*pi),color='blue', aspect_ratio=1) for c in sxrange(-4,4.5,.5)]# En réalité un crée un e liste de courbes, qu'on superpose. show(sum(F1),figsize=5)
(c\displaystyle c, x\displaystyle x, y\displaystyle y)

On cherche une famille de coubes (rouges) qui coupent chacune des courbes bleues, et en chaque point d'intersection les tangentes aux courbes bleues sont orthogonales aux tangentes aux courbes rouges (voir le résultat plus bas).

De l'équation y=csinxy=c\sin{x} on tire directement y=ccosxy'=c\cos{x}, de sorte qu'en chaque point (x,y)(x,y) d'une courbe bleue ScS_c, la pente de la tangente est précisément ccosxc\cos{x}. La pente d'une droite orthogonale est le négatif de l'inverse, c'est à dire 1ccosx-\frac{1}{c\cos{x}}. On cherche donc y=1ccosxy'=-\frac{1}{c\cos{x}}. De l'équation originale on peut éliminer c=ysinxc=\frac{y}{\sin{x}}, de sorte que, en remplaçant on trouve l'équation différentielle y=tanxyy'=-\frac{\tan{x}}{y}

Ceci peut se résoudre sans trop de peine, car c'est une équation à variables séparables, au pire une table d'intégrales donne l'intégrale de tanx\tan{x}. Mais essayons plutôt de le faire avec SAGE.

y=function('y')(x) eq = diff(y,x)==-tan(x)/y desolve(eq,y,show_method=True)
[12y(x)2=C+log(sec(x))\displaystyle -\frac{1}{2} \, y\left(x\right)^{2} = C + \log\left(\sec\left(x\right)\right), separable]

Quelques remarques:

  • L'option show_method = True demande à SAGE de nous dire comment il a fait pour résoudre l'équation différentielle. Comme nous, il s'est rendu compte qu'il s'agissait d'une équation aux variables séparables.

  • Dans la solution présentée par SAGE il y a une constante d'intégration cc, nous obtenons donc pour chaque valeur de cc une nouvelle courbe. Ce n'est pas le même cc que nous avions déjà.

  • Le terme lnsecx\ln{\sec{x}} vient d'intégrer tanx\tan{x}. Or en réalité tanxdx=lnsecx+k\displaystyle \int \tan{x} dx = \ln{|\sec{x}|} +k, il manque la valeur absolue, et le kk que nous avons ici est la constante ci-haut.

  • Les courbes de la famille orthogonale sont des courbes données implicitement (c'est ce qu'on obtient quand on résoud l'équation différentielle). On peut les tracer comme telles, il s'agit des courbes y2+2lnsecx=Kyy^2+2\cdot \ln{|\sec{x}|} = Ky

Trouvez comment ceci est fait avec la commande implicit_plot.

var('c,x,y') F1=[plot(c*sin(x),(x,-2*pi,2*pi),color='blue', aspect_ratio=1) for c in sxrange(-4,4.5,.5)] #show(sum(F1)) F2=[implicit_plot(y^2+2*log(abs(sec(x)))-c,(x,-2*pi,2*pi),(y,-5,5),color='red',aspect_ratio=1) for c in sxrange(-10,10,1)] show(sum(F2)+sum(F1))
(c\displaystyle c, x\displaystyle x, y\displaystyle y)

Notez que les listes F1 et F2 sont les listes de courbes, donc d'objets graphiques. Ainsi, afficher la somme des listes, affiche toutes les courbes des listes. Probablement ce n'est pas la chose la plus efficace à faire...

Que se passe-t-il si on laisse tomber les valeurs absolues?

Voyons maintenant quelques courbes en coordonnées polaires. Habituellement, on écrit r=f(θ)r=f(\theta), si on donne l'équation explicitement.

Par exemple, r=cosθr=\cos{\theta} est un cercle, car en multipliant les deux côtés par rr on obtient r2=rcosθr^2 = r \cos{\theta}, ou encore x2+y2=xx^2+y^2 = x ce qui équivaut à (x12)2+y2=14(x-\frac{1}{2})^2+ y^2 = \frac{1}{4}

polar_plot(cos(t),t,0,2*pi, color='green').show(figsize=[3,3])

Finalement, les courbes paramétriques r(t)=(x(t),y(t))\mathbf{r}(t) = (x(t),y(t)) pour t[a,b]t\in[a,b]

var('t') Courbe=parametric_plot([sin(2*t),cos(3*t)],(t,0,2*pi)) Courbe.show(figsize=4)
t\displaystyle t

Un peu d'algèbre linéaire

Voyons maintenant comment faire les manipulations usuelles en algèbre linéaire : déclarer des vecteurs, faire le produit vectoriel (pour les vecteurs dans R3\mathbb{R}^3), produit scalaire, norme... et il en va de même pour les matrices.

u=vector([-1,-3,1]) v=vector([4,2,8]) w=u.cross_product(v)
w
(26,12,10)\displaystyle \left(-26,\,12,\,10\right)
v.cross_product(u)
(26,12,10)\displaystyle \left(26,\,-12,\,-10\right)
u.dot_product(v)
2\displaystyle -2
u.norm()
11\displaystyle \sqrt{11}
norm(u)
11\displaystyle \sqrt{11}
u+v
(3,1,9)\displaystyle \left(3,\,-1,\,9\right)
A1=matrix([[1,1,0,0,0,0],[0,1,1,0,0,0],[1,0,1,0,0,0],[0,0,1,1,0,0],[0,0,0,1,1,0],[0,0,0,0,1,1]]) A1
(110000011000101000001100000110000011)\displaystyle \left(\begin{array}{rrrrrr} 1 & 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 \end{array}\right)
det(A1)
2\displaystyle 2
A1.inverse()
(121212000121212000121212000121212100121212110121212111)\displaystyle \left(\begin{array}{rrrrrr} \frac{1}{2} & -\frac{1}{2} & \frac{1}{2} & 0 & 0 & 0 \\ \frac{1}{2} & \frac{1}{2} & -\frac{1}{2} & 0 & 0 & 0 \\ -\frac{1}{2} & \frac{1}{2} & \frac{1}{2} & 0 & 0 & 0 \\ \frac{1}{2} & -\frac{1}{2} & -\frac{1}{2} & 1 & 0 & 0 \\ -\frac{1}{2} & \frac{1}{2} & \frac{1}{2} & -1 & 1 & 0 \\ \frac{1}{2} & -\frac{1}{2} & -\frac{1}{2} & 1 & -1 & 1 \end{array}\right)
A1^4
(556000655000565000645100416410104641)\displaystyle \left(\begin{array}{rrrrrr} 5 & 5 & 6 & 0 & 0 & 0 \\ 6 & 5 & 5 & 0 & 0 & 0 \\ 5 & 6 & 5 & 0 & 0 & 0 \\ 6 & 4 & 5 & 1 & 0 & 0 \\ 4 & 1 & 6 & 4 & 1 & 0 \\ 1 & 0 & 4 & 6 & 4 & 1 \end{array}\right)

Polynomes de Taylor

Pour finir, un peu de polynômes de Taylor, en une ou deux variables.

f(x)=sin(x) Taylorf = taylor(f(x),x,0,12) Taylorf
139916800x11+1362880x915040x7+1120x516x3+x\displaystyle -\frac{1}{39916800} \, x^{11} + \frac{1}{362880} \, x^{9} - \frac{1}{5040} \, x^{7} + \frac{1}{120} \, x^{5} - \frac{1}{6} \, x^{3} + x

On peut, bien sur calculer plusieurs polynômes d'un seul coup, et faire les dessins sur une même figure. Ci-bas le graphique de la fonction xsinxx\mapsto \sin{x} sur [2π,2π][-2\pi,2\pi] (c'est ce que le paramètre LL contrôle), et les plynômes de Taylor de degrés inférieurs à 20. On remarquera comment on fait changer les couleurs des courbes.

Par ailleurs, on a intérêt à faire Taylor?.

N=20 L=2 Curvef=plot(f,-L*pi,L*pi,color='darkgreen',thickness=3,detect_poles=True) TaylorPolys=sum([plot(taylor(f(x),x,0,j) ,-L*pi,L*pi, color=((N-j)/N,0,j/N),thickness=1) for j in range(N)]) show(TaylorPolys+Curvef,ymin=-1.2,ymax=1.2,figsize=4)

Voici comment calculer le polynôme de Taylor autour de x=1x=1, on obtient une somme de puissances de (x1)(x-1).

taylor(f(x),x,1,6)
1720(x1)6sin(1)+1120(x1)5cos(1)+124(x1)4sin(1)16(x1)3cos(1)12(x1)2sin(1)+(x1)cos(1)+sin(1)\displaystyle -\frac{1}{720} \, {\left(x - 1\right)}^{6} \sin\left(1\right) + \frac{1}{120} \, {\left(x - 1\right)}^{5} \cos\left(1\right) + \frac{1}{24} \, {\left(x - 1\right)}^{4} \sin\left(1\right) - \frac{1}{6} \, {\left(x - 1\right)}^{3} \cos\left(1\right) - \frac{1}{2} \, {\left(x - 1\right)}^{2} \sin\left(1\right) + {\left(x - 1\right)} \cos\left(1\right) + \sin\left(1\right)

Finalement, en deux variables: Calculons le polynôme de Taylor de degré 44 de la fonction xxcos(y)x\mapsto x \cos(y) autour du point (0,1)(0,-1).

var('y') taylor(x*cos(y),(x,0),(y,-1),4)
y\displaystyle y
16x(y+1)3sin(1)12x(y+1)2cos(1)+x(y+1)sin(1)+xcos(1)\displaystyle -\frac{1}{6} \, x {\left(y + 1\right)}^{3} \sin\left(1\right) - \frac{1}{2} \, x {\left(y + 1\right)}^{2} \cos\left(1\right) + x {\left(y + 1\right)} \sin\left(1\right) + x \cos\left(1\right)

Bien entendu, ceci pourrait se faire (dans ce cas) comme le produit de deux polynomes de Taylor (attention aux degrés)

taylor(x,x,0,4)*taylor(cos(y),y,-1,4)
124((y+1)4cos(1)4(y+1)3sin(1)12(y+1)2cos(1)+24(y+1)sin(1)+24cos(1))x\displaystyle \frac{1}{24} \, {\left({\left(y + 1\right)}^{4} \cos\left(1\right) - 4 \, {\left(y + 1\right)}^{3} \sin\left(1\right) - 12 \, {\left(y + 1\right)}^{2} \cos\left(1\right) + 24 \, {\left(y + 1\right)} \sin\left(1\right) + 24 \, \cos\left(1\right)\right)} x

Quelques graphiques en 3D

On peut dessiner les surfaces de plusieurs façons différentes, dépendament de comment la surface est spécifiée:

  • Paramétriquement, c'est à dire r:DR3\vec{r}:\mathcal{D}\to \mathbb{R}^3 donnée par r(u,v)=x(u,v)e1+y(u,v)e2+z(u,v)e3\vec{r}(u,v)=x(u,v)\mathbf{e}_1 + y(u,v)\mathbf{e}_2 + z(u,v)\mathbf{e}_3 est une paramétrisation d'une surace S\mathcal{S}. Ici on suppose que (u,v)D(u,v)\in \mathcal{D}.

  • Explicitement, c'est à dire si S\mathcal{S} est l'ensemble des points (x,y,z)(x,y,z) tels que z=f(x,y)z=f(x,y), pour (x,y)D(x,y)\in \mathcal{D}.

  • Implicitement, c'est à dire si S\mathcal{S} est l'ensemble des points (x,y,z)(x,y,z) tels que F(x,y,z)=0F(x,y,z)=0.

Voyons quelques exemples.

Exemple : dessiner la région de l'espace comprise entre les surfaces S1:z=x2+3y2S_1:z=x^2+3y^2 et S2:z=8x2y2S_2:z=8-x^2-y^2

Dessinons les deux surfaces explicitement:

var('x,y') f(x,y)=x^2+3*y^2 g(x,y)=8-x^2-y^2 S1=plot3d(f(x,y),(x,-2,2),(y,-1.5,1.5),color='darkseagreen', opacity=0.65) S2=plot3d(g(x,y),(x,-2,2),(y,-1.5,1.5),color='darkgreen', opacity=0.65) show(S1+S2, frame_aspect_ratio=[1,1,1])
(x\displaystyle x, y\displaystyle y)
3D rendering not yet implemented

Le graphique n'est pas tellement beau, essentiellement parce que (x,y)(x,y) décrivent un rectangle. L'idéal serait que seulement les valeurs de (x,y)(x,y) qui se trouvent sous la région commune soient considérées.

Pour ceci, on paramétrise les surfaces (on verra en détail comment faire dans le cours, on peut simplement ignorer les calculs qui suivent):

  • Calculons d'abord l'intersection des deux surfaces, c'est à dire x2+3y2=8x2y2\displaystyle x^2+3y^2= 8-x^2-y^2

  • C'est l'équation d'une ellipse, à savoir (x2)2+(y2)2=1\displaystyle \left(\frac{x}{2}\right)^2+ \left(\frac{y}{\sqrt{2}}\right)^2=1.

    • Une paramétrisation de celle-ci est x(u)=2cos(u), y(u)=2sinux(u)=2\cos(u),\ y(u)=\sqrt{2}\sin{u} pour u[0,2π]u\in[0,2\pi]. La courbe d'intersection entre les deux surfaces est (x(u),y(u),f(x(u),y(u)))(x(u),y(u),f(x(u),y(u)))u[0,2π]u\in [0,2\pi].

  • On va utiliser la paramétrisation des surfaces, pour que les dessins soient plus beaux... Les paramètres seront en quelque sorte les coordonnées polaires, mais avec les noms u,vu,v. Ainsi x(u,v)=2vcosux(u,v)=2 v \cos{u}, et y(u,v)=v2sinuy(u,v)=v \sqrt{2} \sin{u} pour 0v10\leq v \leq 1 et 0u2π0\leq u \leq 2\pi est une description de l'ellipse et tout ce qu'il y a dans son intérieur: en effet on "multiplie" l'ellipse par le paramètre vv qui varie entre 00 et 11, ca remplit la région enfermée par l'ellipse. Pour ce qui est de l'ellipse il suffit de faire v=1v=1.

Les surfaces sont ainsi S1:z=f(x(u,v),y(u,v))S_1: z=f(x(u,v), y(u,v)), ou, paramétriquement (x,y,z)=(x(u,v),y(u,v),f(x(u,v),y(u,v))(x,y,z)= (x(u,v),y(u,v),f(x(u,v),y(u,v)). Pour S2S_2 c'est pareil.

var('u,v') x(u,v)=2*cos(u)*v y(v,v)=sqrt(2)*sin(u)*v
(u\displaystyle u, v\displaystyle v)
Ellipse=parametric_plot3d([x(u,1),y(u,1),0],(u,0,2*pi), color='darkgreen', thickness=2) Courbe=parametric_plot3d([x(u,1),y(u,1),f(x(u,1),y(u,1))],(u,0,2*pi), color='darkgreen', thickness = 3) S1=parametric_plot3d([x(u,v),y(u,v),f(x(u,v),y(u,v))],(u,0,2*pi),(v,0,1), color='darkgreen', opacity=0.3) S2=parametric_plot3d([x(u,v),y(u,v),g(x(u,v),y(u,v))],(u,0,2*pi),(v,0,1), color='red', opacity=0.3) show(Ellipse + Courbe + S1 + S2, frame_aspect_ratio=[2,2,1]);
3D rendering not yet implemented
#Un tube tordu x(u,v) = (2+sin(v))*cos(u) y(u,v) = (2+sin(v))*sin(u) z(u,v)= u+cos(v) Tube = parametric_plot3d([x(u,v), y(u,v), z(u,v)], (u, -pi, 2*pi), (v, 0, 2*pi), mesh=1, opacity=0.5, color="orange") show(Tube, frame= True)
3D rendering not yet implemented

Ici on dessine un champ de vecteurs, le champ gradient d'une fonction ff qu'on déclare. Par la suite, dans le même graphique le diagramme des courbes de niveau de ff. On verra que les courbes sont effectivement orrhogonales au champ.

import matplotlib.cm f(x,y)=x^2-y^2; Champ=plot_vector_field(f.gradient(), (x,-1,1), (y,-1,1), color='blue') Courbes=contour_plot(f(x,y),(x,-1,1),(y,-1,1), fill=False, cmap='autumn_r') show(Champ + Courbes,figsize=6)

Et voici la surface qui correspond à ff

cmsel = [colormaps['autumn_r'](i) for i in sxrange(0,1,0.05)] Surff=plot3d(f,(x,-1,1),(y,-1,1),adaptive=True, color=cmsel) show(Surff)
3D rendering not yet implemented

Flot d'un champ et lignes de courant : étant donné uin champs de vecteurs F\overrightarrow{\mathbf{F}} , une ligne de courant du champ est une courbe C\mathcal{C} donnée par une paramétrisation r(t)\mathbf{r}(t) telle qu'en tout point le vecteur vitesse est égal au champ. En d'autres termes v(t)=F(r(t))\mathbf{v}(t) = \overrightarrow{\mathbf{F}}(\mathbf{r}(t))

Trouver des lignes de courant revient à résoudre certaines équations différentielles. Par chaque point il y a une unique ligne de courant, on peut penser à la ligne de courant comme la trajectoire qu'un objet mobile suivrait, étant donné que sa vitesse doit coïncider avec le champ F\overrightarrow{\mathbf{F}} .

L'ensemble de toutes les lignes de courant s'appelle le flot du champ de vecteurs.

Ci-bas, trois lignes de courant, calculées "manuellement" pour le champ F(x,y)=i+(x+y)j\overrightarrow{\mathbf{F}}(x,y) = \mathbf{i} + (x+y) \mathbf{j} . L'équation différentielle associée est simplement y(x)=x+yy′(x)=x+y. En effet, si on a une courbe donnée explicitement y=y(x)y=y(x), la pente de la tangente en x0x_0 et y(x0)y'(x_0), de sorte qu'un vecteur directeur de la tangente est (1,y(x0))(1,y′(x_0)). La recherche d'une ligne de courant pour le champ F=Pi+Qj\overrightarrow{\mathbf{F}}= P\mathbf{i} + Q\mathbf{j} c'est précisément la recherche d'une courbe dont un vecteur tangent au point (x,y)(x,y) et F\overrightarrow{\mathbf{F}}.

x,y=var('x y'); xmin=-1.5; xmax=-xmin; ymin=-4; ymax=-ymin; Champ=plot_vector_field((1,x+y), (x,xmin,xmax), (y,ymin,ymax), color='black') c1=plot(-x-1,(x,xmin,xmax),color="blue", thickness=2) c2=plot(e^x-x-1,(x,xmin,xmax),color="red", thickness=2) c3=plot(-0.3*e^x-x-1,(x,xmin,xmax),color="green", thickness=2) show(Champ+c1+c2+c3,figsize=5);