Matemaattiset ohjelmistot MAPLE-harjoitus 1, syksy 2012 Ohjeita: Ennen kuin aloitat, tutustu ensin hieman MAPLEn k¨ aytt¨ oliittym¨ a¨ an, esim. selvit¨ a mist¨ a ohjetoiminnot (HELP) l¨ oytyv¨ at. Teht¨ av¨ at 2-4 kannattaa tehd¨ a ty¨ oarkille (File→New→Worksheet Mode). Ty¨ oarkin voi tallettaa (.mw tai .mws) esim. pajun ko- tihakemistoon tai muistitikulle. Kannattaa lis¨ aksi muuttaa sy¨ ote perinteiseen muotoon valitsemalla (Tools→Options→Display→Input Display: Maple Notation), kts. luennoista Maplen k¨ ayt¨ on alkutoimet. 1. Tutustu MAPLEen k¨ aym¨ all¨ a l¨ api P:\matohj\tours hakemistosta l¨ oytyv¨ a ”Quick New User’s Tour”. Suorita siin¨ a ty¨ oarkkien laskut, mutta ¨ al¨ a tallenna ty¨ oarkkeja levylle. 2. Totuttele yksinkertaisiin laskutoimituksiin kuten luentojen alkuosassa on tehty. Las- ke kompleksiluvuilla ja eri vakioilla. Tutustu lausekkeiden nime¨ amiseen sijoitus- lauseen avulla. Selvit¨ a itsellesi puolipisteen ja kaksoispisteen ero lauseen p¨ a¨ attimen¨ a. Opettele tallentamaan ty¨ oarkki levylle. 3. M¨ a¨ ar¨ a¨ a MAPLElla seuraavien funktioiden integraalifunktiot ja tarkista tulos deri- voimalla: (a) x 2 e -x , (b) x 2 cos(x), (c) 1 x 4 -1 , (d) √ 1 - x 2 . 4. Laske/sievenn¨ a MAPLElla seuraavat lausekkeet: (?simplify) (a) 2 log 4 + log √ 25 - 3 log 2 (b) (1 + i) 4 + (1 - i) 4 , jossa i 2 = -1 (c) M X k=1 k - M +1 2 2 (d) n X k=0 (k - np) 2 n k p k (1 - p) n-k (e) d dx arctan 1+ x 1 - x . Lis¨ ateht¨ avi¨ a (jos j¨ a¨ a aikaa/omalla ajalla) 5. K¨ ay l¨ api hakemistosta P:\matohj\tours l¨ oytyv¨ a ”New User’s Tour”. 6. Teht¨ av¨ apaperin toisella puolella on MAPLE-komentoja. Suorita ne MAPLEn avulla. Selvit¨ a HELPin avulla mit¨ a komennot tekev¨ at ja miten niit¨ a k¨ aytet¨ a¨ an. K ¨ A ¨ ANN ¨ A!
53
Embed
MAPLE-harjoitus 1, syksy 2012omankine//Maple/maple_harkat.pdf · MAPLE-harjoitus 1, syksy 2012 Ohjeita: Ennen kuin aloitat, tutustu ensin hieman MAPLEn k aytt oliittym
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Matemaattiset ohjelmistot
MAPLE-harjoitus 1, syksy 2012
Ohjeita: Ennen kuin aloitat, tutustu ensin hieman MAPLEn kayttoliittymaan, esim.selvita mista ohjetoiminnot (HELP) loytyvat. Tehtavat 2-4 kannattaa tehda tyoarkille(File→New→Worksheet Mode). Tyoarkin voi tallettaa (.mw tai .mws) esim. pajun ko-tihakemistoon tai muistitikulle. Kannattaa lisaksi muuttaa syote perinteiseen muotoonvalitsemalla (Tools→Options→Display→Input Display: Maple Notation), kts. luennoistaMaplen kayton alkutoimet.
1. Tutustu MAPLEen kaymalla lapi P:\matohj\tours hakemistosta loytyva ”QuickNew User’s Tour”. Suorita siina tyoarkkien laskut, mutta ala tallenna tyoarkkejalevylle.
2. Totuttele yksinkertaisiin laskutoimituksiin kuten luentojen alkuosassa on tehty. Las-ke kompleksiluvuilla ja eri vakioilla. Tutustu lausekkeiden nimeamiseen sijoitus-lauseen avulla. Selvita itsellesi puolipisteen ja kaksoispisteen ero lauseen paattimena.Opettele tallentamaan tyoarkki levylle.
3. Maaraa MAPLElla seuraavien funktioiden integraalifunktiot ja tarkista tulos deri-voimalla:
(a) x2e−x,
(b) x2 cos(x),
(c) 1x4−1
,
(d)√1− x2.
4. Laske/sievenna MAPLElla seuraavat lausekkeet: (?simplify)
(a) 2 log 4 + log√25− 3 log 2
(b) (1 + i)4 + (1− i)4, jossa i2 = −1
(c)M∑k=1
(k − M + 1
2
)2
(d)n∑
k=0
(k − np)2(n
k
)pk(1− p)n−k
(e)d
dxarctan
(1 + x
1− x
).
Lisatehtavia (jos jaa aikaa/omalla ajalla)
5. Kay lapi hakemistosta P:\matohj\tours loytyva ”New User’s Tour”.
6. Tehtavapaperin toisella puolella on MAPLE-komentoja. Suorita ne MAPLEn avulla.Selvita HELPin avulla mita komennot tekevat ja miten niita kaytetaan.
simplify( sum((k - n*p)^2*binomial(n,k)*p^k*(1 - p)^(n - k), k =
0..n) );
Lisätieto: Edellä on kyseessä binomijakauman toinen momentti eli varianssi. Ongelma ei siis ole järkevä, jos n<0, joten oletetaan n positiiviseksi kokonaisluvuksi. Tilde (~) n:n perässä sinisissä vastauksissa tarkoittaa, että n:ään liittyy jotain oletuksia.assume(n, posint);
simplify( sum((k - n*p)^2*binomial(n,k)*p^k*(1 - p)^(n - k), k =
0..n) );
4.ediff( arctan((1 + x)/(1 - x)), x);
simplify(%);
int(%, x); # Tarkistus
1
Kannattaa siis huomata, että myösdiff(arctan(x), x);
1
Matemaattiset ohjelmistot
MAPLE-harjoitus 2, syksy 2012
1. Ratkaise seuraavat yhtalot MAPLEn avulla:
(a) x3 − 3x2 + 2x = 0
(b) cos x+√
3 sinx = 2
(c) log(x+ 5) = 2 log(x− 1)
(d) ex + e−x = 4
(e)√x+ 5 =
√x+√x− 3.
Tutki ratkaisuja myos graafisesti piirtamalla sopivien funktioiden kuvaajat.
2. (a) Tutki HELPin avulla piirtokaskya plot. Piirra samaan koordinaatistoon kayrat
y =sin(nx)
n, kun 0 ≤ x ≤ 4π ja n = 1, 2, 3, 4.
(b) Tutustu MAPLEn paketteihin plots ja plottools.
(c) Piirra MAPLEn avulla ympyran x2 + y2 = 4 kuvaaja neljalla eri tavalla.
(d) Piirra kayra 3x2 + 2y2 − 2xy = 6.
3. Ratkaise MAPLElla yhtaloryhmat
(a) x2 + y2 = 3 ja xy = 2
(b) x2 + y2 = 3 ja 2y = x2
(c) x+ y + z = 6, x2 + y2 + z2 = 14 ja x3 + y3 + z3 = 36
1.aAlla kolme eri ratkaisutapaa. Huomaa tulosten erimuotoisuus.f := x^3 - 3*x^2 + 2*x; # lauseke!
solve({f = 0}, {x});
solve(f = 0, x);
ratk := solve(f);
Tarkistetaan yksi ratkaisuista:subs(x=ratk[1],f = 0);
eval(f,x=ratk[1]);
0
Piirretään kuvaaja, josta nollakohdat hahmottuvat.plot(f,x=0..3);
1.bf := cos(x) + sqrt(3)*sin(x) - 2;
yht := {f = 0}:
solve(yht, {x});
> >
> >
> >
> >
> >
> >
Yllä ei ole kaikkia ratkaisuja. Ne saadaan seuraavasti:_EnvAllSolutions := true;
solve(yht, {x});
_EnvAllSolutions := false;
Maple käyttää globaalia nimeä _Z1 ratkaisun kokonaislukuparametrille eli ratkaisu on ,
missä on mikä tahansa kokonaisluku.about(_Z1);
Originally _Z1, renamed _Z1~:
is assumed to be: integer
Kuvaaja:plot(f,x=0..Pi/2);
1.cf :=log(x + 5) - 2*log(x - 1);
solve({f=0}, {x});
simplify(subs(x = 4, f)); # Tarkistus0
plot(f,x=1..5);
> >
> >
> >
> >
1.df := exp(x) + exp(-x) - 4;
yht := f =0;
ratk := solve({yht}, {x});
evalf(ratk); # likiarvot
simplify(eval(yht,ratk[1])); # Tarkistus
plot(f,x=-2..2);
1.ef := sqrt(x + 5) - sqrt(x) - sqrt(x - 3);
solve({f=0}, {x});
plot(f,x=2..5);
2 a.sinit := n -> sin(n*x)/n; # funktio, joka riippuu n:stä
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
Piirrettävät käyrät annetaan plot-käskylle listana.plot([sinit(1), sinit(2), sinit(3), sinit(4)], x = 0..4*Pi);
Toinen tapa jonon (sequence) avulla:lista := [seq(sin(n*x)/n, n = 1..4)]; # lista lausekkeita
plot(lista, x = 0..4*Pi):
Tai tietenkin suoraan plot:n sisällä, eikä n:n tarvitse mennä ykkösen askelin, vaan annetaan joitakin n:n arvoja omassa listassaan:plot([seq(sinit(n), n = [1, 3, 5])], x = 0..4*Pi):
Jos ei halua määritellä funktiota, niin voi käyttää lauseketta:sinit := sin(n*x)/n;
plot([seq(sinit, n = 1..4)], x = 0..4*Pi):
Huomaa vielä, että voitaisiin käyttää listan sijasta joukkoa eli pistetään piirrettävä data aaltosulkeisiin:plot({seq(sinit, n = 1..4)}, x = 0..4*Pi):
2c.Piirretään ympyrä 7 tavalla. Kyseessä on origokeskeinen ympyrä, jonka säde on kaksi. Huomaa, että vain viimeinen tulostetaan tilan säästämiseksi. Ladataan ensin plots ja plottools paketit avuksi muutamien piirto-optioiden kera.with(plots): with(plottools):
Piirretään ratkaistut puolikkaat erikseenplot([sqrt(-x^2 + 4), -sqrt(-x^2 + 4)], x = -2..2, y = -2..2,
scaling = constrained, color = red):
Piirretään sinin ja kosinin avulla parametrimuodossa. Huomaa, että parametrin rajojen on tultava myöskin hakasulkeiden sisään!plot([2*cos(t), 2*sin(t), t = 0..2*Pi], scaling = constrained):
Piirretään vakiosuora napakoordinaatistoon (napakoordinaatistossa vakiosuorat ovat ympyröitä!)plot(2, t = 0..2*Pi, coords = polar, scaling = constrained):
Annetaan koneen ratkaista yhtälö ja piirretään se implisiittisesti:implicitplot(x^2 + y^2 = 4, x = -3..3, y = -3..3, scaling =
> >
> >
> >
> >
> >
> >
> >
> >
constrained):
Jälleen vakiosuora napakoordinaatistoon, nyt omalla käskyllään.polarplot(2, t = 0..2*Pi, scaling = constrained):
Lopuksi vielä hauskin tapa, eli kaivetaan paketeista esiin käsky circle, luodaan ympyrä ja näytetään se.ymp1 := circle([0,0], 2):
display(ymp1, scaling = constrained, color = red):
Ympyränkaaren voi myös piirtää koko kehän osalta omalla komennollaan:display(arc([0,0], 2, 0..2*Pi));
Huomaa, että seuraavassa komento allvalues antaa kaikki ratkaisut, kun taas evalf antaa vain yhden ratkaisun RootOf-lausekkeille.allvalues(ratk[1]), allvalues(ratk[2]);
evalf(ratk);
convert(ratk[1], radical);
convert(ratk[2], radical);
Kuitenkin map-komennolla ja tekemällä yhdistetty funktio evalf ja allvalues komennoista, saadaan kaikille ratkaisuille myös likiarvot.map(evalf@allvalues,[ratk]);
Warning, solving for expressions other than names or functions is not recommended.
polarplot(sqrt(rtoi), phi = 0..2*Pi):
Ellipsin pinta-ala saadaan integroimalla yli kulmamuuttujan ja säteen . Nyt säde riippuu kulmamuuttujasta , joten pinta-alaksi saadaan integraali kulmamuuttujan yli:pinta_ala := Int(Int(r, r = 0..r(phi)), phi = 0..2*Pi) = Int(r^2,
phi = 0..2*Pi)/2;
pinta_ala := int(rtoi, phi = 0..2*Pi)/2;
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
(4)(4)
> >
likiarvo := evalf(pinta_ala);
Voidaan käyttää myös pakettia geometry, josta löytyy ellipsi-objekti:with(geometry):
(c) Olkoon n pariton kokonaisluku. Laske cos(nπ). Onko luku n2− 1 jaollinen
neljalla?
KAANNA!
8. Suorita alla olevat komennot MAPLEn avulla ja tarvittaessa tutki HELPin avulla,miten komentoja kaytetaan.
> laus := exp(-x^2); nn := 5;> for k from 1 to nn do> der := diff(laus, x$k);> collect(der, exp(-x^2))> end do;
> for k from 2 to 5 do> sin(k*x) = expand(sin(k*x))> end do;
> for k from 2 to 5 do> sin(x)^k = combine(sin(x)^k)> end do;
> k := ’k’: p := ’p’: n := ’n’:> summa := Sum(k^p, k = 1..n);> for p to 4 do> laus := simplify(value(summa));> summa = factor(laus);> end do;
> >
(1)(1)
> >
> >
> >
Matemaattiset ohjelmistot
(Syksy 2012)
Harjoitus 3
1a. Huomaa, että kyseessä on joukon parametrimuotoinen esitys (hakasulkujen paikka!)plot([cos(t)+0.65*cos(2*t)-0.65,1.5*sin(t), t=0..2*Pi]);
1b. Tehdään lista t:n funktionaF := t -> [ cos(u/t) + cos(u)/t, sin(u/t) - sin(u)/t, u = 0..2*Pi*t];
Sen jälkeen plottaaminen on helppoa:plot([F(3), F(4), F(5), F(6)], axes = frame);
1c. Joukon pisteet on annettu implisiittisesti eli:plots[implicitplot]( ceil(x) = ceil(y), x=-3..3, y=-3..3);
2b.
> >
> >
> >
> >
Piirretään samaan kuvaan tilan säästämiseksi.plot3d( {x^2+y^2, x^2-y^2}, x=-3..3, y=-3..3, axes=boxed);
2c. Jälleen kuvaaja on määritelty implisiittisestiplots[implicitplot3d](Si(x*y*z) = Ci(x^2*y^2*z^2), x=-3..3, y=-3..3, z=-3..3);
2d. restart:with(plottools):with(plots):implicitplot3d( x^2 + y^2 + z^2 = 4, x = -2..2, y = -2..2, z = -2..2, numpoints = 500, style = patchnogrid, scaling = constrained);
> >
(3)(3)
> >
> >
> >
(2)(2)
> >
> >
> >
Ratkaistaan yhtälö ja piiretään molemmat puolet erikseen. Huom! kuva näyttää enemmän Pacmanilta kuin pallolta koska piirtotarkkuus astuu kuvaan mukaan.Sisään on piirretty vielä tason z=0, jota molemmat puolet siis lähestyvät (piirtotarkkuuden rajoissa).puolet := solve( x^2 + y^2 + z^2 = 4, z);
plot3d( {puolet,0}, x = -2..2, y = -2..2, scaling = constrained, numpoints = 500, style = patchnogrid);
Maplesta löytyy myös pallolle valmis komento:c := sphere([0, 0, 0], 2):plots[display](c, scaling=constrained, style=patchnogrid, axes=none):
Piirretään vakio 2 pallokoordinaatistoon. Maplen tuntemiin koordinaattisysteemeihin pääsee tutustumaan kirjoittamalla ?coords. Tuolta löytyvät tietysti myös esim. pallon parametriesitykset.plot3d( 2, x = 0..2*Pi, y = 0..2*Pi, coords = spherical, style = patchnogrid):
Piirretään vakio pallokoordinaatistoon, nyt omalla käskylläänsphereplot( 2, theta = 0..2*Pi, phi = 0..Pi, style = patchnogrid):plot3d( [2*cos(v)*sin(w), 2*sin(v)*sin(w), 2*cos(w)], v = 0..2*Pi, w = 0..Pi, style = patchnogrid):
'2202110'[3] = convert(2202110, decimal, 3)[dec];'2202110'[3] = convert([0,1,1,2,0,2,2], base,3,10)[dec];# 2. tapa
kymppi := convert([0,1],base,5,10); # 5-järjestelmän luku 10 muunnetaan kymmenjärjestelmäänk:=kymppi[1]^kymppi[1];vast:=convert(k,base,5); # muunnos takaisin 5-järjestelmäänvast:=ListTools[Reverse](vast); # tutumpi esitysjärjestys valovuosi = convert(light_year, metric);
4.Kokeillaan ensin ilman oletuksia.restart;is((n^3-n)/3, integer); coulditbe((n^3-n)/3,integer);
falsetrue
Kokeillaan nyt oletuksen kanssa. Luvun n etumerkillä ei tässä tapauksessa ole väliä jaollisuuden kannalta. Kokonaislukuoletus löytyy komennon assume HELPistä.assume(n::integer); is((n^3-n)/3, integer);assume(n::negint); is((n^3-n)/3, integer);assume(n::posint); is((n^3-n)/3, integer);
truetruetrue
Käskyjen ero: is kertoo, onko ominaisuus voimassa kaikilla mahdollisilla arvoilla, coulditbe taas kertoo, onko mahdollisesti olemassa jokin arvo, jolla ominaisuus pätee.
5.alkulista := seq(ithprime(n), n = 1..10);
add(2^n, n = alkulista); mul(binomial(n+1, n), n = alkulista);
545925292
(3)(3)
(9)(9)
(8)(8)
> >
(7)(7)
> >
(10)(10)
> >
> >
25082265600
6. Käytetään toistorakennetta ja käydään läpi kaikki parittomat luvut lukuun 149 asti. Alustetaan summa nollaksi ja lisätään siihen yhdistetyt luvut.summa := 0:for i from 1 by 2 to 149 do if not isprime(i) then summa := summa + i; end if;end do;summa;
3351Toinen tapa: luodaan lista halutuista luvuista ja lasketaan sitten listan alkioiden summa.luvut := [seq(k,k=1..150)]: # kaikki 150 pienemmät luvutluvut := remove(isprime,luvut): # poistetaan alkuluvutluvut := remove(x->is(x,even),luvut); # poistetaan parilliset tai: x -> irem(x,2) = 0add(k,k = luvut); #summataan
3351Sama tehtävä voidaan ratkaista myös vektoreiden sisätulon avulla. Muodostetaan kaksi vektoria; ensimmäiseen parittomat luvut ja toiseen tieto lukujen jaollisuudesta. Luku 1 tarkoittaa, että vastinalkio on yhdistetty luku, luku 0 puolestaan tarkoittaa alkulukua. Summa saadaan vektoreiden sisätulona.
Tässä ja edellisessä ratkaisussa täytyy käsitellä vektoreita/listoja, mikä vaatii enemmän muistitilaa. Toistorakenne tuottaa saman vastauksen "pienemmässä tilassa".luvut := [seq(2*n-1,n=1..75)];a := [seq(not(isprime(n)), n = luvut)];a := subs('false'=0,'true'=1,a);a := Vector[row](a):luvut := Vector[row](luvut):summa := a.luvut;
2. Ratkaise MAPLEn toistorakenteiden avulla seuraavat tehtavat:
(a) Laske (a+ b)k sulut avaten, kun k = 1, 2, 3, 4, 5.
(b) Laske integraali∫
∞
0
dx
(a2 + x2)n
kun n = 2, 3, 4, 5 ja a > 0.
(c) Mika on pienin kokonaisluku n ≥ 1, jolla e− (1 + 1
n)n < 0.0004 ?
3. Mieti miten tutkisit seuraavaa loogista totuustaulua MAPLElla.
A B A ja B
1 1 11 0 00 1 00 0 0
Voisiko tahan kayttaa toistorakennetta?
4. Laadi MAPLE-proseduuri, jolle annetaan argumentteina kolmion sivujen pituudeta, b ja c, ja joka laskee kolmion kulmat ja pinta-alan A. Vihje: kayta kosinilauset-ta (kts. kaantopuoli) ja Heronin kaavaa A =
√
p(p− a)(p− b)(p− c), missa p onkolmion piirin puolikas. Testaa proseduuria mm. tasasivuisella, tasakylkisella ja suo-rakulmaisilla muistikolmioilla.
5. Hermiten polynomit Hn(x) voidaan maaritella seuraavasti:
Laadi proseduuri (rekursiivinen tai ”perinteinen”), joka muodostaa Hermiten poly-nomin Hn(x). Tutki lisaksi, onko MAPLEssa valmista proseduuria Hermiten poly-nomin maaraamiseen.
Lisatehtavia (jos jaa aikaa/omalla ajalla)
6. Tee MAPLE-proseduuri, joka ratkaisee yhtalon f(x) = 0 numeerisesti Newtoninmenetelmalla. Newtonin menetelmassa lahdetaan liikkeelle alkuarvauksesta x0 jalasketaan jono juuren approksimaatioita kaavalla
xk+1 = xk −f(xk)
f ′(xk), k = 0, 1, . . . .
Testaa proseduuria esimerkiksi funktioilla f(x) = exp(x) − 2 ja f(x) = x− cos(x).Vertaa tuloksiasi komennon fsolve antamiin tuloksiin. Miten valitsisit alkuarvauk-sen x0?
Kosinilause
a
bc
β γ
α
c2 = a2 + b2 − 2ab cos γ
> >
> >
(6)(6)
> >
> >
(1)(1)
(2)(2)
> >
(5)(5)
> >
(4)(4)
> >
> >
(3)(3)
Matemaattiset ohjelmistot
(Syksy 2012)
Harjoitus 4restart;
1. Epäyhtälötkin ratkaistaan solve-komennolla. Vastauksissa Open tarkoittaa avointa päätepistettä.solve(x^2-2*x-1<0,x);
solve(2*x^3-5*x^2-4*x+3 <= 0,x);
Aaltosulkuja käyttäen tulos tulee hieman eri muodossa.solve({-4*x^3+5*x^2-2*x <= -x^4},x);
solve(sin(x)+cos(x) >= 0,x);
2. afor k from 1 to 5 do
expand((a+b)^k);
end do;
2. bassume(a::positive):
Ensin for-silmukallafor n from 2 to 5 do
Int(1/(a^2 + x^2)^n, x = 0..infinity) = int(1/(a^2 + x^2)^n, x
= 0..infinity);
end do;
> >
> >
(7)(7)
(6)(6)
> >
> >
(8)(8)> >
Toinen tapa seq-komennollaseq( Int(1/(a^2 + x^2)^n, x = 0..infinity) = int(1/(a^2 + x^2)^n,
x = 0..infinity), n = 2..5 );
2. cMääritellään ensin ns. toleranssi, johon erotusta verrataan:tol := 0.0004;
Käytetään seuraavassa evalhf-komentoa, joka evaluoi lausekkeet käyttäen prosessorin liukulukuja (hardware float), ei Maplen ohjelmallisesti toteutettuja liukulukuja. Näitä käyttäen silmukka pyörii huomattavasti nopeammin.fun := n -> evalhf( exp(1) - (1 + 1/n)^n ):
n := 1:
while fun(n) > tol do
n := n + 1;
end do:
n;3397
Tarkistetaan:fun(n - 1), fun(n);
Vertaillaan vielä aikaeroja, jos käytetään koneen liukulukuja tai Maplen omia liukulukuja.start := time():
> >
(6)(6)
> >
> >
> >
(10)(10)
(9)(9)
fun := n -> evalhf( exp(1) - (1 + 1/n)^n ):
n := 1:
while fun(n) > tol do
n := n + 1;
end do:
n;
aika1 := time() - start; # laskentaan käytetty aika
3397
start := time():
fun := n -> evalf( exp(1) - (1+1/n)^n ): # Maplen omat
liukuluvut
n := 1:
while fun(n) > tol do
n := n + 1;
end do:
n;
aika2 := time() - start; # laskentaan käytetty aika3397
Ero on siis suhteellisesti aikamoinenaika2/aika1;
30.53191489
3.Helpoin tapa totuustaulun tutkimiseen on käydä kaikki 4 vaihtoehtoa läpi A:=true; B := true; A and B;
A:=true; B := false; A and B;
A:=false; B := true; A and B;
A:=false; B := false; A and B;
true
false
false
(12)(12)
(13)(13)
> >
(6)(6)
> >
(14)(14)
> >
> >
> >
(11)(11)
> >
(10)(10)false
Sama toistorakenteella, tulostetaan näkyviin riveittäin:for A in [true,false] do
for B in [true, false] do
rivi := [A,B,A and B];
print(rivi);
end do;
end do;
LISÄTEHTÄVIÄ: Ratkaise MAPLEn toistorakenteiden (for, while, ei seq) avulla seuraavat tehtävät:
a) Tee lista/jono 50 ensimmäisestä Fibonaccin luvusta.
b) Heitä noppaa 200 kertaa ja laske silmälukujen summa ja keskiarvo. Heitä 1000 kertaa. c) Olkoon L lista, jossa on jonkin luvun binääriesitys, esim. L:=[1,0,1,0,0,0,1]. Muunna MAPLEn toistorakenteilla listan esittämä luku kymmenjärjestelmän luvuksi. Tarkista vastauksesi convert-komennolla.
d) Luvun p mahdolliset tekijät ovat pienempiä kuin sqrt(p). Testaa onko luku p:=233 alkuluku käymällä läpi nämä mahdolliset tekijät ja testaamalla jakaako niistä joku p:n. Tarkista isprime-komennolla. Kokeile muitakin lukuja.
restart:
a) Parametrisoidaan ensin jonon pituus.n := 50;
F := [1$n]; # alustetaan jono ykkösiksi
Sitten jonon alkiot on helppo laskea kahden edellisen summana:for i from 3 to n do
F[i] := F[i-1] + F[i-2]:
(17)(17)
> >
(6)(6)
(16)(16)
> >
(14)(14)
> >
> >
(15)(15)
> >
(10)(10)
end do:
F;
b) summa := 0: # alustetaan summa nollaksi
n := 200; # heitetään n kertaa
for i from 1 to n do
summa := summa + rand(1..6)(): # lisätään heiton tulos summaan
end do:
'summa' = summa;
keskiarvo := evalf(summa/n);
c) Ensin alustukset sitten laskenta. Huomaa käänteinen järjestys.L :=[1,0,1,0,1,1,1]; luku :=0:
> isolve(2*x+3*y=5); isolve(x^2+y^2=5);> dsolve(diff(y(x),x)=x*y(x),y(x));> LL:=rsolve({y(n+1)=y(n)+y(n-1),y(0)=0,y(1)=1},y(n));> for n from 2 to 6 do simplify(LL) end do;> [n,LL];
> >
> >
Matemaattiset ohjelmistot
(Syksy 2012)
Harjoitus 4
4. Käytetään Heronin kaavaa pinta-alaan ja kosinikaavaa kulmiin. Huom! Lisätään virhetestaus, joka testaa onko annettu olio kolmio eli onko Heronin kaavassa neliöjuuren sisässä oleva lauseke nolla tai negatiivinen. Testauksessa pitää olla evalf, jotta voitaisiin testata muitakin pituuksia kuin suoraan lukuna annettuja (esim. sqrt(2)).kolmioala := proc(a::constant, b::constant, c::constant)
Ala = simplify(ala), alpha = 180/Pi*kulma1,beta = 180/Pi*
kulma2, gamma = 180/Pi*kulma3
end if;
end proc:
kolmioala(3,4,5); # Tuttu suorakulmainen kolmioala
kolmioala(1,1,sqrt(2)); # Eräs muistikolmioista
kolmioala(1,1,1); # Tasasivuisen kolmion kulmat ovat
yhtäsuuret
kolmioala(2,1,1);
Error, (in kolmioala) ei kolmio
(1)(1)
> >
> >
5. Helpointa lienee kerätä kaikki polynomit yhteen listaanN := 10:
H := [seq(k,k=1..N)]:
H[1] := 1; H[2] := 2*x;
for n from 3 to N do
H[n] := simplify(2*x*H[n-1]-2*(n-2)*H[n-2]);
end do;
Tehdään sitten "perinteisesti" eli käyttäen for-silmukkaa:restart:
Herm_n := proc(n::nonnegint, x::anything)
local H_0, H_1, H_n, i;
if n = 0 then
H_n := 1
elif n = 1 then
H_n := 2*x;
else
H_0 := 1;
H_1 := 2*x;
for i from 2 to n do
H_n := expand(2*x*H_1 - 2*(i-1)*H_0);
H_0 := H_1;
H_1 := H_n;
end do;
H_n;
end if;
> >
> >
(3)(3)
> >
(2)(2)
> >
> >
> >
(4)(4)
end proc:
Testataanseq(H[k](x) = Herm_n(k,x), k = 0..5);
2. tapa tehdään käyttäen MAPLEn mahdollisuutta kutsua proseduuria itseään (rekursiivinen proseduuri). Huomaa lisäksi optio remember, joka ottaa muistitaulukon käyttöön ja optio system, joka liittyy Maplen muistinhallintaan.Herm_n_r := proc(n::nonnegint, x::anything)
Ylikurssia: 3. tapa käyttäen Rodriguesin kaavaa Hermiten polynomeille:Herm_rod := proc(n::nonnegint, x::anything)
local f;
if n = 0 then
f := exp(-x^2)
else
f := diff(exp(-x^2), x$n)
end if;
expand(simplify((-1)^(n)*exp(x^2)*f)); # Rodriguesin kaava
end proc:
for n from 0 to 4 do
H[n](x) = Herm_rod(n,x);
> >
> >
> >
> >
> >
> >
> >
> >
> >
(5)(5)
(4)(4)
end do;
Hermiten polynomit löytyvät kahteenkin kertaan, toinen on orthopoly-paketissa.seq(H[n](x) = simplify(HermiteH(n,x)), n = 0..4);
seq(H[n](x) = orthopoly[H](n,x), n = 0..4);
6.Tehdään ensin proseduuri, joka ainoastaan muodostaa annetulle lausekkeelle sitä vastaavan Newtonin iteraation. Itse iteraation laskeminen on tehtävä omassa silmukassaan tai proseduurissa.TeeIteraatio := proc( lauseke::algebraic, x::name )
local iteraatio;
iteraatio := x - lauseke/diff(lauseke, x);
unapply(iteraatio, x)
end proc:
funk := exp(x) - 2;
Newton := TeeIteraatio( funk, x); # Tehdään x:n funktio
Alkuarvauksen voi valita vaikka kuvaa katsomalla:plot(funk(x),x=0..1);
x0 := 0.8:
juuri := x0;
> >
> >
> >
> >
> >
> >
> >
(6)(6)
(4)(4)
to 4 do
juuri := Newton(juuri);
end do;
Verrataan vielä "tarkkaan" juureen:fsolve(funk(x)=0);
0.6931471806
Seuraavaksi hieman yleiskäyttöisempi proseduuri, jolle annetaan argumentteina mm. kaksi proseduuria,toisessa itse funktio, jonka juurta haetaan ja toisessa ko. funktion derivaatta. Proseduuri iteroi tekee varsinaisen iteraation ja sitä kutsutaan toisesta proseduurista (Newton). Proseduurissa iteroi on for-silmukassa kaksi lopetusehtoa, joko iteraatioiden maksimimäärä N tulee täyteen tai juuri on löydetty riittävällä tarkkuudella (kahden peräkkäisen iteraatiotuloksen erotuksen itseisarvo on riittävän lähellä toisiaan).iteroi := proc( f::procedure, df::procedure, alkuarv::numeric,
2bAlgoritmi: Muodostetaan aluksi kuuden alkion lista, missä kukin alkio on ensin nolla. Heitetään sitten noppaa n kertaa ja kasvatetaan yhdellälistan sitä alkiota, joka saatiin nopan heiton tuloksena.arpakuutio := proc(n::posint)
Tehdään vielä toinen, jolla on hieman siistimpi tulostus. Käytetään tulostukseen kaksirivistä matriisia, jossa ensimmäisellä rivillä on luvut 1..6:kurpaatio := proc(n::posint)
Taulu muodostetaan nyt kuten edellä ryhmä-proseduurin avulla:taulu := proc(n)
description "Määrää ryhmätaulun Z_n^*";
local R,T,i,j,koko;
R:= ryhma(n); # ryhmä (alkiot)
koko := numelems(R); # ryhmä koko (kertaluku)
T := Array(1..koko,1..koko); #taulu
for i from 1 to koko do
for j from 1 to koko do
T[i,j] := R[i]*R[j] mod n;
end do;
end do;
T;
end proc:
> >
> >
> >
> >
> >
> >
> >
(4)(4)
(15)(15)
taulu(9); taulu(11):
6.Huomaa, että Maple antaa tuloksena sekä ominaisarvot että -vektorit. Ensin ovat ominaisarvot sarakevektorin alkioina, jonka jälkeen on matriisi, jonka sarakkeina ovat ominaisvektorit.for n from 2 to 3 do
Eigenvectors(matA(x,n));
end do;
Poimitaan B:n ominaisarvot ja -vektorit muuttujiin (huvin vuoksi):
7.1. tapa matriiseilla ja vektoreilla. Määritellään kerroinmatriisi ja oikean puolen vektori b.A := < <1|2|3> , <1|3|5> >; b := < 6, 9>;
Ratkaistaan LinearSolvellaLinearSolve(A, b);
2. tapa : Ratkaistaan tutulla solvella.yhtr := GenerateEquations(A, [ x[1],x[2],x[3] ], b) ;
solve(yhtr);
"Ratkaistaan" vaakarivimuunnoksilla:
> >
(16)(16)
> >
> >
> >
> >
> >
> >
> >
(4)(4)
> >
> >
> >
> >
> >
> >
> >
(15)(15)
ReducedRowEchelonForm( < A | b > );
8.aAsetetaan jotkin vektorita := <2, 1, 3>: b := <-1, 1, 3>: c := <2, 1, -5>: d := <8, 1, 3>:
Ratkaistaan yhtälöryhmä Ax=0, missä A on vektorien muodostama matriisiA := < a | b | c >;
LinearSolve(A, <0, 0, 0>);
Yhtälöryhmällä on vain triviaaliratkaisu, siis a, b ja c ovat lineaarisesti riippumattomia. Katsotaan mitä vaakarivimuunnos antaa.ReducedRowEchelonForm(Transpose(A));
Mikä on vektoreiden a, b ja c virittämän aliavaruuden dimensio?nops( Basis( [ a, b, c ] ) );
3
Vektoreiden muodostaman matriisin asteen pitäisi olla rivien määrä.Rank(A);
3
Jollakin ylläolevista tavoista voimme siis päätellä, että a, b ja c ovat lineaarisesti riippumattomia (lineaarisesti vapaita).
8.b Kyseessä on lineaarisen yhtälöryhmän ratkaisu, joten:LinearSolve(A, d);
(16)(16)
> >
> >
> >
> >
> >
> >
(4)(4)
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
(15)(15)
2. tapa, Tehdään vektoreista täydennetty kerroinmatriisi ja ratkaistaan matriisiryhmä kahdella tavalla.mat := < a | b | c | d >;
Toinen tapa muodostaa yhtälötyhtr := GenerateEquations(mat,[x,y,z]);
solve(yhtr,{x,y,z});
8.cTehdään ensin ratkaistavat yhtälöt. Jatkon helpottamiseksi laitetaan molemmat suorat (s1 = a +tb, s2 = c+ sd) samaan yhtälöön (ratkaistava siis ryhmä s1-s2=0)A := simplify( a + t*b - (c + s*d) );
Jos yhtälöryhmällä Ax=0 on ratkaisu, niin piste saadaan sen avullasolve( {A[1] = 0, A[2] = 0, A[3] = 0}, {s,t} );
> >
(16)(16)
> >
> >
> >
> >
> >
> >
> >
> >
> >
(4)(4)
(15)(15)
Ei ollut ratkaisua, kokeillaan toista (a+tb ja d+sa).B := simplify( a + t*b - ( d + s*a ) ):
solve( {B[1] = 0, B[2] = 0, B[3] = 0}, {s,t} );
Ratkaisu siis löytyi ja haluttu yhteinen piste onsimplify( a - 2*b ) = simplify( d - 2*a );