Этот пример показывает, как использовать неполную факторизацию Холесского в качестве предкондиционера для улучшения сходимости.
Создайте симметричную положительно определенную матрицу, A
.
Создайте неполную факторизацию Холесского в качестве предкондиционера для pcg
. Используйте вектор константы в качестве правой оси. В качестве опорной структуры выполните pcg
без предварительного кондиционера.
Обратите внимание, что fl0 = 1
указывает, что pcg
не управлял относительной невязкой требуемого допуска в максимально допустимых итерациях. Попробуйте неполную факторизацию Холесского без заполнения в качестве предкондиционера.
fl1 = 0
, что указывает на то, что pcg
сходился к запрашиваемому допуску и делал это в 59 итерациях (значение it1
). Поскольку эта матрица является дискретизированным лаплакианом, однако использование изменённого неполного Холецкого может создать лучшую предварительную кондиционер. Измененная неполная факторизация Холесского создает приблизительную факторизацию, которая сохраняет действие оператора на постоянном векторе. То есть 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 итерациях. Построение графиков всех трех историй сходимости показывает сходимость.
График показывает, что измененный неполный прекондиционер Холецкого создает гораздо более быструю сходимость.
Можно также попробовать неполные факторизации Холесского с отбросом порога. Следующий график показывает сходимость 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');
Обратите внимание на неполный предварительный кондиционер Холецкого, сконструированный с допуском падения 1e-2
обозначается как ICT(1e-2)
.
Как и в случае неполного факторизации Холецкого с нулевым заполнением, факторизация порогового падения может быть полезной от модификации (то есть options.michol = 'on'
), поскольку матрица возникает из эллиптического дифференциального уравнения с частными производными. Как и в случае MIC(0)
, измененный основанный на пороге падение неполный Холецкий сохранит действие предкондиционера на постоянных векторах, то есть norm(A*e-L*(L'*e))
будет приблизительно равен нулю.