В этом примере показано, как использовать неполную факторизацию Холеского в качестве предварительного условия для улучшения сходимости.
Создайте симметричную положительную определенную матрицу, A.
Создание неполной факторизации Cholesky в качестве предварительного условия для pcg. Используйте вектор константы в качестве правой стороны. В качестве опорной структуры выполните pcg без предварительного условия.
Обратите внимание, что fl0 = 1 указывая, что pcg не удалось привести относительный остаток к запрошенному допуску в максимально допустимых итерациях. Попробуйте неполную факторизацию Холеского без заполнения в качестве предварительного условия.
fl1 = 0, указывая, что pcg сходился к требуемому допуску и сделал это в 59 итерациях (значение it1). Поскольку эта матрица является дискретизированной лапласианской, однако, использование модифицированной неполной Cholesky может создать лучшее предварительное условие. Модифицированная неполная факторизация Холеского конструирует приближённую факторизацию, сохраняющую действие оператора на вектор константы. То есть norm(A*e-L*(L'*e)) будет приблизительно равен нулю для e = ones(size(A,2),1) даже несмотря на то, что norm(A-L*L','fro')/norm(A,'fro') не близок к нулю. Нет необходимости указывать тип для этого синтаксиса, так как nofill по умолчанию, но это хорошая практика.
pcg сходится (fl2 = 0) но только в 38 итерациях. Отображение всех трех историй сходимости показывает сходимость.
На графике видно, что модифицированный неполный преусловник Холески создаёт гораздо более быструю сходимость.
Также можно попробовать неполные факторизации Cholesky с понижением порога. Следующий график показывает сходимость pcg с предварительным кондиционированием, изготовленным с различными допусками на падение.
L3 = ichol(A, struct('type','ict','droptol',1e-1));
[x3,fl3,rr3,it3,rv3] = pcg(A,b,tol,maxit,L3,L3');
L4 = ichol(A, struct('type','ict','droptol',1e-2));
[x4,fl4,rr4,it4,rv4] = pcg(A,b,tol,maxit,L4,L4');
L5 = ichol(A, struct('type','ict','droptol',1e-3));
[x5,fl5,rr5,it5,rv5] = pcg(A,b,tol,maxit,L5,L5');
figure
semilogy(0:maxit,rv0./norm(b),'b-','linewidth',2);
hold on
semilogy(0:it3,rv3./norm(b),'b-.','linewidth',2);
semilogy(0:it4,rv4./norm(b),'b--','linewidth',2);
semilogy(0:it5,rv5./norm(b),'b:','linewidth',2);
legend('No Preconditioner','ICT(1e-1)','ICT(1e-2)', ...
'ICT(1e-3)','Location','SouthEast');Обратите внимание на неполное предварительное кондиционирующее устройство Cholesky, построенное с допуском падения 1e-2 обозначается как ICT(1e-2).
Как и в случае неполного Холеского с нулевым заполнением, факторизация снижения порога может извлечь выгоду из модификации (т. е. options.michol = 'on') так как матрица возникает из эллиптического дифференциального уравнения в частных производных. Как и с MIC(0), модифицированный порог на основе отбрасывания неполного Холеского сохранит действие предварительного условия на постоянные векторы, то есть norm(A*e-L*(L'*e)) будет приблизительно равен нулю.