2013-05-30 5 views
0

Я пытаюсь выполнить итеративный расчет в python с использованием метода конечных разностей. Я нашел метод конечных разностей от этого:Poton Iterative Loop Plot values ​​

http://depa.fquim.unam.mx/amyd/archivero/DiferenciasFinitas3_25332.pdf

Значения, что код вычисляет правильны. Проблема в том, что она отображает только конечные значения. Я хочу, чтобы извлечь значения для любой точки в направлении x, чтобы я мог их строить, а также извлекать значения в любой момент времени, например, значения точек на полпути через вычисления. Правильно ли это сделать итеративный расчет? Код показан ниже:

import numpy as np 
import scipy as sp 
import time 
import matplotlib as p 
L=0.005 
Nx=3 
T=5 
N1=5 
k=0.5 
rho=1200 
c=1000 
a=(k/(rho*c)) 
x = np.linspace(0, L, Nx+1) # mesh points in space 
dx = x[1] - x[0] 
t = np.linspace(0, T, N1) # time 
dt = t[1] - t[0] 
toutside=5 
Coefficient = a*dt/dx**2 
bi=0.5 
ui = sp.zeros(Nx+1) 
u = sp.zeros(Nx+1) 
for i in range(Nx+1): 
    ui[i] = 50 # initial values 

for n in range(0, N1): 

    for i in range(0,1): 
     u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i] 
    for i in range(1,Nx): 
     u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i] 
    for i in range(Nx,Nx+1): 
     u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i] 
     ui[:]= u #updates matrix for next loop 
print ui 

Я изменил мой код на основе danodonovan ответ:

for n in range(0, N1): 

for i in range(0,1): 
    u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i] 
for i in range(1,Nx): 
    u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i] 
for i in range(Nx,Nx+1): 
    u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i] 
    ui=u 
    a=list(ui) 

print a 

Когда я пытаюсь взять весь список из петли, только конечные значения производятся. Как извлечь весь список? Правильно ли это сделать итеративный расчет, используя значения предыдущей строки для вычисления значений новой строки?

ответ

0

Для стартера отступа print ui, чтобы увидеть значения ui для всех N1. Затем добавить свои результаты в списке:

res = [] 
for n in range(0, N1): 

    for i in range(0,1): 
     u[i] = 2*Coefficient*(ui[i+1]+bi*toutside)+(1-2*Coefficient-2*bi*Coefficient)*ui[i] 
    for i in range(1,Nx): 
     u[i] = Coefficient*(ui[i+1]+ui[i-1])+(1-2*Coefficient)*ui[i] 
    for i in range(Nx,Nx+1): 
     u[i] = 2*Coefficient*(ui[i-1])+(1-2*Coefficient)*ui[i] 
     ui[:]= u #updates matrix for next loop 
    print ui 
    res.append(ui.copy()) 

print res 

Производит этот результат:

[array([ 41.5625, 50. , 50. , 50. ]), 
array([ 37.87109375, 48.41796875, 50.  , 50.  ]), 
array([ 35.6628418 , 46.73706055, 49.70336914, 50.  ]), 
array([ 34.06639099, 45.21682739, 49.20280457, 49.88876343]), 
array([ 32.79785633, 43.87349129, 48.58405113, 49.63152885])] 
+0

Я попробовал вас, но он произвел только последнюю строку итерации. – Jay

+0

Конечно, вы запишете массив на каждом шаге. Добавление '.copy()' делает трюк. Подсказка: вы действительно должны взглянуть на учебник NumPy и научиться работать с целыми массивами. Ваш код может быть значительно улучшен. –

+0

Это работает для вас? –

0

(Если я правильно понимаю ваш вопрос) Использование matplotlib вы можете сделать

import matplotlib as p 

# and after your loop has completed 

p.pyplot.plot(range(0, N1), ui, 'o-') 
p.pyplot.show() 

получить простой график ваших данных u против range(0, N1).

Я не знаю, что вы ожидаете ui быть ui[:]= u нечетная вещь, чтобы делать - он устанавливает копию ui в u, но не сохранить копию ui, что ui[:] производит.

Подсказка: думать о ui[:] как же, как list(ui)

+0

Я изменил мой код: – Jay

+0

Я не уверен, что это то, что вы хотите, либо, каждый раз, когда вы перебирать ваш последний цикл, вы переписываете 'a' – danodonovan