findDecoupledBlocks

Поиск развязанных блоков в системах уравнений

Описание

пример

[eqsBlocks,varsBlocks] = findDecoupledBlocks(eqs,vars) определяет подмножества (блоки) уравнений, которые могут использоваться для определения подмножеств переменных. Количество переменных vars должно совпадать с количеством уравнений eqs.

i-й блок является множеством уравнений, определяющих переменные в vars(varsBlocks{i}). Переменные в vars([varsBlocks{1},…,varsBlocks{i-1}]) определяются рекурсивно предыдущими блоками уравнений. После того, как вы решите первый блок уравнений для первого блока переменных, второй блок уравнений, заданный eqs(eqsBlocks{2}), задает разделенный подмножество уравнений, содержащих только подмножество переменных, заданное вторым блоком переменных, vars(varsBlock{2}), плюс переменные из первого блока (эти переменные известны в это время). Таким образом, если нетривиальное разложение блока возможно, можно разделить процесс решения для большой системы уравнений с участием многих переменных на несколько шагов, где каждый шаг включает в себя меньшую подсистему.

Количество блоков length(eqsBlocks) совпадает с length(varsBlocks). Если length(eqsBlocks) = length(varsBlocks) = 1, тогда нетривиальное блочное разложение уравнений невозможно.

Примеры

Блок нижнего треугольного разложения системы ДАУ

Вычислите блок нижнего треугольного разложения (разложение BLT) символьной системы дифференциальных алгебраических уравнений (ДАУ).

Создайте следующую систему четырех дифференциальных алгебраических уравнений. Здесь символическая функция вызывает x1(t), x2(t), x3(t), и x4(t) представляет переменные состояния системы. Система также содержит символические параметры c1, c2, c3, c4, и функции f(t,x,y) и g(t,x,y).

syms x1(t) x2(t) x3(t) x4(t)
syms c1 c2 c3 c4
syms f(t,x,y) g(t,x,y)

eqs = [c1*diff(x1(t),t)+c2*diff(x3(t),t)==c3*f(t,x1(t),x3(t));...
       c2*diff(x1(t),t)+c1*diff(x3(t),t)==c4*g(t,x3(t),x4(t));...
       x1(t)==g(t,x1(t),x3(t));...
       x2(t)==f(t,x3(t),x4(t))];

vars = [x1(t), x2(t), x3(t), x4(t)];

Использовать findDecoupledBlocks для поиска блока структуры системы.

[eqsBlocks, varsBlocks] = findDecoupledBlocks(eqs, vars)
eqsBlocks =
  1×3 cell array
    {1×2 double}    {[2]}    {[4]}
varsBlocks =
  1×3 cell array
    {1×2 double}    {[4]}    {[2]}

Первый блок содержит два уравнения в двух переменных.

eqs(eqsBlocks{1})
ans =
 c1*diff(x1(t), t) + c2*diff(x3(t), t) == c3*f(t, x1(t), x3(t))
                                    x1(t) == g(t, x1(t), x3(t))
vars(varsBlocks{1})
ans =
[ x1(t), x3(t)]

После того, как вы решите этот блок для переменных x1(t), x3(t)можно решить следующий блок уравнений. Этот блок состоит из одного уравнения.

eqs(eqsBlocks{2})
ans =
c2*diff(x1(t), t) + c1*diff(x3(t), t) == c4*g(t, x3(t), x4(t))

Блок включает одну переменную.

vars(varsBlocks{2})
ans =
x4(t)

После того, как вы решите уравнение из блока 2 для переменной x4(t), оставшийся блок уравнений, eqs(eqsBlocks{3}), задает оставшуюся переменную, vars(varsBlocks{3}).

eqs(eqsBlocks{3})
vars(varsBlocks{3})
ans =
x2(t) == f(t, x3(t), x4(t))
 
ans =
x2(t)

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

eqsPerm = [eqsBlocks{:}]
varsPerm = [varsBlocks{:}]
eqsPerm =
     1     3     2     4

varsPerm =
     1     3     4     2

Преобразуйте систему в блочную нижнюю треугольную систему уравнений.

eqs = eqs(eqsPerm)
vars = vars(varsPerm)
eqs =
 c1*diff(x1(t), t) + c2*diff(x3(t), t) == c3*f(t, x1(t), x3(t))
                                    x1(t) == g(t, x1(t), x3(t))
 c2*diff(x1(t), t) + c1*diff(x3(t), t) == c4*g(t, x3(t), x4(t))
                                    x2(t) == f(t, x3(t), x4(t))

vars =
[ x1(t), x3(t), x4(t), x2(t)]

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

incidenceMatrix(eqs, vars)
ans =
     1     1     0     0
     1     1     0     0
     1     1     1     0
     0     1     1     1

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

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

Создайте следующую систему линейных алгебраических уравнений.

syms x1 x2 x3 x4 x5 x6 c1 c2 c3

eqs = [c1*x1 + x3 + x5 == c1 + c2 + 1;...
       x1 + x3 + x4 + 2*x6 == 4 + c2;...
       x1 + 2*x3 + c3*x5 == 1 + 2*c2 + c3;...
       x2 + x3 + x4 + x5 == 2 + c2;...
       x1 - c2*x3 + x5 == 2 - c2^2;...
       x1 - x3 + x4 - x6 == 1 - c2];

