changeset 706:a95c89436916 feature/optim

add arnoldi
author Ylva Rydin <ylva.rydin@telia.com>
date Mon, 06 Nov 2017 11:42:15 +0100
parents e6fbdc9ccfc4
children 0de70ec8bf60 bca7a52550d1
files +time/+expint/Arnoldi.m
diffstat 1 files changed, 37 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+time/+expint/Arnoldi.m	Mon Nov 06 11:42:15 2017 +0100
@@ -0,0 +1,37 @@
+function y = Arnoldi(A,v,t,tol,m)
+
+n = size (v,1);
+V = zeros(n  ,m+1);
+H = zeros(m+1,m);
+
+beta = norm(v);
+V(:,1) = v/beta;
+resnorm = inf;
+
+j=0;
+
+while resnorm > tol
+    j = j+1;
+    z = A*V(:,j);
+    for i=1:j
+        H(i,j) = z'*V(:,i);
+        z  = z - H(i,j)*V(:,i);
+    end
+    H(j+1,j) = norm(z);
+    e1 = zeros(j,1); e1(1) = 1;
+    ej = zeros(j,1); ej(j) = 1;
+    s  = [0.01, 1/3, 2/3, 1]*t;
+    for q=1:length(s)
+        u         = expm(-s(q)*H(1:j,1:j))*e1;
+        beta_j(q) = -H(j+1,j)* (ej'*u);
+    end
+    resnorm = norm(beta_j,'inf');
+    fprintf('j = %d, resnorm = %.2e\n',j,resnorm);
+    if resnorm<=toler
+       break
+    elseif j==m
+       disp('warning: no convergence within m steps');
+    end
+    V(:,j+1) = z/H(j+1,j);
+end
+y = V(:,1:j)*(beta*u);