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



Samankaltaiset tiedostot
MS-A0204 Differentiaali- ja integraalilaskenta 2 (ELEC2) Luento 7: Pienimmän neliösumman menetelmä ja Newtonin menetelmä.

Harjoitus 7 -- Ratkaisut

Teknillinen tiedekunta, matematiikan jaos Numeeriset menetelmät

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

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

Numeeriset menetelmät

FUNKTION KUVAAJAN PIIRTÄMINEN

Sovellettu todennäköisyyslaskenta B

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

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

BM20A5840 Usean muuttujan funktiot ja sarjat Harjoitus 7, Kevät 2018

mlnonlinequ, Epälineaariset yhtälöt

Kevään 2011 pitkän matematiikan ylioppilastehtävien ratkaisut Mathematicalla Simo K. Kivelä /

n. asteen polynomilla on enintään n nollakohtaa ja enintään n - 1 ääriarvokohtaa.

Matlabin perusteita Grafiikka

Numeeriset menetelmät

Numeeriset menetelmät

Matematiikan tukikurssi

mlvektori 1. Muista, että Jacobin matriisi koostuu vektori- tai skalaariarvoisen funktion F ensimmäisistä

Zeon PDF Driver Trial

SIMULINK S-funktiot. SIMULINK S-funktiot

Ratkaisuehdotukset LH 8 / vko 47

BM20A5840 Usean muuttujan funktiot ja sarjat Harjoitus 1, Kevät 2018

Funktioiden approksimointi ja interpolointi

Ratkaisuehdotukset LH 7 / vko 47

Mapu 1. Laskuharjoitus 3, Tehtävä 1

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

MS-A0207 Differentiaali- ja integraalilaskenta 2 (Chem) Yhteenveto, osa I

FUNKTION KUVAAJAN PIIRTÄMINEN

MS-A0205/MS-A0206 Differentiaali- ja integraalilaskenta 2 Luento 8: Newtonin iteraatio. Taso- ja avaruusintegraalit

MATEMATIIKAN KOE, PITKÄ OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

läheisyydessä. Piirrä funktio f ja nämä approksimaatiot samaan kuvaan. Näyttääkö järkeenkäyvältä?

origo III neljännes D

Numeeriset menetelmät Pekka Vienonen

Numeeriset menetelmät

Lue tehtävänannot huolella. Tee pisteytysruudukko 1. konseptin yläreunaan. ILMAN LASKINTA -OSIO! LASKE KAIKKI SEURAAVAT TEHTÄVÄT:

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

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

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 );

Week

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Juuri 12 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

Numeerinen analyysi Harjoitus 3 / Kevät 2017

Week

Operatioanalyysi 2011, Harjoitus 3, viikko 39

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

MATEMATIIKAN KOE PITKÄ OPPIMÄÄRÄ Merkitään f(x) =x 3 x. Laske a) f( 2), b) f (3) ja c) YLIOPPILASTUTKINTO- LAUTAKUNTA

f[x i ] = f i, f[x i,..., x j ] = f[x i+1,..., x j ] f[x i,..., x j 1 ] x j x i T n+1 (x) = 2xT n (x) T n 1 (x), T 0 (x) = 1, T 1 (x) = x.

Harjoitus 4 -- Ratkaisut

TEKNILLINEN KORKEAKOULU Systeemianalyysin laboratorio. Kimmo Berg. Mat Optimointioppi. 9. harjoitus - ratkaisut

x j x k Tällöin L j (x k ) = 0, kun k j, ja L j (x j ) = 1. Alkuperäiselle interpolaatio-ongelmalle saadaan nyt ratkaisu

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 5 / vko 48

Matemaattiset ohjelmistot A. Osa 2: MATLAB

Matematiikan tukikurssi

12. Differentiaaliyhtälöt

plot(f(x), x=-5..5, y= )

MATP153 Approbatur 1B Ohjaus 2 Keskiviikko torstai

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Matematiikan peruskurssi 2

Säätötekniikan matematiikan verkkokurssi, Matlab tehtäviä ja vastauksia

MAA02. A-osa. 1. Ratkaise. a) x 2 + 6x = 0 b) (x + 4)(x 4) = 9 a) 3x 6x

k=0 saanto jokaisen kolmannen asteen polynomin. Tukipisteet on talloin valittu

Likimääräisratkaisut ja regularisaatio

Funktio 1. a) Mikä on funktion f (x) = x lähtöjoukko eli määrittelyjoukko, kun 0 x 5?

Tekijä Pitkä matematiikka Pisteen (x, y) etäisyys pisteestä (0, 2) on ( x 0) Pisteen (x, y) etäisyys x-akselista, eli suorasta y = 0 on y.

Numeeriset menetelmät

Differentiaali- ja integraalilaskenta 2 Laskuharjoitus 4 / vko 40

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

Matlab- ja Maple- ohjelmointi

MS-A0207 Differentiaali- ja integraalilaskenta 2 (Chem) Tentti ja välikokeiden uusinta

Differentiaali- ja integraalilaskenta 1 Ratkaisut 5. viikolle /

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)

Matematiikan tukikurssi

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

. Kun p = 1, jono suppenee raja-arvoon 1. Jos p = 2, jono hajaantuu. Jono suppenee siis lineaarisesti. Vastaavasti jonolle r k+1 = r k, suhde on r k+1

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 3 /

Reaalilukuvälit, leikkaus ja unioni (1/2)

Yhtälön ratkaiseminen

Aki Taanila LINEAARINEN OPTIMOINTI

Harjoitus 4: Differentiaaliyhtälöt (Matlab) MS-C2107 Sovelletun matematiikan tietokonetyöt 1

4 Yleinen potenssifunktio ja polynomifunktio

a) Mikä on integraalifunktio ja miten derivaatta liittyy siihen? Anna esimerkki = 16 3 =

Ensimmäisen kertaluvun yhtälön numeerinen ratkaiseminen

Käy vastaamassa kyselyyn kurssin pedanet-sivulla (TÄRKEÄ ensi vuotta ajatellen) Kurssin suorittaminen ja arviointi: vähintään 50 tehtävää tehtynä

3 TOISEN ASTEEN POLYNOMIFUNKTIO

Tieteellinen laskenta 2 Törmäykset

f(x, y) = x 2 y 2 f(0, t) = t 2 < 0 < t 2 = f(t, 0) kaikilla t 0.

Matematiikan tukikurssi

Tehtäväsarja I Kertaa tarvittaessa materiaalin lukuja 1 3 ja 9. Tarvitset myös luvusta 4 määritelmän 4.1.

