Лабы 2022-2023 / 1 сем / Baraeva_Elizaveta_lb1
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №1
по дисциплине «Информатика»
Тема: Основные управляющие конструкции языка Python
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Шевская Н. В. |
Санкт-Петербург
2022
Цель работы.
Научиться пользоваться основными управляющими конструкции языка Python в том числе модулем numpy.
Задание.
Вариант 1
Задача 1.
Оформите решение в виде отдельной функции check_collision. На вход функции подаются два ndarray -- коэффициенты bot1, bot2 уравнений прямых bot1 = (a1, b1, c1), bot2 = (a2, b2, c2) (уравнение прямой имеет вид ax+by+c=0). Функция должна возвращать точку пересечения траекторий (кортеж из 2 значений), предварительно округлив координаты до 2 знаков после запятой с помощью round(value, 2).
Примечание: помните про ранг матрицы и как от него зависит наличие решения системы уравнений. В случае, если решение найти невозможно (например, из-за линейно зависимых векторов), функция должна вернуть None.
Задача 2.
Оформите задачу как отдельную функцию check_surface, на вход которой передаются координаты 3 точек (3 ndarray 1 на 3): point1, point2, point3. Функция должна возвращать коэффициенты a, b, с в виде ndarray для уравнения плоскости вида ax+by+c=z. Перед возвращением результата выполнение округление каждого коэффициента до 2 знаков после запятой с помощью round(value, 2).
Примечание: помните про ранг матрицы и как от него зависит существование решения системы уравнений. В случае, если решение найти невозможно (невозможно найти коэффициенты плоскости из-за, например, линейно зависимых векторов), функция должна вернуть None.
Задача 3.
Оформите решение в виде отдельной функции check_rotation. На вход функции подаются ndarray 3-х координат дакибота и угол поворота. Функция возвращает повернутые ndarray координаты, каждая из которых округлена до 2 знаков после запятой с помощью round(value, 2).
Выполнение работы.
На вход функции check_collision подаются 2 массива (bot1, bot2) с коэффициентами уравнения прямой. Для того чтобы найти точку пересечения, была создана матрица a_b с коэффициентами при x, y и была создана матрица c со свободными коэффициентами. Затем с помощью функции np.linalg.matrix_rank() были вычислены ранги созданных матриц. Потом через цикл for возвращается результат решения двух матриц с округлением до 2 знаков после запятой, если решения нет, то возвращается None.
На вход функции check_surface подаются 3 массива (point1, point2, point3) с координатами точек. Для того чтобы найти уравнение плоскости, были созданы 2 матрицы z и x_y_c с помощью функции np.array(). Затем также были вычислены ранги, посчитан результат и произведен возврат.
На вход функции check_rotation подается массив с тремя координатами vec и угол поворота rad. Для изменения угла поворота, была создана матрица изменения угла rotation_matrix. Матрица с измененными координатами была вычислена с помощью функции np.dot(). Затем было округление матрицы до 2 знаков после запятой и возвращение ее.
Разработанный программный код см. в приложении А.
Тестирование.
Результаты тестирования представлены в табл. 1.
Таблица 1 – Результаты тестирования
№ п/п |
Входные данные |
Выходные данные |
Комментарии |
1. |
check_collision([-3, -6, 9], [8, -7, 0]) |
(0.91, 1.04) |
Проверка функции check_collision. Верно. |
2. |
check_collision([100, 0, 100], [100, 0, 0]) |
None |
Проверка функции check_collision. Верно. |
3. |
check_surface([1, -6, 1], [0, -3, 2], [-3, 0, -1]) |
[2. 1. 5.] |
Проверка функции check_surface. Верно. |
4. |
check_surface([100, 0, 100], [100, 0, 0], [0, 0, -100]) |
None |
Проверка функции check_surface. Верно. |
5. |
check_rotation([1, -2, 3], 1.57) |
[2. 1. 3.] |
Проверка функции check_rotation. Верно. |
6. |
check_rotation([-5, 7, 1], -2.657) |
[ 7.69 -3.86 1. ] |
Проверка функции check_rotation. Верно. |
Вывод.
Были изучены основные управляющие конструкции языка Python. Разработаны 3 функции, выполняющие различные задачи с использованием модуля numpy, в частности numpy.linalg.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main_lb1.py
import numpy as np
def check_collision(bot1, bot2):
a_b = np.array(([bot1[0], bot1[1]], [bot2[0], bot2[1]]))
c = np.array(([-bot1[2]], [-bot2[2]]))
Rank_a_b = np.linalg.matrix_rank(a_b)
Rank_c = np.linalg.matrix_rank(c)
if Rank_c >= 1 and Rank_a_b >= 2:
result = np.linalg.solve(a_b, c)
answer = round(result[0][0], 2), round(result[1][0], 2)
return answer
else:
return None
pass
def check_surface(point1, point2, point3):
z = np.array(([point1[2]], [point2[2]], [point3[2]]))
point1[2], point2[2], point3[2] = 1, 1, 1
x_y_c = np.array((point1, point2, point3))
Rank_x_y_c = np.linalg.matrix_rank(x_y_c)
Rank_z = np.linalg.matrix_rank(z)
if Rank_z >= 1 and Rank_x_y_c >= 3:
result = np.linalg.solve(x_y_c, z)
answer = np.array((round(result[0][0], 2), round(result[1][0], 2), round(result[2][0], 2)))
return answer
else:
return None
pass
def check_rotation(vec, rad):
rotation_matrix = np.array(([np.cos(rad), -np.sin(rad), 0], [np.sin(rad), np.cos(rad), 0], [0, 0, 1]))
vec = np.array(vec)
result = np.dot(rotation_matrix, vec)
answer = np.array((round(result[0], 2), round(result[1], 2), round(result[2], 2)))
return answer
pass
