heksapolin_analyysi.m

% Analysoidaan heksapolimagneettikenttää. Lasketaan keskimääräinen
% kentän intensiteetti rlim-säteisen pinta-alan sisällä.
%
% Tehdään sama analyysi käyttäen kahta for-silmukkaa ja toisella
% tavalla hyödyntäen matriiseja. Näillä kahdella eri tavalla on huomattava
% nopeusero Octavessa ja jonkinlainen nopeusero Matlabissa. Mitataan
% nopeus tic/toc -kellolla.

function heksapolin_analyysi()
    fprintf( 'Analyysi käyttäen silmukoita\n' )
    tic
    analyysi_silmukka()
    toc

    fprintf( '\nAnalyysi ilman silmukoita, käyttäen matriiseja\n' )
    tic
    analyysi_matriisi()
    toc
end


function analyysi_silmukka()
    rlim = 39;
    Bmax = 1.07;
    A = -2*Bmax/rlim^2;

    N = 200;
    
    Bsum = 0;
    BN = 0;
    
    % Lasketaan käyttäen kahta sisäkkäistä for-silmukkaa. Indeksi i
    % viittaa x-koordinaatteihin ja j y-koordinaatteihin
    for i=1:N
        
        % Lasketaan x-koordinaatti indeksistä i
        x = -rlim + 2*rlim*(i-1)/(N-1);
        
        for j=1:N
            
            % Lasketaan y-koordinaatti indeksistä j
            y = -rlim + 2*rlim*(j-1)/(N-1);
        
            % Lasketaan r-koordinaatti ja testataan ollaanko ulkona
            % Hypätään seuraavaan pisteeseen jos ollaan
            r = sqrt(x^2 + y^2);
            if r > rlim
                continue
            end
            
            % Lasketaan magneettikentän intensiteetti
            Bx = A*x*y;
            By = 0.5*A*(x^2-y^2);
            Bint = sqrt(Bx^2+By^2);
            
            % Kontribuutio summaan
            Bsum = Bsum + Bint;
            BN = BN + 1;
            
        end
    end
    
    % Lasketaan keskimääräinen kentän intensiteetti
    Bave = Bsum/BN
end



function analyysi_matriisi()
    rlim = 39;
    Bmax = 1.07;
    A = -2*Bmax/rlim^2;

    % Tuotetaan x- ja y-koordinaatit joissa lasketaan
    N = 200;
    [x, y] = meshgrid(linspace(-rlim,rlim,N));
            
    % Lasketaan magneettikentän intensiteetti näissä pisteissä
    Bx = A*x.*y;
    By = 0.5*A*(x.^2-y.^2);
    Bint = sqrt(Bx.^2+By.^2);

    % Lasketaan totuusarvotaulukko (tai maski) missä kaikki pisteet,
    % joissa säde on pienempi kuin rlim on merkitty arvolla tosi ja
    % muut pisteet ovat epätosi
    rmaski = sqrt(x.^2 + y.^2) < rlim;

    % Poimitaan totuusarvomaskia käyttäen magneettikentän
    % intensiteettitaulukosta pisteet jotka ovat pinta-alan sisällä
    Bsisalla = Bint(rmaski);

    % Lasketaan keskimääräinen kentän intensiteetti
    Bave = sum(Bsisalla)/length(Bsisalla)
end





Last modified: Wed Feb 22 13:37:47 2017