cat > oma.txt Maalaus hiiren vasemmalla Liimaus hiiren keskimmäisellä CTR-D tiedoston sulkeminen(Tai emacs tms.)
Sitten Maple-istunnossa:
> read("oma.txt"); > read("c:\\windows\\mymaple\\oma.txt"); (PC-WIN:ssä)Huom: Joskus näyttää leikkaus/liimaus toimivan emacsista, vaikka www-sivulta ei toimi.
Kaikki kurssilla talletetut ohjelmat voi lukea näin: (yritetään pitää ajan tasalla)
>read("/p/edu/mat-1.414/maple/v201.mpl"); >read("/home/apiola/opetus/peruskurssi/v2-3/maple/v201.mpl");Jälimmäinen on HA:n privaatti.
v2l:=vek->convert(vek,list): # HAM-assa painovirhe (vec) l2v:=lis->convert(lis,vector):Liitetään kaksi vektoria peräkkäin:
vappend:=(v1,v2)->vector([op(convert(v1,list)),op(convert(v2,list))]):Matriisin jonouttaminen pitkäksi vektoriksi
m2l:=M->map(op,convert(M,listlist)): # Vastaa Matlabin M(:), mutta tässä # riveittäin
linspace:=proc() local i,n,a,b; a:=args[1];b:=args[2]; if nargs=2 then n:=10 else n:=args[3] fi; [seq(a+i*(b-a)/(n-1),i=0..n-1) ] end:Esim:x10:=linspace(0,1); x20:=linspace(0,1,20);Kts. 5.3 Diskretointi [HAM] s. 117. Vaihdoimme oletusarvon 10:een, Matlab:n 100:n sijasta.Kompleksiluvut ja -funktiot
Konformikuvauksia
Tässä on ratkaisutyöarkin harj1.mws lopusta poimittuja kuvausvälineitä ja esimerkkiskriptejä hieman täydennetyin selityksi, mutta muuten tiiviimmässä muodossa.> # Vaihtoehtoisia ja paranneltuja Maple-ratkaisutapoja # Aikalailla kätevää on tehdä "cobweb"-tyylillä. Saamme varsin # yleispäteviä työkaluja. Tarkoittaa sitä, että määrittelemme muutaman # grafiikka-arvoisen funktion. # Sovitaan ne g-alkuisiksi (ainakin nyt tässä). # # gympyra on funktio, jolle annetaan keskipiste ja säde , tuloksena on # vastaava ympyrägrafiikka. # gympyrakuva on vastaava kuva sovellettaessa funktiota f, joka myös # annetaan argumenttina. > gympyra:=(z0,r)->complexplot(z0+r*exp(I*Theta),Theta=0..2*Pi): > gympyrakuva:=(z0,r,f)->complexplot(f(z0+r*exp(I*Theta)),Theta=0..2*Pi) > : # Testataanpa. Katsotaan, mitä exp-funktio tekee 1-ympyralle # > display([gympyra(0,1),gympyrakuva(0,1,exp)]); # Katsotaan nyt se Joukowski-kuvaus ja nähdään toden totta, että # reaaliakselin väli [-2,2] on kuvana. > display([gympyra(0,1),gympyrakuva(0,1,z->z+1/z)]); # Voidaan tietysti kokeilla kaikenlaisia funktioita. Tässä on tapa # sijoittaa kuvat vierekkäin, tehdään yleinen taulukko array . # (Kuten matriisi, mutta sallii kaikenlaisia olioita alkioikseen.) > > f:=z->sin(z):display(array([[gympyra(0,1),gympyrakuva(0,1,z->z+sin(1/z > ))]])); > # Ympyräparvet syntyvät käden käänteessä, pannaan samalla liikettä # mukaan: > display([seq(gympyra(I+0.1*k,1),k=0..20)],insequence=true); > display([seq(gympyra(0,0.1*k),k=0..10)]); > gsade:=(Theta,r1,r2)->complexplot(r*exp(I*Theta),r=r1..r2): > gsadekuva:=(Theta,r1,r2,f)->complexplot(f(r*exp(I*Theta)),r=r1..r2): > display([seq(gsade(k*2*Pi/10,0.5,3),k=0..9)]);Mielivaltaisen ympyrärenkaiden ja sektorisäteiden verkon kuvaaminen
Tässä on pari valmista skriptiä. Tarvitsee vain muuttaa muuttujia:nymp - ymyröiden lkm nsateet - moneenko osaan täyskulma 2*Pi jaetaan rmax - suurimman ympyrän säde (aloitetaan origosta (rmin - pienimmän ympyrän säde (kts. alempana)) f:=z-> ... - funktio, jolla kuvataanTässä esimerkkiajoja> nymp:=7: nsateet:=15: rmax:=4: hr:=rmax/nymp: hTheta:=2*Pi/nsateet: > display([seq(gsade(k*hTheta,0,rmax),k=0..nsateet),seq(gympyra(0,k*hr), > k=0..nymp)]); > f:=z->z+sqrt(z): > display([seq(gsadekuva(k*hTheta,0,rmax,f),k=0..nsateet),seq(gympyrakuv > a(0,k*hr,f),k=0..nymp)]);Joukowski airfoil Otetaan joukko 1+I-keskisiä ympyröitä, joiden säde vaihtelee, kuvataan vain ympyräparvi, eikä säteitä. Animaatio on verraton, kun ympyräparvea ei animoida, vaan pelkkästään kuvaparvea, silloin on helppo nähdä vastaavuudet.> nymp:=20: rmin:=0.5:rmax:=2: hr:=(rmax-rmin)/nymp: > display([seq(gympyra(1+I,rmin+k*hr),k=0..nymp)]); > display([seq(gympyrakuva(1+I,rmin+k*hr,z->z+1/z),k=1..nymp)],insequenc > e=true);Tietysti voitaisiin vierittää parvea laittamalla keskipiste muuttumaan jne. jne.Iteraatiot
# Työarkista Lv7iter.mws # Kiintopisteiteraatio # Cobweb: (Robert Israelin tapaan)porras:=x->plot([[x,x],[x,g(x)],[g(x),g(x)]]): newtonkulma:=x->plot([[x,0],[x,f(x)],[N(x),0]],color=black); N:=x->x-f(x)/D(f)(x);Cobweb-piirroksia funktion "porras" avulla
Esim. 1g:=x->(1/3)*(x^2+1); X[0]:=1.0:n:=10:for i to n do X[i]:=g(X[i-1]) od: gjaxkuva:=plot([x,g(x)],x=0 .. 1,color=[blue,black]): alkup:=plot([[X[0],X[0]]],style=point,symbol=circle,symbolsize=20,color=blue): display([alkup,gjaxkuva,seq(porras(X[i]),i=0..n)]);KRE EXA 1 s. 926-927 (mikä painos?)g1:=x->(1/3)*(x^2+1); plot([x,g1(x)],x=0..5); X:='X':f:='f': f:=g1: X[0]:=1.0: n:=10:for i to n do X[i]:=g1(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=0 .. 1,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)});Tässä vaiheessa voidaan muuttaa alkupistettä ja viedä kursori takaisin (tai leikata/liimata) ja laskea ja piirtää uudestaan. Muutetaan samalla x-skaala sopivaksi.X[0]:=2.0; n:=10:for i to n do X[i]:=f(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=0 .. 4,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)}); X[0]:=3.0: n:=3:for i to n do X[i]:=f(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=0 .. 4,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)});Suurempi n-arvo räjäyttää kuvan jo liian isoksi.Vaihdetaan iterointifunktiota (edelleen saman funktion nollakohdista on kyse.)
g2:=x->3-1/x;f:=g2: X[0]:=1.0: n:=10:for i to n do X[i]:=f(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=0 .. 5,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)}); X[0]:=2.0;n:=10:for i to n do X[i]:=f(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=0 .. 4,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)}); X[0]:=3.0:n:=10:for i to n do X[i]:=f(X[i-1]) od: fjaxkuva:=plot([x,f(x)],x=2.5 .. 4,color=[blue,black]): display({fjaxkuva,seq(porras(X[i]),i=0..n)});Newtonin iteraatio ja fraktaalit Maplella
kts: V2-mappi: Projektit # Kts. myös Kofler complexplot3dnewt:=proc(z) local zz,m; zz:=evalf(z); for m from 0 to 50 while abs(zz^3-1)>=0.001 do zz:=zz-(zz^3-1)/(3*zz^2); od; m end: newt3:=proc(z) local zz,m,j1,j2,j3; j1:=1.; j2:=evalf(exp(I*2*Pi/3)); j3:=evalf(exp(-I*2*Pi/3)); zz:=evalf(z); for m from 0 to 50 while abs(zz^3-1)>=0.001 do zz:=zz-(zz^3-1)/(3*zz^2); od; if m > 45 then RETURN(10) fi; if abs(zz-j1) < 0.1 then RETURN(0) elif abs(zz-j2) < 0.1 then RETURN(1) elif abs(zz-j3) < 0.1 then RETURN(2) else RETURN(-1) fi; end: # Tää on ihan nätti ja havainnollinen: #plot3d('newt3'(x+I*y),x=-2..2,y=-2..2,grid=[20,20], # view=[-2..2,-2..2,0..3], axes=FRAME, style=PATCH,orientation=[-130,50]); # Valitse Color-valikosta Z HUE # Tämä ei ole hyvä, värien hallinta? #densityplot('newt3'(x+I*y), x=-2..2, y=-2..2,colorstyle=HUE, # grid=[40,40], style=PATCHNOGRID, scaling=constrained, axes=box); # Newtonin iteraatio ja complexplot3d: #f := z-> z - (z^3-2)/(3*z^2); #complexplot3d(f@@4,-3-3*I..3+3*I,view=-4..4,grid=[50,50],style=patch); # Mandelbrot, Julia, ym, iterointifkt. # Ande s. 386 -> # Mandelbrot:=proc(c) local z,n,r,nmax; z:=0.0;n:=0;r:=10000; nmax:=25; while abs(z) < r and n < nmax do z:=z^2+c; n:=n+1; od; return(n); end: # plot3d('Mandelbrot'(x+I*y),x=-2..2,y=-2..2,grid=[20,20], # view=[-2..2,-2..2,0..25], axes=FRAME, style=PATCH,orientation=[-130,50]); #densityplot('Mandelbrot'(x+I*y), x=-1.5..1.5, y=-1.5..1.5,colorstyle=HUE, #grid=[40,40], style=PATCHNOGRID, scaling=constrained, axes=box);Interpolaatio
Kirjoitetaan Lagrangen polynomin koodi. Periaate:Kirjoitetaan lauseke (x-x0)*(x-x1)...(x-xn) ja jaetaan se (x-xj):llä. Tämä antaa osoittajan.
Nimittäjä saadaan tästä korvaamalla x arvolla xj. Näin johdutaan koodiin:L:=proc(j,xd,x) local oso,nimi,i,j1; j1:=j+1; oso:=product((x-xd[i]),i=1..nops(xd))/(x-xd[j1]); nimi:=subs(x=xd[j1],oso); oso/nimi; end:Parametritj -- antaa L:n indeksin, eli kyseessä on Lj j=0..n, missä n on xd-listan pituus - 1 xd -- xdata, [x0,x1,...,xn], lista (n+1 pistettä) x -- polynomin muuttujaLagrangen polynomijono muodostetaan nyt näin, kun data on listassaxd
seq(L(j,xd,x),j=0..nops(xd)-1);Esim> L(0,[a,b,c],x); (x - b) (x - c) --------------- (a - b) (a - c) # Yleisemmin: > xd:=[seq(X[j],j=0..3)]; xd := [X[0], X[1], X[2], X[3]] > seq(L(j,xd,x),j=0..nops(xd)-1); (x - X[1]) (x - X[2]) (x - X[3]) -----------------------------------------, (X[0] - X[1]) (X[0] - X[2]) (X[0] - X[3]) (x - X[0]) (x - X[2]) (x - X[3]) -----------------------------------------, (X[1] - X[0]) (X[1] - X[2]) (X[1] - X[3]) (x - X[0]) (x - X[1]) (x - X[3]) -----------------------------------------, (X[2] - X[0]) (X[2] - X[1]) (X[2] - X[3]) (x - X[0]) (x - X[1]) (x - X[2]) ----------------------------------------- (X[3] - X[0]) (X[3] - X[1]) (X[3] - X[2])Interpolaatiopolynomi
> add(y[j]*L(j,xd,x),j=0..nops(xd)-1); y[0] (x - X[1]) (x - X[2]) (x - X[3]) ----------------------------------------- (X[0] - X[1]) (X[0] - X[2]) (X[0] - X[3]) y[1] (x - X[0]) (x - X[2]) (x - X[3]) + ----------------------------------------- (X[1] - X[0]) (X[1] - X[2]) (X[1] - X[3]) y[2] (x - X[0]) (x - X[1]) (x - X[3]) + ----------------------------------------- (X[2] - X[0]) (X[2] - X[1]) (X[2] - X[3]) y[3] (x - X[0]) (x - X[1]) (x - X[2]) + ----------------------------------------- (X[3] - X[0]) (X[3] - X[1]) (X[3] - X[2])Määrittelemme funktioksilagint:=(xd,yd,x)->add(yd[j+1]*L(j,xd,x),j=0..nops(xd)-1):Kokeillaan:> lagint([a,b,c],[ya,yb,yc],x); ya (x - b) (x - c) yb (x - a) (x - c) yc (x - a) (x - b) ------------------ + ------------------ + ------------------ (a - b) (a - c) (b - a) (b - c) (c - a) (c - b) > p:=unapply(%,x); p := x -> ya (x - b) (x - c) yb (x - a) (x - c) yc (x - a) (x - b) ------------------ + ------------------ + ------------------ (a - b) (a - c) (b - a) (b - c) (c - a) (c - b) > p(a); ya > p(b); yb > p(c); ycHyvin toimii!
Interpolaatiovirhe:
interR:=(f,xd,x)->(D@@nops(xd))(f)(xi)/(nops(xd))!*product((x-xd[i]), i=1..nops(xd)):Kokeillaan:interR(f,[a,b,c],x); (3) 1/6 (D )(f)(xi) (x - a) (x - b) (x - c)Kaunista!