TypeError, используя словарь для математики в цикле FOR - Но почему? - PullRequest
0 голосов
/ 27 сентября 2019

Итак, цель здесь - оценить длинный ряд уравнений, которые меняются в зависимости от высоты, и, наконец, объединить их в самом конце.Конечная цель - приблизить интеграцию с учетом высоты (эта часть еще находится в разработке).Прямо сейчас мне просто нужно, чтобы последнее уравнение здесь работало.

Я получаю «TypeError: не могу умножить последовательность на не-int типа 'float'", ссылаясь на попытку оценить "а5 "как последний шаг здесь.Я могу только предположить, что это проблема с итерацией по словарю d_gamox (который представляет собой серию пар int: float), но, сделав что-то подобное в другом месте без проблем, я совершенно сбит с толку.Может быть, я просто так долго смотрю на этот код, что мне не хватает чего-то очевидного, так что вы, ребята, думаете?

(Также я уверен, что этот код беспорядок, но ему просто нужноработа ...)

import numpy as np
from math import exp, sin, cos, sqrt


theta = 1 #Elevation angle in degrees
f = 1000 #Frequency in MHz
r = 200 #Range to target in km
h_ant = 100 #Height of antenna + terrain in m

###############

#Constants
r_0 = 6370 #radius of Earth in km
T_0 = 300 #Sea-level temp in K
P_0 = 1013.25 #Sea-level pressure in mbar
N_s = 313 #Avg sea-level refractivity
C_e = 0.1439  #constant for refractivity
C = 2.0058 #for Gam_ox

alpha = 5.2561222 #constants for pressure
beta = 0.034164794
gamma = 11.388265

f_r = 22.235 #for water vapor

rad = np.radians(theta) #Elevation angle in rad
r_m = r * 1000 #Range in meters
f_GHz = f / 1000 #Frequency in GHz
h_ant_km = h_ant/1000 #Antenna height in km
n_0 = 1 + (N_s / (10**6)) #Refractive index

###############

d_gamox = {}
d_fNp = {
    1 : 56.2648,
    3 : 58.4466,
    5 : 59.5910,
    7 : 60.4348,
    9 : 61.1506,
    11 : 61.8002,
    13 : 62.4112,
    15 : 62.9980,
    17 : 63.5685,
    19 : 64.1272,
    21 : 64.6779,
    23 : 65.2240,
    25 : 65.7626,
    27 : 66.2978,
    29 : 66.8313,
    31 : 67.3627,
    33 : 67.8923,
    35 : 68.4205,
    37 : 68.9478,
    39 : 69.4741,
    41 : 70,
    43 : 70.5249,
    45 : 71.0497
    }

d_fNm = {
    1 : 118.7505,
    3 : 62.4863,
    5 : 60.3061,
    7 : 59.1642,
    9 : 58.3239,
    11 : 57.6125,
    13 : 56.9682,
    15 : 56.3634,
    17 : 55.7839,
    19 : 55.2214,
    21 : 54.6728,
    23 : 54.1294,
    25 : 53.5960,
    27 : 53.0695,
    29 : 52.5458,
    31 : 52.0259,
    33 : 51.5091,
    35 : 50.9949,
    37 : 50.4830,
    39 : 49.9730,
    41 : 49.4648,
    43 : 48.9582,
    45 : 48.4530
    }

d1 = {
      0 : 5.947, 
      2 : 2.946, 
      4 : 1.074, 
      6 : 0.3779, 
      8 : 0.1172, 
      10 : 0.01834, 
      12 : 0.003708, 
      14 : 0.0008413, 
      16 : 0.0006138, 
      18 : 0.0004449, 
      20 : 0.0004490, 
      22 : 0.0005230, 
      24 : 0.0006138, 
      26 : 0.0007191, 
      28 : 0.0005230, 
      30 : 0.0003778, 
      32 : 0.0002710
      }
uNp = list()
uNm = list()
uN0 = list()
for i , j in d_fNp.items():
    Np = (i*(2*i+3))/(i+1)
    Nm = (i+1)*(2*i-1)/i
    N0 = (2*(i**2+i+1)*(2*i+1))/(i*(i+1))    
    uNp.append(Np)
    uNm.append(Nm)
    uN0.append(N0)


