Математический фон
Пусть A будет матрицей действительных чисел размером N на N, вектором из N действительных чисел и вектором из N неизвестных действительных чисел. Матричное уравнение Ax = b.
Метод Якоби заключается в следующем: разложить A = D + R, где D - матрица диагоналей, а R - остальные записи.
если вы сделаете начальное решение для угадывания x0, улучшенным решением будет x1 = обратное (D) * (b - Rx), где все умножения - это умножение матрицы на вектор, а обратное (D) - обратная матрица.
Спецификация проблемы
- Входные данные : Ваша полная программа должна принять в качестве входных данных следующие данные: матрицу A, вектор b, начальное предположение x0 и число «ошибки» e.
- Вывод : программа должна вывести минимальное количество итераций, чтобы последнее решение отличалось истинным решением не более чем на e. Это означает, что каждый компонент векторов по абсолютной величине отличается не более чем на e. Вы должны использовать метод Якоби для итераций.
Как вводятся данные - ваш выбор ; это может быть ваш собственный синтаксис в командной строке, вы можете взять ввод из файла, что бы вы ни выбрали.
Как данные выводятся на ваш выбор ; он может быть записан в файл, отображен в командной строке, записан как ASCII-арт, что угодно, если он доступен для чтения человеком.
Более подробная информация
Вам не дано истинное решение: как вы рассчитываете истинное решение, полностью зависит от вас. Вы можете решить это, например, по правилу Крамера или напрямую вычислив обратное. Важно то, что у вас есть верное решение, которое можно сравнить с итерациями.
Точность является проблемой; «Точные решения» некоторых людей для сравнения могут отличаться. Для целей этого кода гольф точное решение должно быть верно до 10 десятичных знаков.
Чтобы быть абсолютно ясным, если даже один компонент вашего нынешнего итерационного решения превосходит свой соответствующий компонент в истинном решении на e, то вам нужно продолжать итерацию.
Верхний предел N зависит от того, какое оборудование вы используете и сколько времени вы готовы потратить на запуск программы. Для целей данного кода гольф, предположим, максимум N = 50.
Предпосылками
Когда ваша программа вызывается, вы можете предполагать, что всегда выполняется следующее:
- N> 1 и N <51, т.е. вам никогда не дадут скалярное уравнение, всегда матричное уравнение.
- Все входные данные находятся над полем действительных чисел и никогда не будут сложными.
- Матрица A всегда такова, что метод сходится к истинному решению, так что вы всегда можете найти количество итераций, чтобы минимизировать ошибку (как определено выше) ниже или равно e.
- A никогда не является нулевой матрицей или единичной матрицей, т.е. существует одно решение.
Тестовые случаи
A = ((9, -2), (1, 3)), b = (3,4), x0 = (1,1), e = 0.04
Истинное решение - (0,586, 1,138). Первая итерация дает x1 = (5/9, 1), отличающееся более чем на 0,04 от истинного решения хотя бы на один компонент. Взяв еще одну итерацию, мы находим x2 = (0,555, 1,148), который отличается менее чем на 0,04 от (0,586, 1,138). Таким образом, выход
2
A = ((2, 3), (1, 4)), b = (2, -1), x0 = (2.7, -0.7), e = 1.0
В этом случае истинным решением является (2.2, -0.8), а первоначальное предположение x0 уже имеет ошибку меньше, чем e = 1.0, поэтому мы выводим 0. То есть, когда вам не нужно делать итерацию, вы просто выводите
0
Оценка представления
Это код гольф, все стандартные лазейки запрещены. Наименьшая правильная полная программа (или функция), т.е. выигрывает наименьшее количество байтов. Не рекомендуется использовать такие вещи, как Mathematica, которые объединяют множество необходимых шагов в одну функцию, но используют любой язык, который вы хотите.