122
pazuRrry
Popularnym zagadnieniem w matematyce jest zagadnienie optymalizacji, a więc szukanie minimum lub maximum jakiejś funkcji, ewentualnie szukanie jej miejsc zerowych. W R jest wiele funkcji, które można wykorzystać do tego celu. Poniżej omówimy funkcje optimize(stats) (również występująca pod nazwą optimiaeCstats)) i uniroot(stats). Pierwsza z nich wyznacza ekstrema, druga wyznacza miejsca zerowe. W obu przypadkach, jeżeli rozwiązań jest więcej niż jedno, to wyznaczane jest dowolne. Deklaracje tych funkcji są następujące:
optimize(f * , interwal *■ , .... lower = min(interval),
upper = raaxCinterwal), maximum *> FALSE, tol = .MachineSdouble.eps“0.25)
m
uniroot(f, interwal, ..., lower = min(interval), upper = max(interval), f.lower = f(lower, ...), f.upper = f(upper, ...), tol = .Machine$double.eps~0.25, maxiter = 1000)
.m.
Argumentami obu funkcji są: f czyli funkcja, dla której szukane mają być ekstre-ii; ina/miejsca zerowe, interval określający na jakim przedziale wyznaczane ma być , -ekstremum/miejsce zerowe. Dodatkowo, w funkcji optimizeO można określić czy poszukujemy maksimum czy minimum (argument marimum) a w funkcji unirootO można wskazać maksymalną liczbę iteracji do wykonania (argument maxiter).
Do badanej funkcji f można przekazać również dodatkowe argumenty. Poniżej ■ przykład użycia obu funkcji.
> # funkcja do badania
> f <- function(x, wyznacznik) <(x - 7)“wyznacznik - x}
> # szukamy minimum na przedziale -1, 10, określamy też dodatkowy
argument dla funkcji f, czyli wyznacznik
> optimizeCf, interval»c(-l,10), wyznacznik * 2)
$minimum
Ul 7.6
$objective Cl] -7.25
> # jak powyżej, a z użyciem funkcji uniroot
> uniroot(f, interval“c(-l,10), wyznacznik « 2)
$root
[1] 4.807418 $f.root
Cl] -4.69523e-06 $iter Cl] 8
$estim.prec Cl] 6.1Ó3516e-0S
Inne, bardziej zaawansowane funkcje do szukania ekstremów to optim(stats) i nlm(stats).
Wybrane funkcje matematyczne
123
Rozdział ten zakończymy przykładami funkcji do różniczkowania i całkowania. Róż-: niczkować można korzystając z funkcji D(stats) lub deriv(stats). Obie funkcje fS wyznaczają symbolicznie pierwszą pochodną, ale różnią się one sposobem podania argumentu do zróżniczkowania. W przypadku funkcji D(stats) argument powinien być klasy expression a w przypadku funkcji deriv() argument powinien być f formułą bez określonej lewej strony. Wielomiany można też różniczkować funkcją deriv(polyuom) opisaną w rozdziale poświęconym wielomianom.
Poniżej przedstawiamy przykład użycia obu funkcji.
> tt wyznaczamy pochodną z funkcji 3(x-2)~2 - 15
' > D(expre3Sion(3»(x-2)“2-15),"x") tt wynik jest klasy 'cali’
3 * (2 * (x - 2))
> tt raz jeszcze policzmy pochodną tej funkcji, teraz funkcją deriuO
> (wyraz = deriv(“(x-2)“2+15,"x”)) tt wynik jest klasy ’expression‘ expression({
. exprl <- x - 2 ; .value <- .exprl“2 + 15
.grad <- arrayCO, c(length(.value) , 1L) , listCNOLL, c("x")))
.gradf, "x"] <- 2 * .exprl attr(.value, "gradient") <- .grad .value
■»
> # policzmy u/artość tej pochodnej ui punktach 1, 2 i 3 :> **1:3
_ > eval(wyraz) tt w punkcie x=2 pochodna się zeruje\
[13 16 15 16 attr(,"gradient") x
E1J -2 , (2,3 0
. [3,3 2
Do całkowania można wykorzystać funkcję integrate(stats). Wyznacza ona numerycznie całkę na określonym, niekoniecznie skończonym, przedziale.
> tt policzmy całkę z gęstości rozkładu normalnego na dodatniej półprostej
> integrate(dnorm, 0, Inf)
0.5 with absolute error < 4.7e-05
> tt policzmy całkę z odrobinę bardziej skomplikowanej funkcji
> integrate(function(x) sin(x)“2, 0, 600) i,300.0221 with absolute error < 0.0087
> tt na półprostej ta całka nie istnieje •> integrate(function(x) sin(x)“2, 0, Inf)
.Error in integrate(function(x) sin(x)“2, 0, Inf) : the integral is probably divergent
Do t akich rzeczy, zdecydowanie lepiej używać pakietu Mathematica.
W R dostępne są też funkcje do rozwiązywania równań różniczkowych. Więcej informacji można znaleźć w opisach funkcji rk4(odesolve) i lsoda(odesolve).