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

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 18 :
=Du segment au cercle=
 
==Transformée inverse==
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]].
 
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:
 
<source lang="ruby">
require 'cmath'
 
def fplus(z)
return (z+CMath.sqrt(z**2-4))/2
end
def fmoins(z)
return (z-CMath.sqrt(z**2-4))/2
end
R=100
 
</source>
 
Le paramètre ''R'' est un facteur d'échelle permettant de zoomer sans avoir à refaire tout le script.
 
La figure est enregistrée dans un fichier au format ''svg'' appelé ''JoukovskiRuby1.svg'':
 
<source lang="ruby">
figure=File.open("JoukovskiRuby1.svg","w")
figure.puts('<?xml version="1.0" encoding="utf-8"?>')
figure.puts('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"')
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">')
</source>
 
La figure occupera donc 640 pixels de large et 480 pixels de haut, et s'appellera ''figure'' tout simplement.
 
==Tracé des isobares==
 
===Côté droit de la figure===
 
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:
 
<source lang="ruby">
#moitié droite des isobares
(0..25).collect { |i|
z=fplus(Complex(i/10.0,-2.0))
xa=z.real*R+320
ya=240-z.imag*R
ligne='<path d="M'
ligne+=xa.to_s+' '+ya.to_s
(-20..20).collect { |j|
z=fplus(Complex(i/10.0,j/10.0))
xa=z.real*R+320
ya=240-z.imag*R
ligne+=' L'+xa.to_s+' '+ya.to_s
}
ligne+='" stroke="yellow" stroke-width="1" fill="none"/>'
figure.puts(ligne)
}
</source>
 
=Conception de l'aile d'avion=