from math import atan,log10,pi
import matplotlib.pyplot as plt
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
from openpyxl.utils import get_column_letter

исходные данные
f = 1300
hr = 40
hbs1 = 49
hbs2 = 35
hms = 1.7
fi = 30

константы
w = 15
b = 40

Модель Уолфиша-Икегами
def los(f, d):
return(42.6 + 26 * log10(d) + 20 * log10(f))

def nlos(f, d, hms, hbs, kf, hr, fi):
delta_hms = hr - hms
delta_hbs = hbs - hr
kd = 18 if hbs >= hr else 18 - 15 * delta_hbs / hr
ka = (54 if hbs > hr else
54 - 0.8 * delta_hbs if d >= 0.5 else
54 - 1.5 * delta_hbs * d)
Lbsh = -18 * log10(1 + delta_hbs) if hbs > hr else 0
Lmsd = Lbsh + ka + kd * log10(d) + kf * log10(f) - 9 * log10(b)
Lori = (
-10 + 0.354 * w if 0 <= fi < 35 else
2.5 + 0.075 * (fi - 35) if 35 <= fi < 55 else
4.0 + 0.114 * (fi - 55) if 55 <= fi <= 90 else 0
)
Lrts = -16.9 - 10 * log10(w) + 10 * log10(f) + 20 * log10(delta_hms) + Lori
Lo = 32.44 + 20 * log10(d) + 20 * log10(f)
Lnlos = Lo + max(0, Lrts + Lmsd)
return Lnlos

Модель Кся-Бертони
def bertoni(f, d, hms, hbs, w, b):
c = 3e8
lam = c / f
delta_hbs = hr - hbs
delta_hms = hms - hr
x = w / 2
teta = atan(delta_hms / x)
r=((delta_hms2)+(x2))**0.5
Ldb= -10 * ((log10(lam / ((4 * pi) * d))) ** 2)
- 10 * log10((lam / ((4 * (pi) ** 2) * r)) * (((1 / teta) - (1 / ((2 * pi) + teta))) ** 2))
- 10 * log10((2.35 ** 2) * (((delta_hbs / d) * ((b / lam) ** 0.5)) ** 1.8))
return Ldb

meters=list(range(200,1600,100))

los_set, nlos_hbs1_middletown, nlos_hbs1_largetown, nlos_hbs2_middletown, nlos_hbs2_largetown, bertoni_hbs1=[],[],[],[],[],[]

for el in meters:
los_set.append(los(f, el))
nlos_hbs1_middletown.append(nlos(f, el, hms, hbs1, (-4+(0.7*((f/925))-1)), hr, fi))
nlos_hbs1_largetown.append(nlos(f, el, hms, hbs1, (-4+(1.5*((f/925))-1)), hr, fi))
nlos_hbs2_middletown.append(nlos(f, el, hms, hbs2, (-4+(0.7*((f/925))-1)), hr, fi))
nlos_hbs2_largetown.append(nlos(f, el, hms, hbs2, (-4+(1.5*((f/925))-1)), hr, fi))
bertoni_hbs1.append(bertoni(f, el, hms, hbs2, w, b))

def plot():
plt.figure(figsize=(8, 7))
plt.plot(meters,los_set,meters,nlos_hbs1_middletown,meters,nlos_hbs1_largetown,meters,nlos_hbs2_middletown,meters,nlos_hbs2_largetown,meters,bertoni_hbs1)
plt.grid(True)
plt.gca().legend(('зона прямой видимости',
'вне зоны прямой видимости, высота {} м, город средних размеров'.format(hbs1),
'вне зоны прямой видимости, высота {} м, город с плотной застройкой'.format(hbs1),
'вне зоны прямой видимости, высота {} м, город средних размеров'.format(hbs2),
'вне зоны прямой видимости, высота {} м, город с плотной застройкой'.format(hbs2),
'Модель Кся-Бертони. Высота м'),loc="lower center",bbox_to_anchor=(0.5, -0.4))
plt.xlim(200,1500)
plt.xticks(meters)
plt.xlabel("расстояние x, м")
plt.ylabel("L (потери сигнала), дБ")
plt.title("Модели Уолфиша-Икегами и Кся-Бертони")
plt.subplots_adjust(bottom=0.262,top=0.934)
plt.show()

def toFixed(numObj, digits=3):
return float(f"{numObj:.{digits}f}")

def save_to_xlsx(filename="pract3.xlsx"):
workbook = Workbook()
sheet = workbook.active
sheet.title = "Потери сигнала"


headers = [
    "Расстояние (м)", 
    "Зона прямой видимости", 
    'Вне зоны, {} м, средний город'.format(hbs1), 
    "Вне зоны, {} м, плотная застройка".format(hbs1), 
    "Вне зоны, {} м, средний город".format(hbs2), 
    "Вне зоны, {} м, плотная застройка".format(hbs2), 
    "Модель Кся-Бертони"
]
sheet.append(headers)

for i in range(len(meters)):
    sheet.append([
        meters[i],
        toFixed(los_set[i]),
        toFixed(nlos_hbs1_middletown[i]),
        toFixed(nlos_hbs1_largetown[i]),
        toFixed(nlos_hbs2_middletown[i]),
        toFixed(nlos_hbs2_largetown[i]),
        toFixed(bertoni_hbs1[i])
    ])

for column_cells in sheet.columns:
    max_length = 0
    column = column_cells[0].column
    for cell in column_cells:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(cell.value)
        except:
            pass
    adjusted_width = (max_length + 2)
    sheet.column_dimensions[get_column_letter(column)].width = adjusted_width

thin_border = Border(
    left=Side(style='thin'),
    right=Side(style='thin'),
    top=Side(style='thin'),
    bottom=Side(style='thin')
)

for row in sheet.iter_rows():
    for cell in row:
        cell.alignment = Alignment(horizontal="center", vertical="center")
        cell.border = thin_border

for cell in sheet[1]:
    cell.font = Font(bold=True)

workbook.save(filename)
plot()
save_to_xlsx()

Добавь красивый интерфейс к программе с помощью customtkinter. Чтобы можно было вводить исходные данные. Добавь кнопки рисования графика и сохранения расчета в файл.