/* [wxMaxima batch file version 1] [ DO NOT EDIT BY HAND! ]*/ /* [ Created with wxMaxima version 17.10.0 ] */ /* [wxMaxima: title start ] Luento 2, osa B [wxMaxima: title end ] */ /* [wxMaxima: section start ] Ehtolauseet Maximassa [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Ehtolauseet ovat peruskäsite kaikenlaisessa ohjelmoinnissa, myös Maximassa. Näistä yksinkertaisin on if-lause: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ x:5; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ if x = 5 then "x on viisi" else "x ei ole viisi"; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] If-lause siis tarkistaa, onko sille annettu ehto (tässä "x=5") voimassa. Jos ehto on voimassa niin ehtolause palauttaa then-sanan jälkeisen lausekkeen (tässä merkkijono "x on viisi") ja jos ei, niin se palauttaa else-sanan jälkeisen lausekkeen (tässä merkkijono "x ei ole viisi"). Testaa mitä käy kun vaihdat ylhäällä x:n arvoa ja ajat ehtolauseen uudestaan! Else-kohdan voi myös tarvittaessa jättää pois: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ if x > 0 then "x on positiivinen"; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] If-lauseiden avulla voidaan myös ajaa komentoja riippuen ehdosta: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ n:1; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ if n = 0 then wxplot2d(sin(z),[z,-5,5]) else wxplot2d(z^2,[z,-5,5]); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ x; n; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ if n = 0 then if x = 1 then y:1 else y:2 else if x # 1 then y:3 else y:4; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ y; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Ehtolausekkeen totuusarvon voi myös tarkistaa is-komennolla: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ is(1=1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ is(2#2); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ is(log(5)>1.4); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ is(1=1.0); /* [wxMaxima: input end ] */ /* [wxMaxima: section start ] Silmukat Maximassa [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Silmukat ovat erittäin hyödyllinen väline kaikessa ohjelmoinnissa. Silmukoiden idea on yksinkertaisesti, että niillä voidaan toistaa joitain komentoja monta kertaa. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ x:2; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ for i:1 thru 10 do x:2*x; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ x; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Yllä silmukassa i on niin sanottu indeksimuuttuja. Se käy silmukassa läpi sille annetun välin kaikki kokonaisluvut. Jos vaikka haluttaisiin laskea ensimmäisen sadan luonnollisen luvun summa, niin se onnistuisi seuraavasti: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ n:100; summa:0; for i:1 thru n do summa:summa+i; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ summa; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ /* Verrataan tuttuun kaavaan */ (n+1)*n/2; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Entä jos haluttaisiin summata vain kolmella jaollisia lukuja? Ehtolauseista on hyötyä tässä! [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ /* Kolmella jaollisuuden tarkastus onnistuu mod-komennolla, esimerkkinä: */ mod(9,3); mod(10,3); mod(11,3); mod(12,3); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ n:100; summa:0; for i:1 thru 100 do if mod(i,3) = 0 then summa:summa+i; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ summa; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Vielä yksi esimerkki, miten listasta voisi poimia positiiviset alkiot uuteen listaan: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ lista:[1,4,-5,3,-7,354,-1,21,-%pi,0,86,sqrt(2),34,-9,6]; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Tätä esimerkkiä varten meidän täytyy osata laskea listan alkioiden lukumäärä... [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ length(lista); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] ...sekä osata yhdistää kaksi listaa. [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ append([1,2,3],[4]); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Näillä eväilä tulee valmista: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ uusi_lista:[]$ /* Tehdään ensin tyhjä lista muttei näytetä sitä turhaan */ for i:1 thru length(lista) do if lista[i] > 0 then uusi_lista:append(uusi_lista,[lista[i]]); uusi_lista; /* Kysytään mitä listalla nyt on */ /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Maximassa voi tehdä myös while-silmukan, joka toistaa asiaa kunnes annettu ehto ei enää toteudu: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ u:1; while u < 6 do u:u+1; u; /* [wxMaxima: input end ] */ /* [wxMaxima: section start ] Monimutkaisempia funktioita [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Silmukoiden ja ehtolauseiden ansiosta meillä on nyt käytössä työkaluja määrittelemään uusia monimutkaisempia funktioita. Tutustutaan ensin siihen, miten Maximassa voi yhdistää komentoja laittamalla ne sulkuihin: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ ( x:1, x:x+1, y:x^2, z:1-y, y ); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Miksi ylläoleva komento palauttaa luvun 4? Syy on yksinkertainen: Kun Maximassa yhdistää monta komentoa laittamalla ne sulkuihin ja erottelemalla ne pilkulla, niin tämä "yhdistetty komento" palauttaa arvokseen viimeisenä esiintyneen lausekkeen. Jokainen sulkujen sisälle laitettu komento kuitenkin ajetaan (kokeile vaikka mikä arvo muuttujassa z on tällä hetkellä). [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Näin voidaan määritellä funktioita, jotka tekevät monta asiaa yhtä aikaa: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ funktio1(A) := ( B:A+4, C:B^2, D:1-C, C ); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ funktio1(1); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ B; C; D; /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Yhdistelemällä nyt aiemmin opittuja asioita saadaan jo aika näppäriä funktioita tehtyä. Tässä funktio, joka laskee monta positiivista alkiota annetussa listassa on: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ funktio2(lista_1) := ( lkm:0, /* Laitetaan aluksi muuttujaan lkm arvo nolla */ for i:1 thru length(lista_1) do if lista_1[i] > 0 then lkm : lkm + 1, /* Kasvatetaan muuttujaa lkm yhdellä aina kun löydetään positiivinen luku */ lkm /* Muuttuja lkm on viimeinen asia suluissa, joten sen arvo palautetaan kun funktiota kutsutaan */ ); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ funktio2([1,2,3,4,5,-6]); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Tai miksei vaikka funktio, joka palauttaa listan jossa on annettu lauseke ja sen n_1 ensimmäistä derivaattaa muuttujan x suhteen: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ kill(all); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ funktio3(lauseke_1,n_1) := ( palaute_lista : [lauseke_1], for i:1 thru n_1 do palaute_lista : append(palaute_lista, [diff(palaute_lista[i],x)]), palaute_lista ); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ funktio3(x*log(x),8); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Tällaisen avulla voi esimerkiksi kirjoittaa Taylorin polynomeja nopeasti ja helposti. [wxMaxima: comment end ] */ /* [wxMaxima: section start ] Lisää listoja [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Tässä pari yksinkertaista komentoa listojen kanssa työskentelyyn. Ensinnäkin listojen luomista varten on Maximassa kätevä komento "makelist": [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ makelist(i^2,i,1,10); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ makelist(diff(x*log(x),x,i),i,0,8); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Makelist-komento siis luo listan annetun lausekkeen perusteella. Listan indeksimuuttuja (yllä valittiin i indeksimuuttujaksi) laitetaan käymään joku väli läpi. [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Jos lista halutaan sijoittaa johonkin useamman muuttujan funktioon argumentiksi, on olemassa komento "apply": [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ monen_muuttujan_funktio_1(a,b,c,d,e) := a + 2*b + 3*c + 4*d + 5*e; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ apply(monen_muuttujan_funktio_1,[0,0,1,1,0]); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Nämä vaikuttavat aika yksinkertaisilta ja "tylsiltä" komennoilta, mutta niillä voi tehdä kaikenlaista näppärää jatkossa! [wxMaxima: comment end ] */ /* [wxMaxima: section start ] Part-komento [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Jos lausekkeesta halutaan erottaa jokin pala, niin sitä varten täytyy käyttää part-komentoa. Maximassa nimittäin ajatellaan, että jokainen lauseke koostuu pienemmistä osista. Yksinkertainen lauseke x^5 sisältää kolme osaa: x,^ ja 5. Maximassa näille annetaan seuraava järjestys: Osa numero 1: x Osa numero 2: 5 Osa numero 0: ^ [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Oikeastaan tässä on niin, että "^" on funktio (jonka nimessä on lainausmerkit jos käytetään funktiona!), jolla on kaksi argumenttia: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ "^"(a,b); "-"(7,3); "+"(x,y,z); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Haluttu osa voidaan poimia part-komennolla: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ part(x^5,1); part(x^5,2); part(x^5,0); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Monimutkaisempi lauseke jakautuu aina pienempiin lausekkeisiin "puumaisesti". Otetaanpa vaikka esimerkkinä lauseke x^5 + sin(x) + 7: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ laus:x^(y+2)+sin(z)-7; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ part(laus,1); part(laus,2); part(laus,3); part(laus,0); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Nyt kun lauseke on jaettu palasiin, näitä palasia voidaan edelleen jakaa pienemmiksi palasiksi: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ part(laus,2,1); part(laus,2,2); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ part(laus,2,2,1); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Myös listan alkion poimiminen onnistuu partilla: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ part([1,4,9,16,25],4); /* [wxMaxima: input end ] */ /* [wxMaxima: comment start ] Esimerkki, miten poimitaan solve-komennon antama ratkaisujoukko listaan ja piirretään se: [wxMaxima: comment end ] */ /* [wxMaxima: input start ] */ poly : x^3 +x^2 -3*x +1; /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ juuret:solve(poly); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ juurilista: makelist(part(juuret,i,2),i,1,length(juuret)); /* [wxMaxima: input end ] */ /* [wxMaxima: input start ] */ wxplot2d( [poly,[discrete,juurilista,[0,0,0]]], /* Juurilista sisältää vain x-koordinaatit, joten laitetaan y-koordinaateiksi lista, jossa on kolme nollaa */ [x,-5,5], [y,-5,5], [style,lines,points], [point_type,asterisk] ); /* [wxMaxima: input end ] */ /* [wxMaxima: section start ] Kysyttävää? [wxMaxima: section end ] */ /* [wxMaxima: comment start ] Kysyttävää tämän päivän luennoista? [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Aiheita, joista haluat lisäkäsittelyä? (Kolmas luento koskee piirtämistä, neljäs sekalaista.) [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Epäselvyyksiä tehtäväpakettien kanssa? [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Teknisiä ongelmia Maximan kanssa? [wxMaxima: comment end ] */ /* [wxMaxima: comment start ] Kysy joko luennolla tai sähköpostilla tai Teamsissä! [wxMaxima: comment end ] */ /* Maxima can't load/batch files which end with a comment! */ "Created with wxMaxima"$