T_h = r_m*sin(rad)+(r_m*cos(rad))**2/(2*((4/3)*(r_0*1000))) #Height of target using 4/3 Earth radius

def target_height(T_h):
    if T_h > 47000:
        return 47000 / 1000
    else:
        return T_h / 1000

h = target_height(T_h) + h_ant/1000 # Target height in km

for h1 in np.linspace(h_ant_km,h,400):


    geo_h = (r_0 * h1) / (r_0 + h1) # Geopotential height

    def T(geo_h):
        if geo_h*1000 <= 11000:
            return 288.16 - 0.0065*(geo_h*1000)
        elif geo_h*1000 > 11000 and geo_h*1000 <= 25000:
            return 216.66
        else:
            return 216.66 + 0.003*((geo_h*1000) - 25000)


    def P(geo_h):
        if geo_h*1000 <= 11000:
            return 1013.25*(T(geo_h)/288.16)**alpha
        elif geo_h*1000 > 11000 and geo_h*1000 <= 25000:
            return 226.32*exp((-beta/T(geo_h))*((geo_h*1000) - 11000))
        else:
            return 24.886*(216.66/T(geo_h))**gamma


    def n_h(h1):
        return 1 + (n_0-1)*exp(-C_e*h1) #Refractive index


    def g_h(h1):
        if h1 >= 0 and h1 <= 8:
            return 0.640
        elif h1 > 8 and h1 <= 25:
            return 0.640 + 0.04218*(h-8)
        else:
            return 1.357

    def del_f(g_h,P,T):
        return g_h(h1) * (P(geo_h)/P_0)*(T_0/T(geo_h)) #Line-breadth constant

    #Calculate FN+/-
    FNp = list()
    FNm = list()
    for i , j in d_fNp.items():
        a1 = (del_f(g_h,P,T) / ((j - f_GHz)**2 + (del_f(g_h,P,T))**2)) + (del_f(g_h,P,T) / ((j + f_GHz)**2 + (del_f(g_h,P,T))**2))
        FNp.append(a1)
    for i , j in d_fNm.items():
        b1 = (del_f(g_h,P,T) / ((j - f_GHz)**2 + (del_f(g_h,P,T))**2)) + (del_f(g_h,P,T) / ((j + f_GHz)**2 + (del_f(g_h,P,T))**2))
        FNm.append(b1)

    def F_0(del_f):
        return del_f(g_h,P,T)/(f_GHz**2+(del_f(g_h,P,T))**2) #Non-resonant component

    #Calculate A_N

    x = np.multiply(FNp, uNp)
    y = np.multiply(FNm, uNm)
    z = list()
    for i in uN0:
        x1 = i*F_0(del_f)
        z.append(x1)

    Enk = list()
    for i, j in d_fNp.items():
        x2 = 2.06844*i*(i+1)
        Enk.append(x2)

    a2 = np.add(x, y)
    a3 = np.add(a2,z)
    a4 = list()
    for i in Enk:
        b2 = exp(-i/T(geo_h))
        a4.append(b2)

    A_N = np.multiply(a3,a4)

    def gam_ox(P,T,A_N):
        return C * P(geo_h) * (T(geo_h)**-3)*(f_GHz**2)*(sum(A_N))
    d_gamox[h1] = [gam_ox(P,T,A_N)]

intlist = list()
for i, j in d_gamox.items():
    a5 = ((1 + (n_0 - 1) * exp(-C_e * i)) * j) / sqrt(1 - ((n_0 * cos(rad)) / ((1 + (n_0 - 1) * exp(-C_e * i)) * (1 + i / r_0)))**2)
    intlist.append(a5)
I1 = sum(intlist)

print(I1)            

1 Ответ

0 голосов
/ 27 сентября 2019

Ошибка происходит в этой строке:

a5 = ((1 + (n_0 - 1) * exp(-C_e * i)) * j) / sqrt(1 - ((n_0 * cos(rad)) / ((1 + (n_0 - 1) * exp(-C_e * i)) * (1 + i / r_0)))**2)

Сообщение об ошибке означает, что у вас есть последовательность среди ваших факторов, которую я не могу умножить на не-целые.В данном случае это j, который является списком одного элемента: [0.005631212879043453].Если вы укажете j[0] для доступа к плавающей точке в списке вместо j, это сработает.

...