Задания по пакету Octave
Базовые задания octave-1
понедельник 2 октября 23:59
Загрузите в папку octave-1 три файла task1.m
, task2.m
, task3.m
, которые мы делали на практике.
Создание матриц octave-matrices
понедельник 2 октября 23:59
Создайте указанные матрицы. В этих задачах нельзя использовать циклы. И вы должны избежать ручного ввода элементов матрицы, вместо этого используйте возможности Octave по конструированию матриц. Т.е., например, если вас попросили создать матрицу 10 на 10, не перечисляейте в решении все 100 элементов этой матрицы. Т.е. представьте, что вас просят на самом деле создавать матрицы 1000 на 1000. Маленькие матрицы в условии нужны для того, чтобы вам было проще отладить свою программу, увидев матрицы на экране целиком.
- Создайте матрицу 10 на 10, у которой все элементы нули, кроме первой строки, в которой все элементы единицы
- Создайте матрицу 10 на 10, у которой в каждой клетке стоит 0 или 1 в шахматном порядке:
0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 ...
- Матрица 9 на 9, вся первая строка состоит из единиц, вторая строка состоит из двоек, третья — из троек и т.д.
- Создайте матрицу 10 на 10 с подряд идущими числами от 1 до 100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...
- “Таблица умножения”. Матрица 9 на 9, где в каждой клетке стоит произведение номера столбца на номер строки:
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 ...
- Даны числа n, a, b. Создайте матрицу размера n на n, у которой на главной диагонали стоят числа a, а строго над и под главной диагональю стоят числа b. Остальные числа матрицы — нули. Пример для аргументов (4, 1, 2):
1 2 0 0 2 1 2 0 0 2 1 2 0 0 2 1
- Вспомните задачу 2. Там еще 1 и 0 в были в шахматном порядке. Создайте теперь матрицу 20 на 20, только теперь «клеточки» должны быть два на два:
0 0 1 1 0 0 ..... 0 0 1 1 0 0 ..... 1 1 0 0 1 1 ..... 1 1 0 0 1 1 ..... .................
- Дано число n. Создайте следующую матрицу размера n на n: На главной диагонали матрицы чередуются 1 и 2. Дальше от каждой клетки главной диагонали направо и вниз расставляется то же числа, что и в самой этой клетке. Пример для аргумента (5):
1 1 1 1 1 1 2 2 2 2 1 2 1 1 1 1 2 1 2 2 1 2 1 2 1
Здесь, если не можете справиться без цикла, сделайте один цикл. Но не больше! Кстати, а какой определитель у этой матрицы? А почему?!
Индексирование в Ocatave octave-indexing
понедельник 2 октября 23:59
В этих задачах тоже нельзя использовать циклы, если явно не сказано обратного.
- Дана квадратная матрица четного размера. Поделите ее пополам по вертикали и горизонтали и верните матрицу, соответствующую верхнему левому квадрату.
- Дана матрица с четным числом строк. Поменяйте местами верхнюю половину строк матрицы и нижнюю половину.
- Дан вектор из целых чисел. Верните вектор, который содержит только те числа исходного вектора, которые делятся на 3.
- Сделайте две функции. Первая
filter_multiples(a, k)
удаляет из вектора a все числа, которые строго больше k и делятся на k. Втораяsieve()
делает следующее:function a = sieve(n) a = 1:n; i = 2; while i < length(a) a = filter_multiples(a, a(i)); i++ endwhile endfunction
Объясните в комментариях, что и как делает функция sieve(n)
- Дана матрица из двух столбцов. Каждая строка описывает человека: его рост в метрах и тип. В задаче есть пять типов: 1 - девочка, 2 - девушка, 3 - мальчик, 4 - мужчина, 5 - кот. Необходимо вернуть три матрицы-столбца из пяти элементов каждая.
Первая матрица содержит суммарный рост для каждого из пяти типов людей.
Вторая — средний рост для каждого из типов. При необходимости делить на 0 пусть ответом будет
NaN
. Третья — средний рост, не учитывая тех, чей рост меньше 1 метра или больше 2 метров. Не используйте цикл для перебора людей. Вы можете использовать цикл перебора типов от 1 до 5, но здорово, если сумеете придумать, как не использовать и его тоже. - Увеличьте все нечетные числа матрицы-строки в два раза.
- А если это не матрица строка, а прямоугольная матрица? Будет работать ваше решение?
Векторизация octave-vectorization
понедельник 16 октября 23:59
В этих задачах вообще нельзя использовать циклы
- Дана матрица строка, например,
a = [1, 2, -2, 4]
и числоx
, например 1. Строкаa
задает коэффициенты многочлена, начиная с младшего, т.е. она соответствует многочлену \(1 + 2x - 2x^2 + 4x^3\). Посчитайте значение многочлена в точкеx
. Для приведенного примера ответ будет 5. Т.е. необходимо написать выражение черезa
иx
, которое считает значение многочленаa
в точкеx
. Замечание: в Octave есть функцияpolyval
, делающая аналогичные действия, но у нее иначе интерпретируются аргументы. Не пользуйтесь этой функцией при решении задачи. - Дана матрица-столбец x. Создать квадратную матрицу такого же размера, которая в i-ой строке
и j-ом столбце содержит разность
x(i) – x(j)
. - Дана матрица, состоящая из трех столбцов. Предположим, что каждая строка задает прямую вида \(ax + by + c = 0\),
где столбцы — это, соответственно, числа
a
,b
,c
. Создайте матрицу, состоящую из двух столбцов с числами, соответственно,k
иb
, которые описывает эти же прямые, только в виде \(y = kx + b\). Например, строка[1 1 1]
должна превратиться в строку[-1 -1]
. - Функция
all2dets(x)
. Дана матрицаx
из двух столбцов. Создать квадратную матрицу, размером в количество строчек исходной. Элемент в i-ой строке j-ом столбце должен быть равен определителю матрицы[x(i,:); x(j,:)]
, т.е. матрицы 2x2, составленной из i-ой и j-ой строк исходной матрицы. Напомню, что определитель матрицы \(\begin{pmatrix}a&b\\c&d\end{pmatrix}\) равен \(ad - bc\). - Функция
all_lines_intersections(a)
. Дана матрицаа
из трех столбцов, описывающая набор прямых (см. предыдущее задание). Если кратко сформулировать условие, то нобходимо пересечь каждую прямую с каждой. Подробней так: каждое пересечение прямой из строки i с прямой из строки j дает две координаты пересечения x и y. Функция должна вернуть две матрицыx
иy
. Первая содержит x координату этого пересечения в строчке i и столбце j, вторая содержит, соответственно, y координату. Не обрабатывайте отдельно случаи параллельных прямых, пусть для параллельных прямых получается произвольный ответ, скорее всего, у вас это будет NaN из-за деления 0 на 0. Напомню формулу пересечения прямых \(a_1x+b_1y+c_1\) = 0 и \(a_2x+b_2y+c_2 = 0\):Δ = det([a1 b1; a2 b2]) Δx = det([-c1 b1; -c2 b2]) Δy = det([a1 -c1; a2 -c2]) x = Δx / Δ y = Δy / Δ
Соответственно, пользуйтесь задачей 4 для решения.
Графика в Ocatave octave-graphics
понедельник 16 октября 23:59
Не используйте при решении задач циклы, если не сказано обратного.
- Нарисуйте график функции \(\sin(x) + \sin(3x)\) в диапазоне от \(-2\pi\) до \(2\pi\). Функция должна не только нарисовать график, но и вернуть два значения:
x
с абсциссами иy
с ординатами точек, это те же значения, которые вы передадите в функцию plot(x,y). - Нарисуйте график функции \(\sin(x) + \frac1{2}\sin(2x) + \frac1{3}\sin(3x) + \cdots + \frac1{10}\sin(10x)\). Для решения задачи создайте матрицу, у которой в строках расположены значения каждого слагаемого по отдельности. Верните результат как в прошлой задаче.
- Дана матрица A размера 2xN, каждый столбец — координаты точки на плоскости. В этой задаче функция не должна возвращать результат, она должна только рисовать одну картинку,
состояющую из следующих элементов:
- Изобразите множество A
- Изобразите центр масс множества A (одна точка, другой маркер, другой цвет)
- Изобразите множество B, которое получается параллельным переносом множества A так, чтобы его центр масс перешел в 0. (Новый тип маркера, новый цвет). Напоминание: при параллельном переносе на вектор \((dx, dy)\) координаты точки \((x, y)\) заменяются на \((x + dx, y + dy)\).
- Изобразите множество C: поворот множества A вокруг нуля на \(5^\circ\). (Новый тип маркера, новый цвет). Напоминание. Чтобы повернуть точку с координатами \((x, y)\) на угол \(\varphi\) относительно нуля, нужно домножить вектор столбец \(\begin{pmatrix}x\\y\end{pmatrix}\) слева на матрицу \(\begin{pmatrix}\cos(\varphi)&\sin(\varphi)\\-\sin(\varphi)&\cos(\varphi)\end{pmatrix}\).
- Изобразите множество D: поворот множества А вокруг его центра масс на \(5^\circ\).
- Нарисуйте 10 концентрических окружностей с радиусами, соответственно, 1, 2, …, 10. Используйте для этого тот факт, что точки с координатами \((\cos(\varphi), \sin(\varphi))\) лежат на одной окружности радиуса 1, при \(\varphi\) меняющемся от 0 до \(2\pi\).
- Дана линейная матрица из трех чисел
a
,b
,c
. Кроме этого даны матрицыxrange=[xmin, xmax]
иyrange=[ymin, ymax]
. Постройте график прямой \(ax + by + c = 0\), нужно построить ту ее часть, которая содержится в прямоугольнике \(x_{min} \leq x \leq x_{max}\) и \(y_{min} \leq y \leq y_{max}\). Учтите все варианты, включая то, что прямая может быть вертикальной. Удобней всего решать так. Нужно пересечь заданную прямую с каждой из четырех сторон прямоугольника. Стороны горизонтальны или вертикальны, поэтому вычислить пересечение с каждой конкретной стороной или проверить, что его нет, относительно несложно. В общей сложности получится два пересечения. Далее нужно нарисовать отрезок от первой точки пересечения до второй, для этого достаточно одного вызова функцииplot()
. - Функция
plot_lines(a, xrange, yrange)
. Дана матрица с прямыми как в задании 3 из блокаoctave-vectorization
. Постройте на одном графике все эти прямые. Вызовите для этого в цикле функцию из предыдущей задачи. - Функция
plot_lines_and_intersections(a, xrange, yrange)
. Дана матрица с прямыми как в предыдущем задании. Воспользуйтесь предыдущей задачей и задачей 5 из блокаoctave-vectorization
, нарисуйте все прямые и все их точки пересечения.
Решение уравнений octave-equations
понедельник 30 октября 23:59
- Дано
n
, найти корни многочлена \(x^n + x^{n - 1} + \cdots + x + 1\), т.е. многочлена степени \(n\), у которого все коэффициенты единицы. Верните корни в виде одной матрицы-строки. Найдите самостоятельно встроенную в Octave функцию, которая вычисляет корни многочлена.- Заставьте эту же функцию
task1
рисовать корни многочлена на плоскости. Так как корни многочлена комплексные, вам придется отдельно выделить их вещественную и мнимую часть. обязательно разберитесь, как выделить вещественную и мнимую части, не пользуйтесь версией функцииplot
, которая сама рисует комплексные числа — в этом случае решение получается слишком простым и скучным.
- Заставьте эту же функцию
- Решите уравнение \(x + \sin(x)=1\). Не забудьте реализовать функцию, которая вернет результат.
- Решите систему уравнений \(\begin{cases} x + \sin(y) = 1 \\ y + \cos(x) = 1 \end{cases}\). Не забудьте реализовать функцию, которая вернет результат.
- Дано вещественное число
a
. Решите уравнение \(e^x - e^{-x}=a\). Пусть функция возвращает четыре результата решения (не в виде матрицы, а именно в виде функции с четырьмя значениями):- Решение задачи с помощью
fsolve
. Здесь и в других пунктах проверяйте решение на числе «миллион». - Решение задачи с помощью
fzero
, здесь вам придется подумать, какой указать отрезок для поиска корня. - Решение задачи с помощью явной формулы. В этом уравнении можно явно выписать, чему равен
x
, подумайте, как это сделать. - Разность между решениями в виде явной формулы и с помощью
fsolve
.
- Решение задачи с помощью
- Круг задается матрицей из трех чисел:
[x, y, r]
— координаты центра и радиус. Даны два круга. Нужно определить их точки пересечения. Для этого составьте систему из двух уравнений, описывающих круги, и используйте функциюfsolve
для решения системы. Функция должна вернуть матрицу из двух строчек, в которой точки пересечения расположены в столбцах. Кроме этого, функция должна нарисовать оба круга и обозначить особым маркером точки пересечения. Не пытайтесь вычислять точки пересечений явно, самостоятельно решая систему или делая геометрические построения.- Для начала найдите хотя бы одну точку пересечения.
- А потом найдите обе точки. Вам придется проделать геометрические вычисления, чтобы определить две начальных точки для двух вызовов
fsolve
.
Решение уравнений octave-ode
четверг 2 ноября 23:59
- Решите неоднородное линейное дифференциальное уравнение с постоянными коэффициентами: \(y’ + 2y = x + \frac12, y(0) = 1\). Получите решение для
x = linspace(0, 1, 100)
. Функция должна вернуть три результата, строчкуx
, строчку значений функцииy1
и строчку значений функцииy2
:y1
получается решением уравнения с помощью функцииlsode
.y2
получается решением уравнения вручную. Вспомните, как решаются такие уравнения, получите решение в виде явной формулы.
Постройте оба графика в одном окне, убедитесь, что они совпадают.
-
Решите уравнение \(y’‘(x) + y(x) * (cos(x) + 1) = 0, y(0)=-1, y’(0)=1\) на отрезке \(0\leq x \leq 10\), постройте график решения, функция не должна ничего возвращать.
-
Создайте функцию
task2a
для решения того же уравнения, но в ней можно задавать начальные значения. В ней должно быть три параметра: координатыx
значение дляy(0)
и дляy'(0)
. Сделайте функциюtask2b
для тестирования функцииtask2a
, внутри должен быть следующий код:x = linspace(0, 10, 1000); plot(x, task2a(x, -1, 1)); hold on plot(x, task2a(x, 0, 1)); plot(x, task2a(x, 1, 1)); plot(x, task2a(x, -1, 0)); plot(x, task2a(x, 0, 0)); plot(x, task2a(x, 1, 0)); plot(x, task2a(x, -1, -1)); plot(x, task2a(x, 0, -1)); plot(x, task2a(x, 1, -1));
-
- Система Хищник-Жертва. Изучите статью по ссылке, в ней описывается система дифференциальных уравнений, моделирующая изменения популяций лис и кроликов, когда они живут вместе и едят друг друга. Создайте функцию, которая на вход получается параметры системы (альфа, бета, гамма, дельта), и рисует графики нескольких решений уравнений, соответствующих начальным данным, вокруг точки равновесия \((\overline{x}, \overline{y})\). Для этого возьмите начальные данные вида \(x(0) = \overline{x}, y(0) = \overline{y} + ks\). Здесь \(k\) — это целое число от 0 до 5, \(s\) - это величина, которая указывается еще одним (пятым) аргументом функции, получается, что на одном графике необходимо нарисовать шесть кривых для каждого значения \(k\). Функция должна только рисовать график в координатах x и y (не используйте координату t при рисовании), и ничего не должна возвращать. Убедитесь, что вы понимаете кривые, изображенные на графике.
Задача о поиске кластеров методом k-средних octave-k-means
понедельник 13 ноября 23:59
Эта задача на отдельной странице: Метод k-средних
% TODO отменить изменения, сделанные в 2019 году