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

Распределенные массивы являются подходящими для больших математических вычислений, такими как большие проблемы линейной алгебры. Этот пример показывает, как можно решить систему линейных уравнений формы 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 из формы xточный=[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 и ожидаемые значения xточный.

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 и точный результат xточный является маленьким. Точность решения является приблизительно тем же самым для обоих типов массива.

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

Смотрите также

| |

Похожие темы