Efficiency change over time

Luento 11: Rajoitusehdot. Ulkopistemenetelmät

Operatioanalyysi 2011, Harjoitus 2, viikko 38

I. AES Rijndael. Rijndael - Internal Structure

Juuri 6 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty Vastaus: Määrittelyehto on x 1 ja nollakohta x = 1.

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

Tekijä Pitkä matematiikka

2 Osittaisderivaattojen sovelluksia

3 Yleinen toisen asteen yhtälö ja epäyhtälö

Transkriptio:

Ohjelmointi ja Matlab syksy 010 Kotitehtävä 1 06.09.010 palautettava 14.9.010 mennessä Methyl alcohol can be synthesized by passing a mixture of CO and H over a suitable catalyst. For a feed mixture containing moles of hydrogen to 1 mole of carbon monoxide, x, the number of moles of hydrogen converted at 300 o C and 40 bar, is indicated by the following equation: 3 x x 49 = 0 x x (1) The solution to the problem corresponds to that value x at which to zero. 3 x x 49 x x reduces Koodaa tehtävän ratkaisu Matlab-ohjelmaa hyväksi käyttäen. Ratkaisumenetelminä käytä Newtonin menetelmää ja sekanttimenetelmää. Ongelmanratkaisu: Menetelmät: Newtonin menetelmä funktion nollakohdan etsimistä varten on seuraavanlainen x f ( xk ) '( x ) = k 1 x + k f () k Menetelmän käyttöön tarvitaan funktio, sen derivaatta (jonka laskeminen voi olla työlästä) sekä sopiva alkuarvaus x 0. Newtonin menetelmä voi divergoitua, jos alkuarvaus on kovin kaukana todellisesta nollakohdasta. Sekanttimenetelmä funktion nollakohdan etsimistä varten on seuraavanlainen x k+ 1 = x k ( k)( k k 1 ) ( ) ( ) f x x x f x f x k k 1 Menetelmän käyttöön tarvitaan funktio sekä kaksi alkuarvausta x 0 ja x 1. Derivaattaa ei tarvita. Molempia menetelmiä käytettäessä on syytä huomata, että (1) ei ole määritelty pisteessä x =. Funktiomme on seuraavanlainen Tarvittavat tiedot: 3 x x f ( x) = 49 x x (4) Funktion derivaatan laskemista varten muokataan funktio seuraavaan muotoon (vakion voimme jättää pois, koska sen derivaatta on nolla...) (3)

( ) g x = x ( ) ( 3 x 3 ) x Tulon derivointisääntöä soveltamalla saamme ja edelleen (5) x x g' ( x) = ( 3 x) D 3 + D 3 ( 3 x) ( x) ( x) ( ) 3 ( ) ( 1) 3( ) ( 1) x x x x g' ( x) = ( 3 x) + 3 3 3 ( 3 x)( 1) ( x) ( x) ( x ) ( x) 3 ( x) ( x) ( ) ( ) x 3 3 g' ( x) = 1+ x x (8) Muoto (8) on tehtävän laskennan suhteen riittävän yksinkertaisessa muodossa, mutta (8) voidaan vielä sieventää muotoon g' ( x) 18 6x = ( x) 4 Nyt meillä on käytössämme funktio ja sen derivaatta. Vielä tarvitaan sopiva aloituspiste. Funktion arvot vaihtelevat rajusti ja funktiolla on epäjatkuvuuskohta. Eli tarvitsemme jonkinlaisen käsityksen funktion käyttäytymisestä. Matlabissa on sopiva mokkula tähän käyttötarkoitukseen eli fplotkomento. Haarukoimalla fplot-komennolla päädymme esim. seuraavanlaiseen tilanteeseen: (6) (7) (9) >> fplot ( '((3-x)/(-x))^ * (x/(-x)) - 49', [1.7 1.9 ]) ; grid ; 000 1500 1000 500 0-500 1.7 1.7 1.74 1.76 1.78 1.8 1.8 1.84 1.86 1.88 1.9

Nollakohdan summittaisen paikan haarukointiin voi tietysti käyttää myös Excel-taulukkolaskentaohjelmaa. Nyt meillä on tiedossamme kaikki tarpeellinen koodausta varten. % K1_010_MetO.m % Hougen, Watson & Ragatz s. 1- % 0.06.010 Matlab-koodi: % Laskee funktion arvot. fun = inline ( '((3-x)/(-x))^ * (x/(-x)) - 49', 'x') ; % Laskee derivaatan arvot. dfun = inline ( '(*(3-x)/((-x)^3))*(((3-x)/(-x))*(1+x)-x)', 'x') ; % Kuvaajan piirto. fplot ( fun, [1.79 1.84 ]) ; grid ; % Newtonin menetelmä. % Tarvitsee KÄSIN lasketun derivaatan. disp ('Lasketaan Newtonin menetelmän avulla:') ; x = 1.8 ; % Aloituspiste. f = fun (x) ; % Funktion arvo aloituspisteessä. f_old = realmax ; disp ( [ x f ] ) ; while ( abs(f_old-f) > 1e-3 ), x = x - fun(x)/dfun(x) ; % Lasketaan uusi piste. f_old = f ; f = fun (x) ; % Funktion arvo uudessa pisteessä. disp ( [ x f ] ) ; end nollakohta = x % Sekanttimenetelmä. % Ei tarvitse derivaattaa. disp ('Lasketaan sekanttimenetelmän avulla:') ; x0 = 1.8 ; x1 = 1.85 ; % Aloituspisteet. f0 = fun (x0) ; f1 = fun (x1) ; % Funktion arvot aloituspisteissä. disp ( [ x0 f0 x1 f1 ] ) ; while ( abs(f0-f1) > 1e-3 ), t = (x1-x0)/(f1-f0) ; x = x - t * f1 ; % Lasketaan uusi piste. x0 = x1 ; x1 = x ; f0 = fun (x0) ; f1 = fun (x1) ; % Funktion arvot uusissa pisteissä. disp ( [ x0 f0 x1 f1 ] ) ; end nollakohta = x % Nollakohdan etsintä FZERO-funktion avulla. % ei toimi, jos aloituspiste on 0 tai disp ('Lasketaan FZERO-funktion avulla:') ; nollakohta = fzero ( ' (((3-x)/(-x))^ * (x/(-x) ) -49)', 1.9)

