3

これが私の機能です。[-5、-3]と[3,5]には特定の値を取り、それ以外の場合は0を取ります。関数は原点を中心に対称です。

f<-function(x){
    y=0 
    if (x>=-5 && x<=-3){
        y=3*(1-(x+4)^2)/8
    }
    if (x>=3 && x<=5){
        y=3*(1-(x-4)^2)/8
    }
    return(y)
}

さて、私は関数を使用しましたsapply (bins, f)

ここでbins = seq(-5,5,by=0.05)。これはうまくいきました!

しかし、f(bins)を実行しようとすると、このばかげた答えが返ってきました。[-5、-3]の範囲は正しかった。

これについての私の推測では、関数fが最初のif条件をチェックしたとき、binsベクトルの最初の値のみをチェックしたため、(-3,5]の範囲では、[-5]のみを対象とした式が誤って使用されていました。 、-3]。

これらの点の曲線を描画する方法を取得しようとしていますが、曲線関数を使用すると、f(bins)を使用して取得する間違った値を使用して曲線が描画されます。

誰かがこれを修正する方法を教えてもらえますか?

4

2 に答える 2

6

関数をベクトルに適用するには、関数をベクトル化する必要があります。f

f = Vectorize(f)
print(f(bins))

:で使用curveすることもできます。sapply

curve(sapply(x, f), from=-5, to=5)

最後に、次のように関数を記述した場合ifelse

f = function(x) {
    ifelse(x >= -5 & x <= -3, 3*(1-(x+4)^2)/8, ifelse(x>=3 & x<=5, 3*(1-(x-4)^2)/8, 0))
}

これにより、を必要とせずにベクトルで動作できるようになりVectorizeます。

于 2012-11-24T19:14:40.247 に答える
3

関数を作成する方がはるかに高速なので、完全にベクトル化されます。

f <- function(x){  0 + (x >=-5 & x <= -3)*(3*(1-(x+4)^2)/8) +
                   + (x >= 3 & x <= 5)*( 3*(1-(x-4)^2)/8) }

そして対称性からさらに単純化することが可能です(私は思います):

f <- function(x){  0 + ( abs(x) <= 5 & abs(x) >= 3)*( 3*(1-(abs(x) -4)^2)/8) }
于 2012-11-24T23:56:04.527 に答える