155GIT1 / 7. cvičení: Porovnání verzí

Z GeoWikiCZ
Skočit na navigaci Skočit na vyhledávání
m
 
(Není zobrazeno 20 mezilehlých verzí od 3 dalších uživatelů.)
Řádek 1: Řádek 1:
 
{{Geoinformatika}}
 
{{Geoinformatika}}
{{Cvičení|155GIT1|7|Grafy funkcí, uživatelské funkce}}
+
{{Cvičení|155GIT1|7|Uživatelské funkce}}
  
 
== Náplň cvičení ==
 
== Náplň cvičení ==
  
# grafické okno <code>figure</code>
+
# drobné smíšené úlohy
# grafy funkcí <code>plot(), subplot(), axis()</code>
 
# uživatelské funkce
 
  
 
== Ukázky ==
 
== Ukázky ==
  
=== Grafické okno ===
+
=== Drobné úlohy ===
  
<source lang=octave>
+
'''Funkce pro výpočet nekonečné řady do zadané přesnosti (příklad iterativního výpočtu)'''
figure
 
</source>
 
  
=== Grafy funkcí ===
+
např. výpočet funkce arctg(), viz {{wikipedia|Taylorova řada}}:
 
 
* <code>plot()</code> {{bullet}} [http://geo.fsv.cvut.cz/user/gin/git1/matlab/matlab.pdf#86 argumenty]
 
  
 
<source lang=octave>
 
<source lang=octave>
x = [0:pi/50:2*pi];
+
function [arctgx] = arctg(x,mez)
y = sin(x);
+
% vypocet funkce arctg rozvojem v radu do zadane presnosti
plot(x, y)
+
% IN:  x     ... vektor argumentu funkce
%
+
%     mez    ... zadana presnost vypoctu
% nové okno
+
% OUT: arctgx ... vektor vypoctenych uhlu z intervalu <-pi/2,pi/2>
h = figure
 
plot(x, y 'r+')
 
%
 
% více grafů najednou
 
z = cos(x);
 
plot(x, y, 'r+', x, z, 'b*')
 
</source>
 
  
{{fig|octave-graf-1|<code>plot(x, y, 'r+', x, z, 'b*')</code>}}
+
if any(x > 1) | any(x < -1)
 +
    error('arctg: Vstupni hodnoty musi byt z intervalu <-1,1>.')
 +
end
  
* <code>subplot()</code>
+
% vypocet pro kazdy prvek daneho vektoru samostatne
 
+
for i=1:length(x)
<source lang=octave>
+
    % start iterace pro i-ty vstupni prvek
x = 1:100;
+
    y0 = 100; % vkladam fiktivni hodnotu, kterou x na vstupu nikdy nemuze nabyt
figure
+
    % 1.iterace
% první
+
    n = 1;
subplot(2, 2, 1)
+
    y = x(i);
plot(x, x)
+
    while  abs( y-y0 ) > mez
% druhý
+
        % n-ta iterace
subplot(2, 2, 2)
+
        n = n+1;
plot(x, sqrt(x))
+
        y0 = y;
% třetí
+
        y = y0 + (-1)^(n+1) *  x(i)^(2*n-1) / (2*n-1);
subplot(2, 2, 3)
+
    end
plot(x, log(x))
+
    % ulozeni vypoctene hodnoty do vystupni promenne
% čtvrtý
+
    arctgx(i) = y;
subplot(2, 2, 4)
+
    fprintf('Pocet iteraci vypoctu: %d\n',n)
plot(x, x.^2)
+
end
 
</source>
 
</source>
  
{{fig|octave-graf-2|<code>subplot()</code>}}
+
'''Funkce pro načtení neformátovaných dat po řádcích'''
  
* <code>axis()</code> - omezení oblasti grafu
+
např. záměna čárky za tečku:
  
 
<source lang=octave>
 
<source lang=octave>
x = 0:0.1:5;
+
function teckazacarku(file)
y = exp(x);
+
% vyhleda vsechny carky v souboru a zameni je za tecku
% celý graf
+
% IN: file ... jmeno vstupniho souboru (textovy retezec)
subplot(2, 1, 1)
 
plot(x, y)
 
% výsek x <1, 2>; y <0, 10>
 
subplot(2, 1, 2)
 
plot(x, y)
 
axis([1,2,0,10])
 
</source>
 
  
{{fig|octave-graf-3|<code>axis()</code>}}
+
if ischar(file) == 0
 
+
    error('Jmeno vstupniho souboru musi byt textovy retezec.');
* popisky
+
end
 
 
<source lang=octave>
 
x = [0:pi/100:pi];
 
figure
 
plot(x, sin(x))
 
title('Funkce sinus')
 
xlabel('hodnota v rad')
 
ylabel('sin(x)')
 
legend('prubeh funkce sinus')
 
</source>
 
  
{{fig|octave-graf-4|Graf s popisky}}
+
vstup = fopen(file,'r');
  
=== Uživatelské funkce ===
+
filenew = [file(1:end-4), '_upr', file(end-3:end)];  % jmeno noveho souboru
 +
vystup = fopen(filenew,'w');
  
Syntax:
+
konec = 0;  % indentifikator konce souboru
   
+
  while konec==0
  function [vystup] = nazev(vstup)
+
    radek = fgets(vstup); % fgets() nacte 1 radek souboru (se znakem \n)
 +
    for i=1:length(radek)
 +
        if radek(i) == ','
 +
            radek(i) = '.';
 +
        end
 +
    end
 +
    fprintf(vystup,'%s',radek);
 +
    konec = feof(vstup);  % feof() vrati pro konec souboru hodnotu 1, jinak vraci hodnotu 0
 
  end
 
  end
  
Každá funkce musí být uložena ve vlastním souboru s příponou <tt>.m</tt>. Název souboru musí odpovídat názvu funkce!
+
fclose all;
 +
fprintf('Data ulozena do souboru %s\n',filenew);
 +
</source>
  
<source lang=octave>
+
datový soubor [ftp://athena.fsv.cvut.cz/ZFG/GIT1/carky.txt carky.txt] ke stažení
function [min_x, max_x, mean_x] = stat (x)
 
    min_x = min(x);
 
    max_x = max(x);
 
    mean_x = mean(x);
 
end
 
</source>
 
  
Příklad volaní:
+
Volání funkce:
  
 
<source lang=octave>
 
<source lang=octave>
[mi, ma, mn] = stat(rand(1, 100))
+
teckazacarku('carky.txt')
fprintf("min  = %.3f\nmax  = %.3f\nmean = %.3f\n", [mi, ma, mn])
 
 
</source>
 
</source>
  
 
== Úlohy ==
 
== Úlohy ==
  
* http://peso.fsv.cvut.cz/vyuka/git1/parcely/parcely.html
+
* [[155GIT1 / 7. cvičení / Příklady|7. cvičení - příklady]]

Aktuální verze z 27. 3. 2019, 11:43

předchozí cvičenístránky předmětudalší cvičení

Uživatelské funkce

Náplň cvičení

  1. drobné smíšené úlohy

Ukázky

Drobné úlohy

Funkce pro výpočet nekonečné řady do zadané přesnosti (příklad iterativního výpočtu)

např. výpočet funkce arctg(), viz Taylorova řada:

 function [arctgx] = arctg(x,mez)
 % vypocet funkce arctg rozvojem v radu do zadane presnosti
 % IN:  x      ... vektor argumentu funkce
 %      mez    ... zadana presnost vypoctu
 % OUT: arctgx ... vektor vypoctenych uhlu z intervalu <-pi/2,pi/2>

 if any(x > 1) | any(x < -1)
     error('arctg: Vstupni hodnoty musi byt z intervalu <-1,1>.')
 end

 % vypocet pro kazdy prvek daneho vektoru samostatne
 for i=1:length(x)
     % start iterace pro i-ty vstupni prvek
     y0 = 100; % vkladam fiktivni hodnotu, kterou x na vstupu nikdy nemuze nabyt
     % 1.iterace
     n = 1;
     y = x(i);
     while  abs( y-y0 ) > mez
         % n-ta iterace
         n = n+1;
         y0 = y;
         y = y0 + (-1)^(n+1) *  x(i)^(2*n-1)  / (2*n-1);
     end
     % ulozeni vypoctene hodnoty do vystupni promenne
     arctgx(i) = y;
     fprintf('Pocet iteraci vypoctu: %d\n',n)
 end

Funkce pro načtení neformátovaných dat po řádcích

např. záměna čárky za tečku:

 function teckazacarku(file)
 % vyhleda vsechny carky v souboru a zameni je za tecku
 % IN: file ... jmeno vstupniho souboru (textovy retezec)

 if ischar(file) == 0
     error('Jmeno vstupniho souboru musi byt textovy retezec.');
 end

 vstup = fopen(file,'r');

 filenew = [file(1:end-4), '_upr', file(end-3:end)];  % jmeno noveho souboru
 vystup = fopen(filenew,'w');

 konec = 0;  % indentifikator konce souboru
 while konec==0
     radek = fgets(vstup);  % fgets() nacte 1 radek souboru (se znakem \n)
     for i=1:length(radek)
         if radek(i) == ','
             radek(i) = '.';
         end
     end
     fprintf(vystup,'%s',radek);
     konec = feof(vstup);   % feof() vrati pro konec souboru hodnotu 1, jinak vraci hodnotu 0 
 end

 fclose all;
 fprintf('Data ulozena do souboru %s\n',filenew);

datový soubor carky.txt ke stažení

Volání funkce:

 teckazacarku('carky.txt')

Úlohy