Семь Раз Отмерь, Один Раз Отрежь Или Примени Поговорку На Практике

Я сидел на курсе Coursera. Курс был ориентирован на новичков в Java, и в одном из видеоуроков эта тема поднималась.

7 шагов для решения проблем .

Я с чистой совестью прослушал видеоурок, подумал про себя, дело это зашло далеко и надолго.

Остальная часть курса прошла легко и без стресса.

Но, по одному из предметов в университете, а именно по так называемому «Научному программированию», появилась следующая задача:

Решите систему линейных уравнений

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, используя следующее матричное разложение

Семь раз отмерь, один раз отрежь или примени поговорку на практике

:

Семь раз отмерь, один раз отрежь или примени поговорку на практике

Где

Семь раз отмерь, один раз отрежь или примени поговорку на практике

представляет собой нижнюю треугольную матрицу, а

Семь раз отмерь, один раз отрежь или примени поговорку на практике

— верхняя треугольная матрица.

Тема линейной алгебры, которую мы проходили на 1 курсе.

Честно говоря, я вспомнил общие принципы работы с матрицами, векторами и святая святых — метод Гаусса.

Если вдуматься, никакого LU-разложения мы не изучали, но метод «Гугла» всегда выручает. Выручал меня, до этого момента.

Я нашел общий алгоритм поиска матриц

Семь раз отмерь, один раз отрежь или примени поговорку на практике

И

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, но в полтретьего ночи никакое количество кофе не дало мне возможности реализовать это как следует (учитывая, что мы там кодировали на Октаве).

В результате я психанул и решил послушать умно названную поговорку.



1. Опишите проблему руками

Все, что вам нужно в жизни, — это понять, в чем настоящая проблема.

Давайте возьмем описанную выше проблему в качестве примера и запишем ее на листе бумаги.

По-хорошему, для существования матриц должны выполняться следующие условия

Семь раз отмерь, один раз отрежь или примени поговорку на практике

И

Семь раз отмерь, один раз отрежь или примени поговорку на практике

: — должна быть обратная матрица

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, Я имею в виду

Семь раз отмерь, один раз отрежь или примени поговорку на практике

; - все крупные миноры не должны быть вырожденными, т.е.



Семь раз отмерь, один раз отрежь или примени поговорку на практике

Отлично, значит, нам как минимум нужна «проверка на дурака», потому что обязательно найдутся умные люди, которые захотят использовать неподходящую для нас матрицу.

Но давайте пока оставим это в стороне.

Задача нам ясна: найти матрицы

Семь раз отмерь, один раз отрежь или примени поговорку на практике

И

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, который будет соответствовать вышеуказанным условиям.

Если вы попытаетесь найти решения в Google, вам вряд ли удастся правильно реализовать алгоритм с первого раза (если вы плохо разбираетесь в линейной алгебре).

Пройдя массу попыток, мы, скорее всего, выработаем какую-то последовательность действий для решения нашей проблемы, а затем перейдем к шагу 2.

2. Опишите, что вы сделали

Возьмем матрицу в качестве примера

Семь раз отмерь, один раз отрежь или примени поговорку на практике

Теперь применим к ней наш метод Гаусса и избавимся от ненужных элементов в строке 3, вычитая из нее первую строку, умноженную на отношение первого элемента строки 3 к первому элементу строки 1:

Семь раз отмерь, один раз отрежь или примени поговорку на практике

Теперь избавимся от второго элемента строки 3 аналогичным действием:

Семь раз отмерь, один раз отрежь или примени поговорку на практике

В результате мы получаем матрицу

Семь раз отмерь, один раз отрежь или примени поговорку на практике

А теперь найденные нами коэффициенты (результат соотношения элементов

Семь раз отмерь, один раз отрежь или примени поговорку на практике

) принимаем в качестве значений матрицы

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, и мы получаем

Семь раз отмерь, один раз отрежь или примени поговорку на практике

Видна закономерность, не так ли?

3. Поиск закономерностей

На этом этапе, скорее всего, вы вернетесь к шагам 1 и 2, поскольку найденная вами закономерность не всегда будет верной для всех случаев.

Но если не получилось один раз, получится в следующий раз.

Итак, на основе примера можно сгенерировать следующий шаблон алгоритма/решения: 1. Установите квадратную матрицу

Семь раз отмерь, один раз отрежь или примени поговорку на практике

-й заказ; 2. Установите матрицу

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, Где

Семь раз отмерь, один раз отрежь или примени поговорку на практике

- единичная матрица

Семь раз отмерь, один раз отрежь или примени поговорку на практике

-й заказ; 3. Установите матрицу

Семь раз отмерь, один раз отрежь или примени поговорку на практике

; 4. Циклически применим к матрицам следующие последовательные преобразования при условии, что

Семь раз отмерь, один раз отрежь или примени поговорку на практике



Семь раз отмерь, один раз отрежь или примени поговорку на практике

В

Семь раз отмерь, один раз отрежь или примени поговорку на практике

, мы получаем:

Семь раз отмерь, один раз отрежь или примени поговорку на практике



4. Проверка шаблона/алгоритма

Есть алгоритм – есть миллионы матриц для его проверки! Об этом шаблоне можно не волноваться, он очевидно правильный (проверено лично на максимально невырожденных возможных матрицах).

Но помни: поторопись, и ты рассмешишь людей .

Поэтому всегда проверяйте созданные вами шаблоны, чтобы не продолжать чертовски прыгать обратно в самое начало.



5. Перевод алгоритма в код

Очевидный шаг заключается в том, что все, что вам нужно, часто уже есть в синтаксисе языка, а если нет, то никто не мешает вам создавать классы и функции для решения этой проблемы, значит, у вас есть алгоритм.

Поскольку я реализовал этот алгоритм в рамках образовательной университетской программы, то для реализации я мог использовать только Octave, поэтому представляю вам весь код в его синтаксисе (он чрезвычайно похож на Python, поэтому для форматирования я буду использовать его подсветку):

   

A = input("Enter the matrix A: ") numOfRows = size(A, 1) numOfCols = size(A, 2) if numOfRows ~= numOfCols disp("Wrong matrix.") else n = numOfCols disp("----------------") L = eye(3) disp("Making U = A") U = A disp("----------------") for i=2:n disp("Step "), disp(i-1) for j=1:i-1 L(i,j) = U(i,j)/U(j,j) U(i,:) = U(i,:) - U(j,:)*L(i,j) end disp("----------------") end disp("Check the answer of L*U: "), disp(L*U) end



6. Поиск неудачных тестов

Вы всегда должны пытаться «сломать» свой код. Полной «защиты от дурака» здесь (очевидно) нет, но за основу я взял предположение, что будет введена изначально правильная матрица.

На этом этапе вы должны найти все возможные ошибки и неточности в вашем коде, которые могут привести к выявлению необъективности построенного вами алгоритма.

Поэтому здесь следует перепробовать как можно больше упущений, которые могли быть допущены.



7. Отладка неудачных тестов

Самый логичный и, вероятно, ожидаемый из шагов.

Код необходимо отладить и скорректировать алгоритм.

Здесь больше нечего добавить.



Заключение

Могу сказать, что вряд ли бы я когда-либо серьезно отнесся к такому подходу к решению задач, если бы не мое сонное состояние.

Но на этот метод стоит обратить внимание – он короткий, и вся его трудоемкость заключается лишь в том, что его необходимо использовать.



Примечание

Спасибо учебникам линейной алгебры за материал для решения задачи.

Теги: #математика #программирование #Лайфхаки для гиков #моделирование #лайфхаки #октава

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.