Постройте поверхность вместо параметрической кривой

Я работаю над использованием схемы прямой разности для численного решения функции диффузии в одном измерении. Мой окончательный график решения должен быть поверхностью, на которой решение u(x,t) нанесено на сетку значений x и t. У меня проблема решена, но я не могу отобразить данные в виде сетки.

Я могу придумать 2 способа исправить это:

1.) Мои массивы x и t должны быть одномерными, а массив u должен быть двумерным. В конечном счете, я хочу квадратную матрицу для вас, но мне трудно ее кодировать. В настоящее время у меня есть массив 1D для вас. Вот код, где u заполняется.

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.) Приведенный выше код возвращает одномерный массив для u. Есть ли способ построить трехмерную поверхность с тремя одномерными массивами для x, y, z?


person peasqueeze    schedule 05.05.2016    source источник


Ответы (1)


Ну... вы не предоставили много информации. Например, вы сказали, что вам нужен график x, y, z, но не сказали, какими должны быть x, y и z в контексте вашего графика. Также z обычно представляет собой z(x,y).

В следующем рецепте предполагается, что t, x и u(t,x) являются переменными, которые должны быть помещены в поверхность. Я предполагаю, что это не совсем ваша идея, но она должна быть адаптирована к вашему упражнению:

EDIT: Также в вашем коде (который находится в функции computeU в этом рецепте) был цикл для Nt, который, похоже, ничего не делает. Я удалил его для целей этого примера.

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()

Обратите внимание, как я использовал meshgrid для создания новых t,x (из одномерных массивов) для сопоставления с вашим стеком массивов U (которые будут иметь ту же форму, что и X,Y — новые t,x). Результат таков:

Поверхность, построенная из нескольких одномерных массивов

person armatita    schedule 05.05.2016