%display typeset
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.
Déplacez le curseur dans l'espace entre deux cellules, vous verrez une ligne bleue apparaître. Si on clique dessus, une nouvelle cellule apparaît, tandis que si on fait Ctrl + click
, c'est une petite section pour entrer du texte, comme celui-ci qui apparaît. Dans ces sections, on peut aussi entrer du texte LATEX, ce qui est très bien si on veut écrire des équations. Par ailleurs, en faisant un double click sur une de ces sections, vous accédez au texte, et pouvez l'éditer. Corrigez ceci : 21+31=2+31+1=52.
Bien entendu, le résultat est 65. 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
Si on veut une valeur numérique on doit faire:
5/6.n()
ou encore
5.0/6
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
(pi+1).n()
pi+1.0
numerical_approx(pi+1,digits=50)
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_
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-13d3e83b7087> in <module>()
----> 1 numerical_
NameError: name 'numerical_' is not defined
Faisons quelques calculs symboliques. Il faut déclarer les variables, toutes sauf x.
var('t,s') f(s,t)=s*cos(s*t)
diff(f(s,t),t)
diff(f(s,t),s,2)
integrate(f(s,t),s)
f(1,pi/4)
integrate(1/t,t,1,2)
factor(x^2+2*x+1)
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])
var('s,t') solve([s+t==3,s-t==1],[s,t])
Bien entendu on a intérêt à faire solve?
puis Entrée.
Faire des listes ou des ensembles est très facile, la syntaxe est presque celle qu'on utilise en maths: {n2∣0≤n≤10} s'obtient au moyen de:
Liste = [n^2 for n in range(11)]
Liste
Le 0−ème élément de la liste est le premier... eu... un exemple!
Liste[3]
Liste[2:7]
sum(Liste)
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 x↦sinx pour x∈[−3π,3π], en rouge. Traçons maintant la courbe de la fonction x↦21cos2x pour x∈[−π,3π], 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)=−xln2x entre 0 et 2. On va commencer par définir la fonction, puis faire une somme de Riemann avec les points milieux.
On fera les choses avec des listes, mais bien sur, ça se fait avec des boucles.
var('a,b,n') 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)]
On crée la liste des points milieux:
Mil=[(b-a)/(2*n)+j*dx for j in range(n)]
On évalue f en chacun de ces points puis on multiplie par Δx, ce qui fait une autre liste, qui s'appelle F.
F=[f(Mil[j])*dx for j in range(n)]
On calcule la somme, en mettant .n()
à la fin, pour forcer un résultat numérique exprimé en notation décimale.
sum(F).n()
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()
Un autre exemple : dessiner les courbes orthogonales aux courbes y=csinx. Pour chaque valeur de c∈R on considère la courbe Sc d'équation y=csinx.
Ci bas on a dessiné les courbes corerspondant aux valeurs de c 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)] show(sum(F1),figsize=5)
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=csinx on tire directement y′=ccosx, de sorte qu'en chaque point (x,y) d'une courbe bleue Sc, la pente de la tangente est précisément ccosx. La pente d'une droite orthogonale est le négatif de l'inverse, c'est à dire −ccosx1. On cherche donc y′=−ccosx1. De l'équation originale on peut éliminer c=sinxy, de sorte que, en remplaçant on trouve l'équation différentielle y′=−ytanx
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. 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)
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 c, nous obtenons donc pour chaque valeur de c une nouvelle courbe. Ce n'est pas le même c que nous avions déjà.
Le terme lnsecx vient d'intégrer tanx. Or en réalité ∫tanxdx=ln∣secx∣+k, il manque la valeur absolue, et le k 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+2⋅ln∣secx∣=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))
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. Probablemen 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(θ), si on donne l'équation explicitement.
Par exemple, r=cosθ est un cercle, car en multipliant les deux côtés par r on obtient r2=rcosθ, ou encore x2+y2=x ce qui équivaut à (x−21)2+y2=41
Voyons maintenant quelques courbes en coordonnées polaires. Habituellement, on écrit r=f(θ), si on donne l'équation explicitement.
Par exemple, r=cosθ est un cercle, car en multipliant les deux ccôtés par r on obtient r2=rcosθ, ou encore x2+y2=x ce qui équivaut à (x−21)2+y2=41.
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)) pour t∈[a,b]
var('t') Courbe=parametric_plot([sin(2*t),cos(3*t)],(t,0,2*pi))
Courbe.show(figsize=4)
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), 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
v.cross_product(u)
u.dot_product(v)
u.norm()
norm(u)
u+v
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
det(A1)
A1.inverse()
A1^4
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
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 x↦sinx sur [−2π,2π] (c'est ce que le paramètre L 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=1, on obtient une somme de puissances de (x−1).
taylor(f(x),x,1,6)
Finalement, en deux variables: Calculons le polynôme de Taylor de degré 4 de la fonction x↦xcos(y) autour du point (0,−1).
var('y') taylor(x*cos(y),(x,0),(y,-1),4)
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)
On peut dessiner les surfaces de plusieurs façons différentes, dépendament de comment la surface est spécifiée:
Voyons quelques exemples.
Exemple : dessiner la région de l'espace comprise entre les surfaces S1:z=x2+3y2 et S2:z=8−x2−y2
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])