Mathématiques avec Python et Ruby/Résolution de problèmes en Python

Mathématiques avec Python et Ruby/Résolution de problèmes en Ruby

Mathématiques avec Python et Ruby/Résolution de systèmes en Ruby

En notant "x" le prix d'un "xylophone" et "y" celui d'un "youkoulélé", l'énoncé se traduit algébriquement par "2y=3x+1" et "x+y=8".
On va donc voir comment résoudre le système de deux équations à deux inconnues suivant:
formula_1
=Méthode itérative=
Dans le cas présent, il se trouve que "x" et "y" sont entiers naturels. Si on sait que c'est le cas, on peut les chercher par tâtonnement avec une boucle sur "x" et sur "y". On va successivement fabriquer un tableau bidimensionnel avec les entiers de 0 à 100 (deux premières lignes) puis regarder quels couples de ce tableau vérifient à la fois les deux conditions données par le système:
total=
puts(solutions)
=Méthode algébrique=
Le système formula_1 peut aussi s'écrire matriciellement formula_3 soit formula_4 avec formula_5 et formula_6. Alors sa solution formula_7 s'obtient par le calcul matriciel formula_8, ce qui se fait directement avec le module "matrix" de "Ruby":
require 'matrix'
require 'mathn'
A=Matrix3,-2],[1,1
B=Matrix-1],[8
solution=A.inverse*B
puts(solution)
En ayant choisi "mathn" avec, les solutions s'écrivent automatiquement sous forme de fractions si elles ne sont pas entières.

Mathématiques avec Python et Ruby/Résolution de systèmes en Python

Bien entendu, on va noter "x" le prix d'un "xylophone", et "y" le prix d'un "youkoulélé". Les données de l'énoncé se traduisant algébriquement par "2y=3x+1" et "x+y=8".
On va donc voir comment résoudre le système de deux équations à deux inconnues suivant :
formula_1
Méthode graphique.
Une méthode simple (surtout ici puisque la solution est formée d'entiers) consiste à tracer les deux droites d'équations respectives formula_2 et formula_3 et de lire sur le graphique les coordonnées de leur point d'intersection. "Python" tout seul ne sait pas faire ça mais "PyKig" lance le logiciel Kig et le laisse faire le travail, à condition de lui fournir les éléments nécessaires pour faire les constructions géométriques : Les coordonnées de points de chaque droite. Or la droite d'équation formula_4 passe par les points de coordonnées formula_5 et formula_6 (intersections avec les axes de coordonnées) qui sont constructibles par "Kig". Le script suivant colorie en bleu la première droite (le milieu M sert de point d'ancrage pour son équation réduite) et en rouge la seconde droite, puis affiche en mauve leur point d'intersection :
e1=[3.0,-2.0,-1.0]
e2=[1.0,1.0,8.0]
A=Point(e1[2]/e1[0],0,HIDDEN)
B=Point(0,e1[2]/e1[1],HIDDEN)
d1=Line(A,B)
d1.setcolor("blue")
M=MidPoints(A,B,HIDDEN)
t=Text(M,Equation(d1),0)
t.setcolor("blue")
C=Point(e2[2]/e2[0],0,HIDDEN)
D=Point(0,e2[2]/e2[1],HIDDEN)
d2=Line(C,D)
d2.setcolor("red")
N=MidPoints(C,D,HIDDEN)
u=Text(N,Equation(d2),0)
u.setcolor("red")
I=LineLineIntersection(d1,d2)
I.setcolor("magenta")
En enregistrant son contenu dans un fichier appelé "system.kpy", et en exécutant dans une console ceci :
pykig.py system.kpy
On obtient, après lancement inopiné de "Kig" (à condition bien sûr que celui-ci soit installé, ce qui est très facile sous Linux, beaucoup moins sous les autres systèmes), la figure suivante (où il a été nécessaire de créer un "Label" donnant les coordonnées du point d'intersection, ce que "PyKig" ne sait pas faire) :
On lit les coordonnées du point d'intersection, qui constituent la solution du système. Il est possible de déplacer à la souris les points A, B, C et D et voir les coordonnées du point d'intersection se mettre à jour en temps réel : En effet "Kig" est un logiciel de géométrie dynamique.
Cette méthode n'est pas applicable à des systèmes de plus de deux inconnues mais elle est très visuelle pour des systèmes tels que formula_7 pour lesquels on voit non seulement qu'il n'y a pas de solution, mais également pourquoi il n'y a pas de solution.
Si l'une des droites est verticale ou horizontale, le fichier ci-dessus doit être modifié avec des tests gérant ces cas. Ceci est laissé en exercice.
Méthode itérative.
Si on sait que "x" et "y" sont entiers naturels, on peut résoudre le système par une double boucle sur "x" et "y" :
solutions=[(x,y) for x in range(100) for y in range(200) if 3*x-2*y==-1 and x+y==8]
print(solutions)
Pour "x"et"y" appartenant à R je propose le script suivant :
def systeme (a1,b1,c1,a2,b2,c2):
 x=float()
 y=float()
 'a1*x + b1*y =c1,a2*x + b2*y =c2'
 if a1*b2-a2*b1==0:
 print('Pas de solution')
 else: 
 y=(c2*a1-c1*a2)/(a1*b2-a2*b1)
 x=(c1-b1*y)/a1
 print('x =',round(x,2),"",'y =',round(y,2))
Méthode de Cramer.
La méthode de Cramer est également implémentable en "Python" :
def affiche(e):
 print(str(e[0])+'x+('+str(e[1])+')y='+str(e[2]))
def resoudre(e1,e2):
 determinant=e1[0]*e2[1]-e1[1]*e2[0]
 if determinant==0:
 print('Pas de solution unique')
 else:
 x=(e1[2]*e2[1]-e1[1]*e2[2])/determinant
 y=(e1[0]*e2[2]-e1[2]*e2[0])/determinant
 print('La solution est ('+str(x)+','+str(y)+')')
e=[3,-2,-1]
f=[1,1,8]
affiche(e)
affiche(f)
resoudre(e,f)
Mais le module "fractions" permet d'avoir la valeur exacte de la solution chaque fois que les coefficients du système sont entiers :
from fractions import *
def resoudre(e1,e2):
 determinant=e1[0]*e2[1]-e1[1]*e2[0]
 if determinant==0:
 print('Pas de solution unique')
 else:
 x=Fraction(e1[2]*e2[1]-e1[1]*e2[2],determinant)
 y=Fraction(e1[0]*e2[2]-e1[2]*e2[0],determinant)
 print('La solution est ('+str(x)+','+str(y)+')')
e=[3,-2,-1]
f=[1,1,8]
resoudre(e,f)
Avec NumPy.
Le module "" permet de faire du calcul avec "Python", et même en étant à la fois rapide et précis (parce que ce module est précompilé). 
Installation.
Les principales distributions Linux sont fournies avec. Sur Windows, on peut le télécharger sur http://sourceforge.net/projects/numpy/files/.
Une fois le .zip décompressé, il faut l'installer en tapant dans la console :
 python setup.py install
En cas d'erreur :
Utilisation.
Pour résoudre le système, entrer le script suivant :
from numpy import *
A=matrix(3,-2],[1,1)
B=matrix(-1],[8)
solution=linalg.solve(A,B)
print(solution)

Mathématiques avec Python et Ruby/Freudenthal en Python