>> K1_010_MetO Lasketaan Newtonin menetelmän avulla: 1.8000-105.0000 1.833 8.8351 1.8194 1.819 1.057 0.003 1.819 0.0000 1.819 nollakohta = 0 1.819 Lasketaan sekanttimenetelmän avulla: 1.8000-105.0000 1.8500 95.959 1.8500 95.959 1.783-17.9596 1.783-17.9596 1.8073-69.9548 1.8073-69.9548 1.84 35.377 1.84 35.377 1.8185-4.530 1.8185 1.8191-4.530-0.81 1.8191 1.819-0.81 0.0016 1.819 0.0016 1.819-0.0000 1.819-0.0000 nollakohta = 1.819-0.0000 1.819 Lasketaan FZERO-funktion avulla: nollakohta = 1.819 Eli : Methyl alcohol can be synthesized by passing a mixture of CO and H over a suitable catalyst. For a feed mixture containing moles of hydrogen to 1 mole of carbon monoxide, the number of moles of hydrogen converted at 300 o C and 40 bar is 1.8. Mikä on konversio? Tehtävän määrittelystä myös näemme, että 0< x <. Miksi? Menetelmien toiminnan vertailu: Newtonin menetelmä: Erittäin nopea, jos aloituspiste on lähellä todellista nollakohtaa Taipumus divergoitua eli ei löydä nollakohtaa, jos aloituspiste x 0 on huonosti valittu Tarvitsee derivaatan, jonka laskeminen käsin on työlästä ja virhealtista Numeerisen derivaatan käyttö on mahdollista (ks. opintojakso Numeeriset menetelmät ) Sekanttimenetelmä: Hitaampi kuin Newtonin menetelmä Ei tarvitse derivaattaa Aloituspisteiden ( x 0 ja x 1 ) valinta voi olla ongelmallista Matlabin fzero-funktio: testattu menetelmä yleensä on syytä käyttää testattuja menetelmiä idioottivarmaa numeerista nollakohdan hakumenetelmää ei olekaan... Lisää tietoa aiheesta: Oheinen moniste. Brent, R., Algorithms for Minimization Without Derivatives, Prentice-Hall, 1973. Forsythe, G. E., M. A. Malcolm, and C. B. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, 1976.

