2016-07-08 10 views
0

Ich versuche eine Finite-Differenzen-Approximation zu implementieren, um die Heat-Gleichung u_t = k * u_{xx} in Python mit NumPy zu lösen.ValueError: x und y müssen die gleiche erste Dimension haben

Hier ist eine Kopie des Codes bei mir läuft:

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

Ich glaube, mein Code richtig funktioniert, und es wird eine Ausgabe erzeugt. Ich möchte die Ausgabe der Lösung u gegenüber t (mein Zeitvektor) plotten. Wenn ich das Diagramm plotten kann, dann kann ich überprüfen, ob meine numerische Approximation mit den erwarteten Phänomenen für die Wärmegleichung übereinstimmt. Allerdings bekomme ich den Fehler, dass "x und y die gleiche erste Dimension haben müssen". Wie kann ich dieses Problem beheben?

Eine zusätzliche Frage: Bin ich besser dran, eine Animation mit matplotlib.animation statt matplotlib.plyplot zu machen ???

Vielen Dank für jede Hilfe! Es wird sehr geschätzt!

+1

Bei Python-Problemen ist es in der Regel eine gute Idee, den kompletten Stack-Trace anzuzeigen. Andernfalls müssen die Leute ableiten/erraten, welche Codezeile und unter welchen Umständen der Fehler auftritt. – John1024

+0

Der Fehler tritt nur auf, wenn ich die Zeile 'plt.plot (u, t)' führe. Wenn ich diese Zeile entferne, führt der Code aus und gibt den Wert für "u" aus. – Javier

+0

Auch der Compiler erzeugt dies: 'if x.shape [0]! = Y.shape [0]: raise ValueError (" x und y müssen dieselbe erste Dimension haben ")' – Javier

Antwort

0

Okay, so hatte ich ein „brain dump“ und versuchte u vs. t Art zu vergessen, dass u, wobei die Lösung der Wärmeleitungsgleichung (u_t = k * u_{xx}) Plotten, wie u(x,t) definiert ist, so hat es Werte für die Zeit. Ich habe die folgende Korrektur zu meinem Code gemacht:

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

Und jetzt meine Programmierung zeigt schließlich ein Bild. Und hier ist es:

enter image description here Es ist absolut schön, nicht wahr?

Verwandte Themen