- 昨日の続き
- という関数がの範囲で大まかにはに入っているような場合に、乱数を使っての値を求めることができる、という話
- という置き換えができる
- はその値がわかっていれば、それを使う。わかっていなくても、の確率でランダムに0/1の値を発生するような状況にあれば、0/1の列を発生させたうえで、それを数え上げてもよい。以下のソースではR.bsとして作っている
- 他方は確率tで0/1の値を取り分けられるような乱数を発生すると、確率的に(n.iter回発生させて、その比率)得ることができる。
n.iter <- 100000
n <- 4
as <- sort(rnorm(n))
x <- seq(from=0,to=1,length=100)
y <- rep(0,length(x))
for(i in 1:n){
y <- y + x^(i-1)*as[i]
}
plot(x,y)
min.y <- min(y)-0.1
as.1 <- as
as.1[1] <- as.1[1]-min.y
y.1 <- y-min.y
as.1 <- as.1/max(y.1)
y.1 <- y.1/max(y.1)
plot(x,y.1)
bs <- Power2Bernstein(as.1)
bs
y.p <- rep(0,length(x))
for(i in 1:length(as.1)){
y.p <- y.p + x^(i-1) * as.1[i]
}
plot(x,y.p,type="l")
y.b <- rep(0,length(x))
n <- length(bs)-1
for(i in 1:length(bs)){
y.b <- y.b + bs[i] * Bernstein(n,(i-1),x)
}
plot(y.b,y.p)
R.xs <- R.bs <- matrix(0,n.iter,length(bs))
for(i in 1:length(bs)){
R.bs[,i] <- sample(0:1,n.iter,replace=TRUE,prob=c(1-bs[i],bs[i]))
}
R.bs <- apply(R.bs,2,sum)/n.iter
print(R.bs)
print(bs)
z <- sample(1:length(x),1)
t <- x[z]
R.xs <- matrix(sample(0:1,n.iter*(length(bs)-1),replace=TRUE,prob=c(1-t,t)),nrow=n.iter)
R.xs <- apply(R.xs,1,sum)
R.xs <- tabulate(R.xs+1,length(bs))/n.iter
print(R.xs)
sum(R.bs*R.xs)
y.1[z]
Bernstein <- function(n,m,x){
if(m<0){
return(rep(0,length(x)))
}else if(m > n){
return(rep(0,length(x)))
}else{
return(gamma(n+1)/gamma(m+1)/gamma(n-m+1)*x^m*(1-x)^(n-m))
}
}
Power2Bernstein <- function(a){
b <- rep(0,length(a))
n <- length(a)-1
for(i in 1:length(b)){
for(j in 1:i){
tmp.i <- i-1
tmp.j <- j-1
b[i] <- b[i] + factorial(tmp.i)*factorial(n-tmp.j)/factorial(tmp.i-tmp.j)/factorial(n)*a[j]
}
}
b
}
Bernstein.1plus <- function(b){
m <- length(b)-1
ret <- rep(0,length(b)+1)
ret[1] <- b[1]
ret[length(ret)] <- b[length(b)]
for(i in 2:length(b)){
ret[i] <- (1-(i-1)/(m+1))*b[i]+(i-1)/(m+1)*b[i-1]
}
ret
}
Bernstein.m <- function(b,m){
ret <- b
n <- length(b)-1
for(i in 1:(m-n)){
ret <- Bernstein.1plus(ret)
}
ret
}