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

Contenu supprimé Contenu ajouté
Annulation des modifications 446713 de CommonsDelinker (discussion)
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
 
Ligne 25 :
Donc pour ''Ruby'', ''C'' et ''f'' seront des méthodes, dont l'antécédent s'appellera ''x'' et dont l'image sera envoyée par ''return'':
 
<sourcesyntaxhighlight lang="ruby">
def C(x)
return x**2+50*x+100.0
Ligne 35 :
end
 
</syntaxhighlight>
</source>
 
Bien entendu, on pouvait aussi définir ''f'' directement par
 
<sourcesyntaxhighlight lang="ruby">
def f(x)
return x+50+100.0/x
end
</syntaxhighlight>
</source>
 
 
Ligne 63 :
Certes, avec une boucle, on peut calculer plein de valeurs de ''f(x)'' différentes:
 
<sourcesyntaxhighlight lang="ruby">
for x in 5..40 do
puts("l'image de #{x} par f est #{f(x)}")
end
</syntaxhighlight>
</source>
 
mais on a trop de valeurs de ''x'' pour remplir le tableau. Une meilleure variante sera donc
 
<sourcesyntaxhighlight lang="ruby">
for x in [5,10,20,30,40] do
puts("l'image de #{x} par f est #{f(x)}")
end
</syntaxhighlight>
</source>
 
qui est déjà bien plus léger à exploiter.
Ligne 81 :
Plus typiquement ''Ruby'':
 
<sourcesyntaxhighlight lang="ruby">
[5,10,20,30,40].collect {|x| puts(f(x))}
</syntaxhighlight>
</source>
 
==Image d'un ensemble par une fonction==
Ligne 89 :
Pour que la fonction ''f'' ne s'applique plus seulement à un réel, mais à tous les nombres du tableau, on utilise ''map'' (une méthode de l'objet ''tableau''):
 
<sourcesyntaxhighlight lang="ruby">
[5,10,20,30,40].map { |x| puts(f(x)) }
</syntaxhighlight>
</source>
 
Cette notion d'image d'un ensemble par une fonction est à la base de pratiquement toute la géométrie: Alors que la [[w:Symétrie centrale|symétrie centrale]] est définie comme une transformation qui associe un point à un point, on l'applique très vite à des ensembles de points comme dans l'expression ''la symétrique d'une droite par rapport à un point''.
Ligne 99 :
Enfin, pour avoir les arrondis au centime près:
 
<sourcesyntaxhighlight lang="ruby">
[5,10,20,30,40].collect {|x| puts(f(x).round(2))}
</syntaxhighlight>
</source>
 
qui remplit le tableau presque immédiatement.
Ligne 109 :
''Ruby'' n'étant pas très doué (pour le moment) en dessin, on va utiliser ses talents littéraires pour fabriquer un fichier au format [[w:Scalable Vector Graphics|svg]]. Ce fichier sera fabriqué comme une chaîne de caractères, et inscrit dans un fichier nommé ''FonctionRuby01.svg'' posté ci-dessous. Le fichier sera créé en mode écriture (''w'') avec
 
<sourcesyntaxhighlight lang="ruby">
figure=File.open("FonctionRuby01.svg","w")
</syntaxhighlight>
</source>
 
==Création de la figure==
Ligne 117 :
On commence par écrire dans le fichier (qui, on l'a vu ci-dessus, s'appelle ''figure''), ce qu'il faut pour dire que c'est un fichier ''svg'' (l'entête):
 
<sourcesyntaxhighlight lang="ruby">
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">')
</syntaxhighlight>
</source>
 
Le fichier fera donc 640 pixels de large et 480 pixels de haut.
Ligne 134 :
L'axe des abscisses et ses graduations sera bleu:
 
<sourcesyntaxhighlight lang="ruby">
figure.puts('<line x1="20.0" y1="460.0" x2="540.0" y2="460.0" style="stroke:rgb(0,0,64);stroke-width:1"/>')
((0..500).select {|x| x%100==0}).collect { |x| figure.print('<text x="'+(x+20).to_s+'" y="475.0" style="font-size:16;fill:rgb(0,0,64);font-weight:normal">'+(x/10).to_s+'</text>\n'+'<line x1="'+(x+20).to_s+'" y1="455" x2="'+(x+20).to_s+'" y2="465" style="stroke:rgb(0,0,64);stroke-width:1"/>\n')}
((0..500).select {|x| x%50==0}).collect { |x| figure.print('<line x1="'+(x+20).to_s+'" y1="456" x2="'+(x+20).to_s+'" y2="464" style="stroke:rgb(0,0,64);stroke-width:1"/>\n')}
((0..500).select {|x| x%10==0}).collect { |x| figure.print('<line x1="'+(x+20).to_s+'" y1="458" x2="'+(x+20).to_s+'" y2="462" style="stroke:rgb(0,0,64);stroke-width:1"/>\n')}
</syntaxhighlight>
</source>
 
===Des ordonnées===
Ligne 145 :
L'axe des ordonnées est en vert:
 
<sourcesyntaxhighlight lang="ruby">
figure.puts('<line x1="20.0" y1="460.0" x2="20.0" y2="40.0" style="stroke:rgb(0,40,0);stroke-width:1"/>')
((0..400).select {|y| y%40==0}).collect { |y| figure.print('<text x="0" y="'+(460-y).to_s+'" style="font-size:16;fill:rgb(0,40,0);font-weight:normal">'+(y/4).to_s+'</text>\n'+'<line x1="15" y1="'+(460-y).to_s+'" x2="25" y2="'+(460-y).to_s+'" style="stroke:rgb(0,40,0);stroke-width:1"/>\n')}
((0..400).select {|y| y%20==0}).collect { |y| figure.print('<line x1="16" y1="'+(460-y).to_s+'" x2="24" y2="'+(460-y).to_s+'" style="stroke:rgb(0,40,0);stroke-width:1"/>\n')}
((0..400).select {|y| y%4==0}).collect { |y| figure.print('<line x1="18" y1="'+(460-y).to_s+'" x2="22" y2="'+(460-y).to_s+'" style="stroke:rgb(0,40,0);stroke-width:1"/>\n')}
</syntaxhighlight>
</source>
 
==Courbe==
Ligne 156 :
On va représenter graphiquement la fonction en rouge, sous forme d'un polygone à 350 côtés:
 
<sourcesyntaxhighlight lang="ruby">
(50..400).collect {|x| figure.print('<line x1="'+(19+x).to_s+'" y1="'+(460-4*f((x-1).to_f/10)).to_s+'" x2="'+(20+x).to_s+'" y2="'+(460-4*f(x.to_f/10)).to_s+'" style="stroke:rgb(120,0,0);stroke-width:1"/>\n')}
</syntaxhighlight>
</source>
 
==Résultat==
Ligne 164 :
Pour que la figure soit reconnue, il reste encore à fermer la balise ''svg'', ouvert au tout début de la figure, puis à fermer le fichier pour que ''Ruby'' le libère:
 
<sourcesyntaxhighlight lang="ruby">
figure.puts('</svg>')
 
figure.close
</syntaxhighlight>
</source>
 
L'exécution du script ci-dessus produit le fichier suivant: