« Mathématiques avec Python et Ruby/Joukovski et Ruby » : différence entre les versions

Contenu supprimé Contenu ajouté
m Révocation des modifications de 62.102.233.149 (discussion) vers la dernière version de Alain Busser
Balise : Révocation
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 22 :
Il suffit donc d'appliquer à cet écoulement l'inverse J<sup>-1</sup> de la transformée de Joukovski, qui envoie le segment [-2;2] sur le cercle unité. Or J<sup>-1</sup> est [[w:Fonction multivaluée|multiforme]]. On utilisera donc la fonction ''fplus'' valant <math>f_{plus}(z)=\frac{z+\sqrt{z^2-4}}{2}</math> sur la moitié droite de l'image, et la fonction ''fmoins'' valant <math>f_{moins}(z)=\frac{z-\sqrt{z^2-4}}{2}</math> sur la moitié gauche. Ces fonctions sont complexes:
 
<sourcesyntaxhighlight lang="ruby">
require 'cmath'
 
Ligne 33 :
R=100
 
</syntaxhighlight>
</source>
 
Le paramètre ''R'' est un facteur d'échelle permettant de zoomer sans avoir à refaire tout le script.
Ligne 39 :
La figure est enregistrée dans un fichier au format ''svg'' appelé ''JoukovskiRuby1.svg'':
 
<sourcesyntaxhighlight lang="ruby">
figure=File.open("JoukovskiRuby1.svg","w")
figure.puts('<?xml version="1.0" encoding="utf-8"?>')
Ligne 45 :
figure.puts('"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">')
figure.puts('<svg xmlns="http://www.w3.org/2000/svg" width="640" height="480">')
</syntaxhighlight>
</source>
 
La figure occupera donc 640 pixels de large et 480 pixels de haut, et s'appellera ''figure'' tout simplement.
Ligne 55 :
Pour tracer les isobares, on prend un point d'affixe x-2i et on le transforme par J<sup>-1</sup>. Puis on commence un ''path'' de ''svg'' par ce point. Ensuite on transforme des points situés sur la même droite verticale que le premier point choisi, et on les ajoute au ''path'' (une chaîne de caractères appelée ''ligne''). La courbe obtenue (le ''path'') sera en jaune et est inscrite à la fin dans le fichier:
 
<sourcesyntaxhighlight lang="ruby">
#moitié droite des isobares
(0..25).collect { |i|
Ligne 73 :
figure.puts(ligne)
}
</syntaxhighlight>
</source>
 
===Côté gauche de la figure===
Ligne 79 :
Les isobares de gauche se dessinent de la même manière, en remplaçant ''fplus'' par ''fmoins'':
 
<sourcesyntaxhighlight lang="ruby">
#moitié gauche des isobares
(-25..0).collect { |i|
Ligne 97 :
figure.puts(ligne)
}
</syntaxhighlight>
</source>
 
==Tracé des lignes de courant==
Ligne 107 :
Il suffit d'intervertir les rôles de ''i'' (abscisse) et ''j'' (ordonnée):
 
<sourcesyntaxhighlight lang="ruby">
#moitié gauche de l'écoulement
(-25..25).collect { |j|
Ligne 125 :
figure.puts(ligne)
}
</syntaxhighlight>
</source>
 
Le décalage des abscisses permet d'éviter le passage par l'origine, où le changement de feuillet de la transformation donnerait des résultats graphiquement bizarres.
Ligne 133 :
Même principe, en remplaçant ''fmoins'' par ''fplus'':
 
<sourcesyntaxhighlight lang="ruby">
#moitié droite de l'écoulement
(-25..25).collect { |j|
Ligne 151 :
figure.puts(ligne)
}
</syntaxhighlight>
</source>
 
==Tracé du cercle==
Ligne 157 :
Pour ajouter le cercle lui-même sur la figure, on peut utiliser l'objet ''circle'' de ''svg''; on en profite pour fermer la bannière ''svg'' et clore le fichier:
 
<sourcesyntaxhighlight lang="ruby">
figure.puts('<circle cx="320" cy="240" r="'+R.to_s+'" fill="white" stroke="black" stroke-width="1" />')
figure.puts('</svg>')
figure.close
</syntaxhighlight>
</source>
 
C'est tout ce qu'il faut pour obtenir l'écoulement que voici:
Ligne 185 :
Pour la fonction de Joukovski, on ajoute un très petit nombre à ''z'' pour que le nombre zéro passe entre les mailles du filet, ce qui évite le risque d'avoir une erreur de division par zéro. À part ça, il suffit d'appliquer J(fa(z)) au cercle unité, et de remplacer le cercle final par son image par J(fa(z)) (pour dessiner l'aile). Ce qui donne le script suivant:
 
<sourcesyntaxhighlight lang="ruby">
require 'cmath'
 
Ligne 259 :
figure.close
</syntaxhighlight>
</source>
 
==Figure obtenue==