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

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

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

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

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

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

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

Сначала задайте матрицу коэффициентов A как переменная в памяти клиента, 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])

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

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

   1.2426e-13

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

delete(gcp('nocreate'));

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

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

См. также

| |

Похожие темы