TEÈAJ IZ MATHEMATICE

5. DEL

Bor Plestenjak

Integralski raèun

Z MMA lahko raèunamo doloèene in nedoloèene integrale. Ustrezna funkcija je Integrate.

Nedoloèeni integrali

Nedoloèeni integral funkcije f po spremenljivki x lahko izraèunamo z Integrate[f,x].

Integrate[x^3,x]

Kot vidimo, MMA vrne rezultat brez konstante, zato jo ne smemo pozabiti upoštevati pri nadalnjem raèunanju s to rešitvijo.

Kot argument lahko navedemo tudi seznam funkcij.

Integrate[{x,x^2},x]

Integrate[Log[x]/x^3,x]

Doloèeni integral

Doloèene integrale raéunamo podobno kot nedoloèene, le da moramo tu poleg spremenljivke navesti še spodnjo in zgornjo mejo integrala. Drugi argument ima sedaj obliko {x,min,max}, kar pomeni da raèunamo integral po spremenljivki x v mejah od min do max.

Integrate[Sin[x],{x,0,Pi}]

Meje so lahko tudi neskonène, kot kae naslednji zgled.

Integrate[Exp[-x^2],{x,0,Infinity}]

MMA ne more vedno izraèunati vseh integralov. Prva teava je e v tem, da se integrali nekaterih funkcij ne dajo izraziti z elementarnimi funkcijami, ampak le v obliki integralov, drugi pa ta, da vèasih MMA ne odkrije prave substitucije, ki bi vodila do rešitve. Najprej MMA vedno poskuša integral rešiti z vgrajenimi pravili in tablicami, èe pa ji to ne uspe, avtomatièno naloi paket z dodatnimi podatki. Èe tudi potem ne najde rešitve, vrne prvorni integral.

Integrate[Exp[-x^2] Cos[x^3],{x,0,Pi^(1/3)}]

Numerièno raèunanje doloèenih integralov

Za numerièno raèunanje doloèenih integralov imamo na voljo funkcijo NIntegrate z enako sintakso kot pri funkciji Integrate. Edina razlika je, da NIntegrate vedno raèuna integral numerièno, tudi èe obstaja nedoloèeni integral. Zato vedno vrne numerièni rezultat (ne pa npr. korenov ali ulomkov).

NIntegrate[Exp[-x^2] Cos[x^3],{x,0,Pi^(1/3)}]

Numerièno reševanje enaèb

Obstajajo funkcije, ki imajo nièle, a se teh nièel ne da eksaktno izraèunati (kot npr. tudi ne števila Pi). Lahko pa te nièle poišèemo numerièno, èe imamo dober zaèetni pribliek. MMA uporablja tangentno metodo v eni ali veè dimenzijah, ustrezna funkcija pa je FindRoot.

Dober zaèetni pribliek lahko dobimo iz slike grafa funkcije.

Plot[x Cos[x]-Sin[x],{x,0,10}]

Funkcija FindRoot[f,{x,x0}] za iskanje nièle funkcije ene spremenljivke ima dva argumenta. Prvi je funkcija, katere nièlo išèemo. To podamo v obliki funkcije in kot enaèbo pri funkciji Solve. Drugi argument je par spremenljivke in zaèetnega priblika. V primeru, da rešujemo enaèbo z veè spremenljivkami, sledijo potem novi argumenti, ki so spet pari spremenljivke in zaèetnega priblika.

FindRoot[x Cos[x]-Sin[x]==0,{x,8}]

Interpolacija in aproksimacija

Interpolacija in aproksimacija sta zelo pomembni veji numeriène matemetike in tudi tu imamo na voljo MMA.

Interpolacija

Naloga interpolacije je poiskati polinom najnije stopnje, ki bo èel skozi dane toèke (x1,y1) do (xn,yn). Seveda mora tu veljati, da so vsi xi paroma razlièni, saj drugaèe tak polinom sploh ne obstaja.

pod={{1,2},{2,4},{3,3},{4,6},{5,4},{6,2}}

slika1=ListPlot[pod,PlotJoined->True]

Funkcija InterpolatingPolynomial[pod,x] nam vrne polinom spremenljivke x najnije stopnje, ki gre skozi toèke seznama pod. Seznam pod je seznam parov oblike {xi,yi}.

pol=InterpolatingPolynomial[pod,x]

Expand[pol]

