Selvitä, mitä koodi tekee sekä kommentoi ja täydennä koodi. Työn arvostelussa kiinnitän erityistä huomiota työn raportoinnin kattavuuteen.



Samankaltaiset tiedostot
MS-A Matriisilaskenta Laskuharjoitus 3

Aluksi Kahden muuttujan lineaarinen epäyhtälö

Koodaa tehtävän ratkaisu Matlab-ohjelmaa hyväksi käyttäen. Ratkaisumenetelminä käytä Newtonin menetelmää ja sekanttimenetelmää.

2.7 Neliöjuuriyhtälö ja -epäyhtälö

c) Määritä paraabelin yhtälö, kun tiedetään, että sen huippu on y-akselilla korkeudella 6 ja sen nollakohdat ovat x-akselin kohdissa x=-2 ja x=2.

2.5. Matriisin avaruudet ja tunnusluvut

Esimerkki 8. Ratkaise lineaarinen yhtälöryhmä. 3x + 5y = 22 3x + 4y = 4 4x 8y = r 1 + r r 3 4r 1. LM1, Kesä /68

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Matriisialgebra harjoitukset, syksy 2015

Tässä dokumentissa on ensimmäisten harjoitusten malliratkaisut MATLABskripteinä. Voit kokeilla itse niiden ajamista ja toimintaa MATLABissa.

Epäyhtälön molemmille puolille voidaan lisätä sama luku: kaikilla reaaliluvuilla a, b ja c on voimassa a < b a + c < b + c ja a b a + c b + c.

( ) ( ) ( ) ( ( ) Pyramidi 4 Analyyttinen geometria tehtävien ratkaisut sivu 271 Päivitetty a) = keskipistemuoto.

Käänteismatriisin ominaisuuksia

Numeeriset menetelmät

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Matlabin perusteita Grafiikka

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Numeeriset menetelmät TIEA381. Luento 6. Kirsi Valjus. Jyväskylän yliopisto. Luento 6 () Numeeriset menetelmät / 33

Matematiikan tukikurssi 3.4.

1 Matriisit ja lineaariset yhtälöryhmät

datenum, hold on, axis, datestr, floor, now, title, xlabel, ylabel, plot, size, text, num2str, legend, grid, hold off, print.

Yhtälöryhmä matriisimuodossa. MS-A0007 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Tilastollinen vastepintamallinnus: kokeiden suunnittelu, regressiomallin analyysi, ja vasteen optimointi. Esimerkit laskettu JMP:llä

Matriisit ja vektorit Matriisin käsite Matriisialgebra. Olkoon A = , B = Laske A + B, , 1 3 3

802118P Lineaarialgebra I (4 op)

monissa laskimissa luvun x käänteisluku saadaan näyttöön painamalla x - näppäintä.

Matriisi-vektori-kertolasku, lineaariset yhtälöryhmät

Kanta ja Kannan-vaihto

Matematiikan tukikurssi

Lineaarinen yhtälöryhmä

4A 4h. KIMMOKERROIN E

1.7 Gradientti ja suunnatut derivaatat

Harjoitus 4 -- Ratkaisut

Pienimm"an neli"osumman sovitus

Matriisialgebra harjoitukset, syksy x 1 + x 2 = a 0

5.3 Ensimmäisen asteen polynomifunktio

MAA10 HARJOITUSTEHTÄVIÄ

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 3 /

Insinöörimatematiikka D

Ratkaisuehdotukset LH 7 / vko 47

Numeeriset menetelmät

3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä

Matemaattiset ohjelmistot 1-2 ov, 2-3 op

Ratkaisuehdotukset LH 3 / alkuvko 45

Osittaistuenta Gaussin algoritmissa: Etsitään 1. sarakkeen itseisarvoltaan suurin alkio ja vaihdetaan tämä tukialkioiksi (eli ko. rivi 1. riviksi).

Numeeriset menetelmät

ARVIOINTIPERIAATTEET

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Harjoitus 7 -- Ratkaisut

Demo 1: Simplex-menetelmä

MS-C1340 Lineaarialgebra ja differentiaaliyhtälöt

JOENSUUN SEUDUN HANKINTATOIMI KOMISSIOMALLI

2.2 Täydellinen yhtälö. Ratkaisukaava

Tyyppi metalli puu lasi työ I II III

Matematiikan tukikurssi

ax + y + 2z = 0 2x + y + az = b 2. Kuvassa alla on esitetty nesteen virtaus eräässä putkistossa.

