2013.01.02


Rによる富士山関数の描き方
富士山関数とは
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
描いてみたけどなんか違う・・・
           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)
            6
            5
Fuji1(x)

            4
            3
            2




                              -5                   0                   5

                                                   x
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合目付近からの夕暮れです。

Rによる富士山関数の描き方