slika2=Plot[pol,{x,1,6},PlotStyle->Dashing[{0.01,0.01}]]

Ko narišemo polinom in toèke ene na isto sliko, je lepo razvidno, da gre polinom skozi vse toèke.

Show[slika1,slika2]

Aproksimacija

Naloga aproksimacije je poiskati polinom stopnje k<<n, ki ne gre nujno skozi vse toèke (x1,y1) do (xn,yn) (skozi vse tudi ne more iti, ker je k<n), vendar pa zanj velja, da najmanj odstopa od vseh toèk. To pomeni, da je vsota (p(xi)-yi)^2 po vseh i najmanjša (takemu polinomu pravimo tudi aproksimacija po metodi najmanjših kvadratov). Problem lahko še posplošimo in ne išèemo le polinomov ampak krivuljo iz neke druine krivulj. To pride prav npr. pri rezulatih merjenj v fiziki, ko je treba poiskati premico, ki se najbolje prilega dobljenim rezultatom, ipd.

Najprej zgeneriramo tabelo premice y=x in jo pokvarimo tako, da vsakemu yi prištejemo neko nakljuèno število.

rez=Table[{i,i+Random[]},{i,1,10}]

slika3=ListPlot[rez,Prolog->PointSize[0.02]]

Iz slike je razvidno, da je to oblika premice, sedaj moramo poiskati le še tisto premico, ki se najbolje prilega tem toèkam.

Funkcija za aproksimacijo je Fit. Poklièemo jo v obliki Fit[pod,sez,x]. Pri tem je pod kot pri interpolaciji seznam parov toèk, sez je seznam funkcij, s katerimi aproksimiramo, x pa je spremenljivka, katere funkcije imamo v sez. Fit kot rezultat vrne linearno kombinacijo danim baznim funkcij. Pri tem moramo paziti na naslednje. Kadar išèemo aproksimacijo s polinomom najveè k-te stopnje, moramo kot bazo sez navesti polinome 1,x,x^2,...,x^k, drugaèe ne bomo dobili pravilni rezulat.

Poišèimo premico, ki najbolje aproksimira nae toèke.

pol2=Fit[rez,{1,x},x]

slika4=Plot[pol2,{x,1,10},PlotStyle->Dashing[{0.02,0.02}]]

Ko narišemo toèke in premico najboljše aproksimacije skupaj, vidimo, da se ta premica res najbolj prilega danim toèkam.

Show[slika3,slika4]

If stavek, funkcije z veè definicijskimi predpisi

If

Stavek If ima v MMA naslednjo obliko If[pog,da,ne], kjer je pog pogoj, da stavki, ki naj se izveddejo v primeru pozitivnega odgovora in ne stavki, ki se izvedejo v primeru negativnega odgovora.

Na naslednji naèin lahko definiramo funkcijo, ki v primeru, da je x veèji od 3 vrne 1, sicer pa 0.

f[x_]:=If[x>3,1,0]

{f[4],f[2]}

Tretji koren

Sedaj ko poznamo stavek If, lahko definiramo tretji koren. Vgrajeni tretji koren v MMA namreè ne vrne prave veje za negativna realna številam kar vidimo tudi iz naslednjega zgleda.

(-27.)^(1/3)

S stavkom If loèimo primer, ko je x negativno in ko je x pozitvno število.

TretjiKoren[x_]:=If[x<0,-(Abs[x]^(1/3)),x^(1/3)]

Sedaj lahko konèno narišemo graf tretjega korena kot se spodobi.

Plot[TretjiKoren[x],{x,-2,2}]

Which, Switch

Funkcija If še ni dovolj, èe elimo definirati funkcijo, sestavljeno iz veè predpisov. Sedaj prideta v poštev funkciji Which in Switch.

Which

Which ima sodo števil argumentov. Klièemo ga z Which[p1,f1,p2,f2,...,pn,fn], kjer so p1,...,pn pogoji, f1 do fn pa stavki, ki naj se izvedejo, èe je ustrezni pogoj izpolnjen. MMA pogoje pregleduje po vrsti in izvede tiste stavke, kjer je pogoj prvi izpolnjen. V primeru, da noben pogoj  ni izpolnjen, Which vrne Null. Temu se lahko izognemo tako, da kot zadnji pogoj damo konstanto True, ki je vedno izpolnjena in na ta naèin doloèimo vrednost, ki naj se vrne, èe noben pogoj ni izpolnjen.