1 Ohjelmointi ja Matlab syksy 010 Kotitehtävä 10.09.010 palautettava 1.09.010 mennessä In analyzing the equilibrium developed in the outgoing gas when a feed mixture of HO and CO in a molal ratio of 5 to 1 is passed though a bed of coke maintained at 1100 K and 10 bar, the following two independent equations are obtained: ( x y) x = 0.944 (a) 1 x+ y 5 x ( )( ) ( 1 x+ y) ( x y)( 6 + y) = 1.01 x = moles of HO converted, per 6 moles of feed, according to the water-gas reaction, HO+ CO CO H + y = moles of CO converted, per 6 moles of feed, according to the reaction, C+ CO CO If the numerical values of x and y can be determined, the equilibrium gas composition may be calculated. Koodaa tehtävän ratkaisu Matlab-ohjelmaa hyväksi käyttäen. Ratkaisumenetelminä käytä Newtonin menetelmää (joka tässä tapauksessa tarkoittaa eri menetelmää kuin kotitehtävässä 1) ja Broydenin menetelmää. Menetelmien kuvaukset oheisessa paperissa. Menetelmät: Menetelmien kuvaukset ja ongelmanratkaisun problematiikka on kuvattu monisteessa (Systems_of_nonlinear_equations.pdf). (b) Tarvittavat tiedot: Sekä Newtonin menetelmässä että Broydenin menetelmässä tarvitaan Jacobin matriisia (esim. http://fi.wikipedia.org/wiki/jacobin_matriisi). f1 f1 x1 x n J = fm fm x 1 xn Seuraavaksi on laskettava tarvittavat osittaisderivaatat. Nyt derivoitavat funktiot ovat (c) ( x y) ( x y) x ( 1 x+ y)( 5 x) f1, = 0.944

f ( x y) ( 1 x+ y) ( x y)( 6 + y), = 1.01 Nyt saamme ensimmäisestä funktiosta ja edelleen ( ) ( 1 )( 5 ) x y x x+ y x ( 1 x+ y)( 5 x) ( x y) x f 1 x = x x ( 1 x+ y)( 5 x) ( ) ( 1 )( 5 ) x y x x+ y x ( 1 x+ y)( 5 x) ( x y) x f 1 y y = y ( 1 x+ y)( 5 x) ( 1 x + y)( 5 x) ( x y) ( x y) x ( 6+ x y) ( 1 )( 5 ) = x x+ y x f1 ( 1 x + y)( 5 x) ( x) ( x y) x ( 10 x) ( 1 )( 5 ) = y x+ y x f1 Toisesta funktiosta saamme ja edelleen ( ) ( ) ( )( 6 ) 1 x+ y ( x y)( 6 + y) ( x y)( 6+ y) 1 x+ y f x = x x x y + y ( ) 1 x+ y ( x y)( 6 + y) ( x y)( 6+ y) ( 1 x+ y) f y y = y ( x y)( 6 + y) ( x y)( 6+ y) ( )( 1 x+ y) ( 1 x+ y) ( 6+ y) f = ( )( 6 ) x x y + y ( x y)( 6+ y) 4( 1 x+ y) ( 1 x+ y) ( x 6 y) f = ( )( 6 ) y x y + y Eo. yhtälöt voisi vielä sievennellä, mutta laskennan kannalta katsottuna se ei ole tarpeen (ks. miten Jacobin matriisi on koodattu Matlab-koodiksi).

3 Aloituspisteen valinta: Alkuperäisistä yhtälöistä näemme, että aloitusarvoina x ja y eivät voi olla samoja eikä x voi olla 5. Aloitusarvoiksi soveltunevat pienet kokonaisluvut, esim. x = 4 ja y = 3. Voisimme myös ratkaista sekä a:sta että b:stä y:t ja katsoa miten saadut funktiot käyttäytyvät, mutta tämä tapa on suhteellisen työläs. Matlab koodit: Ensiksi Newtonin menetelmä: % K_010_MetO_a.m % Newton's method. % 9.10.009, 9.8.010 & 17.9.010 - Juha Jaako format compact ; clear all ; hold on ; disp ( 'Newtonin menetelmä' ) ; x = [ 4 3 ]' ; plot (x(1), x(), 'k*') ; axis ( [ 3.8 4.1.9 3.1 ] ) ; % Määritellään funktiot (inline). f1 = inline ( '(((x-y)*x)/((1-x+*y)*(5-x))) - 0.944', 'x', 'y' ) ; f = inline ( '((1-x+*y)^/((x-y)*(6+y))) - 1.01', 'x', 'y' ) ; % Määritellään Jacobin matriisi (inline). % Ensimmäinen funktio. t1 = [ '((1-x+*y)*(5-x))' ] ; t = [ '((x-y)*x)' ] ; t3 = [ '(' t1 '^)' ] ; t4 = [ '(' t1 '*(*x-y)-' t '*(*x-*y-6))/' t3 ] ; J11 = inline ( t4, 'x', 'y' ) ; t5 = [ '(' t1 '*(-x)-' t '*(10-*x))/' t3 ] ; J1 = inline ( t5, 'x', 'y' ) ; % Toinen funktio. t1 = [ '((x-y)*(6+y))' ] ; t = [ '((1-x+*y)^)' ] ; t3 = [ '(' t1 '^)' ] ; t4 = [ '(' t1 '*((-)*(1-x+*y))-' t '*(6+y))/' t3 ] ; J1 = inline ( t4, 'x', 'y' ) ; t5 = [ '(' t1 '*(4*(1-x+*y))-' t '*((x-6-*y)))/' t3 ] ; J = inline ( t5, 'x', 'y' ) ; % Asetaan suppenemisparametrit. erosuure = realmax ; % Testisuureen alkuarvo. laskuri = 0 ; % Nollataan kierroslaskuri. TOLERANSSI = 1e-6 ; % Laskentatoleranssi. MAKSIMIKIERROKSET = 10 ; % Asetaan maksikierrosten määrä disp ( [ x' ] ) ; % Aloitetaan laskenta. while ( (erosuure > TOLERANSSI) & (laskuri < MAKSIMIKIERROKSET) ), %for i = 1 : 10, laskuri = laskuri + 1 ; % Kasvatetaan kierroslaskuria. f = [ f1(x(1),x()) ; f(x(1),x()) ] ;

4 J = [ J11(x(1),x()), J1(x(1),x()) ;... J1(x(1),x()), J(x(1),x()) ] ; sk = J \ (-f) ; % Lasketaan Newton-askel. s. 39 x = x + sk ; % Uuden pisteen päivityskaava. plot (x(1), x(), 'k*') ; text (x(1), x(), [ '\leftarrow' numstr(laskuri) ' ']) ; line ( [x(1), x(1)-sk(1)], [x(), x()-sk()] ) ; % Lasketaan uuden testisuureen arvo. erosuure = max (abs ([ f1(x(1),x()); f(x(1),x()) ] - f)) ; disp ( [ x' erosuure ] ) ; end % Tulostetaan ratkaisu. disp ( [ 'Ratkaisu:' ] ) ; disp ( x' ) ; disp ( [ 'Kierroksia:' ] ) ; disp (laskuri) ; hold off ; Kun ohjelma ajetaan komentoikkunasta, saamme >> K_010_MetO_a Newtonin menetelmä 4 3 (erosuure) 3.9049 3.8496 3.077.9735 0.3405 0.046 3.8475.9718 0.004 3.8475 3.8475.9718.9718 0.0000 0.0000 Ratkaisu: 3.8475 Kierroksia: 5.9718 Ratkaisu löytyy vähin laskentakierroksin, joka johtuu siitä, että alkuarvauksemme oli hyvä. Ks. seuraava kuvio: 3.1 3.08 3.06 3.04 3.0 1 3.98.96 3 4 5.94.9.9 3.8 3.85 3.9 3.95 4 4.05 4.1 Seuraavaksi Broydenin menetelmä: % K_010_MetO_b.m % Broyden's method.

5 % 03.06.010 - Juha Jaako format compact ; clear all ; disp ( 'Broydenin menetelmä' ) ; tol = 0.000001 ; xk = [ 4 3 ]' ; % Define functions. f1 = inline ( '(((x-y)*x)/((1-x+*y)*(5-x))) - 0.944', 'x', 'y' ) ; f = inline ( '((1-x+*y)^/((x-y)*(6+y))) - 1.01', 'x', 'y' ) ; % Define Jacobian. % First function. t1 = [ '((1-x+*y)*(5-x))' ] ; t = [ '((x-y)*x)' ] ; t3 = [ '(' t1 '^)' ] ; t4 = [ '(' t1 '*(*x-y)-' t '*(*x-*y-6))/' t3 ] ; J11 = inline ( t4, 'x', 'y' ) ; t5 = [ '(' t1 '*(-x)-' t '*(10-*x))/' t3 ] ; J1 = inline ( t5, 'x', 'y' ) ; % Second function. t1 = [ '((x-y)*(6+y))' ] ; t = [ '((1-x+*y)^)' ] ; t3 = [ '(' t1 '^)' ] ; t4 = [ '(' t1 '*((-)*(1-x+*y))-' t '*(6+y))/' t3 ] ; J1 = inline ( t4, 'x', 'y' ) ; t5 = [ '(' t1 '*(4*(1-x+*y))-' t '*((x-6-*y)))/' t3 ] ; J = inline ( t5, 'x', 'y' ) ; a = xk(1) ; b = xk() ; disp ( 'Initial Jacobian:' ) ; % Compute initial Jacobian. - Vaihtoehto 1. Bk = [ J11(a,b), J1(a,b) ; J1(a,b), J(a,b) ] % Initial Jacobian = identity matrix. - Vaihtoehto. %Bk = eye () disp (' ') ; test = realmax ; disp ( [ a b ] ) ; k = 0 ; % Iteration counter while (test > tol), %for i = 1 : 10, f = [ f1(a,b); f(a,b) ] ; sk = Bk \ (-f) ; xk = xk + sk ; a = xk(1) ; b = xk() ; yk = ([ f1(a,b); f(a,b) ] - f ) ; test = max(abs(yk)) ; disp ( [ a b test ] ) ; % Update Jacobian. Bk = Bk + ( (yk-bk*sk)*(sk') ) / ((sk')*sk) ; k = k + 1 ; end disp ( 'Vastaus:' ) ; disp (xk') ;

6 disp (k) ; Ajetaan Broydenin menetelmä ensin siten, että käytetään Jacobin matriisia aloituspisteessä [4, 3] ensimmäisenä arvona: >> K_010_MetO_b Broydenin menetelmä Initial Jacobian: Bk = 3.4444 -. -1.6667. 4 3 3.9049 3.8384 3.077.956 0.3405 0.0575 3.8501.9744 0.058 3.8480 3.8475.97.9718 0.0016 0.0004 3.8475.9718 0.0000 3.8475 Vastaus:.9718 0.0000 3.8475.9718 7 Suppeneminen on hitaampaa kuin Newtonin menetelmässä. Ajetaan Broydenin menetelmää myös siten, että emme käytä Jacobin matriisia ollenkaan, Bk = eye () : >> K_010_MetO_b Broydenin menetelmä Initial Jacobian: Bk = 1 0 0 1 4 3 3.6109 3.01 3.0700 3.735 3.6378.698.6730 3.849 0.1996 3.6703.746 0.1086 4.706 3.7916 3.539.9109 1.01 0.8363 3.8355.9601 0.049 3.8489 3.8476.9734.9719 0.010 0.0014 3.8475.9718 0.000 3.8475 3.8475.9718.9718 0.0000 0.0000 Vastaus: 3.8475 1.9718 Laskenta vie entistä enemmän kierroksia eli 1, kun käytämme samaa lopetusehtoa. Vastaus: The equilibrium gas composition: x : moles of HO converted = 3.85 y : moles of CO converted =.98

7 Mitä menetelmää sitten pitäisi käyttää epälineaarisen yhtälöryhmän ratkaisussa? (vrt. moniste Systems_of_nonlinear_equations.pdf). Yksikäsitteistä vastausta kysymykseen ei ole olemassa. Newton-tyyppiset menetelmät ovat epäluotettavia, jos aloituspiste on kaukana haetusta. Käyttämämme menetelmän tulisi olla luotettava ja helppokäyttöinen. Yksi vaihtoehto on seuraava koodi (Broydenin menetelmä): % K_010_MetO_b1.m % Broyden's method. % 3.6.010 & 0.9.010 - Juha Jaako format compact ; clear all ; % Aloituspiste. x = [ 4 3 ]' ; % Määritellään funktiot. f1 = inline ( '(((x-y)*x)/((1-x+*y)*(5-x))) - 0.944', 'x', 'y' ) ; f = inline ( '((1-x+*y)^/((x-y)*(6+y))) - 1.01', 'x', 'y' ) ; % Aloitusmatriisina yksikkömatriisi. B = eye () ; % Suppenemisen vartiointi. test = realmax ; k = 0 ; maksimikierrokset = 50 ; tol = 1e-6 ; % Suppenemiskriteerin alkuarvo. % Kierroslaskuri. % Laskentakierrosten yläraja. % Lopetustoleranssi. while ((test > tol) & (k < maksimikierrokset)), f = [ f1(x(1),x()) ; f(x(1),x()) ] ; % Funktion arvo. s = B \ (-f) ; % Ratkaistaan lineaarinen yhtälöryhmä. x = x + s ; % Päivitetään ratkaisu. y = ([ f1(x(1),x()); f(x(1),x()) ] - f ) ; test = max(abs(y)) ; % Päivitetään suppenemiskriteeri. % Päivitä kerroimatriisi. B = B + ( (y-b*s)*(s') ) / ((s')*s) ; k = k + 1 ; % Päivitetään kierroslaskuri. end disp ( [ 'Vastaus: x = ' numstr(x(1)) ', y = ' numstr(x())] ) ; disp ([ 'Laskentakierroksia: ' numstr(k) ]) ; Tuloste: >> K_010_MetO_b1 Vastaus: x = 3.8475, y =.9718 Laskentakierroksia: 1

Ohjelmointi ja Matlab syksy 010 Kotitehtävä 3 15.09.010 palautettava 7.9.010 Ohessa on pdf-tiedosto (Cubic_Spline_Interpolation.pdf), jossa on kuvattu, millaisia ovat kuutiolliset splinit. Seuraava data t = [ 1964 : 1 : 009 ] ; y = [, 8, 1, 10, 6, 1, 1, 13, 19, 35, 5, 34, 1, 8, 37,... 33, 4, 3, 33, 30, 5, 14,, 8, 5, 7, 34, 38, 44, 64,... 47, 44, 6, 41, 46, 53, 51, 60, 7, 85, 79, 79, 85, 83, 105, 78 ] ; kuvaa osastolta valmistuneiden diplomi-insinöörien määriä vuosina 1964-009. Kun sovitamme datan kuutiollisen splinin avulla, saamme seuraavan kuvaajan: 10 100 Data points Cubic spline 80 60 40 0 0 1965 1970 1975 1980 1985 1990 1995 000 005 Kuvaaja syntyy seuraavan koodin avulla (K3_010_MetO_S.m): clear all;format compact;hold on;t=[1964:1:009]; y=[,8,1,10,6,1,1,13,19,35,5,34,1,8,37,... 33,4,3,33,30,5,14,,8,5,7,34,38,44,64,... 47,44,6,41,46,53,51,60,7,85,79,79,85,83,105,78 ] ; plot(t,y,'ko');s=length(t);b=[4,1,zeros(1,s-4)]; for i=:s-3,temp=[zeros(1,i-),1,4,1,zeros(1,s-4)];b=[b;temp(1:s-)]; end;b=[b;zeros(1,s-4),1,4];b=sparse(b);h=t()-t(1);k=6/(h^); for i=1:s-,z(i)=k*(y(i)-*y(i+1)+y(i+));end;z=z';m=b\z;m=[0;m;0]; for i=1:s-1,a(i)=(m(i+1)-m(i))/(6*h);b(i)=((m(i))/); c(i)=((y(i+1)-y(i))/h)-((m(i+1)+*m(i))/6)*h;d(i)=y(i); as=['(' numstr(a(i)) ')'];bs=['(' numstr(b(i)) ')']; cs= ['(' numstr(c(i)) ')'];ds=['(' numstr(d(i)) ')']; xi=numstr(t(i)); guns=[ as '*(x-' xi ')^3+' bs '*(x-' xi ')^+' cs '*(x-' xi ')+' ds ]; gun=inline( guns, 'x');fplot(gun,[ t(i) t(i+1) ],'k-'); end;axis([1964 009 0 10]);legend('Data points', 'Cubic spline') ; grid;hold off; Koodi on kuitenkin jätetty kommentoimatta ja se on ulkoasultaan sekä luettavuudeltaan huono. Tehtäväsi on kommentoida koodi (vihje: etsi pdf-tiedostosta se menetelmä, jota on käytetty koodauksen pohjana) sekä parantaa sen ulkoasua ja luettavuutta. Keksi parannuksia koodiin!

8.9.010 16:34 C:\Users\Juha Jaako\AppData\Local\Microsoft\Windo...\K3_korjattu.m 1 of % Matlab-kurssi 010 % 6.9.010 clear all ; format compact ; hold on ; % Maaritellaan t eli aika välille 1964-009 t = [1964 : 1 : 009] ; % Valmistuneiden maarat em. vuosina y = [, 8, 1, 10, 6, 1, 1, 13, 19, 35, 5, 34, 1, 8, 37,... 33, 4, 3, 33, 30, 5, 14,, 8, 5, 7, 34, 38, 44, 64,... 47, 44, 6, 41, 46, 53, 51, 60, 7, 85, 79, 79, 85, 83, 105, 78 ] ; % Piirretaan kuvaajaan aluksi valmistuneiden maarat mustina palloina ajan % ollessa x-akselilla plot (t, y, 'ko') ; % Lähdetaan muodostamaan annetuille tiedoille käyrää luonnollisten splinien % menetelmällä. Määritellaan muuttuja s muuttujan t pituuden mukaan eli % tästä saadaan alkuarvo pisteiden määrälle. Splinien muodostamiseen % tarkoitettujen matriisien koko tullaan määrittämään tämän mukaan. s = length(t) ; % Matriisin ensimmainen rivi, muotoa [4 1 0... ] B = [4,1,zeros(1,s-4)] ; for i = :s-3, end ; % Matriisin "sisaosa" jossa 1,4,1-osa liukuu vasemmasta laidasta % oikeaan laitaan kierros kierrokselta. temp = [ zeros(1,i-),1,4,1,zeros(1,s-4) ] ; B = [B;temp(1:s-)]; % Matriisin viimeinen rivi, muotoa [...0 1 4 ] B = [ B;zeros(1,s-4),1,4 ] ; % Poistetaan turhat 0-elementit B=sparse(B) ; % Selvitetaan kahden edellisen arvon välinen ero, muuttuja h, % tässä tapauksessa kaikki arvot ovat vuoden ts. tasaisin valein % eli niiden valinen ero on aina 1. Ainakaan kaavan % mukaan, % jossa h = x(i) - x(i-1). Siis tällä koodilla ei pystytä laskemaan % epatasaisesti x-akselille sijoittuneita pisteita. (Nyt siis lasketaan % vain laiskasti vuosien 1965 ja 1964 erotus.) h = t() - t(1) ; k = 6/(h^) ; for i=1:s-, end ; % Rakennetaan matriisi z, joka sisaltaa yhdella rivilla kaikkien % menetelmassa kaytettyjen yi - *y - y3 - arvot. z(i) = k*(y(i) - *y(i+1) + y(i+)) ; z = z' ; % Transpoosi matriisista z M = B\z ; % Ratkaistaan M. M = [ 0 ; M ; 0 ] ; % Lisätään nollat alkuun ja loppuun. for i=1:s-1, % Ratkaistaan kierroksen splinin funktion kertoimien arvot a(i) = (M(i+1)-M(i))/(6*h) ; b(i) = ((M(i))/) ; c(i) = ((y(i+1)-y(i))/h)-((m(i+1)+*m(i))/6)*h ; d(i) = y(i) ; % Muutetaan luvut merkkijonoiksi. as = ['(' numstr(a(i)) ')'] ; bs = ['(' numstr(b(i)) ')'] ; cs = ['(' numstr(c(i)) ')'] ; ds = ['(' numstr(d(i)) ')'] ; % Muodostetaan kertoimista funktio josta voidaan jokaisella

8.9.010 16:34 C:\Users\Juha Jaako\AppData\Local\Microsoft\Windo...\K3_korjattu.m of end ; % kierroksella ja t:n arvolla ratkaista y. xi = numstr (t(i)) ; guns=[ as '*(x-' xi ')^3+' bs '*(x-' xi ')^+' cs '*(x-' xi ')+' ds ] ; gun = inline( guns, 'x') ; % Piirretaan jokaisella kierroksella palanen splinia, edellisestä % pisteestä seuraavaan pisteeseen. fplot (gun, [ t(i) t(i+1) ], 'r-') ; % Määritetään akselit axis ([1964 009 0 10]) ; % Selvennetään kaavion merkit legend ('Data points', 'Cubic spline') ; % Selvennetään akselit ylabel ('Valmistuneiden maara') xlabel ('Vuosiluku') grid ; hold off ;

1 Ohjelmointi ja Matlab syksy 010 Kotitehtävä 4 Annettu 1.09.010 Palautettava 4.10.010 klo 3:59 mennessä (H 3.1) For n = 0, 1,..., 5, fit a polynomial of degree n by least squares to the following data: t 0.0 1.0.0 3.0 4.0 5.0 y 1.0.7 5.8 6.6 7.5 9.9 Make a plot of the original data points along with each resulting polynomial curve (you may make separate graphs for each curve or a single graph containing all of the curves). Which polynomial would you say captures the general trend of the data better? Obviously, this is a subjective question, and its answer depends on both the nature of the given data (e.g., the uncertainty of the data values) and the purpose of the fit. Explain your assumptions in answering. Use Matlab. Ratkaisu: Piirretään ensin datapisteet koordinaatistoon: >> clear all >> t = [ 0.0 1.0.0 3.0 4.0 5.0 ] ; >> y = [ 1.0.7 5.8 6.6 7.5 9.9 ] ; >> plot (t, y, 'ko') ; axis ( [0 7 0 14] ) ; grid on ; 14 1 10 8 6 4 0 0 1 3 4 5 6 7 Kuvion perusteella näyttää siltä, että polynomimalli sopii hyvin käyttötarkoitukseemme. On vain valittava sopivin pienimmän neliösumman mielessä.

Pienimmän neliösumman menetelmän (PNS, method of least squares, least squares, esim: http://en.wikipedia.org/wiki/least_squares) käyttöä olitte jo harjoitelleet 4.9.010 tehdyn harjoitteen puitteissa, jolloin havaittiin, että Matlabia käyttäen ongelman ratkaisu (parametrien suhteen lineaarisessa tapauksessa) ei ole kovin vaikeaa. Koodataan seuraava koodi, joka piirtää kaikki sovitukset samaan kuvioon (voi myös käyttää subplot -komentoja ja piirtää kuusi erillistä pikkukuviota tai piirtää kuusi erillistä isoa kuviota): % K4_010_MetO.m % Pienimmän neliösumman menetelmä. % 10.08.010 & 30.09.010 - (c) Juha Jaako format compact ; clear all ; % Pito päälle (sallii kuvaa kohti useita piirtokomentoja). hold on ; % Mittaustiedot. t = [ 0.0 1.0.0 3.0 4.0 5.0 ] ; y = [ 1.0.7 5.8 6.6 7.5 9.9 ] ; % Piirretään mittaustiedot koordinaatistoon. plot (t, y, 'ko') ; % Datapisteet kuvioon. grid on ; % Ruudukko kuvioon. % Lisätään akselitiedot. axis ( [0 7 0 14] ) ; % Määritellään akselit: t 0...6 ; y 0...14 xlabel ( '\it t' ) ; % Teksti x-akselille. ylabel ( '\it y' ) ; % Teksti y-akselille. title ( 'Polynomisovitus: n = 0, 1,..., 5') ; % Kuvion otsikko. %%% Polynomit : n = 0, 1,, 3, 4, 5 % Tähän voisi tehdä for... end -silmukan. % n = 0 : y = a0 A = [ones(length(t),1)] ; b = y' ; x = A \ b ; a0 = x ; yp = [ '(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'k--' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma0 = sum ((y - temp).^) % n = 1 : y = a1*t + a0 % PNS-matriisi : A x = b A = [t', ones(length(t),1)] ; b = y' ; x = A \ b ; a1 = x(1) ; a0 = x() ; yp = [ '(' numstr(a1) ')*t+(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'b--' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma1 = sum ((y - temp).^)

3 % n = : y = a*t^ + a1*t + a0 % PNS-matriisi : A x = b A = [(t.^)', t', ones(length(t),1)] ; b = y' ; x = A \ b ; a = x(1) ; a1 = x() ; a0 = x(3) ; yp = [ '(' numstr(a) ')*t^+(' numstr(a1) ')*t+(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'r--' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma = sum ((y - temp).^) % n = 3 : y = a3*t^3 + a*t^ + a1*t + a0 % PNS-matriisi : A x = b A = [(t.^3)', (t.^)', t', ones(length(t),1)] ; b = y' ; x = A \ b ; a3 = x(1) ; a = x() ; a1 = x(3) ; a0 = x(4) ; yp = [ '(' numstr(a3) ')*t^3+(' numstr(a) ')*t^+('... numstr(a1) ')*t+(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'k.-' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma3 = sum ((y - temp).^) % n = 4 : y = a4*t^4 + a3*t^3 + a*t^ + a1*t + a0 % PNS-matriisi : A x = b A = [(t.^4)', (t.^3)', (t.^)', t', ones(length(t),1)] ; b = y' ; x = A \ b ; a4 = x(1) ; a3 = x() ; a = x(3) ; a1 = x(4) ; a0 = x(5) ; yp = [ '(' numstr(a4) ')*t^4+(' numstr(a3) ')*t^3+(' numstr(a)... ')*t^+(' numstr(a1) ')*t+(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'b.-' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma4 = sum ((y - temp).^) % n = 5 : y = a5*t^5 + a4*t^4 + a3*t^3 + a*t^ + a1*t + a0 % PNS-matriisi : A x = b A = [(t.^5)', (t.^4)', (t.^3)', (t.^)', t', ones(length(t),1)] ; b = y' ; x = A \ b ; a5 = x(1) ; a4 = x() ; a3 = x(3) ; a = x(4) ; a1 = x(5) ; a0 = x(6) ; yp = [ '(' numstr(a5) ')*t^5+(' numstr(a4) ')*t^4+(' numstr(a3)... ')*t^3+(' numstr(a) ')*t^+(' numstr(a1) ')*t+(' numstr(a0) ')' ] ; yf = inline (yp, 't') ; disp (yf) ; fplot (yf, [ 0 7], 'r.-' ) ; % Neliösumman arvo. temp = [ yf(t(1)), yf(t()), yf(t(3)), yf(t(4)), yf(t(5)), yf(t(6)) ] ; neliosumma5 = sum ((y - temp).^) % Selitteet. legend ( 'datapisteet', 'n=0', 'n=1', 'n=', 'n=3', 'n=4', 'n=5', ) ; % Pito pois. hold off ;

4 Saamme seuraavan kuvion 14 1 10 8 datapisteet n=0 n=1 n= n=3 n=4 n=5 Polynomisovitus: n = 0, 1,..., 5 y 6 4 0 0 1 3 4 5 6 7 t ja tulosteen, josta näkyvät myös lasketut malliparametrit ja neliösummat (ulkoasua muokattu): >> K4_010_MetO Inline function: yf(t) = (5.5833) neliosumma0 = 5.7083 Inline function: yf(t) = (1.7057)*t+(1.319) neliosumma1 = 1.798 Inline function: yf(t) = (-0.094643)*t^+(.1789)*t+(1.0036) neliosumma = 1.4584 Inline function: yf(t) = (0.07196)*t^3+(-0.6937)*t^+(3.1557)*t+(0.78968) neliosumma3 = 1.190 Inline function: yf(t) = (0.1065)*t^4+(-0.991)*t^3+(.634)*t^+(0.11997)*t+(0.97183) neliosumma4 = 0.000 Inline function: yf(t) = (-0.059167)*t^5+(0.84583)*t^4+(-4.15)*t^3+(8.304)*t^+(- 3.1783)*t+(1) neliosumma5 = 4.8193e-006 Yleensä sopivimman mallin valinta tapahtuu silmämääräisesti sekä laskemalla tunnuslukuja. Yleisin tunnusluku on selitysaste R tai neliösumman arvo. Selitysaste ilmoittaa, kuinka suuri murto-osa y:n arvoissa todetusta vaihtelusta voidaan selittää t:n arvoissa tapahtuneilla muutoksilla. Selitysasteet eri malleille ovat (miten lasketaan?): n R Neliösumma 0 << 1 5.7083 1 0.966 1.798 0.973 1.4584 3 0.9786 1.190 4 0.996 0.000 5 1.0000 4.8193e-006 ~ 0

5 Yleensä mallia pidetään hyvänä, jos selitysaste on parempi kuin 0.9 (tai neliösumma ei ole kovin suuri). Nyt tilanne on malleilla n > 0 tämä. Lisäksi mallien selityaste kasvaa polynomin asteen kasvaessa. Arvolla n = 5 selitysaste on jopa 1 (miksi?). Katsotaan nyt mallien n = 0... 5 tilannetta. malli n = 0 : Kuvaajasta näemme, että malli kuvaa erittäin huonosti dataa (neliösumma suuri). Poistamme tilanteen n = 0 ja saamme seuraavan kuvion. 14 1 10 8 datapisteet n=1 n= n=3 n=4 n=5 Polynomisovitus: n = 1,..., 5 y 6 4 0 0 1 3 4 5 6 7 t mallit n = 4 ja n = 5 : Kuvaajista näemme, että mallit kuvaavat dataa hyvin datapisteissä, kohtalaisesti datapisteiden välillä (interpolaatio) mutta erittäin huonosti välillä t > 5 (ekstrapolointi). Poistamme tilanteet n = 4 ja n = 5 ja saamme kuvion 14 1 10 datapisteet n=1 n= n=3 Polynomisovitus: n = 1,..., 3 8 y 6 4 0 0 1 3 4 5 6 7 t

6 mallit n = 1, n = ja n = 3 : Mallit kuvaavat hyvin dataa sekä datapisteiden välillä että välillä x > 5. Periaatteessa kaikki mallit käyvät, mutta koska yleensä pyritään käyttämään mahdollisimman yksinkertaista mallia, poistetaan tilanne n = 3 tarkastelusta. Saamme 14 1 datapisteet n=1 n= Polynomisovitus: n = 1, 10 8 y 6 4 0 0 1 3 4 5 6 7 t Nyt on aika tavalla makuasia, käyttääkö mallia n = 1 vai n =. Kummallakin valinnalla on puolensa. y(t) = 1.7057*t + 1.319 y(t) = -0.094643*t^ +.1789*t + 1.0036 n R Neliösumma 1 0.966 1.798 0.973 1.4584

1 Ohjelmointi ja Matlab syksy 010 Kotitehtävä 5 palautettava 5.10.010 klo 3:59 mennessä Suppose that in a certain city, the pollution level is measured at two-hour intervals, beginning at midnight. These measurements were recorded for a one-week period and stored in a Matlab matrix, the first line of which contains the pollution levels for day 1, the second line for day, and so on. For example, suppose the pollution matrix for a certain week contains the following data: A = [ 30, 30, 31, 3, 35, 40, 43, 44, 47, 45, 40, 38 ;... 33, 3, 30, 34, 40, 48, 46, 49, 53, 49, 45, 40 ;... 38, 35, 34, 37, 44, 50, 51, 54, 60, 58, 51, 49 ;... 49, 48, 47, 53, 60, 70, 73, 75, 80, 75, 73, 60 ;... 55, 54, 53, 65, 70, 80, 90, 93, 95, 94, 88, 6 ;... 73, 70, 65, 66, 71, 78, 74, 78, 83, 75, 66, 58 ;... 50, 47, 43, 35, 30, 33, 37, 43, 45, 5, 39, 31 ] ; A Matlab program (or programs) is (are) to be written to produce a weekly report displaying the pollution levels. Ongelman ratkaisu: Ensimmäinen ongelma mittausdataa käsiteltäessä on, että onko viikon ensimmäinen päivä maanantai (kuten Suomessa) vai sunnuntai (kuten Yhdysvalloissa). Tässä käsittelyssä on oletettu, että viikon ensimmäinen päivä on sunnuntai. Mikäli käytämme viikon ensimmäisenä päivänä maanantaita, niin koodeihin on tehtävä vastaavat muutokset. Millaisia raportteja mittausdatasta voi sitten tehdä? Tarjolla on useita vaihtoehtoja: erilaisia taulukoita, kuvaajia tai edellisten yhdistelmiä. Tässä esityksessä tehdään yksi taulukko ja neljä erilaista kuvaajaa: kellonaika vs. saastetaso eri päivinä (time of day vs. pollution level) viikonpäivä vs. saastetaso eri kellonaikoina (day of week vs. pollution level) koko viikko vs. saastetaso (whole week vs. pollution level) saastetason luokka vs. lukumäärä (values range vs. number of occurrences) Teemme ensiksi ohjelman (pollution_data.m), joka tallettaa datan (vektorin t ja matriisin A) datatiedostoon pollution_data.mat. % pollution_data.m % 19.8.010 & 5.10.010 - (c) Juha Jaako clear all ; % Mittausajakohdat. t = [ 0,, 4, 6, 8, 10, 1, 14, 16, 18, 0, ] ; % Saastetaso. A = [ 30, 30, 31, 3, 35, 40, 43, 44, 47, 45, 40, 38 ; 33, 3, 30, 34, 40, 48, 46, 49, 53, 49, 45, 40 ; 38, 35, 34, 37, 44, 50, 51, 54, 60, 58, 51, 49 ; 49, 48, 47, 53, 60, 70, 73, 75, 80, 75, 73, 60 ; 55, 54, 53, 65, 70, 80, 90, 93, 95, 94, 88, 6 ; 73, 70, 65, 66, 71, 78, 74, 78, 83, 75, 66, 58 ; 50, 47, 43, 35, 30, 33, 37, 43, 45, 5, 39, 31 ] ; save pollution_data t A ; disp ( 'Tietojen tallennus tapahtui' ) ; Nyt voimme ladata mittausdatan aina tarvittaessa ohjelmaan load -komennolla.

Voimme esittää datan yksinkertaisessa taulukkomuodossa seuraavasti (esim. siirrettäväksi Wordtekstinkäsittelyohjelmaan): % pollution_table.m % 19.8.010 & 5.10.010 - (c) Juha Jaako clear all ; format compact ; % Ladataan datatiedosto. load pollution_data t A ; % Matriisin koko. [rows, colunms ] = size (A) ; % Viikonpäivät. names = ( [ 'Sunday : ' ; 'Monday : ' ; 'Tuesday : ' ;... 'Wednesday : ' ; 'Thursday : ' ; 'Friday : ' ;... 'Saturday : ' ] ) ; % Tehdään taulukko näytölle; taulukon voi kirjoittaa myös tiedostoon. % Lasketaan taulukkoon myös kunkin päivän keskiarvot. disp ( ' ' ) ; disp ( 'Pollution Data for Week X' ) ; disp ( ' Time of Day' ) ; disp ( [ 'Day : ' sprintf('%3d', t) ' Mean' ]) ; disp ( '-----------------------------------------------------' ) ; for i = 1 : rows, disp([names(i,:) sprintf('%3d',a(i,:)) sprintf('%6.1f', mean(a(i,:)))]) ; end Tulosteena saamme: >> pollution_table Pollution Data for Week X Time of Day Day : 0 4 6 8 10 1 14 16 18 0 Mean ----------------------------------------------------- Sunday : 30 30 31 3 35 40 43 44 47 45 40 38 37.9 Monday : 33 3 30 34 40 48 46 49 53 49 45 40 41.6 Tuesday : 38 35 34 37 44 50 51 54 60 58 51 49 46.8 Wednesday : 49 48 47 53 60 70 73 75 80 75 73 60 63.6 Thursday : 55 54 53 65 70 80 90 93 95 94 88 6 74.9 Friday : 73 70 65 66 71 78 74 78 83 75 66 58 71.4 Saturday : 50 47 43 35 30 33 37 43 45 5 39 31 40.4