Funkce cat() výstup hodnot atomických typů cat() slouží zejména pro výstup hodnot atomických typů. Syntax: cat(..., file = "", sep = " ",.). arguments separated by, to output. cat() strives to convert its arguments ( ) to character vectors, concatenates them to a single character vector, appends the given sep = string(s) to each element and then outputs them. cat is useful for producing output in user-defined functions. No linefeeds are output unless explicitly requested by "\n" or if generated by filling (if argument fill is TRUE or numeric).
FUNKCE DEFINOVANÉ UŽIVATELEM myfname <- function(par1, par2,... ){ code parametry return(object) Volání funkce: myfname(argumenty) fa2pb2<-function(a,b){ if(is.numeric(a) & is.numeric(b)) return(a^2 + b^2) else return("nelze") argumenty > fa2pb2(3,2) [1] 13 > fa2pb2(3,"2") [1] "Nelze" Funkce navrací výsledek (hodnotu objektu) funkcí return(). Nevykoná-li se volání funkce return(), pak je výsledek hodnota posledního vykonaného příkazu. Obsahuje-li kód funkce jen jednu položku, netřeba ji uzavírat do {.
Příklady funkcí - 1 Počáteční hodnoty argumentů. ObjemKvadru<-function(a,b,c){ #Objem kvádru return(a*b*c) > ObjemKvadru(1,2,6) Poziční volání. XSinX<-function(x,a=1,b=1,c=0){ #y=a*x*sin(b*x+c) return(a*x*sin(b*x+c)) XSinX(pi/2) XSinX(c=20, x=pi/2) ; XSinX(pi/2,b=2) Volání s pojmenovanými Argumenty. Smíšené poziční volání a volání s pojmenovanými argumenty.
Příklady funkcí - 2 Počáteční hodnoty argumentů ObjemKvadru<-function(a,b,c){ #Objem kvádru if(is.numeric(a) & is.numeric(b) & is.numeric(c)) { return(a*b*c) else{ return(0) > ObjemKvadru(1,2,6) Poziční volání. XSinX<-function(x,a=1,b=1,c=0){ #y=a*x*sin(b*x+c) if(is.numeric(a) & is.numeric(b) & is.numeric(c)) { return(a*x*sin(b*x+c)) else{ return(0) XSinX(pi/2) XSinX(x=pi/2,c=20) ; XSinX(pi/2,b=2) Volání s pojmenovanými argumenty
Argumentem funkce může být jméno další funkce. Které argumenty jsou funkcemi poznáme najisto až po prohlídce kódu funkce. ff<-function(a,b,f){ f(a,b) > ff(5,6,sum) [1] 11 > a1<-c(1,2,5) > a2<-c(4,8,6) > ff(a1,a2,sum) [1] 26 > ff(a1,a2,`+`) [1] 5 10 11
Funkce g kreslí graf funkce f. g <- function(f,a,b,k, bar="black") { # a,b - začátek, konec intervalu nez. prom. k - krok po němž se funkce f zobrazuje. s<-seq(a,b,k) y<-f(s) plot(s,y,type = "l", col=bar)
Základy numerických metod v programu R
Numerické derivování f x f x fd1<-function(f,x,h){ return((f(x+h)-f(x))/h) fd2<-function(f,x,h){ return((f(x+h)-f(x-h))/(2*h)) f x + h f x h f x + h f x h 2 h, E = O(h), E = O(h 2 )
Příklad Vypočítejte numerickou derivaci funkce funkce sin v intervalu <0,2*pi> Výpočet proveďte pomocí obou uvedených vzorců Výsledky znázorněte v grafu spolu s grafem přesné hodnoty derivace
Numerické integrování - funkce integrate {stats Slouží k numerické integraci Zjednodušená syntax: integrate(f,a,b, ) > integrate(sin,0,pi) 2 with absolute error < 2.2e-14 integrate(f, lower, upper,..., subdivisions = 100L, rel.tol =.Machine$double.eps^0.25, abs.tol = rel.tol, stop.on.error = TRUE, keep.xy = FALSE, aux = NULL)
Integrace metodou Monte Carlo Metody Monte Carlo jsou statistickými metodami. Zahrnují soubor technik, které dovolí aproximovat řešení zadané úlohy výsledkem velkého množství opakovaných náhodných pokusů. Výhodou je obvykle snadné sestavení algoritmu, nevýhodou je velký objem výpočtů. Výsledkem výpočtu určitého integrálu touto metodou je součin střední hodnoty S integrované funkce v integračním intervalu a délky (objemu) tohoto intervalu. S= 1 σ N i=1 N f(m i ), kde M i jsou (pseudo)náhodně generované body v integračním intervalu.
Integrace metodou Monte Carlo program v R. #Integrace metodou Monte Carlo imontecarlo<-function(f,a,b,n){ nah<-runif(n,a,b) s<-sum(f(nah))/n return (s*(b-a))
Hledání nulových bodů funkce - findzeros package mosaic findzeros(expr,..., xlim = range(a,b) > findzeros(sin(t) ~ t, xlim = range(-5,1)) t 1-6.2832 2-3.1416 3 0.0000 4 3.1416 > findzeros(cos(t)-t ~ t, xlim = c(0,3)) t 1 0.7391
Numerické řešení obyčejných diferenciálních rovnic 1. řádu Budeme se zabývat numerickým řešením Cauchyovy úlohy pro diferenciální rovnici 1. řádu dy dx = f(x, y) Řešení budeme hledat na intervalu < a, b >, x < a, b >. Řešení u(x) naší rovnice musí splňovat počáteční podmínku u(x 0 ) = u 0 V intervalu < a, b > zvolme krok velikosti h a definujme uzly x i = x 0 + i h, kde i=1,2, n, n=int((b-a)/h)). Numerickým řešením Cauchyovy úlohy rozumíme posloupnost y i, jejíž členy aproximují teoretické řešení této úlohy v uzlech x i, přičemž platí počáteční podmínka y 0 = u 0.
Eulerova metoda Aproximujme hodnotu derivace v diferenciální rovnici y i+1 y i h potom dy dx = f x i, y i y i+1 = y i + h f x i, y i E = O(h)
Kinetická rovnice reakce 1. řádu radioaktivní rozpad (KR1) k rychlostní konstanta dx dt = k x
Funkce integrateode package mosaic
Řešení KR1 pomocí integrateode sol<-integrateode(dx~-3*x, tdur =list(from=0,to=2,dt=0.1), x=10) plotfun(sol$x(t)~t,tlim=range(0,2), col= red, lwd=2)
Autokatalytické reakce Reakce A B B Kinetická rovnice dx dt = k x (B0 + A0 x) x aktuální koncentrace látky A v čase t k rychlostní konstanta A0 počáteční koncentrace látky A B0 - počáteční koncentrace látky B katalyzátoru sola<-integrateode(dx~-k*x*(b0+a0-x), k=2,b0=0.01,a0=10,x=10,tdur=2)
Následné reakce Reakce A k1 B k2 C Kinetické rovnice da dt =-k1*a db dt =k1*a-k2*b dc dt =k2*b res<-integrateode(da ~ -k1*a, db ~ k1*a-k2*b, dc ~ k2*b, k1=1,k2=0.5, A=10,B=0,C=0, tdur = 15)
Logistický růst Exponenciální růst dp dt = k P Logistický růst dp dt = k P (1 P N ) P populace (počet obyvatel, buněk, ) N limita populace K konstanta růstu sol2<-integrateode(dp~k*p*(1-p/n),k=0.2,tdur=50,n=1500, p=50) plotfun(sol2$p(t)~t, tlim=range(0,50), col="red", lwd=2)
SIR model We will assume that each individual in the population falls into one of the following categories: S(t)=Susceptible individuals I(t)=Infected individuals R(t)=Removed individuals Susceptible individuals who do not yet have the disease and can catch the disease from infected individuals. Individuals enter the removed population by either recovering from the disease or dying. If an infected individual recovers, then the individual is immune to the disease. Schematically, we can represent the effect of the disease by the diagram S I R. Since the population is closed, we know that S(t)+I(t)+R(t)=N.
Diferenciální rovnice SIR modelu # SIR model sols=integrateode(ds~-alfa*s*i,di~alfa*s*i-beta*i, alfa=0.005,beta=0.08,s=100,i=5,tdur=80) plotfun(sols$s(t)~t, tlim=range(0,80),col="red",lwd=2) plotfun(sols$i(t)~t, tlim=range(0,80),add="true",lwd=2)
Model predátor - kořist dr dt = a R b R F Rychlost přírůstku kořisti roste s jejím množstvím a klesá se součinem množství kořisti a predátorů. = c F + d R F Rychlost přírůstku predátorů klesá s jejich množstvím a roste se součinem množství kořisti a predátorů. pp<-integrateode(dr~2*r-r*f, df~-5*f+r*f, r=20, f=5, tdur=5) plotfun(pp$r(t)~t, tlim=range(0,5)) plotfun(pp$f(t)~t, tlim=range(0,5), col="red",add="true") df dt
Model predátor kořist - graf