Вложенные функции: расчёт выполняется только частично

Al Frolov

Новичок
Пользователь
Фев 20, 2022
20
3
3
Добрый вечер!

Ниже блок моего кода, выполненный в виде вложенных функций. Итерации задействуют не все строки - только 14-16, поэтому результат я не получаю. Мне нужно, чтобы были выполнены итоговые строки - 36-50.
В цикле перебираю значения переменных для момента времени t0. Затем эти значения используются в функции "fr" (они составляют вектор начальных условий yay0, который необходим для solve_ivp - строка 35). Если это неправильная стратегия, то как должен быть построен блок?
Буду просто счастлив, если подскажите, в чём проблема и как её решить.

Python:
y30 = [-0.593, -0.628]
y40 = 5000
y50 = [-0.05, -0.07]
y60 = [1.1, 1.6]
y70 = [1.2, 1.7]
y90 = [0, 1]
tf = 7
t0 = 0
hr = 0.00001

step = -0.01
for y30_ in np.arange(y30[0], y30[1], step):
    y00_ = function_vr(ph0b, et0, y30_)
    y10_ = function_vn(ph0b, et0, y30_)
    y20_ = function_o(ph0, et0, y30_)
    
    for y50_ in np.arange(y50[0], y50[1], step):
      
      for y60_ in np.arange(y60[1], y60[0], step):
        
        for y70_ in np.arange(y70[1], y70[0], step):
          y80_ = funct_labt(y30_, y60_, y70_, y50_)
          
          for y90_ in np.arange(y90[1], y90[0], step):
            ksi0_ = function_propulsion(y40, y50_, y60_, y90_, ptb, mqb)
            deo0_ = function_deo(y40, y50_, y60_, y90_, ptb, mqb, pes)
              
            def fr(t, yay, phb, et, ptb, mqb, pes):
                y0, y1, y2, y3, y4, y5, y6, y7, y8, y9 = yay
                dy0dt = ptb / y4 * y5 / sqrt(y5**2 + y6**2) * function_deo(y4, y5, y6, y9, ptb, mqb, pes) - 1 / y2**2 + y1**2 / y2
                dy1dt = ptb / y4 * y6 / sqrt(y5**2 + y6**2) * function_deo(y4, y5, y6, y9, ptb, mqb, pes) - y0 * y1 / y2
                dy2dt = sqrt(1 / phb) * et * sin(y3)
                dy3dt = (sqrt(1 / phb) * (1 + et * cos(y3))) / (phb / (1 + et * np.cos(y3)))
                dy4dt = -mqb * function_deo(y4, y5, y6, y9, ptb, mqb, pes)
                dy5dt = y6 * y1 / y2 - y7
                dy6dt = -y5 * 2 * y1 / y2 + y6 * y0 / y2 - y8 * 1 / y2
                dy7dt = y5 * (-2 / y2**3 + y1**2 / y2**2) + y6 * (-y0 * y1) / y2 + y8 * y1 / y2**2
                dy8dt = 0
                dy9dt = ptb / y4**2 * (sqrt(y5**2 + y6**2)) * function_deo(y4, y5, y6, y9, ptb, mqb, pes)
                return dy0dt, dy1dt, dy2dt, dy3dt, dy4dt, dy5dt, dy6dt, dy7dt, dy8dt, dy9dt
              
                step = 0.01
                t0, tf = 0, 7
                yay0 = y00_, y10_, y20_, y30_, y40, y50_, y60_, y70_, y80_, y90_
                soln = solve_ivp(fr, (t0, tf), yay0, method='Radau',  args=(ph0b, et0, ptb, mqb, pes))
                print(soln.nfev, 'evaluations required.')
                print(f"y0_(t0, tf), y1_(t0, tf), y2_(t0, tf), y3_(t0, tf), y4_(t0, tf), y5_(t0, tf), y6_(t0, tf), y7_(t0, tf), y8_(t0, tf), y9_(t0, tf), ksi_(t0, tf) = {ksi0_(t0, tf)}, deo0_(t0, tf) = {deo0_(t0, tf)}")
                  
                for it in range(12):
                  plt.plot(soln.t, soln.y[0], label='[Vr]')
                  plt.plot(soln.t, soln.y[1, 11], label='[Vn]')
                  plt.plot(soln.t, soln.y[2, 12], label='[r]')
                  plt.plot(soln.t, soln.y[3, 13], label='[betta]')
                  plt.plot(soln.t, soln.y[4, 14], label='[mt]')
                  plt.plot(soln.t, soln.y[5, 15], label='[l_Vr]')
                  plt.plot(soln.t, soln.y[6, 16], label='[l_Vn]')
                  plt.plot(soln.t, soln.y[7, 17], label='[l_r]')
                  plt.plot(soln.t, soln.y[8, 18], label='[l_betta]')
                  plt.plot(soln.t, soln.y[9, 19], label='[l_mt]')
                  plt.plot(function_deo(y4, y5, y6, y9, ptb, mqb, pes), label='[deo]')
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
ты используешь return в центре функции, завершая ее и не давая коду после return выполниться
 

Al Frolov

Новичок
Пользователь
Фев 20, 2022
20
3
3
ты используешь return в центре функции, завершая ее и не давая коду после return выполниться
Спасибо, уберу. В то же время вижу, что выполнение до return не доходит. Функция fr вообще не задействована. Есть ли ещё предположение, что не так?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
А ты вроде ее не вызываешь (ну только в ней же)
 

Al Frolov

Новичок
Пользователь
Фев 20, 2022
20
3
3
А ты вроде ее не вызываешь (ну только в ней же)
Как вызвать?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Python:
# Создание функции
# При ее создании код в ней не выполняется
def func(a, b):
    print(a + b)

# Вызов функции
# Выполнится код в функции
func(1, 3)  # 4
 
  • Мне нравится
Реакции: Al Frolov

Форум IT Специалистов