Ищите разъединенные блоки в системах уравнений
[
идентифицирует подмножества (блоки) уравнений, которые могут использоваться, чтобы задать подмножества переменных. Количество переменных eqsBlocks
,varsBlocks
]
= findDecoupledBlocks(eqs
,vars
)vars
должен совпасть с количеством уравнений eqs
.
i th блок является системой уравнений, определяющей переменные в vars(varsBlocks{i})
. Переменные в vars([varsBlocks{1},…,varsBlocks{i-1}])
определяются рекурсивно предыдущими блоками уравнений. После того, как вы решаете первый блок уравнений для первого блока переменных, второго блока уравнений, данных eqs(eqsBlocks{2})
, задает разъединенное подмножество уравнений, содержащих только подмножество переменных, данных вторым блоком переменных, vars(varsBlock{2})
, плюс переменные из первого блока (эти переменные известны в это время). Таким образом, если нетривиальная блочная декомпозиция возможна, можно разделить процесс решения для большой системы уравнений, включающей много переменных в несколько шагов, где каждый шаг включает меньшую подсистему.
Количество блоков length(eqsBlocks)
совпадает с length(varsBlocks)
. Если length(eqsBlocks) = length(varsBlocks) = 1
, затем нетривиальная блочная декомпозиция уравнений не возможна.
Реализованный алгоритм требует этого для каждой переменной в vars
в eqs
должно быть по крайней мере одно соответствующее уравнение включение этой переменной. То же уравнение не может также быть соответствующим к другой переменной. Если система не удовлетворяет этому условию, то
findDecoupledBlocks
выдает ошибку. В частности, findDecoupledBlocks
требует того length(eqs) = length(vars)
.
Применение сочетаний e = [eqsBlocks{:}]
к векторному eqs
и v = [varsBlocks{:}]
к векторному vars
производит матрицу падения incidenceMatrix(eqs(e), vars(v))
это имеет блок нижний треугольный шаблон разреженности.
daeFunction
| decic
| diag
| incidenceMatrix
| isLowIndexDAE
| massMatrixForm
| odeFunction
| reduceDAEIndex
| reduceDAEToODE
| reduceDifferentialOrder
| reduceRedundancies
| tril
| triu