2016-07-08 8 views
0

Я пытаюсь реализовать конечно-разностную аппроксимацию для решения уравнения тепла, u_t = k * u_{xx}, в Python с использованием NumPy.ValueError: x и y должны иметь такое же первое измерение

Вот копия кода я бегу:

## 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 

# parameters  
L = 1 # legnth of the rod 
T = 10 # terminal time 
N = 10 
M = 100 
s = 0.25 

# 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 

# Boundary Conditions 
for m in xrange(0, M): 
    t[m] = m * dt 

# Initial Conditions 
for j in xrange(0, N): 
    x[j] = j * dx 

# definition of 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**2 #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 
     else: 
      u[j,m+1] = u[j,m] + s * (u[j+1,m] - 
      2 * u[j,m] + u[j-1,m]) 

print u, #t, x 
plt.plot(u, t) 
#plt.show() 

Я думаю, что мой код работает правильно, и это производит выход. Я хочу построить вывод решения u по сравнению с t (мой временной вектор). Если я смогу построить график, то я смогу проверить, согласуется ли мое числовое приближение с ожидаемыми явлениями для уравнения тепла. Тем не менее, я получаю ошибку, что «x и y должны иметь одно и то же первое измерение». Как я могу исправить эту проблему?

Дополнительный вопрос: мне лучше сделать анимацию с matplotlib.animation вместо matplotlib.plyplot ???

Большое спасибо за любую помощь! Это очень ценится!

+1

С проблемами python, как правило, неплохо показать полную трассировку стека. В противном случае люди должны вывести/угадать, какая строка кода и при каких обстоятельствах происходит ошибка. – John1024

+0

Ошибка возникает только при запуске строки 'plt.plot (u, t)'. Если я удалю эту строку, тогда код выполнит и напечатает значение для 'u'. – Javier

+0

Также компилятор производит это: 'if x.shape [0]! = Y.shape [0]: raise ValueError (« x и y должны иметь такое же первое измерение »)' – Javier

ответ

0

Хорошо, так что я был «дамп мозга» и пытался черчения ut Vs. рода забывая, что u, являясь решением уравнения теплопроводности (u_t = k * u_{xx}), определяется как u(x,t) поэтому имеет значение времени. Я внесла следующую поправку в мой код:

print u #t, x 
plt.plot(u) 
plt.show() 

И теперь мое программирование наконец-то отображает изображение. И вот оно:

enter image description here Это абсолютно красиво, не так ли?

Смежные вопросы