Не удается выполнить итерацию списка с помощью цикла for для моих значений

#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. Возможно, это было бы более полезно для вас.