5

最適化関数は、私が理解しているように、1つの関数引数のみを処理するように設計されています。ただし、関数が変数とパラメーターのさまざまな入力範囲に依存する場合があります。

例えば:

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])

xr yに渡されるxのドメインは、サンプルごとに変わる可能性があります。一般的なxを使用する代わりに、値の多くのxrドメインから描画してyを実行できるようにしたいと思います。y、関数、xの両方をドメイン変数と最適化パラメーターpに渡すことができるように、最適化関数を変更する方法はありますか?

上記でエラーが発生します:

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

編集:以下の提案に従って(これは理にかなっています...しかし)私は試しました。

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)

結果は次のとおりです。p*1のエラー:'p'がありません

また、

> 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'

他のアイデアはありますか?

編集2:ループの下のコメントごとに機能しますが、それにアプローチする奇妙な方法のようです。xrドメインを一意に考慮しているかどうかもわかりません。

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
...
4

2 に答える 2

3

optimise私は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

もちろんmaximum = TRUE最後になったら

ll[[which.max(sapply(ll,'[[','maximum'))]]
于 2013-02-16T22:57:04.873 に答える
1

呼び出しているものが関数に渡される追加の名前付きパラメーターを指定できない場合でも機能する別の方法は、指定された p で関数を生成する関数生成関数を作成することです。

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

そして今、yp関数は x の単なる関数です:

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

したがって、ループは次のようになります。

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])
        })

pvベクトルをループし、各値を入れて、その値に基づいてp関数を作成します。には ( と を除いて)Y何も渡されません。upperloweroptimize

于 2013-02-17T08:56:04.317 に答える