web-dev-qa-db-fra.com

Équation du tracé montrant un cercle

La formule suivante est utilisée pour classer les points d'un espace à deux dimensions:

f(x1,x2) = np.sign(x1^2+x2^2-.6)

Tous les points sont dans l'espace X = [-1,1] x [-1,1] avec une probabilité uniforme de choisir chaque x.

Maintenant, je voudrais visualiser le cercle égal à:

0 = x1^2+x2^2-.6

Les valeurs de x1 doivent être sur l'axe des x et les valeurs de x2 sur l'axe des y.

Cela doit être possible mais j'ai du mal à transformer l'équation en un complot.

10
Elyakim

Vous pouvez utiliser un tracé de contour, comme suit (basé sur les exemples à http://matplotlib.org/examples/pylab_examples/contour_demo.html ):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1.0, 1.0, 100)
y = np.linspace(-1.0, 1.0, 100)
X, Y = np.meshgrid(x,y)
F = X**2 + Y**2 - 0.6
plt.contour(X,Y,F,[0])
plt.show()

Cela donne le graphique suivant

enter image description here

Enfin, quelques déclarations générales:

  1. x^2 Ne signifie pas ce que vous pensez qu'il fait en python, vous devez utiliser x**2.
  2. x1 Et x2 Sont terriblement trompeurs (pour moi), surtout si vous déclarez que x2 Doit être sur l'axe des y.
  3. (Merci à Dux) Vous pouvez ajouter plt.gca().set_aspect('equal') pour donner à la figure un aspect réellement circulaire, en rendant l'axe égal.
9
Bas Jansen

La solution de @BasJansen vous y mène certainement, elle est soit très inefficace (si vous utilisez plusieurs points de grille) soit inexacte (si vous n'utilisez que peu de points de grille).

Vous pouvez facilement dessiner le cercle directement. Étant donné 0 = x1**2 + x**2 - 0.6, Il s'ensuit que x2 = sqrt(0.6 - x1**2) (comme l'a dit Dux).

Mais ce que vous voulez vraiment faire, c'est transformer vos coordonnées cartésiennes en coordonnées polaires.

x1 = r*cos(theta)
x2 = r*sin(theta)

si vous utilisez ces sous-positions dans l'équation circulaire, vous verrez que r=sqrt(0.6).

Alors maintenant, vous pouvez l'utiliser pour votre intrigue:

import numpy as np
import matplotlib.pyplot as plt

# theta goes from 0 to 2pi
theta = np.linspace(0, 2*np.pi, 100)

# the radius of the circle
r = np.sqrt(0.6)

# compute x1 and x2
x1 = r*np.cos(theta)
x2 = r*np.sin(theta)

# create the figure
fig, ax = plt.subplots(1)
ax.plot(x1, x2)
ax.set_aspect(1)
plt.show()

Résultat:

enter image description here

13
hitzg

Que diriez-vous de dessiner des valeurs x et de calculer les valeurs y correspondantes?

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100, endpoint=True)
y = np.sqrt(-x**2. + 0.6)

plt.plot(x, y)
plt.plot(x, -y)

produit

enter image description here

Cela peut évidemment être rendu beaucoup plus agréable, mais ce n'est que pour la démonstration ...

5
Dux
# x**2  + y**2 = r**2
r = 6
x = np.linspace(-r,r,1000)
y = np.sqrt(-x**2+r**2)
plt.plot(x, y,'b')
plt.plot(x,-y,'b')
plt.gca().set_aspect('equal')
plt.show()

produit:

enter image description here

2
chen_767