この記事はQiita 数学 Advent Calendar 2015の6日目の記事です。(後付け)
懲りずにRで遊ぶシリーズです。次のような仲間がいます。
2016年度京都大学特色入試の数学をRで解く【3】
2015年センター試験数学IAの統計の問題を一部プログラム(R)で解く
結論を先に述べると、今回のお遊びで作ったグラフに線を入れて領域に色を付ける関数は、結構使い勝手がよさそうでした。ggplot2をつかえという話なのかもしれないのですが。。。
問題
【2】
$0 \leq x \leq 1$の範囲で定義された連続関数$f(x)$に対し,$x$が$0\leq x \leq 1$の範囲を動くときの$f(x)$の最大値を$\max_{0\leq x \leq 1}f(x)$とおく。以下の設問に答えよ。
(1)$0\leq x \leq 1$の範囲で定義された狭義単調増加な連続関数$f(x)$に対し,以下の不等式が成立することを示せ。
$\int_0^1|f(x)|dx \leq 3 \max_{0\leq x\leq 1}|\int_0^x f(t)dt|$
ただし,$f(x)$が狭義単調増加であるとは、「$x < y$ならば$f(x) < f(y)$」を満たすことをいう。
(2)以下の条件(A)を満たすような実数$C$は存在しないことを示せ.
(A)$0\leq x \leq 1$の範囲で定義されたどのような連続関数$f(x)$に対しても,不等式
$\int_0^1|f(x)|dx \leq C \max_{0\leq x\leq 1}|\int_0^x f(t)dt|$
が成立する。
Rで見せつける
見せつけてやるぜ、ヒャッハー
※グラフの描き方は最後に付けています。
日本語でおk
##(1)
$f(x)$が常に正、常に負の場合、(1)用の最初の図と最後の図より明らか。$f(x)=0$となる点を含む場合、$f(x)<0$の部分の面積と$f(x)>0$の部分の面積を比較すると、$\max_{0\leq x\leq 1}|\int_0^x f(t)dt|$の値が図の赤か青または(赤+緑)の部分の面積と一致するが、赤か青の部分が赤、緑、青の中で最大で、かつ全体の面積との比率で最小になる場合を考えると、要するに赤緑青の面積がすべて等しいときなので全体の1/3になる。(赤+緑)の場合は1/3以上なのはあきらか。(ということを丁寧に説明する。)
##(2)
(2)図のような関数を考えれば、全体の面積は一定だが、$\max_{0\leq x\leq 1}|\int_0^x f(t)dt|$は山と谷を増やしていくと0に近づく。(ということをきちんと言う。)
R言語でおk
(1)
# (1)
N <- 10000
# f(x) > 0 (forall x)
svg("1.svg")
x <- 1:N/N
y <- sqrt(x) + 0.5
plot(x,y,type="l", xlim =c(0,1),ylim=c(-2,2) ,axes = F)
axis(2)
polygon(c(x,1,0),c(y,0,0),col="#00ff0080")
dev.off()
# at some x f(x) = 0
svg("2_1.svg")
x <- 1:N/N
y <- sqrt(x) - 0.5
plot(x,y,type="l", xlim =c(0,1),ylim=c(-2,2) ,axes = F)
axis(2)
lines(c(1,0),c(0,0))
polygon(c(x[1:2500],0.25,0),c(y[1:2500],0,0),col="#ff000080")
polygon(c(x[2501:5625],0.5625,0.25),c(y[2501:5625],0,0),col="#00ff0080")
polygon(c(x[5626:10000],1,0.5625),c(y[5626:10000],0,0),col="#0000ff80")
dev.off()
# at some x f(x) = 0
svg("2_2.svg")
x <- 1:N/N
y <- sqrt(x) - 0.9
plot(x,y,type="l", xlim =c(0,1),ylim=c(-2,2) ,axes = F)
axis(2)
lines(c(1,0),c(0,0))
polygon(c(x[1:6271],0.6271,0),c(y[1:6271],0,0),col="#ff000080")
polygon(c(x[6272:8100],0.81,0.6272),c(y[6272:8100],0,0),col="#00ff0080")
polygon(c(x[8101:10000],1,0.81),c(y[8101:10000],0,0),col="#0000ff80")
dev.off()
# f(x) < 0 (forall x)
svg("3.svg")
x <- 1:N/N
y <- sqrt(x) - 1.5
plot(x,y,type="l", xlim =c(0,1),ylim=c(-2,2) ,axes = F)
axis(2)
polygon(c(x,1,0),c(y,0,0),col="#00ff0080")
dev.off()
関数の定義
ここで、同じような繰り返しの部分を抽出して関数にしてみます。これが意外と便利そうです。
intInt <- function(x,y,interval=NULL,n=10,col="#ff000080",ybase=0,yax=T,...){
plot(x,y,type="n",axes=F,...)
if(yax){
axis(2)
}
if(is.null(interval)){
interval <- seq(from=min(x),to=max(x),length.out=n+1)
}
n <- length(interval) - 1
col <- rep(col, n/length(col))
for(i in 1:n){
intmin <- sum(x<interval[i]) + 1
intmax <- sum(x<=interval[i+1])
polygon(c(x[intmin:intmax],x[intmax],x[intmin]),c(y[intmin:intmax],ybase,ybase),col=col[i])
}
}
##(2)
svg("2_all.svg")
par(mfrow=c(3,1))
x <- 1:N/N
y <- sin(x*2*pi)
intInt(x,y,n=2,col=c("#FF000080","#00FF0080"),ylim=c(-1,1))
x <- 1:N/N
y <- sin(x*4*pi)
intInt(x,y,n=4,col=c("#FF000080","#00FF0080"),ylim=c(-1,1))
x <- 1:N/N
y <- sin(x*6*pi)
intInt(x,y,n=6,col=c("#FF000080","#00FF0080"),ylim=c(-1,1))
dev.off()
山ごとに塗り分けるのが一行でかける、というのが結構びっくりしました。
最近Rにはまりつつあるのは、ベクトル操作が相当簡単で絵もかきやすいから、という気がします。
一応補足
ちゃんと論証ができるということは重要なので、このお遊びの通りに絵だけで答案を作っても、評価してくれる人と評価してくれない人の二種類の人が存在します。あくまでもネタということで。
この問題はさすがに易しすぎるのではないか、とも思ったのですが、こういう問題に好意的かどうか、というところが結構重要な要素の気がします。なんとなく。