477033A, Ohjelmointi ja Matlab (Programming in Matlab), 4 op / 2.5 ov Opettaja (Teacher): TkT Juha Jaako Työstä tehdään työselostus, joka palautetaan 15.9.2009 klo 16:00 mennessä sähköpostin liitetiedostona (yksi pdf-tiedosto) osoitteeseen juha.jaako@oulu.fi. 1 Tehtävä (Problem) Opintopolku (Study path time vs. credits) Oman opintopolun graafinen esitys (aika vs. opintopisteet). Oman opintosuoritusotteesi saat weboodista (https://weboodi.oulu.fi/oodi/). Tehtäväsi on tehdä Matlab-koodi, joka tekee seuraavanlaisen kuvan, joka taas on esimerkki Matti Meikäläisen opintopolusta. Datapisteinä käytät omia tietojasi. Seuraavien Matlabin valmiiden funktioiden ja komentojen käytöstä on apua tehtävän teossa: datenum, hold on, axis, datestr, floor, now, title, xlabel, ylabel, plot, size, text, num2str, leg, grid, hold off, print. Tehtävässä harjoitellaan seuraavia asioita: datan kerääminen, datan käsittely, datan käsittelyrutiinin koodaaminen sekä tulosten esittäminen graafisesti.
% Meikalainen.m % Meikäläinen Matti - Opintopolku % 12.8.2009 - Juha Jaako % 2.9.2009 - toimii myös vuoden 1999 versiossa clear all ; format compact ; % Optimipolku - 60 op/a. opt_px = [ datenum(2005,9,1), datenum(2006,9,1), datenum(2007,9,1), datenum(2008,9,1)... ] - datenum(2005, 9, 1) ; opt_py = [ 0, 60, 120, 180 ] ; % KELA-tuen edellyttämä polku - 43.2 op/a. KELA_px = [ datenum(2005,9,1), datenum(2006,9,1), datenum(2007,9,1),... datenum(2008,9,1), datenum(2009,9,1)... ] - datenum(2005, 9, 1) ; KELA_py = [ 0, 43.2, 2*43.2, 3*43.2, 4*43.2 ] ; % Päivämäärä ja opintopistekertymä - Meikalainen. Meikalainenx = [... datenum(2005,9,1), datenum(2005,9,20), datenum(2005,11,30), datenum(2005,12,5),... datenum(2005,12,13), datenum(2005,12,15), datenum(2005,12,19),... datenum(2006,1,27), datenum(2006,2,15), datenum(2006,2,21), datenum(2006,2,21),... datenum(2006,4,6), datenum(2006,4,26), datenum(2006,5,3),... datenum(2006,5,15), datenum(2006,5,19),... datenum(2006,11,1), datenum(2006,11,25), datenum(2006,12,10),... datenum(2006,12,19), datenum(2006,12,22),... datenum(2007,1,15), datenum(2007,1,16), datenum(2007,3,2), datenum(2007,3,5),... datenum(2007,3,23), datenum(2007,4,14), datenum(2007,4,16), datenum(2007,5,22),... datenum(2007,6,16),... datenum(2008,1,30), datenum(2008,3,12), datenum(2008,3,14), datenum(2008,3,17),... datenum(2008,3,18), datenum(2008,4,4), datenum(2008,4,9),... datenum(2008,4,10), datenum(2008,4,11), datenum(2008,4,30), datenum(2008,5,27),... datenum(2008,10,10), datenum(2008,10,17), datenum(2008,11,15), datenum(2008,11,21)... ] - datenum(2005,9,1) ; Meikalaineny = [ 0, 4, 9, 12, 16, 17, 19,... 20.5, 25.5, 27.5, 31.5,... 34.5, 37.5, 40.5, 42.5, 47.5,... 52.5, 56, 59, 61, 66,... 69, 71, 75, 79, 80, 85, 90, 92, 97,... 100, 102, 106, 111, 116, 119, 122, 125, 129, 137, 142,... 145, 150, 153, 157 ] ; hold on ; axis ( [ 0, (datenum(2009,9,1)-datenum(2005,9,1)), 0, 180] ) ; tanaan = datestr (floor(now), 1) ; title ( ['Meikäläinen : opintopolku ' tanaan ' mennessä'] ) ; xlabel ('\itpäiviä opiskelun alkamisesta') ; ylabel ('\itopintopisteet') ; % Plotataan opintopolku. plot (opt_px, opt_py, 'b-', KELA_px, KELA_py, 'r-', Meikalainenx, Meikalaineny, 'k.-') ; d = size (Meikalainenx, 2); text (Meikalainenx(d), Meikalaineny(d),... [' \leftarrow Meikäläinen (' num2str(meikalaineny(d)) ' op)'] ) ; leg ('60 op/a', '43.2 op/a', 'Meikäläinen', 2) grid ; hold off ; print -tiff -deps2 c:\tmp\meikalainen ;
1 477033A, Ohjelmointi ja Matlab (Programming in Matlab), 4 op / 2.5 ov Opettaja (Teacher): juha.jaako@oulu.fi Työstä tehdään työselostus, joka palautetaan ti 22.9.2009 klo 16:00 mennessä sähköpostin liitetiedostona osoitteeseen juha.jaako@oulu.fi. 2 Tehtävä (Problem) Simulointi (Simulation) Kolmen sarjassa olevan, isotermisen reaktorin simulointi. Liitteessä on skannattuna tehtävän taustamäärittely (Luyben, W.L. (1990) Process modeling, simulation and control for chemical engineers. 2 nd ed. McGraw-Hill: New York, NY.). Luvussa 3.2 on esitetty mallin muodostamisen periaate ja luvussa 5.2 on esitetty mallista tehty tietokonemalli, joka on koodattu Fortran77- ohjelmointikielellä. Ohjelmointityössä tulee kohtalaisen usein eteen tilanne, jossa tarvitaan laskentarutiini, joka ei olekaan tarjolla käytettävässä työskentely-ympäristössä. Tällöin tarvitaan käännös kielestä toiseen. Tehtäväsi on tehdä Matlab-koodi, joka laskee samat asiat kuin luvussa 5.2 on esitetty (laskenta lopetetaan kuitenkin vasta kuuden minuutin kohdalla); lisäksi laskentatulokset on esitettävä graafisesti (ks. tehtävä 1) taulukkomuodon lisäksi. Simuloinnissa käytetään apuna numeerista integrointia ja menetelmänä on Eulerin menetelmä (ks. opintojakso Numeeriset menetelmät ). Mikäli et ymmärrä Fortran77 koodia suoraan, niin lyhyt opas aiheeseen on osoitteessa http://www.star.le.ac.uk/~cgp/prof77.html. Seuraavien Matlabin valmiiden funktioiden (tai komentojen) käytöstä on apua tehtävän teossa: clear all, hold on, while..., disp, for..., sprintf, plot, title, xlabel, ylabel, grid, hold off, print. Tehtävässä harjoitellaan seuraavia asioita: prosessimallin muodostaminen, mallin koodaaminen kielestä toiseen, differentiaaliyhtälön numeerinen ratkaisu (Eulerin menetelmä) sekä tulosten esittäminen taulukkomuodossa ja graafisesti.
2 % lcs120.m % Luyben, Process modeling, simulation and control for chemical engineers, 2nd ed. s. 120 % (c) Juha Jaako 13.04.1999 & 16.03.2000 & 12.8.2009 % Disturbance is a step change in feed concentration at time % equal zero from 0.8 to 1.8 moles of A/m^3. % Time is in minutes. clear all ; % Initial conditions. time(1) = 0 ; CA1(1) = 0.4 ; CA2(1) = 0.2 ; CA3(1) = 0.1 ; CA0 = 1.8 ; % Parameter values. tau = 2 ; k = 0.5 ; delta = 0.1 ; tprint = 0 ; hold on ; i = 1 ; % Evaluate derivatives. while (time (i) < 5.9), CA1dot = (CA0 -CA1(i))/tau - k*ca1(i) ; CA2dot = (CA1(i)-CA2(i))/tau - k*ca2(i) ; CA3dot = (CA2(i)-CA3(i))/tau - k*ca3(i) ; % Euler integration with a step size delta. CA1(i+1) = CA1(i) + CA1dot*delta ; CA2(i+1) = CA2(i) + CA2dot*delta ; CA3(i+1) = CA3(i) + CA3dot*delta ; time(i+1) = time(i) + delta ; i = i + 1 ; % Print simulation results. disp (' time CA1 CA2 CA3') ; for j = 1 : i, tul = sprintf ('%8.3f %8.3f %8.3f %8.3f',... time(j), CA1(j), CA2(j), CA3(j)) ; disp (tul) ; %... and plot 'em. plot (time, CA1, 'k.-',... time, CA2, 'r.-',... time, CA3, 'b.-') ; text (time(i), CA1(i), ' \it{c_{a1}}') ; text (time(i), CA2(i), ' \it{c_{a2}}') ; text (time(i), CA3(i), ' \it{c_{a3}}') ; title ( ['Three Isothermal CSTR - step change from 0.8 to 1.8'] ) ; xlabel ('\ittime [minutes]') ; ylabel ('\itconcentration [mol/m^3]') ; grid ; hold off ; print -tiff -deps2 d:\tmp\tehtava_2 ;
>> lcs120 time 0.000 CA1 0.400 CA2 0.200 CA3 0.100 0.100 0.450 0.200 0.100 0.200 0.300 0.495 0.535 0.203 0.207 0.100 0.100 0.400 0.572 0.213 0.100 0.500 0.600 0.605 0.634 0.220 0.229 0.101 0.102 0.700 0.661 0.237 0.103 0.800 0.900 0.685 0.706 0.247 0.256 0.105 0.107 1.000 0.726 0.266 0.109 1.100 1.200 0.743 0.759 0.276 0.285 0.111 0.114 1.300 0.773 0.295 0.117 1.400 1.500 0.786 0.797 0.304 0.313 0.120 0.123 1.600 0.807 0.321 0.126 1.700 1.800 0.817 0.825 0.330 0.337 0.130 0.133 1.900 0.832 0.345 0.137 2.000 2.100 0.839 0.845 0.352 0.359 0.140 0.144 2.200 0.851 0.365 0.147 2.300 2.400 0.856 0.860 0.371 0.377 0.151 0.154 2.500 0.864 0.382 0.158 2.600 2.700 0.868 0.871 0.387 0.392 0.161 0.164 2.800 0.874 0.396 0.168 2.900 3.000 0.876 0.879 0.400 0.404 0.171 0.174 3.100 0.881 0.408 0.176 3.200 3.300 0.883 0.885 0.411 0.414 0.179 0.182 3.400 0.886 0.417 0.184 3.500 3.600 0.887 0.889 0.419 0.422 0.187 0.189 3.700 0.890 0.424 0.191 3.800 3.900 0.891 0.892 0.426 0.428 0.193 0.195 4.000 0.893 0.430 0.197 4.100 4.200 0.893 0.894 0.432 0.433 0.199 0.201 4.300 0.895 0.434 0.202 4.400 4.500 0.895 0.896 0.436 0.437 0.204 0.205 4.600 0.896 0.438 0.206 4.700 4.800 0.896 0.897 0.439 0.440 0.208 0.209 4.900 0.897 0.441 0.210 5.000 5.100 0.897 0.898 0.442 0.442 0.211 0.212 5.200 0.898 0.443 0.213 5.300 5.400 0.898 0.898 0.444 0.444 0.214 0.215 5.500 0.898 0.445 0.215 5.600 5.700 0.899 0.899 0.445 0.445 0.216 0.217 5.800 0.899 0.446 0.217 5.900 6.000 0.899 0.899 0.446 0.447 0.218 0.218 3
4
5 % lcs120_1.m % Luyben, Process modeling, simulation and control for chemical engineers, % 2nd ed. s. 120 % (c) Juha Jaako 13.04.1999 & 16.03.2000 & 12.8.2009 & 18.9.2009 % Disturbance is a step change in feed concentration at time % equal zero from 0.8 to 1.8 moles of A/m^3. % Time is in minutes. clear all ; hold on ; % Initial conditions. time = 0 ; CA1 = 0.4 ; CA2 = 0.2 ; CA3 = 0.1 ; CA0 = 1.8 ; % Parameter values. tau = 2 ; k = 0.5 ; delta = 0.1 ; % Print simulation results. disp ('*** Print simulation results ***') ; disp (' time CA1 CA2 CA3') ; % Evaluate derivatives. while (time <= 6), CA1dot = (CA0-CA1)/tau - k*ca1 ; CA2dot = (CA1-CA2)/tau - k*ca2 ; CA3dot = (CA2-CA3)/tau - k*ca3 ; s1 = sprintf ('%8.3f %8.3f %8.3f %8.3f', time, CA1, CA2, CA3) ; plot (time, CA1, 'k.', time, CA2, 'r.', time, CA3, 'b.') ; disp (s1) ; % Euler integration with a step size delta. CA1 = CA1 + CA1dot*delta ; CA2 = CA2 + CA2dot*delta ; CA3 = CA3 + CA3dot*delta ; time = time + delta ; title ( ['Three Isothermal CSTR - step change from 0.8 to 1.8'] ) ; xlabel ('\it Time [minutes]') ; ylabel ('\it Concentration [mol/m^3]') ; grid ; hold off ; print -tiff -deps2 d:\tmp\tehtava_21 ;
477033A, Ohjelmointi ja Matlab (Programming in Matlab), 4 op / 2.5 ov Opettaja (Teacher): juha.jaako@oulu.fi Työstä tehdään työselostus, joka palautetaan ti 29.9.2009 klo 16:00 mennessä (juha.jaako@oulu.fi). 3 Tehtävä Liukuva keskiarvo (keskiarvosuodin) Central moving average Ohjelmointityössä tulee joskus eteen tilanne, jossa valmiit kirjastofunktiot tai muut laskentarutiinit eivät sovellu tilanteeseen. Tällöin on koodattava oma laskurutiini. Monesti mittaustuloksista saatava data ei sellaisenaan ole käyttökelpoista johtopäätösten tekoa varten, esim. voimakkaan oskilloinnin takia. Tarvitaan suodatin. Seuraavassa on osastolta valmistuneiden diplomi-insinöörien, lisensiaattien ja tohtoreiden määrät datavektoreina: % Datavektorit. vuosi = [ 1964 : 1 : 2008 ] ; DI = [ 2, 8, 12, 10, 6, 12, 12, 13, 19, 35, 25, 34, 21, 28, 37,... 33, 42, 23, 33, 30, 25, 14, 22, 28, 25, 27, 34, 38, 44, 64,... 47, 44, 62, 41, 46, 53, 51, 60, 72, 85, 79, 79, 85, 83, 105 ] ; TkL = [ 0, 0, 2, 1, 0, 0, 2, 2, 2, 3, 4, 1, 3, 1, 2, 6, 2, 0, 5, 0,... 6, 6, 4, 5, 1, 3, 4, 4, 4, 2, 7, 5, 4, 2, 9, 7, 3, 4, 5, 2,... 1, 2, 2, 0, 1 ] ; TkT = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,... 2, 1, 0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 4, 3, 5, 4, 2, 8, 3, 7,... 5, 4, 11, 8, 3 ] ; Tehtäväsi on tehdä Matlab-koodi, joka suodattaa annetun datan (kaikki kolme datavektoria!) käyttämällä liukuvaa keskiarvoa. Liukuvan keskiarvon laskennassa käytetään seuraavaa menetelmää (Laine, J. (1997) Prosessilaskennan matemaattiset apuneuvot. Tampere. ISBN 952-90-8589-3. s. 105) : C isuod,. = ( C + C + C + C + C ) min ( C ) max ( C ) i 2 i 1 i i+ 1 i+ 2 i: 2 2 i: 2 2 Eli valitaan viisi originaaliarvoa, niistä minimi ja maksimi hylätään ja lopuista lasketaan aritmeettinen keskiarvo kolmella jakamalla. Mitä voit päätellä suodatetun datan avulla valmistumismäärien treistä (DI, TkL, TkT)? Seuraavien Matlabin valmiiden funktioiden (tai komentojen) käytöstä on apua tehtävän teossa: clear all ; format compact ; hold on ; size, if elseif else, for, sum, min, max, title, plot, xlabel, ylabel, grid, hold off, print. Tehtävässä harjoitellaan seuraavia asioita: mittausdatan syöttäminen, suodattimen koodaaminen, suodatus, tulosten esittäminen graafisesti (alkuperäiset pisteet sekä suodattimen läpi tulleet pisteet) sekä tulosten tulkinta. 3
% liukuva.m % Liukuvan keskiarvon laskenta - datana osastolta valmistuneiden % diplomi-insinöörien, lisensiaattien sekä tohtoreiden määrät % (c) Juha Jaako 14.8.2009 clear all ; format compact ; % Datavektorit. vuosi = [ 1964 : 1 : 2008 ] ; DI = [ 2, 8, 12, 10, 6, 12, 12, 13, 19, 35, 25, 34, 21, 28, 37,... 33, 42, 23, 33, 30, 25, 14, 22, 28, 25, 27, 34, 38, 44, 64,... 47, 44, 62, 41, 46, 53, 51, 60, 72, 85, 79, 79, 85, 83, 105 ] ; TkL = [ 0, 0, 2, 1, 0, 0, 2, 2, 2, 3, 4, 1, 3, 1, 2, 6, 2, 0, 5, 0,... 6, 6, 4, 5, 1, 3, 4, 4, 4, 2, 7, 5, 4, 2, 9, 7, 3, 4, 5, 2,... 1, 2, 2, 0, 1 ] ; TkT = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,... 2, 1, 0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 4, 3, 5, 4, 2, 8, 3, 7,... 5, 4, 11, 8, 3 ] ; hold on ; % Jos 'lippu=1' niin DI:t, jos 'lippu=2' TkL:t ja jos 'lippu=3' TkT:t. lippu = 3 ; % Tilanteesta riippuen. if (lippu == 1), x = DI ; s1 = [ 'DI' ] ; elseif (lippu == 2), x = TkL ; s1 = [ 'TkL' ] ; elseif (lippu == 3), x = TkT ; s1 = [ 'TkT' ] ; else disp ('Virhe') ; break ; % Liukuvan keskiarvon laskenta. % Liukuvaa keskiarvoa kuvaavat datapisteet talletetaan vektoriin liuk % Ensiksi lasketaan datavektorin pituus. [M,N] = size (vuosi) ; % N = vektorin pituus % Kahden ensimmäisen datapisteen laskenta. liuk(1) = x(1) ; % Piste itse. liuk(2) = (x(1) + x(2)) / 2 ; % Aritmeettinen keskiarvo % Lasketaan muut datapisteet. for i = 3 : (N-2), tmp = [ x(i-2), x(i-1), x(i), x(i+1), x(i+2) ] ; liuk(i) = ( sum(tmp) - max(tmp) - min(tmp) ) / 3 ; % Kahden viimeisen datapisteen laskenta. liuk(n-1) = (x(n) + x(n-1)) / 2 ; liuk(n) = x(n) ; % Kuvan piirtäminen. if (lippu == 1), title ( ['Valmistuneet diplomi-insinöörit, ' num2str(sum(x)) ] ) ; plot (vuosi, DI, 'ko:', vuosi(1:n-1), liuk(1:n-1), 'k-') ; elseif (lippu == 2), title ( ['Valmistuneet tekniikan lisensiaatit, ' num2str(sum(x)) ] ) ; plot (vuosi, TkL, 'ko:', vuosi(1:n-1), liuk(1:n-1), 'k-') ; elseif (lippu == 3), title ( ['Valmistuneet tohtorit, ' num2str(sum(x)) ] ) ; plot (vuosi, TkT, 'ko:', vuosi(1:n-1), liuk(1:n-1), 'k-') ; else disp ('Virhe') ; break ; xlabel ('Vuosi') ; ylabel ('Määrä') ; grid ; hold off ; tiedosto = [ 'd:\tmp\valmistuneet_' s1 ] ; print ('-tiff', '-deps2', tiedosto) ;
477033A, Ohjelmointi ja Matlab (Programming and Matlab), 4 op / 2.5 ov Opettaja (Teacher): Juha Jaako Työstä tehdään työselostus, joka palautetaan ma 5.10.2009 klo 16:00 mennessä (juha.jaako@oulu.fi). Appices: 04_Levenspiel_107-113.pdf & 04_Kreyszig_960-963.pdf 4 Problem Plug flow reactor performance (see also 04_Levenspiel_107-113.pdf) A homogeneous gas reaction A 3 R has a reported rate at 215 o C r mol C ls 2 ½ A = 10 A, (1) Find the space-time needed for 80% conversion of a 50% A 50% inert feed to a plug flow reactor 215 o C C 0 = 0.0625 mol/ l operating at and 5 atm ( ). A For this stoichiometry and with 50% inerts two volumes of feed gas would give four volumes of completely converted product gas, thus ε A 4 2 = = 1 (2) 2 in which case the plug flow performance equation, Eq. 17, becomes X Af dx τ = C = C X Af dx (3.1) A A A0 A0 ½ r 0 A 0 ½ 1 X A kca0 1+ ε AX A ½ 0.8 C A0 1+ X A τ = k 1 X 0 A ½ dx A Evaluate the integral (3.2) by programming a Matlab m-file and using Simpson s Rule of Integration (see 04_Kreyszig_960-963.pdf). Also, using the program just created find out what is the space-time when X Af = 0.90, X Af = 0.95 and X Af = 1.0? Using Matlab code create a figure which clarifies the problem you solved. (3.2) Useful Matlab commands and functions: clear all, format compact, zeros, for, sqrt, hold on, axis, fplot, line, title, xlabel, ylabel, sprintf, grid, hold off, print What are we practicing here? Programming a computational algorithm (Simpson s rule) using Matlab, using program code to design a plug flow reactor.
>> Reactor_performance J = 1.3274 tau = 33.1841
% Reactor_performance.m % 15.12.1998 & 31.8.2009 (c) Juha Jaako % Kreyszig E, Advanced engineering mathematics. p. 960-963. % 7th Edition (1993) % Levenspiel O, Chemical reaction engineering. p. 111-113. % 2nd Edition (1972) % Simpson's Rule of Integration & Plug flow reactor performance clear all ; format compact ; % Reaction parameters. CA0 = 0.0625 ; % [mol/l] k = 10^(-2) ; % [ (mol^(1/2)) / ( n(l^(1/2)) s ) ] % Integration parameters a = 0.0 ; % Interval of integration, start. b = 0.8 ; % Interval of integration,. m2 = 12 ; % Number of subintervals, even number. h = (b-a)/m2 ; % Subinterval length. % Compute function values at all interval points. f = zeros (m2+1, 1) ; for i = 0 : m2, XA = a + h*i ; f(i+1) = sqrt ( (1+XA) / (1-XA) ) ; % Compute Simpson's s0, s1 and s2. s0 = f(1) + f(m2+1) ; s1 = 0 ; for i = 1 : 2 : (m2-1), s1 = s1 + f(i+1) ; s2 = 0 ; for i = 2 : 2 : (m2-2), s2 = s2 + f(i+1) ; % Value of numerical integral - Simpson's rule. J = (h/3)*(s0 + 4*s1 + 2*s2) vakio = ( sqrt(ca0) / k) ; tau = vakio*j % Function plot. hold on ; axis ( [0 1 0 3.5] ) ; fplot ('sqrt((1+x)/(1-x))', [0 1.0] ) ; line ( [ b b ], [ 0 (sqrt((1+b)/(1-b))) ] ) ; title ( 'Plug Flow Reactor Performance') ; xlabel ('X_A') ; ylabel ('sqrt((1+x_{a})/(1+x_{a}))') ; stau = sprintf('%5.1f',tau) ; text (0.25, 0.75, ['\tau = ' stau ' s' ]) ; grid ; hold off ; print -tiff -deps2 d:\tmp\ex_4_2009 ;
Matlabissa on myös valmiita numeerisia integraattoreita. Käytetään tässä quad -funktiota. Voit käyttää myös quad8 -funktiota sekä (uusissa versioissa) quadl -funktiota. % paaohjelma_41.m % Ratkaisee tehtävän 4 - Ohjelmointi ja Matlab 2009 % 15.12.1998 & 31.8.2009 (c) Juha Jaako % Levenspiel O, Chemical reaction engineering. p. 111-113. % 2nd Edition (1972) % Plug flow reactor performance clear all ; format compact ; hold on ; % Reaction parameters. CA0 = 0.0625 ; k = 10^(-2) ; vakio = ( sqrt (CA0) / k) ; % Loppukonversiot. XAf = [ 0.8, 0.9, 0.95, 0.999 ] ; for i = 1 : 4, % Käytetään Matlabissa olevaa 'quad'-funktiota. J = quad ('putkireaktori_4', 0, XAf(i)) ; tau(i) = vakio * J ; plot (XAf(i), tau(i), 'o' ) ; disp ( [ ' XAf tau' ] ) ; disp ( [ XAf' tau' ] ) ; % XAf vs. tau -kuvaaja. x = 0.01 : 0.01 : 0.99 ; [N, M] = size (x) ; for i = 1 : M, J = quad ('putkireaktori_4', 0, x(i)) ; tau(i) = vakio * J ; plot (x, tau, '-') ; grid ; xlabel ('X_{Af}' ) ; ylabel ('\tau') ; hold off ; print ('-tiff', '-deps2', 'd:\tmp\ex_41_2009') ; Lisäksi tarvitaan funktio, joka laskee integroitavan function arvoja. % putkireaktori_4.m % 15.12.1998, 31.8.2009 & 5.10.2009 (c) Juha Jaako % Huom. x & f ovat vektoreita. function f = putkireaktori_4 (x) f = ((1+x)./(1-x)).^(0.5) ;
>> paaohjelma_41 XAf tau 0.8000 33.1824 0.9000 42.0970 0.9500 48.5247 0.9990 62.0340
477033A, Ohjelmointi ja Matlab (Programming and Matlab), 4 op / 2.5 ov Opettaja (Teacher): Juha Jaako Työstä tehdään työselostus, joka palautetaan ke 7.10.2009 klo 16:00 mennessä (juha.jaako@oulu.fi). 5 Tehtävä (Problem 5) a) Muunna tehtävän 1 koodi funktioksi nimeltään Optimipolku. Kutsuva pääohjelma (esimerkki) on seuraavanlainen (käytät luonnollisesti omia datapisteitäsi ja omaa nimeäsi): % Paaohjelma_1.m % Meikäläinen Matti - Opintopolku % Päivämäärä, opintopistekertymä ja aloituspäivä - Meikäläinen. x = [ datenum(2005,9,1), datenum(2008,11,21)] - datenum(2005,9,1) ; y = [ 0, 4,, 153, 157 ] ; aloituspaiva = [ 2005, 9, 1] ; Optimipolku (x, y, 'Meikäläinen', aloituspaiva) ; Muunna tehtävän 3 koodi funktioksi nimeltään Liukuva_ka. Kutsuva pääohjelma (esimerkki) on seuraavanlainen (tehtävä suoritetaan luonnollisesti kaikille datoille: DI, TkL & TkT). % Paaohjelma_3.m % Liukuvan keskiarvon laskenta % Datavektori - valmistuneet diplomi-insinöörit. vuosi = [ 1964 : 1 : 2008 ] ; DI = [ 2, 8,, 83, 105 ] ; teksti = [ 'diplomi-insinöörit' ] ; maara = sum (DI) ; Liukuva_ka (vuosi, DI, teksti, maara ) ; (Transform the code presented in problems 1 and 3 into Matlab functions. Syntax is presented above.) b) Tee Matlab-ohjelma, joka tarkistaa, onko annettu merkkijono palindromi (http://fi.wikipedia.org/wiki/palindromi). Esimerkkejä palindromeista löytyy eo. linkistä. Ohjelman tulee myös todeta, että seuraavat merkkijonot ovat palindromeja: - Atte kumiorava, varo imuketta!! - Saippuakivikauppias - Madam, I m Adam (Create a Matlab program which checks whether a given string is a Palindrome or not.) Tässä tehtävässä ei anneta vihjeitä sopivien komentojen ja funktioiden käytöstä. Tehtävässä harjoitellaan seuraavia asioita: a) olemassa olevan koodin muuttaminen yleiskäyttöiseksi funktioksi, b) yksinkertaisen algoritmin koodaaminen.
a) Tehtävässä muutetaan koodi toiseen muotoon. Ohjelmointityössä erittäin paljon muokataan olemassa olevia ohjelmia hiukan toisenlaisiksi. Yleensä ohjelmat rakennetaan siten, että otetaan koodinpätkä ja ruvetaan sen ympärille rakentamaan uutta ohjelmaa. a1) % Paaohjelma_1.m % Meikäläinen Matti - Opintopolku % Alkuperäinen ohjelma on muutettu kutsuvaksi pääohjelmaksi. % 12.8.2009 & 1.9.2009 - Juha Jaako % Päivämäärä ja opintopistekertymä - Meikalainen. x = [... datenum(2005,9,1), datenum(2005,9,20), datenum(2005,11,30), datenum(2005,12,5),... datenum(2005,12,13), datenum(2005,12,15), datenum(2005,12,19),... datenum(2006,1,27), datenum(2006,2,15), datenum(2006,2,21), datenum(2006,2,21),... datenum(2006,4,6), datenum(2006,4,26), datenum(2006,5,3),... datenum(2006,5,15), datenum(2006,5,19),... datenum(2006,11,1), datenum(2006,11,25), datenum(2006,12,10),... datenum(2006,12,19), datenum(2006,12,22),... datenum(2007,1,15), datenum(2007,1,16), datenum(2007,3,2), datenum(2007,3,5),... datenum(2007,3,23), datenum(2007,4,14), datenum(2007,4,16), datenum(2007,5,22),... datenum(2007,6,16),... datenum(2008,1,30), datenum(2008,3,12), datenum(2008,3,14), datenum(2008,3,17),... datenum(2008,3,18), datenum(2008,4,4), datenum(2008,4,9),... datenum(2008,4,10), datenum(2008,4,11), datenum(2008,4,30), datenum(2008,5,27),... datenum(2008,10,10), datenum(2008,10,17), datenum(2008,11,15), datenum(2008,11,21)... ] ; y = [ 0, 4, 9, 12, 16, 17, 19, 20.5, 25.5, 27.5, 31.5,... 34.5, 37.5, 40.5, 42.5, 47.5, 52.5, 56, 59, 61, 66,... 69, 71, 75, 79, 80, 85, 90, 92, 97, 100, 102, 106,... 111, 116, 119, 122, 125, 129, 137, 142, 145, 150,... 153, 157 ] ; Optimipolku (x, y, 'Meikalainen', [ 2005, 9, 1] ) ; Ja yleiskäyttöinen funktio % Optimipolku.m % Meikäläinen Matti - Opintopolku % Alkuperäinen ohjelma on muutettu funktioksi. % 12.8.2009 & 1.9.2009 - Juha Jaako function f = Optimipolku (x, y, nimi, alku) % Puretaan vektorista päiväys v = alku(1) ; kk = alku(2) ; p = alku(3) ; % Vähennetään aloituspäivä. x = x - datenum(v,kk,p) ; % Optimipolku - 60 op/a. opt_px = [ datenum(v,kk,p), datenum(v+1,kk,p), datenum(v+2,kk,p), datenum(v+3,kk,p)... ] - datenum(v,kk,p) ; opt_py = [ 0 : 60 : 180 ] ; % KELA-tuen edellyttämä polku - 43.2 op/a. KELA_px = [ datenum(v,kk,p), datenum(v+1,kk,p), datenum(v+2,kk,p),... datenum(v+3,kk,p), datenum(v+4,kk,p)... ] - datenum(v,kk,p) ; KELA_py = [ 0 : 43.2 : 4*43.2 ] ; hold on ; axis ( [ 0, (datenum(v+4,kk,p)-datenum(v,kk,p)), 0, 180] ) ; tanaan = datestr(now,1) ; title ( [ nimi ' : opintopolku ' tanaan ' mennessä'] ) ; xlabel ('\itpäiviä opiskelun alkamisesta') ; ylabel ('\itopintopisteet') ; % Plotataan opintopolku. plot (opt_px, opt_py, 'b-', KELA_px, KELA_py, 'r-', x, y, 'k.-') ; d = size (x, 2); text (x(d), y(d),... [' \leftarrow ' nimi '(' num2str(y(d)) ' op)'] ) ; leg ('60 op/a', '43.2 op/a', nimi, 2) grid ; hold off ; tiedosto = [ 'd:\tmp\' nimi ] ; print ('-tiff', '-deps2', tiedosto) ; f = 1 ;
a2) Liukuvan keskiarvon laskenta. % Paaohjelma_3.m % Liukuvan keskiarvon laskenta - datana osastolta valmistuneiden % diplomi-insinöörien määrä % (c) Juha Jaako 14.8.2009, pääohjelmaksi 2.9.2009 clear all ; format compact ; % Datavektorit - valmistuneet diplomi-insinöörit, lisensiaatit ja % tohtorit. vuosi = [ 1964 : 1 : 2008 ] ; DI = [ 2, 8, 12, 10, 6, 12, 12, 13, 19, 35, 25, 34, 21, 28, 37,... 33, 42, 23, 33, 30, 25, 14, 22, 28, 25, 27, 34, 38, 44, 64,... 47, 44, 62, 41, 46, 53, 51, 60, 72, 85, 79, 79, 85, 83, 105 ] ; TkL = [ 0, 0, 2, 1, 0, 0, 2, 2, 2, 3, 4, 1, 3, 1, 2, 6, 2, 0, 5, 0,... 6, 6, 4, 5, 1, 3, 4, 4, 4, 2, 7, 5, 4, 2, 9, 7, 3, 4, 5, 2,... 1, 2, 2, 0, 1 ] ; TkT = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0,... 2, 1, 0, 0, 1, 1, 0, 2, 1, 1, 1, 1, 4, 3, 5, 4, 2, 8, 3, 7,... 5, 4, 11, 8, 3 ] ; x = vuosi ; for i = 1 : 3, if i == 1, y = DI ; teksti = [ 'diplomi-insinöörit' ] ; maara = sum(di) ; elseif i == 2, y = TkL ; teksti = [ 'lisensiaatit' ] ; maara = sum(tkl) ; elseif i == 3, y = TkT ; teksti = [ 'tohtorit' ] ; maara = sum(tkt) ; else break ; Liukuva_ka (x, y, teksti, maara ) ; pause ; % Pysäyttää ohjelman suorituksen; välilyöntiä painamalla jatkuu. Ja funktio % Liukuva_ka.m % Liukuvan keskiarvon laskenta - % (c) Juha Jaako 14.8.2009, funktioksi 2.9.2009 function f = Liukuva_ka (x, y, teksti, maara ) clf ; hold on ; % Liukuvan keskiarvon laskenta. % Liukuvaa keskiarvoa kuvaavat datapisteet talletetaan vektoriin liuk % Ensiksi lasketaan datavektorin pituus. N = length (x) ; % N = vektorin pituus % Kahden ensimmäisen datapisteen laskenta. liuk(1) = mean (y(1:3)) ; liuk(2) = mean (y(1:4)) ; % Lasketaan muut datapisteet. for i = 3 : (N-2), tmp = y(i-2:i+2) ; liuk(i) = ( sum(tmp) - max(tmp) - min(tmp) ) / 3 ; % Kahden viimeisen datapisteen laskenta. liuk(n-1) = mean (y(n-3:n)) ; liuk(n) = mean (y(n-2:n)) ; % Kuvan piirtäminen. title ( ['Valmistuneet ' teksti ', ' num2str(maara) ] ) ; plot (x, y, 'ko:', x(1:n-1), liuk(1:n-1), 'k-') ; xlabel ('Vuosi') ; ylabel ('Määrä') ; grid ; hold off ; tiedosto = [ 'c:\tmp\' teksti ] ; print ('-tiff', '-deps2', tiedosto) ; f = 1 ;
b) Palindromi eräs mahdollisuus ratkaista ongelma. Matlabin tehokkaita funktioita käyttäen homma hoituu parhaimmillaan parilla rivillä. % palindromi.m % Tarkistaa, onko annettu merkkijono palindromi. % 28.9.2009 - Juha Jaako s = [ 'Atte kumiorava, varo imuketta!!' ] ; %s = [ 'Saippuakalakauppias' ] ; %s = [ 'Madam I' char(39) 'm Adam.' ] ; %disp (s) ; s = [ s '*' ] ; s = lower(s) ; pituus = max(size(s)) ; hipsu = char(39) ; % Tähti loppuun. % Pieniksi kirjaimiksi. % Merkkijonon pituus. % ' - merkki i = 1 ; while (i < pituus), % Katsotaan merkkijono merkki kerrallaan. t = s(i) ; if ( t==' ' t==',' t==';' t=='.'... t==':' t=='?' t=='!' t==hipsu ), s = [ s(1:i-1) s(i+1:pituus) ] ; % disp(s) ; pituus = pituus - 1 ; i = i - 1 ; i = i + 1 ; s = s (1:pituus-1) ; % Käännetään merkkijono toisinpäin. k = 1 ; for j = pituus-1 : -1 : 1, r(k) = s(j) ; k = k + 1 ; if (s == r), disp ('On palindromi!') ; else disp ( 'Ei ole palindromi' ) ;