2016-05-05 1 views
0

Je travaille sur l'utilisation du principe de différence directe pour résoudre numériquement la fonction de diffusion dans une dimension. Mon tracé final de la solution devrait être une surface où la solution u (x, t) est tracée sur une grille de valeurs x et t. J'ai le problème résolu, mais je ne peux pas obtenir les données à tracer avec la représentation de la grille.Surface du tracé au lieu de la courbe paramétrique

je peux penser à 2 façons de résoudre ce:

1.) Mes tableaux x et t doivent être une dimension, mais mon tableau u devrait être un tableau 2D. En fin de compte, je veux une matrice carrée pour vous, mais j'ai du mal à coder cela. Actuellement, j'ai un tableau 1D pour vous. Voici le code où vous êtes peuplé.

u = zeros(Nx+1)   # unknown u at new time level 
u_1 = zeros(Nx+1)   # u at the previous time level 
# Set initial condition u(x,0) = I(x) 
for i in range(0, Nx+1): 
#set initial u's to I(xi) 
    u_1[i] = 25-x[i]**2 
for n in range(0, Nt): 
# Compute u at inner mesh points 
    for i in range(1, Nx): 
     u[i] = u_1[i] + F*(u_1[i-1] - 2*u_1[i] + u_1[i+1]) 

2.) Le code ci-dessus renvoie un tableau 1D pour u, est-il possible de tracer une surface 3D avec trois tableaux 1D pour x, y, z?

Répondre

0

Eh bien ..., il y a beaucoup d'informations que vous n'avez pas fournies. Par exemple, vous avez dit que vous vouliez un tracé x, y, z, mais n'avez pas dit ce que les x, y et z devraient être dans le contexte de votre intrigue. De plus, z est typiquement z (x, y).

La recette suivante suppose un t et x, et u(t,x) comme variables à mettre dans une surface. J'imagine est pas exactement votre idée, mais il devrait être adaptable à votre exercice:

EDIT: également votre code (qui est dans la fonction computeU dans cette recette) avait une boucle pour Nt qui ne semble rien faire . Je l'ai supprimé pour les besoins de cet exemple.

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

def computeU(Nx,x,F,Nt): 
    u = np.zeros(Nx+1)   # unknown u at new time level 
    u_1 = np.zeros(Nx+1)   # u at the previous time level 
    # Set initial condition u(x,0) = I(x) 
    for i in range(0, Nx+1): 
    #set initial u's to I(xi) 
     u_1[i] = 25-x[i]**2 
    #for n in range(0, Nt): # I'm not sure what this is doing. It has no effect. 
    # Compute u at inner mesh points 
    for i in range(1, Nx): 
     u[i] = u_1[i] + F*(u_1[i-1] - 2*u_1[i] + u_1[i+1]) 
    return np.hstack((u[:,np.newaxis],u_1[:,np.newaxis])) 

Nx = 10 
F = 3 
Nt = 5 
x = np.arange(11) 
t = np.arange(2) 

X,Y = np.meshgrid(t,x) 
Z = computeU(Nx,x,F,Nt) 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,linewidth=0, antialiased=False) 
plt.show() 

Remarquez comment je l'ai utilisé meshgrid pour construire de nouvelles t, x (de tableaux 1D) pour être mis en correspondance contre votre pile de U tableaux (qui ont la même forme de X, Y - la nouvelle t, x). Le résultat est le suivant:

Surface built from several 1D arrays