Z uporabo Which lahko definiramo funkcijo g[x], ki je sestavljena iz treh predpisov.

g[x_]:=Which[x<0,x^2,0<=x && x<=3,x,x>3,x^2-6]

Plot[g[x],{x,-4,4}]

Funkcije z veè predpisi, lahko definiramo tudi na naslednji naèin, ko definicijo funkcije nadaljujemo s
podpièjem in nato povemo pogoj, kdaj naj ta definicija velja.

h[x_]:=-x^2+1 /; x<0
h[x_]:=x     /; 0<x && x<3
h[x_]:=x^2-10 /; x>3

Plot[h[x],{x,-4,4}]

Switch

Switch se od Which razlikuje v tem da je prvi argument funkcija, potem pa preverjamo vrednosti, ki jih ta funkcija vrne. Ukaz klièemo kot Switch[f,v1,f1,v2,f2,...,vn,fn]. Tu je f funkcija, ki vrne neko vrednost, v1 do vn so vrednosti, f1 do fn pa stavki, ki naj se izvedejo, èe bo vrednost enaka vi. Tudi tu lahko vedno doseemo, da Switch vedno nekaj vrne, èe kot zadnjo vrednost vn vstavimo Null.

Ost3[x_]:=Switch[Mod[x,3],0,"niè",1,"ena",2,"dva"]

Map[Ost3,{1,2,3,4,5}]

Zanke

Praviloma v MMA ne uporabljamo zank, ampak vse prevedemo na operacije na seznamih. Za primere, ko ne moremo brez zank pa imamo na voljo Do, While in For.

Do

Zanko Do klièemo z Do[stavki,{i,min,max}]. Tu so stavki stavki, ki naj se izvajajo, i pa števec, ki teèe od min do max. V primeru, ko stavki niso odvisni od števca, lahko {i,min,max} nadomestimo z {max}, kjer je max število ponavljanj.

Do[Print[i^2],{i,4}]

Do[Print[{i,j}],{i,3},{j,3}]

t=x; Do[t=1/(1+t),{3}]; t

While

While ima tri argumente. Prvi je pogoj, drugi so stavki in tretji izraz, kjer v vsakem koraku spremenimo števec. While se izvaja, dokler je pogoj izpolnjen, kar pomeni, da se lahko sploh ne izvede, èe pogoj ni izpolnjen na zaèetku.

n=5; While[n>0, Print[n]; n=n-1]

For

For ima štiri argumente in je zelo podoben stavku While. Razlika je le v tem, da imamo na zaèetku še en izraz, v katerm števcu priredimo zaèetno vrednost.

For[n=1, n<5, Print[n]; n=n+1]

Lokalne spremenljivke

Module

Loakalne spremenljivke uporabljamo z ukazom Module, s katerim tudi zdruujemo veè stavkov. Module ima dva argumenta. Prvi je seznam lokalnih spremenljivk, èe ni nobene, mora biti to prazen seznam, drugi argument pa so stavki, ki naj se izvedejo. Lokalne spremenljivke veljajo le znotraj funkcije Module. Module uporabljamo vedno pri definiciji novih funkcij, ki se jih ne da napisati v enem stavku.

t=5

Module[{t},t=3; Print[t]]

t

Vidimo, da se globalna vrednost spremenljivke t ni spremenila, kljub temu, da smo znotraj funkcije Module uporabili spremenljivko z enakim imenom.

a=3;
Module[{t=3},Print[t]; t=t+a; Print[t]]

MMA si lokalne spremenljivke predstavlja tako, da imenom doda še konènico $ + neko število, ko pride do konca Module pa to spremenljivko zbriše.

Module[{t},Print[t]]

Pisanje daljših funkcij

Za zgled lahko sedaj napišemo funkcijo, ki nariše graf funkcije f na intervalu [a,b], hkrati pa nariše še tangento in normalo na funkcijo v toèki z.

Graf[f_,a_,b_,z_]:=Module[{tt,nn},
	tt[k_]:=f[z]+(k-z)f'[z];
	nn[k_]:=f[z]-(k-z)1/f'[z];
	Plot[{f[x],tt[x],nn[x]},{x,a,b},AspectRatio->Automatic] ];

Graf[Sin,0,Pi,1]