2017-06-27 1 views
0

J'utilise l'interface Spyder (Python 2.7) pour résoudre numériquement les PDE. J'ai le code mis à l'endroit où U est calculé par rapport à la position et l'heure. U est une matrice [nxm] dans mon code où n est la position et m est le temps. Ainsi, à chaque U [n, m], le code donne une énième position à une énième fois. Y a-t-il un moyen de faire usage d'une telle matrice pour créer un tracé de maillage en python. J'ai cherché, mais par exemple la grille de maillage de numpy ne traite que des tableaux. Je vous remercie.Tracer un Meshgrid 3D:

[[ 1.20643447 1.20520185 1.20397894 ..., 1.04589795 1.04587534 1.04585286] 
[ 1.40901699 1.40658211 1.4041664 ..., 1.09172525 1.09168043 1.09163586] 
[ 1.6039905 1.6004133 1.59686428 ..., 1.13741248 1.13734625 1.1372804 ]..., 
[ 2.3960095 2.3995867 2.40313572 ..., 2.54969453 2.55003659 2.55037764] 
[ 2.59098301 2.59341789 2.57981471 ..., 2.59750546 2.59785406 2.59820163] 
[ 2.79356553 2.74473913 2.71231633 ..., 2.64640578 2.64675767 2.64710852]] 

Ce sont les nombreuses valeurs pour U le shell crache à moi. Comme vous pouvez le voir, je traiterais 600 tableaux différents parce que la matrice est configurée pour trouver U à un moment et dans une position spécifiques. Prendre un total de 600 pas de temps. This is a example of a type of graph that I am trying to reproduce.

+1

Y at-il une raison que vous ne pouvez pas, avant le traçage, convertir la matrice à un tableau, avec 'np.asarray (U)' 'ou np.array (U)'? – EFT

Répondre

3

Merci d'essayer d'utiliser la fonction de recherche; vous pouvez trouver le code de travail here parmi beaucoup d'autres fils sur les surfaces de traçage ici sur débordement.


Je pense que vous pourriez avoir un peu de terminologie ici. Vous avez une matrice de valeurs qui correspondent aux valeurs d'une fonction de deux dimensions; ce n'est pas un meshgrid. Dans matplotlib, vous pouvez visualiser une matrice tridimensionnelle d'un certain nombre de façons, typiquement surface, wireframe ou image (en tant que heatmap). La fonction np.meshgrid() vous donne N -dimensional indices. Vous avez besoin de ceci pour vos vecteurs n et m, pas votre matrice U, pour les transformer en tableaux multidimensionnels de la même forme que votre matrice. Heureusement pour vous, matplotlib ne se soucie pas de savoir si U est une matrice ou un vecteur.

Par exemple avec np.meshgrid():

>>> t = np.linspace(0,60,6000) 
>>> x = np.linspace(0,2*np.pi,3600) 
>>> T, X = np.meshgrid(t, x) 
>>> t.shape 
(6000,) 
>>> x.shape 
(3600,) 
>>> T.shape 
(3600, 6000) 
>>> X.shape 
(3600, 6000) 

Et maintenant pour créer une fonction U(x,t):

>>> U = np.matrix(x[:, np.newaxis] * t) # broadcast 
>>> U.shape 
(3600, 6000) 

Et pour tracer la surface, vous pouvez utiliser la fonction surf dans Axes3D de matplotlib par exemple, mais vous pouvez également utiliser la méthode filaire ou image liée ci-dessus.

>>> import matplotlib.pyplot as plt 
>>> import pylab 
>>> from mpl_toolkits.mplot3d import Axes3D 

>>> fig = plt.figure() 
>>> ax = fig.gca(projection='3d') 
>>> surf = ax.plot_surface(X,T,U) 
>>> plt.show() 

Surface plot

+0

Donc dans mon cas. Je peux juste mettre U dans le graphique de surface 3D avec pyplot même si c'est un tableau à deux dimensions, il devrait encore fonctionner? Parce que après avoir défini mon maillage pour X et T, j'ai obtenu une erreur de valeur de discordance de forme. En incluant U. –

+0

Vous avez probablement juste 'X' et' T' en arrière dans votre tableau --- Je n'étais pas particulièrement fidèle à votre tableau exact. Il suffit d'imprimer les formes comme vous l'avez fait, et vous serez plus à l'aise avec les relations entre les formes numériques. C'est un peu déroutant au début, mais surtout intuitif. Vous voulez que les meshgrids aient la même forme que votre matrice. –

+0

Vous aviez raison, j'ai vérifié les formes de U, X et T et ils ne fonctionnaient pas correctement. Puis j'ai changé le format meshgrid, et cela a parfaitement fonctionné. Merci de votre aide. –