#python #loops #jupyter-notebook #physics #differential-equations
#python #циклы #jupyter-ноутбук #физика #дифференциальные уравнения
Вопрос:
Итак, это функция, которая у меня есть для решения типа стоячей волны для генерации текущего u:
def standing_wave_solution(t,nx,mx,my,x,y):
dx = (1/nx-1)
w = math.pi*(math.sqrt((mx**2) (my**2)))
un = math.sin(mx*math.pi*x)*math.sin(my*math.pi*y)*math.cos(w*t)
ui1 = math.sin(mx*math.pi*x-1)*math.sin(my*math.pi*y)*math.cos(w*t)
ui2 = math.sin(mx*math.pi*x 1)*math.sin(my*math.pi*y)*math.cos(w*t)
uj1 = math.sin(mx*math.pi*x)*math.sin(my*math.pi*y-1)*math.cos(w*t)
uj2 = math.sin(mx*math.pi*x)*math.sin(my*math.pi*y 1)*math.cos(w*t)
uprev = un-((-4*un) (ui1) (uj1) (ui2) ((uj2)/(dx**2)))
return uprev,un
И затем я пытаюсь применить эту функцию для вычисления одного временного шага волны, заданного псевдокодом:
Итак, мое решение для реализации этого с использованием предыдущей функции standing_wave_solution заключается в следующем:
def one_time_step(t,mx,my,nx,ny,alpha):
x=np.linspace(0,1,nx)
y=np.linspace(0,1,ny)
unext = np.zeros([nx,ny])
l = np.zeros([nx,ny])
dx = (1/nx-1)
dy = (1/ny-1)
dt = (alpha*dx)/(math.sqrt(2))
for i in range(nx-1):
for j in range(ny-1):
uprev,ucur = standing_wave_solution(t,nx,mx,my,x[i],y[j])
if (i==0 or i == nx-1 or j==0 or j == ny-1):
unext[i][j]=0
else:
l = (-4*ucur[i][j]) (ucur[i-1][j]) (ucur[i][j-1]) (ucur[i 1][j]) ((ucur[i][j 1])/(dx**2))
unext[i][j] = (-1*uprev[i][j]) (2*ucur[i][j]) ((dt**2)*(l))
return next
one_time_step(4,4,4,4,4,1)
И когда я запускаю его, я получаю следующую ошибку:
TypeError Traceback (most recent call last)
<ipython-input-152-8ddbe6456bbd> in <module>
21
22
---> 23 one_time_step(4,4,4,4,4,1)
<ipython-input-152-8ddbe6456bbd> in one_time_step(t, mx, my, nx, ny, alpha)
16 unext[i][j]=0
17 else:
---> 18 l = (-4*ucur[i][j]) (ucur[i-1][j]) (ucur[i][j-1]) (ucur[i 1][j]) ((ucur[i][j 1])/(dx**2))
19 unext[i][j] = (-1*uprev[i][j]) (2*ucur[i][j]) ((dt**2)*(l))
20 return unext
TypeError: 'float' object is not subscriptable
В основном все, что я пытаюсь сделать, это использовать мой вложенный цикл for, который продолжается до nx и ny, чтобы установить. значения uprev и ucur с этим конкретным индексом ‘i’ и ‘j’, чтобы я мог сгенерировать кучу неустановленных значений и сохранить их в матрице.
Комментарии:
1. ucur — это число, и вы говорите ucur[i] [j]
2. Согласен с @bilke, ваша переменная ucur выглядит как плавающая. Вы пробовали его распечатать?
3. В частности
ucur
, исходит изmath.sin(mx*math.pi*x)*math.sin(my*math.pi*y)*math.cos(w*t)
того, что на самом деле является просто числом.4. Из памяти, я думаю, если бы вы использовали для этого numpy, приведенное выше выражение for
ucur
также возвращало бы массив, еслиt
илиy
илиx
также является массивом numpy. Возможно, это было бы более полезно для вас.