vars = [x1, x2, x3, x4, x5, x6];

Использовать findDecoupledBlocks для преобразования системы в более низкую треугольную форму. Для этой системы, findDecoupledBlocks определяет три блока уравнений и соответствующих переменных.

[eqsBlocks, varsBlocks] = findDecoupledBlocks(eqs, vars)
eqsBlocks =
  1×3 cell array
    {1×3 double}    {1×2 double}    {[4]}
varsBlocks =
  1×3 cell array
    {1×3 double}    {1×2 double}    {[2]}

Идентифицируйте переменные в первом блоке. Этот блок состоит из трех уравнений в трех переменных.

vars(varsBlocks{1})
ans =
[ x1, x3, x5]

Решите первый блок уравнений для первого блока переменных, присваивая решения соответствующим переменным.

[x1,x3,x5] = solve(eqs(eqsBlocks{1}), vars(varsBlocks{1}))
x1 =
1
 
x3 =
c2
 
x5 =
1

Идентифицируйте переменные во втором блоке. Этот блок состоит из двух уравнений в двух переменных.

vars(varsBlocks{2})
ans =
[ x4, x6]

Решите этот блок уравнений, присваивая решения соответствующим переменным.

[x4, x6] = solve(eqs(eqsBlocks{2}), vars(varsBlocks{2}))
x4 =
x3/3 - x1 - c2/3 + 2
 
x6 =
(2*c2)/3 - (2*x3)/3 + 1

Использовать subs чтобы вычислить результат для уже известных значений переменных x1, x3, и x5.

x4 = subs(x4)
x6 = subs(x6)
x4 =
1
 
x6 =
1

Идентифицируйте переменные в третьем блоке. Этот блок состоит из одного уравнения в одной переменной.

vars(varsBlocks{3})
ans =
x2

Решите это уравнение, присвоив решение x2.

x2 = solve(eqs(eqsBlocks{3}), vars(varsBlocks{3}))
x2 =
c2 - x3 - x4 - x5 + 2

Использовать subs чтобы вычислить результат для уже известных значений всех других переменных этой системы.

x2 = subs(x2)
x2 =
0

Также можно переписать этот пример с помощью for-цикл. Этот подход позволяет вам использовать пример для больших систем уравнений.

syms x1 x2 x3 x4 x5 x6 c1 c2 c3

eqs = [c1*x1 + x3 + x5 == c1 + c2 + 1;...
       x1 + x3 + x4 + 2*x6 == 4 + c2;...
       x1 + 2*x3 + c3*x5 == 1 + 2*c2 + c3;...
       x2 + x3 + x4 + x5 == 2 + c2;...
       x1 - c2*x3 + x5 == 2 - c2^2
       x1 - x3 + x4 - x6 == 1 - c2];

vars = [x1, x2, x3, x4, x5, x6];

[eqsBlocks, varsBlocks] = findDecoupledBlocks(eqs, vars);

vars_sol = vars;

for i = 1:numel(eqsBlocks)
  sol = solve(eqs(eqsBlocks{i}), vars(varsBlocks{i}));
  vars_sol_per_block = subs(vars(varsBlocks{i}), sol);
  for k=1:i-1
    vars_sol_per_block = subs(vars_sol_per_block, vars(varsBlocks{k}),...
                         vars_sol(varsBlocks{k}));
  end
  vars_sol(varsBlocks{i}) = vars_sol_per_block
end
vars_sol =
[ 1, x2, c2, x4, 1, x6]
 
vars_sol =
[ 1, x2, c2, 1, 1, 1]
 
vars_sol =
[ 1, 0, c2, 1, 1, 1]

Входные параметры

свернуть все

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

Переменные, заданные как вектор символьных переменных, функций или вызовов функций, таких как x(t).

Пример: [x(t),y(t)] или [x(t);y(t)]

Выходные аргументы

свернуть все

Индексы, определяющие блоки уравнений, возвращенные как массив ячеек. Каждый блок индексов является вектором-строкой целочисленных чисел двойной точности. i-й блок уравнений состоит из уравнений eqs(eqsBlocks{i}) и включает только переменные в vars(varsBlocks{1:i}).

Индексы, определяющие блоки переменных, возвращаются как массив ячеек. Каждый блок индексов является вектором-строкой целочисленных чисел двойной точности. i-й блок уравнений состоит из уравнений eqs(eqsBlocks{i}) и включает только переменные в vars(varsBlocks{1:i}).

Совет

  • Реализованный алгоритм требует, чтобы для каждой переменной в vars должно быть хотя бы одно совпадающее уравнение в eqs с включением этой переменной. То же уравнение не может быть согласовано с другой переменной. Если система не удовлетворяет этому условию, то findDecoupledBlocks выдает ошибку. В частности, findDecoupledBlocks требует, чтобы length(eqs) = length(vars).

  • Применение сочетаний e = [eqsBlocks{:}] в векторную eqs и v = [varsBlocks{:}] в векторную vars создает матрицу инцидентности incidenceMatrix(eqs(e), vars(v)) который имеет блок нижней треугольной разреженности шаблона.

Введенный в R2014b