2013-02-16 9 views
5

Funkcja optymalizacji służy tylko do obsługi jednego argumentu funkcji, jak rozumiem. Czasami jednak funkcja może zależeć od różnych zakresów wejściowych zmiennych i parametrów.Czy mogę przekazać więcej argumentów do funkcji optimize() w R

na przykład:

x.r<-rnorm(100) 
y<-function(x,p) -x^2+p*1/exp(x^3) 
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1]) 

x.r. domena x przekazywana do y może się zmienić z próbki na próbkę. Zamiast używać ogólnego x, chcę móc rysować z wielu domen wartości x.r, aby uruchomić y over. Czy istnieje jakiś sposób modyfikacji funkcji optymalizacji, aby móc przekazać zarówno y, funkcję i x jej zmienne domeny, jak i parametry optymalizacji p?

Z powyższego pojawia się błąd:

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1]) 
Error in p * 1 : 'p' is missing 

EDIT: za sugestię poniżej (co ma sens ... ale) próbowałem.

x.r<-rnorm(100) 
p<-seq(-5,5,1) 
y<-function(x,p) -x^2+p*1/exp(x^3) 
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p) 

wyniki były: Błąd w p * 1: 'p' brakuje

również

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p,x.r) 
Error in optimize(y, upper = range(x.r)[2], lower = range(x.r)[1], p, : 
    invalid function value in 'optimize' 

jakieś inne pomysły?

edytuj 2: za komentarz poniżej zadziała pętla, ale wydaje się dziwnym sposobem podejścia do niej. Nie jestem pewien, czy to w unikalny sposób bierze pod uwagę domenę x.r.

x.r<-rnorm(100) 
p<-seq(-5,5,1) 
y<-function(p=p,x=x.r) -x^2+p*1/exp(x^3) 
for(v in p){ 
print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))} 

> for(v in p){ 
+ print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))} 
$minimum 
[1] -4.999944 

$objective 
[1] -9.637547e+54 

$minimum 
[1] -4.999944 

$objective 
... 
+1

Spróbuj czegoś takiego jak 'optimize (y, upper = range (xr) [2], lower = range (xr) [1], p = some_variable)' chodzi o dodanie parametru 'p' na końcu i podanie do dowolnej zmiennej, którą chcesz – iTech

+0

Edytowałem, aby spróbować. Próbowałem również kilka wariantów (inc.robienie jako pierwszego argumentu y, ponieważ optymalizacja domyślnie pobiera pierwszy argument). Klucz, który próbuję uzyskać, przekazuje różne domeny x do optymalizacji. – pat

+0

powinieneś dodać argument jako 'p = 3' na przykład – iTech

Odpowiedz

3

Wzywam optimise nad p

x.r <- rnorm(100) 
p <- seq(-5,5,1) 
y<-function(x,p) -x^2+ p/exp(x^3) 
ll <- lapply(p,function(i) 
     optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p=i)) 

ll[[which.min(sapply(ll,'[[','minimum'))]] 

$minimum 
[1] -2.14628 

$objective 
[1] -98357.67 

Oczywiście jeśli maximum = TRUE ostatni staje

ll[[which.max(sapply(ll,'[[','maximum'))]] 
1

Innym wyjściem z tej, która działa nawet wtedy, gdy sprawa, do której dzwonisz nie pozwala określić dodatkowe parametry, które są przekazywane do funkcji, aby utworzyć funkcję generującą funkcję, która generuje funkcję z danym p.

yp <- function(p){force(p);function(x){-x^2+p*1/exp(x^3)}} 
yp1=yp(1) 
yp2=yp(2) 

i teraz funkcje yp to tylko funkcja X:

> yp1(0) 
[1] 1 
> yp2(0) 
[1] 2 

więc pętla staje:

x.r <- rnorm(100) 
pv <- seq(-5,5,1) 

ll <- lapply(pv,function(p){ 
     Y = yp(p) 
     optimize(Y,upper=range(x.r)[2],lower=range(x.r)[1]) 
     }) 

który jest zapętlenie nad pv wektora i oddanie każdą wartość w p, aby utworzyć funkcję Y na podstawie tej wartości. Nic innego (poza upper i lower) jest przekazywane do optimize.

Powiązane problemy