rによる富士山関数の描き方
TRANSCRIPT
Rによる富士山関数の描き方
2013.01.02
富士山関数とは
Q:以下の関数のグラフを描け。
f(x)= x^4-x^2+6
(|x|<=1), 12/(|x|+1) (|x|>1),
g(x)= 1/2*cos(2x)+7/2 (|x|<=2)
静岡大学の試験問題だそうです。詳しくは以下を参照。http://www.yukawanet.com/archives/4365293.html
描いてみたけどなんか違う・・・
-5 0 5
23
45
6
x
Fuji1
(x)
Fuji <- function(x) ifelse(abs(x) <= 1, x^4-x^2+6, 12/(abs(x)+1))
curve(Fuji, xlim=c(-8,8), col="royalblue", lwd=2)
curve(1/2 * cos(2*x) + 7/2, xlim=c(-2,2), add=T, col=“royalblue", lwd=2)
g(x)の式を調整するとFuji <- function(x) ifelse(abs(x) <= 1, x^4-x^2+6, 12/(abs(x)+1))
curve(Fuji, xlim=c(-8,8), col="royalblue", lwd=2)
curve(1/3 * cos(6*x) + 7.5/2, xlim=c(-2,2), add=T, col="royalblue", lwd=2)
解説
curve(1/3 * cos(6*x) + 7.5/2 ・・・
① ② ③
① 2=>3 振幅を少し小さく
② 2=>6 振動数を多く
③ 7=>7.5 端が山裾にフィットするよう上にすこし持ち上げる
後日談
この試験問題はかなり有名なようで、私が見たものはおそらく何度も転載を繰り返される間に式の転記ミスがあったもののようです。正しくは、
g(x)=1/2cos(2πx)+7/2
π(パイ)が抜けていました。
π=3.1415926・・・・
参考: http://iky.no-ip.org/weblog/fuji.pdf
正しい式で再び描画Fuji <- function(x) ifelse(abs(x) <= 1, x^4-x^2+6, 12/(abs(x)+1))
curve(Fuji, xlim=c(-8,8), col="royalblue", lwd=2, xaxt="n", yaxt="n", xlab="", ylab="")
curve(1/2 * cos(2*pi*x) + 7/2, xlim=c(-2,2), add=T, col="royalblue", lwd=2)
※ 軸ラベルや目盛を消してより絵らしくしてみました。
大元の式と調整式の違い薄い水色の点線がこのスライドで調整したg(x)です。
正解を見てから考えれば振動数調整だけで良かったのですが、振れ幅を浅くしたために上に持ち上げる必要が発生しました。
もう一歩頑張って色付けするとFuji <- function(x) ifelse(abs(x) <= 1, x^4-x^2+6, 12/(abs(x)+1))
curve(Fuji, xlim=c(-8,8), col="royalblue", lwd=2, , axes=F, ann=F)
# 枠も消しました
curve(1/2 * cos(2*pi*x) + 7/2, xlim=c(-2,2), add=T, col="royalblue", lwd=2)
# 雪のない部分をx1, y1で細かく囲み、中を塗る
x1 <- sort(runif(1000, -8, 8)) # 一様乱数を順番に並び替え
y1 <- rep(NA, 1000)
y1[which(abs(x1)>2)] <- Fuji(x1[which(abs(x1)>2)])
y1[which(abs(x1)<=2)] <- 1/2 * cos(2*pi*x1[which(abs(x1)<=2)]) + 7/2
polygon(x1, y1, col ="royalblue", border=F)
おわり2012年7月に撮影した、富士山8合目付近からの夕暮れです。