import math
import numpy as np
# ==========================================
# ЗАДАНИЕ 11. БИБЛИОТЕКИ MATH И NUMPY
# ==========================================
# 1. Библиотека Math: константы и функции
print("========== ПУНКТ 1. БИБЛИОТЕКА MATH ==========")
print("Число pi =", math.pi)
print("Число e =", math.e)
print("Квадратный корень из 25 =", math.sqrt(25))
degrees = 180
radians = math.radians(degrees)
print(degrees, "градусов в радианах =", radians)
print(radians, "радиан в градусах =", math.degrees(radians))
# 2. Квадратный корень и перевод градусов
print("\n========== ПУНКТ 2. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ ==========")
number = 144
print("Квадратный корень из", number, "=", math.sqrt(number))
angle = 90
print("90 градусов в радианах =", math.radians(angle))
print("1.5708 радиан в градусах =", math.degrees(1.5708))
# 3. Матрицы NumPy: копирование и умножение
print("\n========== ПУНКТ 3. МАТРИЦЫ NUMPY ==========")
# Создаём случайную матрицу размером 3x10
A = np.random.randint(1, 10, size=(3, 10))
print("Исходная матрица A:")
print(A)
# Транспонируем матрицу
A_T = A.T
print("\nТранспонированная матрица A.T:")
print(A_T)
# Простое присваивание: B ссылается на ту же матрицу, что и A
B = A
# Создаём независимую копию
C = A.copy()
# Изменяем элемент B (это также изменит A)
B[0, 0] = 100
print("\nМатрица B после изменения:")
print(B)
print("Матрица A после изменения B:")
print(A)
# Изменяем элемент независимой копии C
C[0, 1] = 200
print("\nМатрица C после изменения:")
print(C)
print("Матрица A после изменения C:")
print(A)
# Сравниваем матрицы
print("\nA и B одинаковы:", np.array_equal(A, B))
print("A и C одинаковы:", np.array_equal(A, C))
# Поэлементное умножение
print("\nПоэлементное умножение A * C:")
print(A * C)
# Матричное умножение
print("\nМатричное умножение A @ A.T:")
print(A @ A.T)
# 4. Метод наименьших квадратов (МНК)
print("\n========== ПУНКТ 4. МЕТОД НАИМЕНЬШИХ КВАДРАТОВ ==========")
# Матрица A размером 3x10 и вектор B длиной 10
A = np.random.rand(3, 10)
B = np.random.rand(10)
print("Матрица A:")
print(A)
print("\nВектор B:")
print(B)
# Способ 1: решение через нормальные уравнения
X1 = np.linalg.solve(A @ A.T, A @ B)
print("\nРешение через матричные операции:")
print(X1)
# Способ 2: функция numpy.linalg.lstsq
X2 = np.linalg.lstsq(A.T, B, rcond=None)[0]
print("\nРешение через numpy.linalg.lstsq:")
print(X2)
# Сравниваем результаты
print("\nРезультаты практически совпадают:", np.allclose(X1, X2))
# 5. Последовательности: range, arange, linspace
print("\n========== ПУНКТ 5. ПОСЛЕДОВАТЕЛЬНОСТИ ==========")
# range — встроенная функция Python
a = range(0, 11)
print("range:", list(a))
print("Тип данных:", type(a))
# arange — массив NumPy с шагом 1
b = np.arange(0, 11)
print("\narange:", b)
print("Тип данных:", type(b))
# linspace — 11 равномерных точек от 0 до 10 включительно
c = np.linspace(0, 10, 11)
print("\nlinspace:", c)
print("Тип данных:", type(c))
print("\n========== ПРОГРАММА ЗАВЕРШЕНА ==========")