2017-05-17 2 views
1

En utilisant Matplotlib, comment tracer les équations algébriques suivantes en 3D? Aimeriez-vous visualiser l'intersection de 3 plans.Utilisation de Matplotlib pour tracer des équations algébriques

x - y + 2z = 5 

    y - z = -1 

     z = 3 
+1

On l'appelle * matplotlib * not * mat ** h ** plotlib * - ce qui signifie qu'il ne trace pas de fonctions mathématiques. Vous devrez calculer des valeurs discrètes de paires (x, y, z) pour les tracer. Alternativement, jetez un coup d'œil au [module de traçage de sympy] (http://docs.sympy.org/dev/modules/plotting.html) qui peut être plus proche de ce que vous voulez réaliser. – kazemakase

+1

J'ai toujours pensé que matplotlib est synonyme de bibliothèque de traçage mathématique. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Juste pour clarifier, le PO orthographié à l'origine matplotlib avec h. J'ai plutôt pensé qu'il portait le nom de Matlab, qui est un abréviation de * matrix laboratory *. – kazemakase

Répondre

2

Les équations doivent être présentées sous une forme fermée à tracer avec du matplotlib. C'est relativement facile pour ces équations de la question.
On peut alors utiliser un meshgrid en 2 dimensions pour calculer les valeurs de la dimension manquante selon les équations. Maintenant, ayant des valeurs pour toutes les 3 dimensions, nous pouvons utiliser un plot_surface pour tracer les plans.

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 


z1 = lambda x,y: 5./2.-x/2.+y/2. # x - y + 2z = 5 
z2 = lambda x,y: y+1    #  y - z = -1 
z3 = lambda x,y: 3.*np.ones_like(x) #   z = 3 

x = np.arange(-3,3) 
X,Y = np.meshgrid(x,x) 


fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_xlabel("x"); ax.set_ylabel("y"); ax.set_zlabel("z") 


surf = ax.plot_surface(X, Y, z1(X,Y), color="C1", linewidth=0, shade=False) 
surf = ax.plot_surface(X, Y, z2(X,Y), color="C2", linewidth=0, shade=False) 
surf = ax.plot_surface(X, Y, z3(X,Y), color="C3", linewidth=0, shade=False) 


plt.show() 

enter image description here

Les avions ne semblent pas recouper, qui est due à Matplotlib ne pas être un véritable moteur de rendu 3D.

+0

Merci! C'est exactement ce que je cherchais. N'importe quelle raison n'étant pas un vrai moteur de rendu 3D? Je vois des exemples 3D plus complexes dans leur galerie. – Godekere

+1

Les artistes dans une intrigue 3D sont simplement projetés sur l'espace 2D. Cela signifie qu'un artiste est devant ou derrière un autre, mais pas partiellement devant et partiellement derrière. La seule façon de résoudre cela dans matplotlib serait de diviser l'avion en deux sections en fonction de l'angle de vue. – ImportanceOfBeingErnest

+1

Avec ordinateur portable% matplotlib et en utilisant alpha = 0.5 dans tous les plot_surface .... par exemple :. ax.plot_surface (X, Y, z1 (X, Y), alpha = 0.5, rstride = 100, cstride = 100), je peux changer l'angle de vue pour voir l'intersection des avions dans le carnet de Jupyter et tous les plans se croisent point – Godekere