Käytön idea: kun löydät mieleisesi tehtävän, sen alapuolella on linkki tex-tiedostoon. Lataa
tiedosto, ja liitä se pääsivulta löytyvään harjoituspohjaan.
1.
Piirrä samaan kuvaan funktioiden cos ja sin kuvaajat välillä Aloita
tyyliin:
Vihje: Voit piirtäämolemmat yhdelläplot-komennolla tai käyrän kerrallaan pitämällävanhan kuvan hold-komennon avulla.
Jos haluat kuvat eri grafiikkaikkunoihin, voit käyttääfigure-komentoa. Toisinaan on kätevääjakaa grafiikkaruutu osiin. Tämäonnistuu subplot:n avulla. Kokeile näitävaihtoehtoisia tapoja (nyttai myöhemmin).
Piirrä sin(2x) sinisellä ja cos(5x) punaisella, välillä [−π,π] (samaan kuvaan).
Merkitse vielä samaan kuvaan sin(2x):n arvot o-merkeillä x-pisteissä
Vihje: Pane merkille tällaiset grafiikan ulkoasua säätelevät lisäkomennot (jotka voidaan antaajälkikäteen (paitsi hold on pitääantaa ajoissa)): grid on/off, hold on/off, axis, xlim, ylim, figure, subplot, shg , close all Tutkitoiminta help:stäja oppaista. Aloita: help plot (tai klikkaa: plot).
Suorita joitakin kokeiluja (mutta älä uuvuksiin asti tässä vaiheessa vielä).
Piirrä samaan kuvaan funktioiden sin kx kuvaajat välillä , kun k = 1…5.
1.
Tee nuolinäppäintä ( ↑ ) komentoeditoinnissa hyödyntäen ja hold on-
komentoa käyttäen.
2.
Kirjoita pieni for-silmukka.
3.
Muodosta 5-sarakkeinen matriisi, jonka k : s sarake on sin kx, missä x on
“x-vektori” .
Vihje: Muodosta ensin 100 × 5-matriisi , jonka sarakkeet ovat kx, k = 1…5. Kätevimminmatriisikertolaskulla x*K, missäx on (100-pituinen) sarakevektori ja K (5-pituinen) indeksi(rivi)vektori.Mieti huolellisesti, miksi! Toinen mahdollisuus on käyttäämeshgrid-komentoa, jonka käyttöön rutinoidutaan 3d-grafiikanyhteydessä.
Matriisiin sovellettuna plot-funktio piirtää kunkin matriisin sarakkeen. Varsin
käyttökelpoinen muoto on plot(x,A), jossa x on A:n sarakkeiden pituinen
argumenttivektori.
Piirrä samaan kuvaan potenssit x,x2,…,xn, missä n on muuteltava parametri. Käytä
m-tiedostoa (skriptiä) seuraavan ohjeen mukaisesti. Avaa uusi m-tiedosto ( FILE-valikosta open->new->script ) ja talleta se vaikkapa
nimelle potenssipiirto.m . Tai kirjoita komentoikkunassa: >> edit ’potenssipiirto.m’ Aloita tiedosto jotenkin näin:
% % Piirret“”a“”an potenssifunktioita.
% Tiedosto: potenssipiirto.m.
% Laatinut Vilja Varis 1.1.2012 % HUOM! ellet muuta tätä, saat 0 pistettä!
close all % Grafiikkaruudun tyhjennys
n=5; % Muuteltava parametri
...
Talleta ja kirjoita komentoikkunaan:
>> potenssipiirto
Tällöin tiedostossa olevat Matlab-komennot suorittuvat.
Komennot suorittuvat myös editori-ikkunasta CTR-ENTER :llä. (Mac:ssä yleisesti
CTR:n sijasta cmd.)
(Vihreä nuoli tai F5 toimivat myös.) Suorita skripti muutamalla eri n:n arvolla
Vihje:
1.
Tee for-silmukka ja käytähold on-komentoa uuden kuvan piirtämiseksi vanhankaveriksi.
2.
Olkoon aluksi vaikka n = 3,m = 7, missäm on x-vektorin pituus. Muodosta matriisitN ja X, missäN koostuu vakiosarakkeista 1,2,3 ja X saadaan latomalla kolme x-sarakettarinnakkain. Tällöin X.^Non matriisi, jonka sarakkeina ovat x-vektorin potenssit 1,2,3.Kuva saadaan nyt komennolla plot(x,X.^N). (Yleisesti: plot(x,Y)piirtääkunkinY-matriisin sarakkeen x:n toimiessa x-akselina, kun xon Y:n sarakkeiden pituinen vektori.(Toimii myös riveittäin, jos x on rivien pituinen.)
Miten saadaan helpoimmin matriisit X, N ? Standarditapa on tämä:
>> nind=1:3;
>> [N,X]=meshgrid(nind,x);
Suorita ja selvitäitsellesi.
Tee sitten esim. 100-pituinen x-vektori ja vaihtele myös n:ääja piirräsileitäkuvia. Lopuksi voit kokeilla, miltänäyttää mesh(nind,x,X.^N).
Huom! Tällainen meshgrid-komennon käyttöon rutiinitoimenpide 3d-grafiikantekemisessä, sen toimintaperiaate on mukava ymmärtää, sitätämäyrittääpalvella.
3.
Helpoin tapa lienee Vandermonden matriisi vander. Siitäpäon eri tehtävä(05), mutta ei olehuonoa harjoitella tässäkin uudestaan.
Piirrä pintakuva ja korkeuskäyräpiirros, jälkimmäinen sekä contour
että ezcontour-funktioilla. Tässä on mahdollisuus kokeilla korkeuskäyrien
valitsemistapoja, myös clabel. Ota alueeksi vaikka [-2 2 -1 1] .
Tämä on exp-funktion rationaaliapproksimaatio, ns. Pade-approksimaatio. Piirrä
kuvaaja välillä [0,4]. Piirrä samaan kuvaan exp-funktio eri värillä ja eri kuvaan erotus f(x) −exp(x) Aloita
vaikka: x=linspace(0,4,200);
Vihje: Tehtävässäharjoitellaan lausekkeen muodostamista pisteittäisin laskutoimituksin. Homma selkeytyy jakamalla pienempiin osiin, ainakin nyt tällaisiin:
>> x=...;
>> osoittaja=...;
>> nimittaja=...;
>> f=...; % Huomaa: f on muuttuja (200-pituinen vektori), ei funktio.
>> % Tässä ei siten saa kirjoittaa: f(x) = ...
>> x=linspace(0,4,200);
>> osoittaja=1+x/24; % Skalaarilla jaossa ei tarvia pistettä.
>> % (Jos skalaari jaettaisiin vektorilla, niin toki tarvittaisiin.)
>> nimittaja=1-x/12+x.^2/384;
>> f=(osoittaja./nimittaja).^8;
>> plot(x,f)
>> hold on
>> plot(x,exp(x),’r’)
>> figure % uusi graiikkaikkuna
>> plot(x,f-exp(x))
Opettajalle: Tästä voisi tehdä jatkotehtävän tyyppiä: Vertaa Taylorin sarjaa ja
Pade-approksimaatiota. Ja vielä: voisi vaikka opettaa, miten Pade-approksimaatioita
muodostetaan.
määräämä dynaaminen systeemi tunnetaan kvadraattisena kuvauksena. Valituille
luvuille c ja z0 ylläoleva rekursio johtaa kompleksiseen lukujonoon z1,z2,z3…. Tätä
jonoa kutsutaan z0:n kiertoradaksi. Riippuen lukujen c ja z0 valinnasta ratojen muotoja
on useita.
Annetulle kiinteälle luvulle c useimmilla z0 rata lähestyy ääretöntä (eli |zn|
kasvaa rajatta kun n →∞.) Joillakin c ja z0 rata kuitenkin suppenee kohti jotain
periodista silmukkaa (eli arvot kiertävät z0 jollain tietyllä etäisyydellä |zn|);
joillakin alkuarvoilla rata on kaoottinen. Nämä alkuarvot z0 ovat kuvauksen
Julia-joukko.
Tässä harjoituksessa kirjoitetaan MATLAB-ohjelma, joka laskee ns. täytetyn
Julia-joukon, joka koostuu niistä alkioista z0 joiden radat jollain annetulla arvolla c
eivät kasva rajatta – tavallinen Julia-joukko on tämän joukon reuna.
On näytetty, että jos |zn| kasvaa isommaksi kuin 2 jollain arvolla n, rekursio kasvaa
rajatta. Arvoa n jolla tämä tapahtuu, kutsutaan tässä tehtävässä pisteen z0
”pakonopeudeksi.”
Aloita kirjoittamalla funktio n = escapeVelocity(z0,c,N), jossa N on jokin yläraja
pakonopeuksille (erityisesti: jos |zn| < 2∀n < N, funktion tulee palauttaa N. Näin
vältetään ikuiset silmukat).
Luodaksesi Julia-joukon kirjoita funktio M=julia(zMax,c,N). Argumentti zMax
määrää kompleksitasosta nelikulmion |Im(z)| < zmax,|Re(z)| < zmaz. c ja N ovat
samat argumentit kuin edellä, palautettava matriisi M koostuu määritetyn hilan
pakonopeuksista.
Aloita funktion julia kirjoittaminen määrittelemällä 500 × 500 hila realitasossa, luo
sen avulla vastaava hila Z kompleksitasolle, ja aja funktio escapeVelocity jokaiselle
matriisin Z alkiolle.
Vihje: Realiakselin väli [a,b] määritellään MATLABissa komennolla I = linspace(a,b,n),missän on haluttujen pisteiden määrä, kuten esim. 500. Hila reaalitasolle määritelläänkomennolla [x y] = meshgrid(t1,t2) , missät1 ja t2 ovat välejäreaaliakselilta. Tästäluodaankompleksitasoa peittävähila komennolla z = x+i*y.
Kompleksiluvun modulin saa selville itseisarvofunktiolla abs.
Vihje: Voit piirtäämolemmat yhdelläplot-komennolla tai käyrän kerrallaan pitämällävanhan kuvan hold-komennon avulla.
Jos haluat kuvat eri grafiikkaikkunoihin, voit käyttääfigure-komentoa. Toisinaan on kätevääjakaa grafiikkaruutu osiin. Tämäonnistuu subplot:n avulla. Kokeile näitävaihtoehtoisia tapoja (nyttai myöhemmin).
mlG11.tex Kirjoita MATLAB-skripti, joka laskee ja piirtää seuraavat funktiot:
a)
y = 5 cos(3πx). Laske arvo 101:ssä tasavälisessä pisteessä välillä 0 ≤ x ≤
1.
b)
y = välillä −5 ≤ x ≤ 5 .
c)
y = . Laske arvo 200 tasavälisessä pisteessä välillä −≤x ≤ . Käytä axis komentoa asettaaksesi näytettävät akselit väleille
−2 ≤ x ≤ 2 ja −10 ≤ x ≤ 10.
Vihje: Jako- ja kertolaskujen tapauksessa ole tarkkana: haluatko matriisioperaation vai alkioittaisenoperaation? Alkioittaiset operaatiot erotetaan matriisioperaatioista operaattorin eteen sijoitettavallapisteellä. Esimerkiksi .* on alkioittainen kertolasku, * matriisien kertolasku.
Trigonometriset funktiot toimivat MATLABissa alkioittain, ja löytyvät loogisilla nimillä. (cos,acos, sin jne.)
Tasavälisiäpistejoukkoja luodaan komennolla linspace, tai vaihtoehtoisesti MATLABinkaksoispiste-notaatiolla. Tutustu kummankin dokumentaatioon, ja päätäkumpaa kannattaa tässätilanteessa käyttää.
Funktion g(x) kiintopiste on piste x0, jolle pätee g(x0) = x0. Valistuneen arvauksen
kiintopisteen sijainnista voi piirtämällä kuvaajat y = g(x) ja y = x samaan kuvaan, ja
arvioimalla käyrien leikkauspistettä graafisesti. Käyttämällä tätä tekniikkaa,
arvioi funktion g(x) = cos(x) kiintopisteen sijaintia.
Vihje: Kaksi käyräävoidaan piirtääsamaan kuvaan joko yhdelläplot käskyllä:plot(x1,y1,x2,y2), tai vaihtoehtoisesti voidaan käyttääMATLABin hold optiota:
Tässä tehtävässä tutkitaan kuvien, matriisien ja singulaariarvojen yhteyksiä.
Matriisin A ∈ ℝm×n singulaariarvohajotelma on
missä matriisi S on diagonaalimatriisi, ja matriisit U ja V ovat ortogonaalisia
neliömatriiseja. Matriisin sisältämää informaatiota voidaan tietyssä mielessä
kompressoida tiputtamalla osia singulaariarvohajotelmasta pois; on todistettavissa että
(MATLABilla ilmaistuna) U(:,1:k)*S(1:k,1:k)*V(:,1:k)’ on paras mahdollinen
rank(k)-approksimaatio matriisille A.
Kuva voidaan ajatella m × n matriisina, missä i,j alkio ilmaisee vastaavassa paikassa
olevan pikselin väriarvon. Tutkitaan sitten kuinka singulaariarvoja voidaan käyttää
hyväksi kuvien pakkaamisessa ja hahmontunnistuksessa.
Lue haluamasi kuva sisään MATLABin imread komennolla. Komento luo (yleensä,
mutta hieman kuvasta riippuen), m × n × 3 matriisin. Tämä vastaa RGB-esitystä:
ensimmäisessä kerroksessa on punaisen värin intensiteetit, toisessa vihreän ja
kolmannessa sinisen. Muuta tämä matriisi harmaaskaalaan komennolla rgb2gray.
Tämän jälkeen tee matriisille singulaariarvohajotelma komennolla [u s v]= svd(P), missä P on kuvasi matriisiesitys. Tutki sitten millä k:n arvolla
komentojono
>> M = u(:,1:k)*s(1:k,1:k)*v(:,1:k)’;
>> image(M)
tuottaa havaittavia tuloksia. Pitäisi myös päteä, että kuvan isommat hahmot
alkavat erottua ensin, mikä tekee singulaariarvoista huomattavan tehokkaan työkalun
hahmontunnistuksessa.
Vihje: Kuvan ulottuvuuksien ei kannata olla kovin isoja: singulaariarvohajotelma on raskas laskettava.Jos haluat lisähaastetta, erottele kuvan värikerrokset, tee hajotelma niille erikseen, ja kokoa tulokset.Näin saat aikaan värikuvia.
Luo n × n matriiseja A jollakin sopivalla n (s.o. enemmän kuin kymmenen,
vähemmän kuin sata), joiden alkiot ovat muotoa
Piirrä matriisin A ominaisarvot tasoon, kun t vaihtelee välillä [−1, 1]. Mitä
havaitset? Voisivatko perättäisten ominaisarvojen radat esittää jotain?
Vihje: Mieti miten matriisin voisi määritelläilman silmukkaa. Matriisin ominaisarvot lasketaankomennolla eig – huomaa, ettäjos matriisi on kovin iso, niin laskeminen voi kestääkauan.
a) Piirrä funktiot cos t ja sin t samaan kuvaan eri väreillä.
b) Piirrä toiseen kuvaan yksikköympyrä ja säännöllinen n−kulmio esim. arvolla
n = 10. Järjestä sopivilla axis-komennoilla skaalat yhtäsuuriksi, jotta ympyrä
näkyy ympyränä.
c) Piirrä yksikköympyrän kuva joillain edellä esiintyneillä lineaarikuvauksilla(tai
muilla keksimilläsi).
Vihje: Uusi grafiikkaikkuna: figure Muistathan ympyrän luonnollisen parametriesityksen. Ympyrän data koostuu oikeasti säännöllisesen n-kulmion nurkkapisteistä, missäesim. n = 100(linspace:n oletus). Ympyrän kuvan piirtäminen on siten sama homma kuin edellisissälineaarikuvaustehtävissä.
Vihje: Tutustu samalla Matlabin meshgrid:n toimintaan. Korkeusarvomatriisi Z tehdään kahden muuttujan funktiolle tähän tapaan:
>> x=linspace(a,b,m); y=linspace(c,d,n); % m ja n luokkaa 30.
>> [X,Y]=meshgrid(x,y);
>> Z=f(X,Y);
(Kokeile periaatetta pienillä, hiukan erikokoisilla matriiseilla X,Y.) Tässäfunktion f on toimittava pisteittäisin operaatioin. Jos vaikka f(x,y) = x2−y2, kirjoitettaisiin: Z=X.^2 - Y.^2;
Pintoihin mesh(x,y,Z), surf(x,y,Z), ...Kokeile myös colorbar yms.
Matlabilla korkeuskäyriin contour, voit myös kokeilla ezcontour-funktiota. Mahdollisuus on kokeillamyös korkeuskäyrien valitsemistapoja, clabel.
Älädiskretoi liian hienoksi. Linspacessa 100 on ihan liikaa, n. luokkaa 30 olkoon lähtökohta.
Maple: Helpompaa, mutta tulos ei aivan niin loistava kuin Matlabissa. (Osin tosin varsin hienoatämäkin, ja “context sensitive”).
Piirrä sin(2x) sinisellä ja cos(5x) punaisella, välillä [−π,π] (samaan kuvaan).
Merkitse vielä samaan kuvaan sin(2x):n arvot o-merkeillä x-pisteissä
Vihje: Pane merkille tällaiset grafiikan ulkoasua säätelevät lisäkomennot (jotka voidaan antaajälkikäteen (paitsi hold on pitääantaa ajoissa)): grid on/off, hold on/off, axis, xlim, ylim, figure, subplot, shg , close all Tutkitoiminta help:stäja oppaista. Aloita: help plot (tai klikkaa: plot).
Suorita joitakin kokeiluja (mutta älä uuvuksiin asti tässä vaiheessa vielä).
Piirrä samaan kuvaan funktioiden sin kx kuvaajat välillä , kun k = 1…5.
1.
Tee nuolinäppäintä ( ↑ ) komentoeditoinnissa hyödyntäen ja hold on-
komentoa käyttäen.
2.
Kirjoita pieni for-silmukka.
3.
Muodosta 5-sarakkeinen matriisi, jonka k : s sarake on sin kx, missä x on
“x-vektori” .
Vihje: Muodosta ensin 100 × 5-matriisi , jonka sarakkeet ovat kx, k = 1…5. Kätevimminmatriisikertolaskulla x*K, missäx on (100-pituinen) sarakevektori ja K (5-pituinen) indeksi(rivi)vektori.Mieti huolellisesti, miksi! Toinen mahdollisuus on käyttäämeshgrid-komentoa, jonka käyttöön rutinoidutaan 3d-grafiikanyhteydessä.
Matriisiin sovellettuna plot-funktio piirtää kunkin matriisin sarakkeen. Varsin
käyttökelpoinen muoto on plot(x,A), jossa x on A:n sarakkeiden pituinen
argumenttivektori.
Piirrä samaan kuvaan potenssit x,x2,…,xn, missä n on muuteltava parametri. Käytä
m-tiedostoa (skriptiä) seuraavan ohjeen mukaisesti. Avaa uusi m-tiedosto ( FILE-valikosta open->new->script ) ja talleta se vaikkapa
nimelle potenssipiirto.m . Tai kirjoita komentoikkunassa: >> edit ’potenssipiirto.m’ Aloita tiedosto jotenkin näin:
% % Piirret“”a“”an potenssifunktioita.
% Tiedosto: potenssipiirto.m.
% Laatinut Vilja Varis 1.1.2012 % HUOM! ellet muuta tätä, saat 0 pistettä!
close all % Grafiikkaruudun tyhjennys
n=5; % Muuteltava parametri
...
Talleta ja kirjoita komentoikkunaan:
>> potenssipiirto
Tällöin tiedostossa olevat Matlab-komennot suorittuvat.
Komennot suorittuvat myös editori-ikkunasta CTR-ENTER :llä. (Mac:ssä yleisesti
CTR:n sijasta cmd.)
(Vihreä nuoli tai F5 toimivat myös.) Suorita skripti muutamalla eri n:n arvolla
Vihje:
1.
Tee for-silmukka ja käytähold on-komentoa uuden kuvan piirtämiseksi vanhankaveriksi.
2.
Olkoon aluksi vaikka n = 3,m = 7, missäm on x-vektorin pituus. Muodosta matriisitN ja X, missäN koostuu vakiosarakkeista 1,2,3 ja X saadaan latomalla kolme x-sarakettarinnakkain. Tällöin X.^Non matriisi, jonka sarakkeina ovat x-vektorin potenssit 1,2,3.Kuva saadaan nyt komennolla plot(x,X.^N). (Yleisesti: plot(x,Y)piirtääkunkinY-matriisin sarakkeen x:n toimiessa x-akselina, kun xon Y:n sarakkeiden pituinen vektori.(Toimii myös riveittäin, jos x on rivien pituinen.)
Miten saadaan helpoimmin matriisit X, N ? Standarditapa on tämä:
>> nind=1:3;
>> [N,X]=meshgrid(nind,x);
Suorita ja selvitäitsellesi.
Tee sitten esim. 100-pituinen x-vektori ja vaihtele myös n:ääja piirräsileitäkuvia. Lopuksi voit kokeilla, miltänäyttää mesh(nind,x,X.^N).
Huom! Tällainen meshgrid-komennon käyttöon rutiinitoimenpide 3d-grafiikantekemisessä, sen toimintaperiaate on mukava ymmärtää, sitätämäyrittääpalvella.
3.
Helpoin tapa lienee Vandermonden matriisi vander. Siitäpäon eri tehtävä(05), mutta ei olehuonoa harjoitella tässäkin uudestaan.
Piirrä pintakuva ja korkeuskäyräpiirros, jälkimmäinen sekä contour
että ezcontour-funktioilla. Tässä on mahdollisuus kokeilla korkeuskäyrien
valitsemistapoja, myös clabel. Ota alueeksi vaikka [-2 2 -1 1] .
Tämä on exp-funktion rationaaliapproksimaatio, ns. Pade-approksimaatio. Piirrä
kuvaaja välillä [0,4]. Piirrä samaan kuvaan exp-funktio eri värillä ja eri kuvaan erotus f(x) −exp(x) Aloita
vaikka: x=linspace(0,4,200);
Vihje: Tehtävässäharjoitellaan lausekkeen muodostamista pisteittäisin laskutoimituksin. Homma selkeytyy jakamalla pienempiin osiin, ainakin nyt tällaisiin:
>> x=...;
>> osoittaja=...;
>> nimittaja=...;
>> f=...; % Huomaa: f on muuttuja (200-pituinen vektori), ei funktio.
>> % Tässä ei siten saa kirjoittaa: f(x) = ...
>> x=linspace(0,4,200);
>> osoittaja=1+x/24; % Skalaarilla jaossa ei tarvia pistettä.
>> % (Jos skalaari jaettaisiin vektorilla, niin toki tarvittaisiin.)
>> nimittaja=1-x/12+x.^2/384;
>> f=(osoittaja./nimittaja).^8;
>> plot(x,f)
>> hold on
>> plot(x,exp(x),’r’)
>> figure % uusi graiikkaikkuna
>> plot(x,f-exp(x))
Opettajalle: Tästä voisi tehdä jatkotehtävän tyyppiä: Vertaa Taylorin sarjaa ja
Pade-approksimaatiota. Ja vielä: voisi vaikka opettaa, miten Pade-approksimaatioita
muodostetaan.
määräämä dynaaminen systeemi tunnetaan kvadraattisena kuvauksena. Valituille
luvuille c ja z0 ylläoleva rekursio johtaa kompleksiseen lukujonoon z1,z2,z3…. Tätä
jonoa kutsutaan z0:n kiertoradaksi. Riippuen lukujen c ja z0 valinnasta ratojen muotoja
on useita.
Annetulle kiinteälle luvulle c useimmilla z0 rata lähestyy ääretöntä (eli |zn|
kasvaa rajatta kun n →∞.) Joillakin c ja z0 rata kuitenkin suppenee kohti jotain
periodista silmukkaa (eli arvot kiertävät z0 jollain tietyllä etäisyydellä |zn|);
joillakin alkuarvoilla rata on kaoottinen. Nämä alkuarvot z0 ovat kuvauksen
Julia-joukko.
Tässä harjoituksessa kirjoitetaan MATLAB-ohjelma, joka laskee ns. täytetyn
Julia-joukon, joka koostuu niistä alkioista z0 joiden radat jollain annetulla arvolla c
eivät kasva rajatta – tavallinen Julia-joukko on tämän joukon reuna.
On näytetty, että jos |zn| kasvaa isommaksi kuin 2 jollain arvolla n, rekursio kasvaa
rajatta. Arvoa n jolla tämä tapahtuu, kutsutaan tässä tehtävässä pisteen z0
”pakonopeudeksi.”
Aloita kirjoittamalla funktio n = escapeVelocity(z0,c,N), jossa N on jokin yläraja
pakonopeuksille (erityisesti: jos |zn| < 2∀n < N, funktion tulee palauttaa N. Näin
vältetään ikuiset silmukat).
Luodaksesi Julia-joukon kirjoita funktio M=julia(zMax,c,N). Argumentti zMax
määrää kompleksitasosta nelikulmion |Im(z)| < zmax,|Re(z)| < zmaz. c ja N ovat
samat argumentit kuin edellä, palautettava matriisi M koostuu määritetyn hilan
pakonopeuksista.
Aloita funktion julia kirjoittaminen määrittelemällä 500 × 500 hila realitasossa, luo
sen avulla vastaava hila Z kompleksitasolle, ja aja funktio escapeVelocity jokaiselle
matriisin Z alkiolle.
Vihje: Realiakselin väli [a,b] määritellään MATLABissa komennolla I = linspace(a,b,n),missän on haluttujen pisteiden määrä, kuten esim. 500. Hila reaalitasolle määritelläänkomennolla [x y] = meshgrid(t1,t2) , missät1 ja t2 ovat välejäreaaliakselilta. Tästäluodaankompleksitasoa peittävähila komennolla z = x+i*y.
Kompleksiluvun modulin saa selville itseisarvofunktiolla abs.
Kirjoita MATLAB-skripti, joka laskee ja piirtää seuraavat funktiot:
a)
y = 5 cos(3πx). Laske arvo 101:ssä tasavälisessä pisteessä välillä 0 ≤ x ≤
1.
b)
y = välillä −5 ≤ x ≤ 5 .
c)
y = . Laske arvo 200 tasavälisessä pisteessä välillä −≤x ≤ . Käytä axis komentoa asettaaksesi näytettävät akselit väleille
−2 ≤ x ≤ 2 ja −10 ≤ x ≤ 10.
Vihje: Jako- ja kertolaskujen tapauksessa ole tarkkana: haluatko matriisioperaation vai alkioittaisenoperaation? Alkioittaiset operaatiot erotetaan matriisioperaatioista operaattorin eteen sijoitettavallapisteellä. Esimerkiksi .* on alkioittainen kertolasku, * matriisien kertolasku.
Trigonometriset funktiot toimivat MATLABissa alkioittain, ja löytyvät loogisilla nimillä. (cos,acos, sin jne.)
Tasavälisiäpistejoukkoja luodaan komennolla linspace, tai vaihtoehtoisesti MATLABinkaksoispiste-notaatiolla. Tutustu kummankin dokumentaatioon, ja päätäkumpaa kannattaa tässätilanteessa käyttää.
Funktion g(x) kiintopiste on piste x0, jolle pätee g(x0) = x0. Valistuneen arvauksen
kiintopisteen sijainnista voi piirtämällä kuvaajat y = g(x) ja y = x samaan kuvaan, ja
arvioimalla käyrien leikkauspistettä graafisesti. Käyttämällä tätä tekniikkaa,
arvioi funktion g(x) = cos(x) kiintopisteen sijaintia.
Vihje: Kaksi käyräävoidaan piirtääsamaan kuvaan joko yhdelläplot käskyllä:plot(x1,y1,x2,y2), tai vaihtoehtoisesti voidaan käyttääMATLABin hold optiota:
Tässä tehtävässä tutkitaan kuvien, matriisien ja singulaariarvojen yhteyksiä.
Matriisin A ∈ ℝm×n singulaariarvohajotelma on
missä matriisi S on diagonaalimatriisi, ja matriisit U ja V ovat ortogonaalisia
neliömatriiseja. Matriisin sisältämää informaatiota voidaan tietyssä mielessä
kompressoida tiputtamalla osia singulaariarvohajotelmasta pois; on todistettavissa että
(MATLABilla ilmaistuna) U(:,1:k)*S(1:k,1:k)*V(:,1:k)’ on paras mahdollinen
rank(k)-approksimaatio matriisille A.
Kuva voidaan ajatella m × n matriisina, missä i,j alkio ilmaisee vastaavassa paikassa
olevan pikselin väriarvon. Tutkitaan sitten kuinka singulaariarvoja voidaan käyttää
hyväksi kuvien pakkaamisessa ja hahmontunnistuksessa.
Lue haluamasi kuva sisään MATLABin imread komennolla. Komento luo (yleensä,
mutta hieman kuvasta riippuen), m × n × 3 matriisin. Tämä vastaa RGB-esitystä:
ensimmäisessä kerroksessa on punaisen värin intensiteetit, toisessa vihreän ja
kolmannessa sinisen. Muuta tämä matriisi harmaaskaalaan komennolla rgb2gray.
Tämän jälkeen tee matriisille singulaariarvohajotelma komennolla [u s v]= svd(P), missä P on kuvasi matriisiesitys. Tutki sitten millä k:n arvolla
komentojono
>> M = u(:,1:k)*s(1:k,1:k)*v(:,1:k)’;
>> image(M)
tuottaa havaittavia tuloksia. Pitäisi myös päteä, että kuvan isommat hahmot
alkavat erottua ensin, mikä tekee singulaariarvoista huomattavan tehokkaan työkalun
hahmontunnistuksessa.
Vihje: Kuvan ulottuvuuksien ei kannata olla kovin isoja: singulaariarvohajotelma on raskas laskettava.Jos haluat lisähaastetta, erottele kuvan värikerrokset, tee hajotelma niille erikseen, ja kokoa tulokset.Näin saat aikaan värikuvia.
Luo n × n matriiseja A jollakin sopivalla n (s.o. enemmän kuin kymmenen,
vähemmän kuin sata), joiden alkiot ovat muotoa
Piirrä matriisin A ominaisarvot tasoon, kun t vaihtelee välillä [−1, 1]. Mitä
havaitset? Voisivatko perättäisten ominaisarvojen radat esittää jotain?
Vihje: Mieti miten matriisin voisi määritelläilman silmukkaa. Matriisin ominaisarvot lasketaankomennolla eig – huomaa, ettäjos matriisi on kovin iso, niin laskeminen voi kestääkauan.
a) Piirrä funktiot cos t ja sin t samaan kuvaan eri väreillä.
b) Piirrä toiseen kuvaan yksikköympyrä ja säännöllinen n−kulmio esim. arvolla
n = 10. Järjestä sopivilla axis-komennoilla skaalat yhtäsuuriksi, jotta ympyrä
näkyy ympyränä.
c) Piirrä yksikköympyrän kuva joillain edellä esiintyneillä lineaarikuvauksilla(tai
muilla keksimilläsi).
Vihje: Uusi grafiikkaikkuna: figure Muistathan ympyrän luonnollisen parametriesityksen. Ympyrän data koostuu oikeasti säännöllisesen n-kulmion nurkkapisteistä, missäesim. n = 100(linspace:n oletus). Ympyrän kuvan piirtäminen on siten sama homma kuin edellisissälineaarikuvaustehtävissä.
Vihje: Tutustu samalla Matlabin meshgrid:n toimintaan. Korkeusarvomatriisi Z tehdään kahden muuttujan funktiolle tähän tapaan:
>> x=linspace(a,b,m); y=linspace(c,d,n); % m ja n luokkaa 30.
>> [X,Y]=meshgrid(x,y);
>> Z=f(X,Y);
(Kokeile periaatetta pienillä, hiukan erikokoisilla matriiseilla X,Y.) Tässäfunktion f on toimittava pisteittäisin operaatioin. Jos vaikka f(x,y) = x2−y2, kirjoitettaisiin: Z=X.^2 - Y.^2;
Pintoihin mesh(x,y,Z), surf(x,y,Z), ...Kokeile myös colorbar yms.
Matlabilla korkeuskäyriin contour, voit myös kokeilla ezcontour-funktiota. Mahdollisuus on kokeillamyös korkeuskäyrien valitsemistapoja, clabel.
Älädiskretoi liian hienoksi. Linspacessa 100 on ihan liikaa, n. luokkaa 30 olkoon lähtökohta.
Maple: Helpompaa, mutta tulos ei aivan niin loistava kuin Matlabissa. (Osin tosin varsin hienoatämäkin, ja “context sensitive”).