B8

Contents

Called Functions

A29

%A29Test
A = randn(5,5);
b = randn(5,3);
k=7;
x = MySolve(A,k,b);

A^k*x-b
ans =

   1.0e-12 *

   -0.0251    0.0365   -0.0457
   -0.1572    0.1963   -0.0918
    0.0683    0.0424    0.0226
   -0.4242    0.1880   -0.3420
    0.0329   -0.0107   -0.0100

A30

v0 = ones(5,1);
tol = 1.e-7;
rayleigh(A,tol,v0)
ans =

    0.4584
   -0.3242
   -0.4061
   -0.1969
   -0.6936

A31

S =[0 0 0 1 0 0 2 0 0;
    0 0 2 0 0 3 0 0 0;
    0 0 0 9 0 5 0 0 0;
    0 0 8 0 0 0 0 7 0;
    0 0 0 7 0 0 0 0 5;
    0 7 4 0 0 0 6 0 0;
    0 0 0 0 0 4 0 0 0;
    6 2 0 0 0 0 0 4 8;
    3 0 0 0 0 0 0 0 0];

[BI BJ] = SudBlock(S,4,7)

SudZug(S,2,2)
SudZug(S,7,3)
BI =

     4     5     6


BJ =

     7     8     9


ans =

     1     4     5     6     8     9


ans =

     1     5     7     9

A32

ST = sudoku(S)
ST(3)
ST(39)
ST = 

1x62 struct array with fields:

    i
    j
    zug


ans = 

      i: 3
      j: 1
    zug: [1 4 7 8]


ans = 

      i: 6
      j: 6
    zug: [1 2 8 9]

MySolve
function x = MySolve(A,k,b)
    [N,M]=size(A);
    if ~(N==M)
        error('A ist nicht quadratisch.')
    end
    [Nb,Mb] = size(b);
    if ~(Nb==N)
        error('b hat falsches Format/Größe.')
    end
    if k<0 || abs(round(k)-k)>0
        error('k muss eine natürliche Zahl > 0 sein.')
    end
    [L,U,P] = lu(A);
    for i=1:k
        x = U\(L\(P*b));
        b = x;
    end
end
SudBlock
function [BI, BJ] = SudBlock(S,i,j)
N = length(S);
n = sqrt(N);

BI = (ceil(i/n)-1)*n+1:(ceil(i/n))*n; %Blockzeilen
BJ = (ceil(j/n)-1)*n+1:(ceil(j/n))*n; %Blockspalten

end
SudZug
function vec = SudZug(S,i,j)
vec=1:length(S);

vec = setdiff(vec,S(i,:));      %Zeile
vec = setdiff(vec,S(:,j));      %Spalte
[BX, BY] = SudBlock(S,i,j);     %Block index
vec = setdiff(vec,S(BX,BY));    %Block
end
rayleigh
function [x, lam] = rayleigh(A,epsilon,x)
  x = x / norm(x);

    lam = x'*A*x;

  err = norm(A*x-lam*x) / norm(x);

  while err > epsilon
    y = (A-lam*eye(size(A,1))) \ x;
    x = y / norm(y);
    lam = x'*A*x;

    err = norm(A*x-lam*x);
  end
end
sudoku
function [ST] = sudoku(S)

[x,y]  = find(S==0);    %Finde alle Indizes
r      = length(x);     %# Nullen

ST(r).i = [];           %preallocate

for k=1:r

    ST(k).i=x(k);       % Zeile
    ST(k).j=y(k);       % Spalte

    ST(k).zug = SudZug(S,ST(k).i,ST(k).j);  %Zulässige Werte

end

end