Yhtälöryhmä matriisimuodossa. MS-A0004/A0006 Matriisilaskenta. Tarkastellaan esimerkkinä lineaarista yhtälöparia. 2x1 x 2 = 1 x 1 + x 2 = 5.

Kenguru 2016 Mini-Ecolier (2. ja 3. luokka) Ratkaisut

Tieteellinen laskenta 2 Törmäykset

Ville Turunen: Mat Matematiikan peruskurssi P1 1. välikokeen alueen teoriatiivistelmä 2007

BM20A0700, Matematiikka KoTiB2

Oletetaan, että funktio f on määritelty jollakin välillä ]x 0 δ, x 0 + δ[. Sen derivaatta pisteessä x 0 on

30 + x ,5x = 2,5 + x 0,5x = 12,5 x = ,5a + 27,5b = 1,00 55 = 55. 2,5a + (30 2,5)b (27,5a + 27,5b) =

1 Ominaisarvot ja ominaisvektorit

Lineaarialgebra ja differentiaaliyhtälöt Harjoitus 4 / Ratkaisut

1. Lineaarialgebraa A := Matriisin osia voidaan muutella päivittämällä riviä, saraketta tai osamatriisia (Matlabmaisesti): B :=

Kurssin loppuosassa tutustutaan matriiseihin ja niiden käyttöön yhtälöryhmien ratkaisemisessa.

Johdatus diskreettiin matematiikkaan Harjoitus 7,

Matemaattiset ohjelmistot A. Osa 2: MATLAB

Ominaisarvot ja ominaisvektorit 140 / 170

3 Ikkunointi. Kuvio 1: Signaalin ikkunointi.

MS-C1340 Lineaarialgebra ja

3 Lineaariset yhtälöryhmät ja Gaussin eliminointimenetelmä

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44

S Laskennallinen Neurotiede

Determinantti. Määritelmä

MS-A0004/MS-A0006 Matriisilaskenta Laskuharjoitus 6 / vko 42

Eksponenttifunktion Laplace muunnos Lasketaan hetkellä nolla alkavan eksponenttifunktion Laplace muunnos eli sijoitetaan muunnoskaavaan

T Sovellusohjelmat Matlab osa 4: Skriptit, funktiot ja kontrollirakenteet

MAB3 - Harjoitustehtävien ratkaisut:

5 Lineaariset yhtälöryhmät

Talousmatematiikan perusteet

Harjoitus 3: Matlab - Matemaattinen mallintaminen

Matematiikan tukikurssi

Ennakkotehtävän ratkaisu

Matriisien tulo. Matriisit ja lineaarinen yhtälöryhmä

Luento 6. June 1, Luento 6

Simplex-algoritmi. T Informaatiotekniikan seminaari , Susanna Moisala

Matriiseista. Emmi Koljonen

Numeeriset menetelmät TIEA381. Luento 8. Kirsi Valjus. Jyväskylän yliopisto. Luento 8 () Numeeriset menetelmät / 35

Scilab ohjelman alkeisohjeet

FUNKTION KUVAAJAN PIIRTÄMINEN

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Harjoitus 3: Regressiomallit (Matlab)

Kuntosaliharjoittelun kesto tunteina Kokonaishyöty Rajahyöty

ACKERMANNIN ALGORITMI. Olkoon järjestelmä. x(k+1) = Ax(k) + Bu(k)

MS-A0202 Differentiaali- ja integraalilaskenta 2 (SCI) Luento 4: Ketjusäännöt ja lineaarinen approksimointi

Determinantti. Määritelmä

Transkriptio:

Ohjelmointi ja Matlab : syksy 0 : 5.9.-9.0.0 Kotitehtävä : Seuraavassa on esitetty Matlab-koodi, joka laskee jotakin. %om_0_k.m A=[,,0;-,,;0,,4];b=[;;3];n=length(b); for k=:n-,for i=k+:n,if A(i,k)~=0, ka=a(i,k)/a(k,k);a(i,k+:n)=a(i,k+:n)-ka*a(k,k+:n); b(i)=b(i)-ka*b(k);,,; for k=n:-:,b(k)=(b(k)-a(k,k+:n)*b(k+:n))/a(k,k);;disp(b); Selvitä, mitä koodi tekee sekä kommentoi ja täydennä koodi. Työn arvostelussa kiinnitän erityistä huomiota työn raportoinnin kattavuuteen. Ratkaisu: Kyseessä on lineaarisen yhtälöryhmän ratkaisu Gaussin eliminaatiomenetelmällä. Kyseessä on seuraava lineaarinen yhtälöryhmä: x y x y z y 4z 3 Matriisimuodossa () voidaan esittää seuraavasti 0 x y 0 4 z 3 Ratkaistaan nyt () Gaussin eliminaatiomenetelmällä (puhutaan myös vaakarivimuunnoksista). Matriisimuodossa laskut tapahtuvat seuraavasti. Aloitusmatriisi on: 0 0 4 3 Voimme laittaa nyt rivit Matlabiin seuraavasti (voimme laskea tietysti käsinkin, mutta koska Matlab on käytössämme...): >> format rat % Käytämme murtolukuesitysmuotoa R = [ 0 ] ; R = [ - ] ; R3 = [ 0 4 3 ] ; >> disp ([ R; R; R3 ]) 0-0 4 3 Laskemme vektoreita käyttäen. () ()

Ensimmäinen tehtävä on poistaa x:n kertoimet riveiltä (yhtälöistä) (R) ja 3 (R3). Kun kerromme ensimmäisen rivin (R) ½:lla ja lisäämme sen toiseen riviin (R) saamme >> R = R + (/) * R ; >> disp ([ R; R; R3 ]) 0 0 5/ 5/ 0 4 3 Nyt kolmannen rivin x:n kerroin on jo nolla, joten sitä ei tarvitse poistaa. Jos siinä olisi nollasta eroava luku, se poistetaan edellä esitetyllä tavalla. Seuraavaksi poistetaan y:n kertoimet riviltä 3 (R3) kertomalla rivi (R) (-/5):lla ja lisäämällä se riviin 3 (R3): >> R3 = R3 + (-/5)*R ; >> disp ([ R; R; R3 ]) 0 0 5/ 5/ 0 0 6/5 0 x 0 y 5 5 6 0 0 5 z Nyt matriisi on halutussa muodossa, eli ns. alakolmiossa on pelkkiä nollia. Palautetaan esitysmuoto lineaarisen yhtälöryhmän muotoon: x y 5 5 y z 6 z 5 Josta takaisinpäin sijoittamalla saamme: >> z = /(6/5) z = 5/8 >> y = ( (5/)-*z )/(5/) y = / >> x = ( - y) / x = /4 >> disp ([ x; y; z ]) /4 / 5/8 Eli yhtälöryhmän ratkaisu on: x 4 x 0.500 y eli y 0.5000 5 z 8 z 0.650 Voimme tarkistaa vastauksen sijoittamalla arvot alkuperäiseen yhtälöryhmään (). (3)

Käydään seuraavaksi alkuperäisen sillisalaattikoodin - käytetään myös nimitystä spagettikoodi - kimppuun. Lisätään tekstiin rivinvaihtoja, välilyöntejä ja tekstin sisennyksiä, jolloin saamme: %om_0_k.m A = [,, 0 ;... -,, ;... 0,, 4 ] ; b = [ ; ; 3] ; n = length(b) ; for k = : n-, for i = k+ : n, if A(i,k)~=0, ka = A(i,k)/A(k,k) ; A(i,k+:n) = A(i,k+:n) - ka*a(k,k+:n) ; b(i) = b(i) - ka*b(k) ;,, ; for k = n : - :, b(k)=(b(k)-a(k,k+:n)*b(k+:n))/a(k,k) ; ; disp(b) ; Vaikka koodi on vielä täysin kommentoimaton, näemme jo ohjelman rakenteen aika selvästi. Alussa on määritelty laskentamatriisit, seuraavaksi on kaksi laskentasilmukkaa, jotka käyvät läpi matriisin A ja lopuksi lasketaan matriisin (tai oikeammin vektorin) arvot. Lopuksi tulostetaan ruudulle b:n arvot. Kommentoidaan koodi: %om_0_k.m format rat ; % Esitetään murtolukuina. % Lineaarinen yhtälöryhmä % x + y = % -x + y + z = % y + 4z = 3 % voidaan esittää vektorimuodossa Matlabissa seuraavasti. A = [,, 0 ;... % 3 x 3 matriisi. -,, ;... 0,, 4 ] ; b = [ ; ; 3]; % Pystyvektori. n = length(b) ; % Lasketaan pystyvektorin pituus. % Tulostetaan ongelma ruudulle. disp ([ A b ]) ; disp (' ') ; % Tyhjä rivi tulosteeseen. % Eliminointivaihe (elimination phase). for k = : n-, % Käydään läpi kaikki rivit. for i = k+ : n, %.. ja kaikki sarakkeet. if A(i,k)~=0, % Jos alkion arvo nolla, ei tehdä mitään. ka = A(i,k)/A(k,k) ; % Lasketaan kertoimen arvo. % Vaakarivimuunnokset. A(i,k+:n) = A(i,k+:n) - ka*a(k,k+:n) ; b(i) = b(i) - ka*b(k) ;,, disp ([ A b ]) ; disp (' ') ; ; Yhden sisennyksen mitta on joko kaksi, kolme tai neljä välilyöntiä mikä nyt sattuu silmää parhaiten miellyttämään. Tässä on käytetty sisennyksenä kahta välilyöntiä.

% Taaksepäin sijoittaminen (back substitution). for k = n : - :, b(k) = (b(k) - A(k,k+:n)*b(k+:n))/A(k,k); ; % Tulostetaan ratkaisu ruudulle. disp ( 'Ratkaisu:') ; disp (b) ; Kun ajamme ohjelman, saamme seuraavan tulosteen: >> om_0_k 0-0 4 3 Ratkaisu: /4 / 5/8 0-5/ 5/ 0 4 3 0-5/ 5/ 0 6/5 Laskenta etenee hiukan toisella tavalla kuin tehtävän alussa on esitetty; Gaussin eliminaation kun voi koodata niin monella eri tavalla. Tässä yhteydessä emme kuitenkaan paneudu tehdyn koodauksen kaikkiin hienouksiin. Tosielämässä Matlabilla lineaariset yhtälöryhmät ratkaistaan kenoviivalla jakamalla seuraavasti: >> A = [,, 0 ; -,, ; 0,, 4 ] ; >> b = [ ; ; 3] ; >> vastaus = A\b vastaus = /4 / 5/8 Matlabia käyttäen monet monimutkaisilta vaikuttavat ongelmat muuttuvat helpoiksi.

Ohjelmointi ja Matlab : syksy 0 : 5.9.-9.0.0 Kotitehtävä : palautettava to.09.0 klo :00 mennessä Juha Jaakon postilaatikkoon (joko kirjepostilaatikkoon tai sähköpostilaatikkoon juha.jaako@oulu.fi) Seuraavassa kuviossa on esitetty osastolta valmistuneet kandidaatintyöt ja tutkinnot. Kuviossa käytetyt datapisteet ovat seuraavat: % Kandidaatintyöt. data = [ datenum(005, 9, ), 0 ; datenum(006,, 30), ;... datenum(007,, 6), ; datenum(008,, 5), 5 ;... datenum(008, 3, 4), 8 ; datenum(008, 5, ), 3 ;... datenum(008, 9, 9), ; datenum(009,, 0), 33 ;... datenum(009, 4, 8), 4 ; datenum(009, 7, 6), 54 ;... datenum(009, 8, 6), 67 ; datenum(009, 0, 6), 79 ;... datenum(009,, 3), 89 ; datenum(00,, ), 99 ;... datenum(00, 3, 9), 06 ; datenum(00, 9, ), 5 ;... datenum(00, 0, 7), 34 ; datenum(00,, ), 43 ;... datenum(0,, 8), 5 ; datenum(0, 4, 9), 6 ;... datenum(0, 5, 30), 7 ; datenum(0, 7, ), 80 ] ; % Kandidaatintutkinnot. data = [ datenum(005,,3), 0 ; datenum(006,,3), 0 ;... datenum(007,,3), 0 ; datenum(008,,3), ;... datenum(009,,3), 37 ; datenum(00,,30), 90 ; datenum(0, 5,30), 6 ] ; Koodaa Matlab-ohjelma, joka tekee yo. kuvion. Työn arvostelussa kiinnitän erityistä huomiota työn raportoinnin kattavuuteen.

% om_0_k.m % Juha Jaako - 9.09.0 % MATLAB Version 5.3..95a (R.) on PCWIN clear all ; format compact ; hold on ; % Aloitetaan kuvan piirtäminen. % Tutkintotavoite 85 tutkintoa vuodessa - tätä voi muuttaa. tavoite = 85 ; % Aloituspäivä. alku = datenum(005, 9, ) ; % Datapisteet kandidaatintöistä. data = [ datenum(005, 9, ), 0 ;... datenum(006,, 30), ;... datenum(007,, 6), ;... datenum(008,, 5), 5 ;... datenum(008, 3, 4), 8 ;... datenum(008, 5, ), 3 ;... datenum(008, 9, 9), ;... datenum(009,, 0), 33 ;... datenum(009, 4, 8), 4 ;... datenum(009, 7, 6), 54 ;... datenum(009, 8, 6), 67 ;... datenum(009, 0, 6), 79 ;... datenum(009,, 3), 89 ;... datenum(00,, ), 99 ;... datenum(00, 3, 9), 06 ;... datenum(00, 9, ), 5 ;... datenum(00, 0, 7), 34 ;... datenum(00,, ), 43 ;... datenum(0,, 8), 5 ;... datenum(0, 4, 9), 6 ;... datenum(0, 5, 30), 7 ;... datenum(0, 7, ), 80 ] ; data(:,) = data(:,) - alku ; % Datapisteet kandidaatintutkinnoista. data = [ datenum(005,,3), 0 ;... datenum(006,,3), 0 ;... datenum(007,,3), 0 ;... datenum(008,,3), ;... datenum(009,,3), 37 ;... datenum(00,,30), 90 ;... datenum(0, 5,30), 6 ] ; data(:,) = data(:,) - alku ; % Määritetään akselien rajat. axis( [ 0 3000 0 350 ] ) ; % Piirretään datapisteet kuvioon. plot ( data(:,), data(:,), 'k.-', data(:,), data(:,), 'kd-' ) ;

% Piirretään asetusarvo +. vuoden viive &. vuoden viive... % Montako päivää on neljässä vuodessa. delta_x = datenum(009, 8, 3) - datenum(005, 9, ) ; delta_y = 4*tavoite ; % Tutkintotavoite neljässä vuodessa. kk = delta_y / delta_x ; % Suorien kulmakertoimen laskenta. for k = : 8, % Piirretään suorat fplot-komennon avulla. % Suoran yhtälön muodostaminen. fun = [ numstr(kk) '*x-' numstr(k) '*(' numstr(tavoite) ')' ] ; % Piirretään sinisellä... str = 'b--' ; %... paitsi kun k =. if ( k == ), str = 'r-' ; % Varsinainen suoran piirtorutiini. fplot (fun, [ 0 3000], str ) ; % Tekstit. leg ( 'Kandidaatintyöt', 'Kandidaatintutkinnot',... [ 'Tavoite ' numstr(tavoite) ' tutkintoa/a' ], ) ; title ( { 'Kandidaatintyöt ja -tutkinnot', 'Prosessi- ja ympäristötekniikan osastolla' } ) ; xlabel ( 'Päiviä ajanhetkestä.9.005' ) ; ylabel ( 'Määrä' ) ; text ( 50, 5, [ 'Tilanne ' datestr(now, ) ] ) ; grid on ; hold off ; % Ruudukko kuvioon. % Lopetetaan kuvion piirtäminen. %print -depsc -tiff d:\tmp\om_0_k ;

Ohjelmointi ja Matlab : syksy 0 : 5.9.-9.0.0 Kotitehtävä 3: palautettava to 9.09.0 klo :00 mennessä Juha Jaakon postilaatikkoon (joko kirjepostilaatikkoon tai sähköpostilaatikkoon juha.jaako@oulu.fi) A car manufacturer has collected some data on the noise level (measured in decibels) produced at 7 different speeds by 6 different models of cars that it produces. This data is summarized in the following table: Speed [km/h] Car 30 50 65 80 95 0 30 88 90 94 0 34 75 77 80 86 94 03 3 3 80 83 85 94 00 4 68 7 76 85 96 0 5 5 77 84 9 98 05 9 6 8 85 90 96 0 09 0 Write a Matlab program (or programs) which creates a report (or reports) out of this data. Preferably use Matlab s function-structures (>>help function). Arvostelussa kiinnitän erityistä huomiota työn raportoinnin kattavuuteen. Eräs ratkaisuvaihtoehto: Tässä vaihtoehdossa tehdään itse koodattuja Matlab-funktioita, jotka luovat raportin. Teemme ensin pääohjelman om_0_k3.m, % om_0_k3.m % Eri automallien melutaso. format compact ; Nopeus = [ 30 50 65 80 95 0 30 ] ; Melu = [ 88 90 94 0 34 ;... 75 77 80 86 94 03 3 ;... 80 83 85 94 00 ;... 68 7 76 85 96 0 5 ;... 77 84 9 98 05 9 ;... 8 85 90 96 0 09 0 ] ; % Muodostetaan kuvaaja. k3_0_kuvaaja ( Nopeus, Melu,... 'Autojen melutaso', 'Nopeus [km/h]', 'Auto [nro]', 'Melu [db]') ; % Raporttitaulukko. k3_0_taulukko ( Nopeus, Melu,... 'Autojen melutaso', 'Nopeus [km/h]', 'Auto', 'Melu [db]') ;

jossa on aluksi mittausdatan määrittely, joka voitaisiin koodata myös siten, että data luetaan jonkin mittauslaitteen tekemästä tiedostosta. Seuraavaksi kutsutaan kuvaajan tekevää funtiota k3_0_kuvaaja.m sekä halutun taulukon tekevää funktiota k3_0_taulukko.m. Kun ohjelma ajetaan saamme taulukkoraportin, johon on myös laskettu joitakin tunnuslukuja: >> om_0_k3 Autojen melutaso - Melu [db] =================================================================== Auto Nopeus [km/h] 30 50 65 80 95 0 30 k-arvo ------------------------------------------------------------------- 88 90 94 0 34 05.9 3 75 80 77 83 80 85 86 94 94 00 03 3 89.7 96.3 4 68 7 76 85 96 0 5 90. 5 6 77 8 84 85 9 90 98 96 05 0 09 9 0 98.0 97.6 =================================================================== k-arvo 78. 8.7 86.0 93.5 0.3..0 96.3 sekä kuvaajan:

3 Tarvitsemme tietysti seuraavat funktiot: % k3_0_kuvaaja.m % Piirretään annetuin tiedoin verkkokuvaaja. function k3_0_kuvaaja ( a, b, ts, xs, ys, zs ) hold on ; % Kuvanpito päälle. % Katsotaan matriisien mitat ensiksi. N = size (b,) ; M = length (a) ; % Vektorin a pituus. % Viivat ensimmäiseen suuntaan. for i = : N, plot3 (a, i*ones(,m), b(i,:), 'ko-' ) ; % Viivat toiseen suuntaan. for i = : M, plot3 (a(i)*ones(,n), :N, b(:,i), 'ko-' ) ; % Selitetekstit. title ( [ '\bf' ts ] ) ; xlabel ( xs ) ; ylabel ( ys ) ; zlabel ( zs ) ; % Akselien skaalaus. axis ( [ 0 40 0 7 0 40 ] ) ; grid on ; hold off ; % Asteikkoverkko päälle. % Kuvanpito pois päältä.

4 ja % k3_0_taulukko.m % Muodostaa taulukon. function k3_0_taulukko ( a, b, ts, xs, ys, zs ) M = length(b(:,)) ; fs = '%7.0f' ; fs = '%7.f' ; disp ( ' ' ) ; disp ( [ ts ' - ' zs ]) ; disp ( viiva(*m,'=') ) ; disp ( [ ys ' ' sprintf(' %s',xs) ] ); % Tulostetaan vektori a + viiva perään! disp ( [ viiva(6,' ') ' ' sprintf(fs,a) ' k-arvo' ]); disp ( viiva(*m,'-') ) ; % Lasketaan keskiarvot kullekin autolle. ka = mean ( b' ) ; % Transponoidaan b! % Tulostetaan matriisi b + viiva perään! for i = : M, disp ( [ sprintf('%4d ',i)... sprintf(fs,b(i,:)) ' ' sprintf(fs,ka(i)) ] ); disp ( viiva(*m,'=') ) ; % Lasketaan keskiarvot kullakin nopeudella, ka, % sekä kaikille arvoille, ka3. ka = mean ( b ) ; k3 = mean ( mean (b)) ; disp ( [ 'k-arvo ' sprintf(fs,ka) ' ' sprintf(fs,k3) ] ); % Viivanpiirtofunktio. function f = viiva (n, s) t = s ; for i = : n, t = [ t s ] ; f = t ; Huomaa, että jälkimmäinen funktio kutsuu myös alifunktiota viiva. Tällainen menettelytapa sopii tilanteeseen, jossa meillä on aina samantyyppinen data, jota käsitellään samalla tavalla.

Ohjelmointi ja Matlab : syksy 0 : 05.09.-09.0.0 Kotitehtävä 4: palautettava to 06.0.0 klo :00 mennessä Juha Jaakon postilaatikkoon (joko kirjepostilaatikkoon tai sähköpostilaatikkoon juha.jaako@oulu.fi) Kinematic viscosity k of water varies with temperature T as shown in the table. Determine the o o o o polynomial that best fits the data, and use it to compute at T 0 C,30 C,60 C and 90 C. o T C 0. 37.8 54.4 7. 87.8 00 3 k 0 m / s.79.3 0.696 0.59 0.338 0.3 0.96 Arvostelussa kiinnitän erityistä huomiota työn raportoinnin kattavuuteen. Eräs ratkaisu: Tehtävämme on katsoa mikä polynomi approksimoi parhaiten dataa; lisäksi meidän on laskettava muodostetun polynomin avulla kinemaattisen viskositeetin arvot halutuissa pisteissä. Polynomin asteen yläraja määräytyy datapisteiden määrän mukaan miinus yksi (nyt N max = 7- = 6). Tässä tapauksessa mahdollisia polynomeja ovat: 0 f x a x a f x a x a x a 0 3 f x a x a x a x a 3 0 4 3 f x a x a x a x a x a 4 3 0 5 4 3 f x a x a x a x a x a x a 5 4 3 0 6 5 4 3 f x a x a x a x a x a x a x a 6 5 4 3 0 Testataan tilanne kaikilla mahdollisilla vaihtoehdoilla. k lineaarinen malli (N = ) neliöllinen malli (N = ) kuutiollinen (N = 3) (N = 4) (N = 5) (N = 6)

Teemme seuraavanlaisen pääohjelman: % om_0_k4_u.m clear all ; format compact ; clf ; % Mittausdata vaakavektoreina! xdata = [ 0. 37.8 54.4 7. 87.8 00 ] ; ydata = [.79.3 0.696 0.59 0.338 0.3 0.96 ] ; % Polynomin suurin asteluku. M = length(xdata) ; % Luupataan... while, hold on ; % Piirretään datapisteet koordinaatistoon. axis ( [ 0 0 0 ] ) ; plot (xdata, ydata, 'ko') ; xlabel ('T [{^o}c]') ; ylabel ('\mu{_k} [0{^-3} m{^}/s]') ; grid ; % Kysytään millaista polynomia tarkastellaan. N = input( 'Polynomin aste = ') ; % Jos polynomin asteluku on sopimaton -> LOPETETAAN. if ( N == 0 N >= M ), fprintf ('Sopimaton polynomi\n') ; clf ; break ; % Jos halutaan LOPETTAA, niin painetaan rivinvaihtonäppäintä. if isempty (N), fprintf ('Valmis\n') ; break ; % Kutsutaan sovituspolynomin muodostavaa funktiota. polynomi = om_0_k4_f (xdata, ydata, N) ; % Lasketaan kinemaattiset viskositeetit kun T = 0, 30, 60 ja 90. T = [ 0, 30, 60, 90 ] ; for m = : 4, uk(m) = polynomi(t(m)) ; %... ja merkitään pisteet ja tekstit kuvaajaan. plot (T(m), uk(m), 'k*' ) ; text (T(m), uk(m),... [ ' \leftarrow (' numstr(t(m)) ', ' numstr(uk(m)) ')' ] ) ; % Piirretään polynomin kuvaaja. fplot (polynomi, [0 0] ) ; title ( [ 'Polynomin aste = ' numstr(n) ] ) ; hold off ; % Pidetään taukoa kuvaajien piirron välillä. pause ; clf ; fprintf ('\n') ;

3 Lisäksi tarvitaan funktio, joka laskee sovituspolynomin: % om_0_k4_f.m function polynomi = om_0_k4_f (x, y, k) M = length (x) ; % Muodostetaan kerroinmatriisit. if ( k == ), A = [ ones(,m) ; x ] ; elseif ( k == ), A = [ ones(,m) ; x ; x.^ ] ; elseif ( k == 3 ), A = [ ones(,m) ; x ; x.^ ; x.^3 ] ; elseif ( k == 4 ), A = [ ones(,m) ; x ; x.^ ; x.^3 ; x.^4 ] ; elseif ( k == 5 ), A = [ ones(,m) ; x ; x.^ ; x.^3 ; x.^4 ; x.^5 ] ; elseif ( k == 6 ), A = [ ones(,m) ; x ; x.^ ; x.^3 ; x.^4 ; x.^5 ; x.^6 ] ; % Transponoidaan kerroinmatriisi A. A = A' ; % Tehdään PNS-sovitus. v = A \ y' ; % Käännetään vektorin sisältö. aste = length (v) ; v = v(aste :- : ) ; % Muodostetaan polynomi. fun = '' ; for i = : : aste, j = aste - i ; if (i == ), s = [ '(' numstr(v(i)) ')*(x^' numstr(j) ')' ] ; else s = [ '+(' numstr(v(i)) ')*(x^' numstr(j) ')' ] ; fun = [ fun s ] ; % Palautetaan polynomi kutsuvaan ohjelmaan. polynomi = inline (fun, 'x')

4 Ajatetaan nyt ohjelma: >> om_0_k4_u Polynomin aste = polynomi = Inline function: polynomi(x) = (-0.0446)*(x^)+(.4793)*(x^0) Polynomin aste = polynomi = Inline function: polynomi(x) = (0.000046)*(x^)+(-0.03478)*(x^)+(.7749)*(x^0) Polynomin aste = 3 polynomi = Inline function: polynomi(x) = (-8.4589e-007)*(x^3)+(0.0003857)*(x^)+(- 0.0393)*(x^)+(.7957)*(x^0) Polynomin aste = 4 polynomi = Inline function: polynomi(x) = (-.3387e-008)*(x^4)+(.8459e- 006)*(x^3)+(0.000609)*(x^)+(-0.03634)*(x^)+(.79)*(x^0) Polynomin aste = 5 polynomi = Inline function: polynomi(x) = (4.55e-00)*(x^5)+(-.956e-007)*(x^4)+(.357e- 005)*(x^3)+(-0.000745)*(x^)+(-0.03306)*(x^)+(.79)*(x^0) Polynomin aste = 6 polynomi = Inline function: polynomi(x) = (-.0646e-00)*(x^6)+(3.404e-008)*(x^5)+(-4.54e- 006)*(x^4)+(0.0003856)*(x^3)+(- 0.0060)*(x^)+(0.0437)*(x^)+(.79)*(x^0) Polynomin aste = Valmis

5 Saamme myös seuraavat kuvaajat: Polynomin aste = Polynomin aste =.8.8.6.6 k [0-3 m /s].4. 0.8 (0,.3378) (30,.0549) k [0-3 m /s].4. 0.8 (0,.448) (30, 0.9557) 0.6 (60, 0.63054) 0.6 0.4 0. (90, 0.066) 0.4 0. (60, 0.4068) (90, 0.90) 0 0 0 40 60 80 00 0 T [ o C] 0 0 0 40 60 80 00 0 T [ o C] Polynomin aste = 3 Polynomin aste = 4.8.8.6.6.4 (0,.4345).4 (0,.4485) k [0-3 m /s]. 0.8 (30, 0.88894) k [0-3 m /s]. 0.8 (30, 0.8996) 0.6 0.6 0.4 0. (60, 0.43658) (90, 0.3057) 0.4 0. (60, 0.49) (90, 0.3) 0 0 0 40 60 80 00 0 T [ o C] 0 0 0 40 60 80 00 0 T [ o C] Polynomin aste = 5 Polynomin aste = 6.8.8.6.6 (0,.607).4 (0,.4663).4 k [0-3 m /s]. 0.8 (30, 0.88678) k [0-3 m /s]. 0.8 (30, 0.8459) 0.6 0.6 0.4 0. (60, 0.43473) (90, 0.3035) 0.4 0. (60, 0.45838) (90, 0.3377) 0 0 0 40 60 80 00 0 T [ o C] 0 0 0 40 60 80 00 0 T [ o C]

6 Mikä näistä polynomeista sitten soveltuu parhaiten tähän käyttötarkoitukseen?. Lineaarinen malli (N=) ei kovin hyvin sovitu mittausdataan. Arvolla N=6 polynomi kulkee tarkasti kaikkien datapisteiden kautta (miksi?), mutta datapisteiden välillä käyttäytyminen on vähintäänkin arveluttavaa. Jos katsomme polynomien kertoimia: N x 6 x 5 x 4 x 3 x x x 0-0.0446.4793 0.000046-0.03478.7749 3-8.4589e-007 0.0003857-0.0393.7957 4 -.3387e-008.8459e-006 0.000609-0.03634.79 5 4.55e-00 -.956e-007.357e-005-0.000745-0.03306.79 6 -.0646e-00 3.404e-008-4.54e-006 0.0003856-0.0060 0.0437.79 huomaamme, että korkeampiasteisten polynomien (N>3) suurempien potenssien kertoimet ovat hyvin pieniä eli luokkaa 0-5... 0-0, joka taas tarkoittaa, että näillä kertoimilla ei ole kovin suurta (ja tuskin sitäkään) vaikutusta polynomin muotoon. Huomaamme, että arvosta N = datapisteitä approksimoivan polynomin muoto säilyy suunnilleen samana ja toisaalta, koska yritämme insinöörihommissa esittää asiat aina mahdollisimman simppelisti, niin miksi mennä merta edemmäs kalaan? Eli käytämme polynomia N = : Huomatkaa, että ekstrapolointi on tässäkin tapauksessa vaarallista, mutta interpolointi suhteellisen turvallista!