Précision du tracé d'un polynôme de degré 4 sur tikzpicture

shinitchi
Modifié (May 2023) dans LaTeX
Bonjour à tous, j'ai besoin de tracer des fonctions bien précises via tikzpicture. L'une d'elle est la suivante :
$F(x)=-(0{,}25x^4-11x^3+153x^2-648x)\times \dfrac{5}{843{,}75}$
Je rentre le code suivant :
\begin{tikzpicture}[scale=0.8]
\draw[gray,opacity=0.5] (0,-3) grid (20,5) ;
\draw[thick] (0,-3) -- (0,5) (0,0) -- (20,0) ;
\foreach \x in{2,4,...,20}{
	\draw[thick] (\x,0) -- ++ (0,-0.2) node[below]{\scriptsize{$\x$}} ;
}
\foreach \y in{-2,0,2,4}{
	\draw[thick] (0,\y) -- ++ (-0.2,0) node[left]{\scriptsize{$\y$}} ;
}
\draw (20,0) node[right]{$x$} (0,5) node[above]{$f(x)$} ;
\draw[Magenta,very thick]
	plot[domain=0:20,smooth,samples=200]
	(\x,{-(0.25 /843.75 *\x *\x *\x *\x - 11/843.75 * \x *\x *\x + 153/843.75 *
	 \x *\x - 648/843.75 *\x)*5})
	;
\end{tikzpicture}
Néanmoins, la précision de la courbe obtenue est de plus en plus mauvaise à mesure que $x$ augmente, ce malgré que j'augmente le nombre d'échantillons. La courbe du bas est obtenue à partir de samples = 200 et celle du haut à partir de samples = 1000.
C'est évidemment insatisfaisant. Quelqu'un aurait une solution pour obtenir quelque chose de plus précis et lisse ?

Je précise que dans l'expression de la fonction sous plot, je ne factorise pas par $\dfrac{1}{843{,}75}$ de façon à ce que les nombres obtenus n'excèdent pas le max dans l'algorithme de calcul utilisé par tikz.

En vous remerciant par avance.

Réponses

  • verdurin
    Modifié (May 2023)
    Il est possible que le schéma de Horner permette une amélioration :
    $F(x)=-(((0{,}25x-11)x+153)x-648)x\times \dfrac{5}{843{,}75}$
  • Ludwig
    Modifié (May 2023)
    Bonjour,
    Je ne connais rien à ce logiciel et je ne comprends pas pourquoi le dessin est si mauvais. Je te propose quand même d'essayer la forme de Horner : $f(x)=5x (648 + x (-153 + (11 - 0.25 x) x))/843.75$.

  • dp
    dp
    Modifié (May 2023)
    Édit: en utilisant la formule de @verdurin, réutilisée par @Médiat_Suprème, et, magie, sans mettre samples=… :
    begin{tikzpicture}[scale=0.8]
    
    \draw[gray,opacity=0.5] (0,-3) grid (20,5) ;
    \draw[thick] (0,-3) -- (0,5) (0,0) -- (20,0) ;
    
    \foreach \x in{2,4,...,20}{ \draw[thick] (\x,0) -- ++ (0,-0.2) node[below]{\scriptsize{$\x$}}; }
    \foreach \y in{-2,0,2,4}  { \draw[thick] (0,\y) -- ++ (-0.2,0) node[left]{\scriptsize{$\y$}} ; }
    \draw (20,0) node[right]{$x$} (0,5) node[above]{$f(x)$} ;
    
    \draw[magenta,very thick] plot[domain=0:20,smooth] (\x,{-(((0.25*\x-11)*\x+153)*\x-648)*\x* 5/843.75}) ;
    
    \end{tikzpicture}



  • celine_L
    Modifié (May 2023)
    En remplaçant la ligne qui trace la fonction par celle-ci :
    \draw[color=red, thick, domain=0:20] plot[id=parabole, smooth] function{-(0.25*x**4-11*x**3+153*x**2-648*x)*5/843.75};
    Cela utilise gnuplot qu'il faut donc avoir installé sur son ordi.
    Nécessite de compiler en shell-escape et [de] bien vérifier que le répertoire dans lequel se trouve gnuplot figure dans le path de latex.
    J'obtiens ceci.

    On voit que l'utilisation de gnuplot permet une bien meilleure précision dans les tracés, et ce quelle que soit la fonction à tracer.
  • Médiat_Suprème
    Modifié (May 2023)
    J'obtiens un bien meilleur résultat avec la fonction : (\x,{-(((0.25*\x-11)*\x+153)*\x-648)*\x* 5/843.75}) que ce soit avec samples = 200 ou samples =1000.

    On voit que 18 est une racine
    lmn.pdf 62.1K
    Il ne faut pas respirer la compote, ça fait tousser.

    J'affirme péremptoirement que toute affirmation péremptoire est fausse
  • Comme je viens de le remarquer et de le mettre en edit, pas besoin de mettre de samples=… en réalité.
  • Je vais opter pour la solution de Verdurin qui d'après le test effectué par dp à l'air de très bien fonctionner. Merci beaucoup pour vos réponses, en espérant que cette écriture d'Horner suffise pour les poly de degré supérieur.

    Encore merci à tous pour cette astuce !
  • Personnellement, quand j'ai des fonctions un peu compliquées, j'utilise un autre logiciel (Python, maple...) pour faire les calculs, que j'exporte dans un fichier à part, et ensuite, je demande à tikz de tracer ce qu'il y a dans le fichier. Ici, ça donne le fichier joint data.txt. On trace alors avec
    \draw [smooth, color=magenta, very thick] plot file {data.txt};
    Ce qui donne :



  • @dp : effectivement ça marche bien mais sans le samples = 200, on voit les cassures tandis qu'avec, la courbe est plus lisse.

    @Guego : je te remercie pour ta réponse. Je ne suis pas encore très familier avec l'environnement Python que je n'ai que très peu utilisé il y a bien longtemps. J'imagine qu'avec un peu de lecture et de pratique, je parviendrai à calculer les valeurs d'une fonction. Cependant, ma question est : comment importes-tu tes valeurs une fois calculées, dans un fichier .txt ? S'il n'est pas nécessaire de toutes les réécrire, je suis preneur de ta méthode qui donne une courbe bien lisse de par la précision des calculs.
  • def f(x):
        return -(0.25*x**4-11*x**3+153*x**2-648*x)*5/843.75
    
    fichier=open("data.txt","w")
    for i in range(201):
        fichier.write(str(i/10)+"\t"+str(f(i/10))+"\n")
    
    fichier.close()
    
  • C'est sans doute le mieux, avec les avantages de TikZ (polices consistentes, etc.) sans les désavantages (pas prévu pour du calcul numérique).

  • @Guego : je te remercie beaucoup pour l'astuce et le code !
  • dp
    dp
    Modifié (May 2023)
    Ah… ce n'est pas impossible, et je m'en excuse si c'est le cas. Ayant cassé ma paire de lunettes hier je ne vois actuellement pas trop ce genre de détails.
Connectez-vous ou Inscrivez-vous pour répondre.