« 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 183 :
==Calcul de l'écoulement==
 
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:
 
<source lang="ruby">
require 'cmath'
 
def fa(z)
return Complex(0.93,-0.15)*(z-1)+1
end
 
def Joukovski(z)
return z+1/(z+0.0000001)
end
 
def fplus(z)
return Joukovski(fa((z+CMath.sqrt(z**2-4))/2))
end
def fmoins(z)
return Joukovski(fa((z-CMath.sqrt(z**2-4))/2))
end
R=100
 
 
figure=File.open("JoukovskiRuby2.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">')
#moitié gauche de l'écoulement
(-25..25).collect { |j|
z=fplus(Complex(-3.0,j/10.0))
xa=z.real*R+320
ya=240-z.imag*R
ligne='<path d="M'
ligne+=xa.to_s+' '+ya.to_s
(-30..0).collect { |i|
z=fplus(Complex(i/10.0-0.000001,j/10.0))
xa=z.real*R+320
ya=240-z.imag*R
ligne+=' L'+xa.to_s+' '+ya.to_s
}
ligne+='" stroke="red" stroke-width="1" fill="none"/>'
figure.puts(ligne)
}
#moitié droite de l'écoulement
(-25..25).collect { |j|
z=fmoins(Complex(0,j/10.0))
xa=z.real*R+320
ya=240-z.imag*R
ligne='<path d="M'
ligne+=xa.to_s+' '+ya.to_s
(0..30).collect { |i|
z=fmoins(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="red" stroke-width="1" fill="none"/>'
figure.puts(ligne)
}
 
ligne='<path d="M'+(320+2*R).to_s+' 240'
(0..200).collect { |i|
t=Math::PI*i/100
z=Joukovski(fa(Complex(Math.cos(t),Math.sin(t))))
xa=z.real*R+320
ya=240-z.imag*R
ligne+=' L'+xa.to_s+' '+ya.to_s
}
ligne+='" stroke="black" stroke-width="1" fill="white"/>'
figure.puts(ligne)
 
figure.puts('</svg>')
figure.close
</source>
 
==Figure obtenue==
 
L'exécution du script produit la figure suivante:
 
[[Fichier:JoukovskiRuby2.svg]]
 
Le fait que les lignes de courant sont plus courbées sur le dessus que sur le dessous entraîne par la force de Bernoulli, une dépression sur le dessus de l'aide, qui est à l'origine de la portance: L'avion vole!