Matlab – cvičení 1
CV – základní operace s maticemi
1.1 Operace s prvky, ukládání Vytvořte (programově, nikoliv ručně) matici o rozměru 10x5, která bude mít v prvním řádku lineární posloupnost (1,2,…,5) a v každém dalším řádku bude n-násobek prvního řádku kde n je číslo řádku. První tři řádky budou tedy vypadat takto: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 -vygenerovanou matici nazvete MOJE1 a uložte ji jako textový (ASCII) soubor matice.txt, jako oddělovače použijte tabulátory. 1.2 Operace s prvky, ukládání Vytvořte matici MOJE2 o rozměru 10x5, která bude mít v prvním sloupci lineární posloupnost (1,…,10) a v dalších sloupcích mocniny prvního sloupce (druhou až pátou). Vytvořte kopii této matice MOJE3 a transponujte ji. Obě matice uložte binárně do souboru matice12.mat.
2
CV – grafika
2.1 2D grafy Vytvořte graf (pomocí m-souboru) dat uložených v úloze 1.2. Využijte příkazu semilogy a legend. Graf by měl na konci zpracování vypadat takto:
2.2 2D grafy Rozšíření úlohy 2.1. Vytvořte graf (pomocí m-souboru) dat uložených v úloze 1.2. Graf by měl na konci zpracování vypadat dle násl. obr. Použijte příkazy subplot a plotyy. Použijte handlu osy pro nastavení textu pomocí příkazu set.
5 programování 5.1. jednoduché funkce 5.1.1 jednoduchá funkce Napište funkci chyba1d s argumenty a,b, kde a a b jsou řádkové vektory, která vypočte a zobrazí rozdíl mezi jednotlivými prvky. Zobrazení bude pomocí grafu, ve kterém budou jak původní vektory a a b, tak chybový vektor. Původní vektory budou přiřazeny levé svislé ose, chybový vektor bude mít svislou osu vpravo. Hlavička funkce: function [rozdil] = chyba1d(a,b) 5.1.2 jednoduchá funkce Rozšiřte předchozí příklad na n rozměrů. Napište funkci chybaND s argumenty a a b, kde a je řádkový vektor a b je matice o stejném počtu sloupců jako je délka vektoru a. Vypočtěte rozdíly mezi jednotlivými řádky matice b a vstupním vektorem a. Spočtěte eukleidovskou metrikou (odmocnina ze součtu čtverců) velikosti rozdílů a najděte největší z nich. Funkce vrací matici rozdílů, vektor velikostí rozdílů a index řádku s největším rozdílem. Funkce dále zobrazí v grafu matici rozdílů. Hlavička funkce: function [rozdily,velikosti,nejvic] = chybaND(a,b) 5.1.3 jednoduchá funkce Napište funkci derivacepolynomu s argumenty a a b, kde a je polynom a b je řád derivace. Funkce vrací derivace n-tého řádu. Hlavička funkce: function [derivace] = derivacepolynomuND(a,b) 5.2 Objektově orientované programování Na webu je ke stažení základ tříd pacient a kpacient (jako oop2012.zip). Text v podporách se vztahuje ke starší verzi, ale pro pochopení se dá využít. Vytvořte dědice třídy pacient s názvem kpacient (pacient s končetinami). Tato nová třída bude mít dvě nové interní proměnné (celočíselné) – rukou, nohou (význam je počet rukou a počet nohou). Vytvořte ‐ ‐ ‐ ‐ ‐
Konstruktor (je na netu) Přístupové metody včetně indexovaných přístupových metod Přístupovou metodu jen pro čtení „počet_končetin“ Zobrazovací metodu „display“ (je na netu) Metody, které mění hodnoty proměnných třídy o Metoda „zestarni“ meni vek o Metoda „nehoda“ změní náhodně počet rukou nebo nohou, pouze dolů! o Metoda „zazrak“ změní náhodně počet rukou nebo nohou, pouze nahoru!
5.3 case study - robot chodí okolo, nedívej se na něho Trošku složitější projekt, který bude vyžadovat již vícero funkcí s různou funkcionalitou. Problém je jednoduchý: robot se pohybuje ve 2D prostředí a je vybaven laserovým dálkoměrem, který je schopný měřit vzdálenost k překážkám. Vytvořte simulaci včetně zobrazení. Krok 1 Popis světa i robotu vytvořte pomocí struktur. Svět vytvořte jako jednoduchý obdélník, překážky ve světě jako obecné polygony. Struktury: svet.sirka %sirka v metrech svet.vyska %vyska (hloubka) v metrech svet.prekazky = {}; % cell array prekazek, kazda je matici vrcholu robot.x % souradnice v ose x robot.y % souradnice v ose y robot.fi % uhel natoceni v radianech
Hlavičky funkcí (můžete navrhnout vlastní funkce, které budou v hlavních funkcích dále využívány): function [svet] = VytvorSvet(sirka, vyska) function [novysvet] = VytvorPrekazky(svet, pocet); function [robot] = VytvorRobota(svet) function [] = NakresliVsechno(svet, robot)
Krok 2 Vytvořte funkci, která pro daný úhel natočení robotu vytvoří koncové body paprsků scanneru, bez ohledu na překážky. Získáte tak hromadu úseček (jednotlivých paprsků). Dále vytvořte funkci, která v daném světě vrátí pro jednotlivé paprsky nejbližší průsečík paprsku s překážkou. K tomu budete potřebovat funkci, která vrátí všechny úsečky překážek, které svět obsahuje. Pak již stačí vyrobit funkci, která vrací průsečík dvou úseček a zjistit, který průsečík (pokud je jich více) je nejbližší. Na závěr vytvořte zobrazovací funkci. Rozsirene struktury svet.sirka %sirka v metrech svet.vyska %vyska (hloubka) v metrech svet.prekazky = {}; % cell array prekazek, kazda je matici vrcholu svet.usecky %matice všech usecek světa (co usecka to radek x1,y1,x2,y2) robot.x % souradnice v ose x robot.y % souradnice v ose y robot.fi % uhel natoceni v radianech robot.dosahLRF %dosah laseroveho scanneru v metrech robot.beams %koncove body paprsku scanneru bez ohledu na prekazky robot.scan % vzdalenosti k prekazce a koncove body pruseciku s prekazkou
Hlavičky funkcí: function [NovyRobot] = GetBeams (robot) % vrati novy robot s naplnenou matici robot.beams (koncove body scanu bez ohledu na prekazky) function [NovySvet] = GetAllLines (svet) % vytvori matici o 4 sloupcich se vsemi useckamy prekazek a da ji do svet.usecky function [NovyRobot] = GetScan(robot,svet) % naplni matici robot.scan. Ta ma v prvnim sloupci vzdalenost od nejblizsi prekazky (maximalne % dosah senzoru, ve druhem a tretim sloupci koncove body pruseciku s nejblizsi prekazkou function [xp,yp,jetam] = prusecik(x1,y1,x2,y2, xb1,yb1,xb2,yb2) % pomocna funkce která najde prusecik dvou usecek, pripadne vrati ze prusecik neexistuje
Výsledek kroku 2 by mohl vypadat například takto:
12 10 8 6 4 2 0 -2 0
2
4
6
8
10
12
14
16
18
20
Krok 3 V kroku 3 robota rozpohybujeme a naprogramuje plánovač trasy, který ho dovede k cíli aniž by robot narazil do překážky. Nejprve budeme předpokládat holonomního robota, tedy takového, který se dokáže otočit na místě. Přidáme funkce JedRovne(okolik) a Zatoc(okolik), respektive funkci ProvedAkci(Akce). Do světa přidáme souřadnice cíle. Poslední ale nejsložitější funkcí bude plánovač, tedy funkce, která na základě polohy robota, aktuálního scanu okolí a polohy cíle vybere co má robot dělat. To co má robot dělat bude definováno ve struktuře Akce. Celá simulace pak poběží v cyklu, který bude ukončen jakmile robot dorazí do blízkosti cíle.
Rozsirene struktury svet.sirka %sirka v metrech svet.vyska %vyska (hloubka) v metrech svet.prekazky = {}; % cell array prekazek, kazda je matici vrcholu svet.usecky %matice všech usecek světa (co usecka to radek x1,y1,x2,y2) svet.cil % souradnice cile
Nová struktura Akce.vpred % o kolik ma robot popojet Akce.otocka % o kolik se ma robot natoci Akce.typ % zda ma robot jet kupredu (1) nebo zatocit (2)
Hlavičky funkcí: function [NovyRobot] = JedRovne(robot,vzdalenost) % vrati novy robot se změněnou polohou function [NovyRobot] = Zatoc(robot,uhel) % vrati novy robot se změněnym uhlem natoceni function [NovyRobot] = ProvedAkci(robot,akce) % vrati novy robot po provedeni akce function [Akce, Chyba] = Planovac(robot,svet) % vrati co se ma provest za akci na zaklade aktualniho scanu, pripadne chybu function [jevcili] = RobotVCili(robot,svet,tolerance) % vrati true nebo false pokud je robot u cile
Hlavni testovaci script bude vypadat v pseudokodu takto VytvorRobota() VytvorSvet() UdelejScan() [Akce, chyba] = Planovac() Dokud není RobotVCili() nebo chyba ProvedAkci() UdelejScan() NakresliVsechno() [Akce, chyba] = Planovac() End Dokud