exponenta event banner

Использование распределенных массивов для решения систем линейных уравнений прямыми методами

Распределённые массивы хорошо подходят для больших математических вычислений, таких как большие задачи линейной алгебры. В этом примере показано, как можно решить систему линейных уравнений вида Ax = b параллельно с прямым методом с помощью распределенных массивов. Так же, как и для массивов, хранящихся в памяти клиента, можно использоватьmldivide для решения может систем линейных уравнений, определенных с помощью распределенных массивов, поэтому нет необходимости изменять код.

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

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

Этот пример демонстрирует, как решить простую систему линейных уравнений вида Ax = b с точным, известным решением x. Система определяется матрицей A и вектором-столбцом b. Раствор x также является вектором-столбцом. В этом примере система определяется с использованием полных и разреженных матриц. Требуемый код одинаков для систем, определенных с использованием распределенных массивов или массивов в клиентской памяти.

Связанный пример использования итеративных решателей и распределенных массивов см. в разделе Использование распределенных массивов для решения систем линейных уравнений итерационными методами.

Решение полной матричной системы

Сначала определите матрицу коэффициентов А как переменную в памяти клиента, A, а затем передать эту матрицу в distributed для создания распределенной версии той же матрицы, ADist. При использовании distributed функция MATLAB автоматически запускает параллельный пул с использованием настроек кластера по умолчанию.

n = 1e3;
A = randi(100,n,n);
ADist = distributed(A);

Теперь можно определить правый вектор b. В этом примере b определяется как сумма строк A, что приводит к точному решению Ax = b вида xexact = [1,..., 1] T.

b = sum(A,2);
bDist = sum(ADist,2);

С тех пор sum действует в распределенном массиве, bDist также распределяется, и его данные хранятся в памяти работников вашего параллельного пула. Наконец, определите точные решения для сравнения с решениями, полученными с помощью прямых численных методов.

xEx = ones(n,1);
xDistEx = ones(n,1,'distributed');

Теперь, когда вы определили свою систему линейных уравнений, вы можете использовать mldivide для непосредственного решения системы. В MATLAB можно вызвать mldivide с помощью специального оператора \. Для решения проблемы распределенной системы не требуется изменять код. mldivide имеет автоматическую поддержку распределенных массивов.

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

x = A\b;
err = abs(xEx-x);

xDist = ADist\bDist;
errDist = abs(xDistEx-xDist);

figure
subplot(2,1,1)
semilogy(err,'o');
title('System of Linear Equations with Full Matrices');
ylabel('Absolute Error');
xlabel('Element in x');
ylim([10e-17,10e-13])
subplot(2,1,2)
semilogy(errDist,'o');
title('System of Linear Equations with Distributed Full Matrices');
ylabel('Absolute Error');
xlabel('Element in x');
ylim([10e-17,10e-13])

Для распределенных массивов и массивов, хранящихся на клиенте, абсолютная ошибка между вычисленными результатами для x и точным результатом xexact невелика. Точность решения примерно одинакова для обоих типов массивов.

mean(err)
ans = 1.6031e-13
mean(errDist)
ans =

   1.2426e-13

Решение разреженной матричной системы

Распределенные массивы также могут содержать разреженные данные. Для создания матрицы коэффициентов A используйте sprand и speye для непосредственного генерирования разреженной матрицы случайных чисел плюс разреженная единичная матрица. Добавление единичной матрицы помогает предотвратить создание A в виде сингулярной или почти сингулярной матрицы, которые трудно факторизировать.

n = 1e3;
density = 0.2;
A = sprand(n,n,density) + speye(n);
ADist = distributed(A);

Выбор вектора правой руки b в качестве суммы строк A дает точное решение той же формы, что и решение для полной матричной системы.

b = sum(A,2);
bDist = sum(ADist,2);
xEx = ones(n,1);
xDistEx = ones(n,1,'distributed');

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

x = A\b;
err = abs(xEx-x);

xDist = ADist\bDist;
errDist = abs(xDistEx-xDist);

figure
subplot(2,1,1)
semilogy(err,'o');
title('System of Linear Equations with In-Client Sparse Matrices');
ylabel('Absolute Error');
xlabel('Element in x');
ylim([10e-17,10e-13])
subplot(2,1,2)
semilogy(errDist,'o');
title('System of Linear Equations with Distributed Sparse Matrices');
ylabel('Absolute Error');
xlabel('Element in x');
ylim([10e-17,10e-13])

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

mean(err)
ans = 1.6031e-13
mean(errDist)
ans =

   1.2426e-13

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

delete(gcp('nocreate'));

Повышение эффективности решения

Для некоторых типов матрицы A больших и разреженных коэффициентов существуют более эффективные методы, чем прямая факторизация для решения ваших систем. В этих случаях итеративные методы могут быть более эффективными при решении вашей системы линейных уравнений. Итеративные методы генерируют ряд приближенных решений, которые сходятся к конечному результату. Пример использования итерационных методов для решения линейных уравнений с большими разреженными входными матрицами см. в разделе Использование распределенных массивов для решения систем линейных уравнений с помощью итеративных методов.

См. также

| |

Связанные темы