Identifier les points d'intersection d'une courbe avec y = 0
Dans le contexte du traçage Python à l'aide de tableaux NumPy, la valeur précise sur le L'axe y où une courbe coupe y = 0 peut être une tâche insaisissable. Cet article traite d'une méthode permettant de déterminer avec précision ces points d'intersection, en tenant compte des limites des techniques de recherche de racines existantes.
Pour commencer, définissons notre tracé à l'aide de tableaux NumPy :
<code class="python">import numpy as np import matplotlib.pyplot as plt vertical_data = ... gradient = ... plt.plot(gradient, vertical_data) plt.show()</code>
Maintenant , supposons que nous voulions localiser la valeur zéro de la courbe. Les algorithmes conventionnels de recherche de racine fournissent souvent des résultats imprécis en raison des limitations de précision des virgules flottantes. Pour surmonter ce problème, nous utilisons une technique d'interpolation linéaire simple :
<code class="python">import numpy as np def find_roots(x, y): # Compute the sign differences s = np.abs(np.diff(np.sign(y))).astype(bool) # Perform linear interpolation at sign changes return x[:-1][s] + np.diff(x)[s]/(np.abs(y[1:][s]/y[:-1][s])+1)</code>
Cette fonction prend les tableaux x et y en entrée et localise les points d'intersection où les valeurs y franchissent le repère zéro. Nous appliquons cette fonction à nos données et traçons les résultats :
<code class="python">z = find_roots(gradient, vertical_data) plt.plot(gradient, vertical_data) plt.plot(z, np.zeros(len(z)), marker="o", ls="", ms=4) plt.show()</code>
En inversant les rôles de x et y, nous pouvons déterminer les points d'intersection le long de l'axe des x :
<code class="python">plt.plot(vertical_data, gradient) plt.plot(np.zeros(len(z)), z, marker="o", ls="", ms=4) plt.show()</code>
De plus, la méthode présentée permet de trouver des points d'intersection à des valeurs y non nulles. Soustrayez simplement la valeur y souhaitée de la courbe avant d'appliquer la fonction find_roots :
<code class="python">y0 = 1.4 z = find_roots(gradient, vertical_data - y0) plt.plot(z, np.zeros(len(z))+y0)</code>
Enfin, pour déterminer l'intersection entre deux courbes, calculez la différence entre les courbes et appliquez la fonction find_roots pour localiser l'intersection. points :
<code class="python">y2 = ... z = find_roots(gradient, y2 - y1) plt.plot(gradient, y1) plt.plot(gradient, y2, color="C2") plt.plot(z, np.interp(z, gradient, y1), marker="o", ls="", ms=4, color="C1")</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!