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