Shopy 101
← Résolution de systèmes en Ruby Sign in to download
Résolution de problèmes en Ruby Résolution de problèmes en Ruby
Triplets pythagoriciens en Ruby Triplets pythagoriciens en Ruby

Un petit exercice
Au village de Trokhafairtrade dans le Swazibwana occidental, on pratique un mélange de commerce équitable et de troc. Ainsi, un habitant a acquis 2 youkoulélés d'Hawaii contre 3 xylophones et 1 € et un écotouriste a acquis un xylophone et un youkoulélé pour la modique somme de 8 €. On demande le prix, en euros, d'un xylophone et le prix d'un youkoulélé sur le marché de Trokhafairtrade.

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:

{\displaystyle \left\{{\begin{array}{rcl}3x-2y&=&-1\\x+y&=&8\end{array}}\right.}

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=[[]]
(0..100).each{|x| (0..100).each{|y| total.push([x,y])}}
solutions=total.select{|c| 3*c[0].to_f-2*c[1].to_f==-1 and c[0].to_f+c[1].to_f==8}
puts(solutions)

Méthode algébrique

Le système {\displaystyle \left\{{\begin{array}{rcl}3x-2y&=&-1\\x+y&=&8\end{array}}\right.} peut aussi s'écrire matriciellement {\displaystyle \left({\begin{array}{rr}3&-2\\1&1\end{array}}\right)\left({\begin{array}{r}x\\y\end{array}}\right)=\left({\begin{array}{r}-1\\8\end{array}}\right)} soit {\displaystyle AX=B} avec {\displaystyle A=\left({\begin{array}{rr}3&-2\\1&1\end{array}}\right)} et {\displaystyle B=\left({\begin{array}{r}-1\\8\end{array}}\right)}. Alors sa solution {\displaystyle X=\left({\begin{array}{r}x\\y\end{array}}\right)} s'obtient par le calcul matriciel {\displaystyle X=A^{-1}B}, ce qui se fait directement avec le module matrix de Ruby:

require 'matrix'
require 'mathn'

A=Matrix[[3,-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.