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_hms**2)+(x**2))**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. Чтобы можно было вводить исходные данные. Добавь кнопки рисования графика и сохранения расчета в файл.