53 lines
1.5 KiB
Matlab
Executable File
53 lines
1.5 KiB
Matlab
Executable File
%%*************************************************************************
|
|
%% iterrefine: Iterative refinement.
|
|
%% This step is crucial to ensure that computed solution
|
|
%% is sufficiently accuraete.
|
|
%%
|
|
%% SDPT3: version 3.1
|
|
%% Copyright (c) 1997 by
|
|
%% K.C. Toh, M.J. Todd, R.H. Tutuncu
|
|
%% Last Modified: 16 Sep 2004
|
|
%%*************************************************************************
|
|
|
|
function [x,resnrm,solve_ok] = iterrefine(A,b,L,x0);
|
|
|
|
tol = 1e-6;
|
|
maxit = 10;
|
|
bnorm = max(1,norm(b));
|
|
tolb = tol*bnorm;
|
|
x = x0;
|
|
solve_ok = 1;
|
|
resnrm(1) = bnorm;
|
|
%%
|
|
for iter = 1:maxit
|
|
x0 = x;
|
|
if isstruct(A); r = b-matvec(A,x); else; r=b-A*x; end;
|
|
err = norm(r);
|
|
resnrm(iter+1) = err;
|
|
|
|
if (err < tolb); break; end;
|
|
if (iter > 1) & (resnrm(iter+1)/resnrm(iter) > 0.9)
|
|
x = x0; solve_ok = 0; break;
|
|
end
|
|
d = linsysolvefun(L,r);
|
|
x = x + d;
|
|
end
|
|
%%*************************************************************************
|
|
%% matvec: matrix-vector multiply.
|
|
%% matrix = [A.mat11 A.mat12; A.mat12' A.mat22]
|
|
%%*************************************************************************
|
|
|
|
function Ax = matvec(A,x);
|
|
|
|
m = length(A.mat11); m2 = length(x)-m;
|
|
x1 = x(1:m);
|
|
Ax = A.mat11*x1;
|
|
if (m2 > 0)
|
|
x2 = x(m+[1:m2]);
|
|
Ax = Ax + A.mat12*x2;
|
|
Ax2 = (x1'*A.mat12)' + A.mat22*x2;
|
|
Ax = [Ax; Ax2];
|
|
end
|
|
return;
|
|
%%*************************************************************************
|