2016-07-12 5 views
1

Ich versuche, eine 3D-Oberfläche zu plotten, aber ich habe einige Probleme, weil die Dokumentation für matplotlib nicht sehr gründlich scheint und in Beispielen fehlt. Wie auch immer das Programm, das ich geschrieben habe, ist es, die Wärmegleichung numerisch über die Methode der endlichen Unterschiede zu lösen. Hier ist mein Code:Erstellen eines 3D-Oberflächendiagramms mit Matplotlib in Python

## This program is to implement a Finite Difference method approximation 
## to solve the Heat Equation, u_t = k * u_xx, 
## in 1D w/out sources & on a finite interval 0 < x < L. The PDE 
## is subject to B.C: u(0,t) = u(L,t) = 0, 
## and the I.C: u(x,0) = f(x). 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 

# Parameters  
L = 1 # length of the rod 
T = 10 # terminal time 
N = 40 # spatial values 
M = 1600 # time values/hops; (M ~ N^2) 
s = 0.25 # s := k * ((dt)/(dx)^2) 

# uniform mesh 
x_init = 0 
x_end = L 
dx = float(x_end - x_init)/N 

x = np.arange(x_init, x_end, dx) 
x[0] = x_init 

# time discretization 
t_init = 0 
t_end = T 
dt = float(t_end - t_init)/M 

t = np.arange(t_init, t_end, dt) 
t[0] = t_init 

# time-vector 
for m in xrange(0, M): 
    t[m] = m * dt 

# spatial-vector 
for j in xrange(0, N): 
    x[j] = j * dx 

# definition of the solution u(x,t) to u_t = k * u_xx 
u = np.zeros((N, M+1)) # array to store values of the solution 

# Finite Difference Scheme: 

u[:,0] = x * (x - 1) #initial condition 

for m in xrange(0, M): 
    for j in xrange(1, N-1): 
     if j == 1: 
      u[j-1,m] = 0 # Boundary condition 
     elif j == N-1: 
      u[j+1,m] = 0 # Boundary Condition 
     else: 
      u[j,m+1] = u[j,m] + s * (u[j+1,m] - 
      2 * u[j,m] + u[j-1,m]) 

Das ist das, was ich geschrieben habe, um zu versuchen, und zeichnen ein 3D-Oberflächendiagramm:

# for 3D graph 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
surf = ax.plot_surface(x, t, u, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.show() 

ich diese Störung erhalte, wenn ich den Code ausführen, um die Grafik zu zeichnen: " ValueError: Formkonflikt: Zwei oder mehr Arrays haben auf Achse 1 inkompatible Dimensionen. "

Bitte, jede und alle Hilfe ist sehr gut geeignet. Ich denke, der Fehler kommt auf, weil ich u als Nx(M+1) Matrix definiert habe, aber es ist notwendig, das ursprüngliche Programm auszuführen. Ich bin mir nicht sicher, wie ich das korrigieren kann, damit die Grafik korrekt dargestellt wird. Vielen Dank!

Antwort

1

Verwenden Sie diesen Code (bei den Kommentaren sehen):

# plot 3d surface 
# create a meshgrid of (x,t) points 
# T and X are 2-d arrays 
T, X = np.meshgrid(t,x) 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
# Use X and T arrays to plot u 
# shape of X, T and u must to be the same 
# but shape of u is [40,1601] and I will skip last row while plotting 
surf = ax.plot_surface(X, T, u[:,:1600], rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.show() 

Ergebnis:

enter image description here

because the documentation for matplotlib does not appear to be very thorough and is lacking in examples

http://matplotlib.org/examples/mplot3d/index.html

2

Es ist hilfreich, aus den Formen der Variablen drucken x, t und u:

x.shape == (40,) 
t.shape == (1600,) 
u.shape == (40, 1601) 

So gibt es hier zwei Probleme. Die erste ist, dass x und t 1-dimensional sind, obwohl sie 2-dimensional sein müssen. Und die zweite ist, dass u ein Element mehr als t in der zweiten Dimension hat. Sie können sowohl fix von

t, x = np.meshgrid(t, x) 
u = u[:,:-1] 

, bevor Sie die 3D-Plot-Erstellung.

+0

Vielen Dank, das hat den Trick gemacht – Javier

Verwandte Themen