Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

courses:a4b35ko:ukol4 [2010/03/14 21:24]
r.polasek created
courses:a4b35ko:ukol4 [2025/01/03 18:28] (aktuální)
Řádek 1: Řádek 1:
 ====== Úkol 4 ====== ====== Úkol 4 ======
 +Nastin reseni: -uzijte si jarniho slunicka-
  
 +dykstar.m:
 +<​code>​
 +Nezlobte se, ale on to fakt neopsal :)
 +
 +%% funkce dyckstar
 +% implementace Dijkstrova algoritmu
 +% INput: ​   r... starting point
 +%           ​W(i,​j)... weight matrix (distances between cities i->j)
 +% OUTput: ​  ​dist(i)..distances from start point to other vertices (city i),
 +% U in slides
 +%           ​track(i)..bactracking the route, to city i we got from
 +%           ​track(i),​ ODKUD in slides
 +function [track,​dist] = dyckstar(r,​W)
 +noV=size(W,​2);​ % pocet vrcholu v grafu
 +V=[1:noV]; % vrcholy v grafu
 +dist=ones(1,​noV).*inf;​ % init..distances are unknown
 +dist(r)=0; % dist r=0
 +track=ones(1,​noV).*inf; ​
 +track(r)=-1;​ % pomocna ukoncovaci podminka
 +done=[]; % already finished (fixed) vertices) , D in slides
 +
 +nehotove=setdiff(V,​done);​ % nehotove ..indexy V\done : nejsou inf
 +while sum(dist(nehotove) ~=inf) > 0
 +    [bla,​zpracovat]=min(dist(nehotove));​ % zpracovat ..index minima z dist(nehotove)
 +    v = nehotove(zpracovat);​ % hodnota toho vrcholu
 +    done = [done v]; % uzel '​v'​ ted udelame a pridame proto k hotovym ​
 +    % pres vsechny vystupni hrany z '​v'​ : 
 +    koncoveBody= V(W(v,:​)~=inf);​ % vrcholy, pro ktere vede hrana z '​v'​
 +    for y = koncoveBody
 +       if dist(v) + W(v,y) < dist(y) % update na kratsi cestu
 +           ​dist(y) = dist(v) + W(v,y);
 +           ​track(y)=v;​
 +       end
 +    end
 +    nehotove=setdiff(V,​done);​
 +end
 +end
 +</​code>​
 +
 +createApproxMatrix.m: ​
 +<​code>​
 +%% createApproxMatrix - vytvari matici pouzitou pro aproximaci
 +%% funkce/​obrazku
 +% W .. vysledna matice vah
 +% x,f .. data na ose x, a f(x)(resp. y)
 +% vrcholy [x(i),​f(x(i))] predstavuji uzly, 
 +% graf obsahuje hranu pro kazdou dvojici uzlu i,j: i<​j; ​
 +% kde vaha hrany je ohodnoceni chyby aproximace.
 +function [W] = createApproxMatrix(x,​f,​alfa,​beta)
 +    % priprava matice vzdalenosti
 +    vrcholu =size(x,2);
 +    W = inf(vrcholu);​
 +    % pro vsechna i<j
 +    for j = 1:​vrcholu ​  
 +        for i = 1:j-1      ​
 +            err = 0;       
 +            % ta suma; tzn pro vsechny body x_k (i<​k<​j) pocitame chybu aproximace techto
 +            % bodu useckou z x_i do x_j
 +            for k = (i+1):​j ​          
 +                approx = f(i) + (x(k) - x(i))*(f(j)-f(i))/​(x(j)-x(i)); ​   % derivace ​      
 +                err = err + (f(k) - approx).^2; ​          
 +            end       
 +            W(i,j) = alfa + beta*err; ​      % nas vypocet vah - v zavislosti na chybe
 +        end    ​
 +    end
 +end
 +</​code>​
 +
 +approxFce.m:​
 +<​code>​
 +%% ukol na cv 6 z A4M33KO - hledani nejkratsi cesty, Dijkstruv alg,
 +%% aproximace fce a obrazku
 +clc;
 +clear;
 +close all;
 +
 +% koeficienty pro pocet vrcholu a odchylky
 +alpha = 1;
 +beta = 1;
 +
 +% vstupni data 
 +x = [ 0 1.26 2.51 3.77 5.03 6.28];
 +f = [ 0.01 1.16 0.70 -0.34 -0.80 0.2100];
 +
 +W = createApproxMatrix(x,​f,​alpha,​beta);​
 +'​matice vzdalenosti:​ ',W
 +
 +% Dijkstruv algoritmus
 +[track,​dist]=dyckstar(1,​W)
 +
 +% vyberu vrcholy po nejkratsi ceste
 +q = size(W,2);
 +cesta = q;
 +while track(1,q) ~= -1
 +    q = track(1,q);
 +    cesta = [cesta q];
 +end
 +
 +cesta = sort(cesta);​
 +
 +% vykresleni ​
 +plot(x,​f,'​g'​)
 +hold on;
 +plot(x(cesta),​f(cesta),'​r'​)
 +</​code>​
 +
 +approxObrazku.m: ​
 +PS: 1)u slidu pisi neco o jinem vypoctu vah nez u fce, ale to je imho zbytecne.
 +    2)orezal jsem data kvuli rychlosti (netbook:P)
 +
 +<​code>​
 +%% ukol na cv 6 z A4M33KO - hledani nejkratsi cesty, Dijkstruv alg,
 +%% aproximace fce a obrazku
 +%clc;
 +%clear;
 +%close all;
 +
 +% koeficienty pro pocet vrcholu a odchylky
 +alpha = 1;
 +beta = 1;
 +
 +% vstupni data 
 + load czechRepublic.mat
 +% whos
 +
 +%% zrychleni pro ukazku: udelejme si mensi republiku
 +x=x(1:​end/​5);​
 +y=y(1:​end/​5);​
 +W = createApproxMatrix(x',​y',​alpha,​beta);​
 +'​matice vzdalenosti:​ ',W;
 +
 +% Dijkstruv algoritmus
 +[track,​dist]=dyckstar(1,​W)
 +
 +% vyberu vrcholy po nejkratsi ceste
 +q = size(W,2);
 +cesta = q;
 +while track(1,q) ~= -1
 +    q = track(1,q);
 +    cesta = [cesta q];
 +end
 +
 +cesta = sort(cesta);​
 +
 +% vykresleni ​
 +plot(x,​y,'​g'​)
 +hold on;
 +plot(x(cesta),​y(cesta),'​r'​)
 +</​code>​
 ~~DISCUSSION~~ ~~DISCUSSION~~
  
  
courses/a4b35ko/ukol4.1268598248.txt.gz · Poslední úprava: 2025/01/03 18:24 (upraveno mimo DokuWiki)
Nahoru
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0