From f0611971072ef3df8f958b6531353cb00514abad Mon Sep 17 00:00:00 2001 From: cheykrym Date: Mon, 14 Oct 2024 22:56:34 +0300 Subject: [PATCH] =?UTF-8?q?1=20=D0=B8=202=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++ app/menu_load.py | 74 +++++++++++++++++++++++++++++++++++++++++ app/zadachi/zadacha1.py | 60 +++++++++++++++++++++++++++++++++ app/zadachi/zadacha2.py | 35 +++++++++++++++++++ app/zadachi/zadacha4.py | 0 app/zadachi/zadacha5.py | 0 app/zadachi/zadacha6.py | 0 main.py | 11 +++--- 8 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 app/menu_load.py create mode 100644 app/zadachi/zadacha4.py create mode 100644 app/zadachi/zadacha5.py create mode 100644 app/zadachi/zadacha6.py diff --git a/README.md b/README.md index b87a322..27d3f68 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ chezahuynya1 ============= bts metodi 1 +1 + +2 + +3 - +4 - +5 - +6 - -------- diff --git a/app/menu_load.py b/app/menu_load.py new file mode 100644 index 0000000..854b324 --- /dev/null +++ b/app/menu_load.py @@ -0,0 +1,74 @@ +from app.utils.system import clear_console +from app.zadachi.zadacha1 import zadacha1 +from app.zadachi.zadacha2 import zadacha2 + +class pod_menu: + + def __init__(self): + pass # Конструктор пока пустой, при необходимости можно добавить параметры + + def zadacha1_menu(): + """Меню для задачи 1 с подкатегориями.""" + clear_console() + while True: + print('\nЗадача 1:') + print('1. линейно') + print('2. квадратично') + print('0. Назад') + + choice = input('Выберите подкатегорию: ') + + clear_console() + z1 = zadacha1() # создаем объект для задачи 1 + + if choice == '1': + z1.plot_lin_data() # Выполнить первую подзадачу + #return # Вернуться в основное меню после выполнения + elif choice == '2': + z1.plot_sqr_data() # Выполнить вторую подзадачу + #return # Вернуться в основное меню после выполнения + elif choice == '0': + break # Вернуться в основное меню + else: + print('Неверный выбор, попробуйте снова.') + + def zadacha2_menu(): + """Меню для задачи 2 (расчет коэффициентов методом наименьших квадратов).""" + clear_console() + z1 = zadacha1() # Используем объект задачи 1 для генерации данных + z2 = zadacha2() # Создаем объект для задачи 2 + + while True: + print('\nЗадача 2:') + print('1. Рассчитать коэффициенты b0 и b1 для линейной модели') + print('2. Сделать прогноз по рассчитанным коэффициентам') + print('0. Назад') + + choice = input('Выберите подкатегорию: ') + + clear_console() + + if choice == '1': + # Генерация линейных данных с помощью функции из задачи 1 + x_data, y_data = z1.create_lin_array() + + # Рассчет коэффициентов b0 и b1 методом наименьших квадратов + b0, b1 = z2.calculate_coefficients(x_data, y_data) + + print(f'Рассчитанные коэффициенты:') + print(f'b0 (свободный член) = {b0}') + print(f'b1 (коэффициент наклона) = {b1}') + elif choice == '2': + # Пример предсказания на новых данных + x_data, y_data = z1.create_lin_array() # Сначала генерируем данные + b0, b1 = z2.calculate_coefficients(x_data, y_data) # Рассчитываем коэффициенты + + # Выполняем прогноз + predicted_y = z2.predict(x_data, b0, b1) + + print(f'Предсказанные значения Y на основе рассчитанных коэффициентов:') + print(predicted_y) + elif choice == '0': + break # Вернуться в основное меню + else: + print('Неверный выбор, попробуйте снова.') diff --git a/app/zadachi/zadacha1.py b/app/zadachi/zadacha1.py index e69de29..90c196f 100644 --- a/app/zadachi/zadacha1.py +++ b/app/zadachi/zadacha1.py @@ -0,0 +1,60 @@ +import numpy as np +import matplotlib.pyplot as plt + +class zadacha1: + + def __init__(self): + pass # Конструктор пока пустой, при необходимости можно добавить параметры + + # Метод для генерации линейного массива данных + def create_lin_array(self, b0=2, b1=4, N=500, noise_std=10): + """ + Генерация массива данных по линейной зависимости Y = b0 + b1 * X + error + :param b0: свободный коэффициент + :param b1: коэффициент при X + :param N: количество точек данных + :param noise_std: стандартное отклонение для случайной ошибки + :return: массивы X и Y + """ + X = np.linspace(1, 500, N) # создаем массив X с равномерным шагом + error = np.random.normal(0, noise_std, N) # генерируем шум + Y = b0 + b1 * X + error # генерируем Y по линейному закону + return X, Y + + # Метод для генерации квадратичного массива данных + def create_sqr_array(self, a=1, b=3, c=2, N=500, noise_std=10): + """ + Генерация массива данных по квадратичной зависимости Y = a * X^2 + b * X + c + error + :param a: коэффициент при X^2 + :param b: коэффициент при X + :param c: свободный коэффициент + :param N: количество точек данных + :param noise_std: стандартное отклонение для случайной ошибки + :return: массивы X и Y + """ + X = np.linspace(1, 500, N) # создаем массив X + error = np.random.normal(0, noise_std, N) # генерируем шум + Y = a * X**2 + b * X + c + error # генерируем Y по квадратичному закону + return X, Y + + # Метод для отображения графика линейных данных + def plot_lin_data(self, b0=2, b1=4, N=500, noise_std=10): + """ + Отображение сгенерированных линейных данных и теоретической линии + """ + X, Y = self.create_lin_array(b0, b1, N, noise_std) # Генерация данных + plt.scatter(X, Y) # График рассеяния + plt.plot(X, b0 + b1 * X, color='red') # Линейная функция без шума + plt.title("Линейная зависимость с шумом") + plt.show() + + # Метод для отображения графика квадратичных данных + def plot_sqr_data(self, a=1, b=3, c=2, N=500, noise_std=10): + """ + Отображение сгенерированных квадратичных данных и теоретической кривой + """ + X, Y = self.create_sqr_array(a, b, c, N, noise_std) # Генерация данных + plt.scatter(X, Y) # График рассеяния + plt.plot(X, a * X**2 + b * X + c, color='red') # Квадратичная функция без шума + plt.title("Квадратичная зависимость с шумом") + plt.show() diff --git a/app/zadachi/zadacha2.py b/app/zadachi/zadacha2.py index e69de29..20fb055 100644 --- a/app/zadachi/zadacha2.py +++ b/app/zadachi/zadacha2.py @@ -0,0 +1,35 @@ +import numpy as np + +class zadacha2: + def calculate_coefficients(self, X, Y): + """ + Функция для расчета коэффициентов b0 и b1 по методу наименьших квадратов (МНК) + :param X: массив значений независимой переменной + :param Y: массив значений зависимой переменной + :return: коэффициенты b0 и b1 + """ + n = len(X) + + # Вычисляем средние значения X и Y + mean_x = np.mean(X) + mean_y = np.mean(Y) + + # Вычисляем коэффициент b1 + numerator = np.sum((X - mean_x) * (Y - mean_y)) + denominator = np.sum((X - mean_x) ** 2) + b1 = numerator / denominator + + # Вычисляем коэффициент b0 + b0 = mean_y - b1 * mean_x + + return b0, b1 + + def predict(self, X, b0, b1): + """ + Функция для предсказания значений Y на основе коэффициентов b0 и b1 + :param X: массив значений независимой переменной + :param b0: коэффициент b0 (свободный член) + :param b1: коэффициент b1 (коэффициент при X) + :return: предсказанные значения Y + """ + return b0 + b1 * X diff --git a/app/zadachi/zadacha4.py b/app/zadachi/zadacha4.py new file mode 100644 index 0000000..e69de29 diff --git a/app/zadachi/zadacha5.py b/app/zadachi/zadacha5.py new file mode 100644 index 0000000..e69de29 diff --git a/app/zadachi/zadacha6.py b/app/zadachi/zadacha6.py new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py index db18c08..f25480c 100644 --- a/main.py +++ b/main.py @@ -1,23 +1,24 @@ from app.utils.config import debug from app.utils.system import clear_console -#from test_module import * +from app.menu_load import pod_menu def main_menu(): clear_console() while True: print('\nMain Menu:') - print('1. Start') + print('1. Задача 1') + print('2. Задача 2') print('0. Exit') choice = input('Select an option: ') clear_console() if choice == '1': - #return test() - return - + pod_menu.zadacha1_menu() # Переход к подменю Задачи 1 + elif choice == '2': + pod_menu.zadacha2_menu() # Переход к подменю Задачи 2 elif choice == '0': print('Exiting program...') break