関数$\varphi: [0,1] \to [0,1]$を, \begin{equation*} \varphi(x) := \begin{cases} 1 & (0 \leq x < 0.5)\\ 0 & (0.5 \leq x \leq 1) \end{cases} \end{equation*} によって定義する.
今, 初期点を$x_{0} \in [0,1]$とし, $\varphi$によって$n$回変換したときの点を$x_{n}$とする. すなわち, \begin{equation*} x_{n} = \varphi(x_{n-1}) = \varphi^{n}(x_{0}). \end{equation*}
ここで, $x_{0} = 0.3$として, $x_{n}$をJuliaで計算してみる.
x0 = 0.3 #初期点
0.3
#関数ϕの定義
function ϕ(x) #ϕは \phi と入力してから Tabキーを押すと入力できる
if x < 0.5
return 2*x
else
return 2*(1 - x)
end
end
ϕ (generic function with 1 method)
x = x0 #初期値を値として設定
x_sq = [ x ] # 結果を保存しておくための配列
1-element Vector{Float64}: 0.3
for n in 1:100 #100ステップ計算してみる
x = ϕ(x) #古い x -> 新しい x へ更新(x_{n} = ϕ(x_{n-1}))
push!(x_sq, x) # push! で配列に要素を追加 #ちなみに, 命令の最後に ! がついているものは, 「追加で」という意味を示す.
end
結果を見てみる. 本来0.8と0.4が交互に現れて無限ループとなるはずが, 途中で値が0になっている.
x_sq
101-element Vector{Float64}: 0.3 0.6 0.8 0.3999999999999999 0.7999999999999998 0.40000000000000036 0.8000000000000007 0.3999999999999986 0.7999999999999972 0.4000000000000057 0.8000000000000114 0.39999999999997726 0.7999999999999545 0.40000000000009095 0.8000000000001819 0.3999999999996362 0.7999999999992724 0.4000000000014552 0.8000000000029104 0.39999999999417923 0.7999999999883585 0.40000000002328306 0.8000000000465661 0.39999999990686774 0.7999999998137355 0.40000000037252903 0.8000000007450581 0.3999999985098839 0.7999999970197678 0.4000000059604645 0.800000011920929 0.3999999761581421 0.7999999523162842 0.40000009536743164 0.8000001907348633 0.39999961853027344 0.7999992370605469 0.40000152587890625 0.8000030517578125 0.399993896484375 0.79998779296875 ⋮ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
もう少し手前までの要素を表示する. $x_{56}$で0となっていることがわかる.
x_sq[1:60] #1~60番目の要素まで表示
60-element Vector{Float64}: 0.3 0.6 0.8 0.3999999999999999 0.7999999999999998 0.40000000000000036 0.8000000000000007 0.3999999999999986 0.7999999999999972 0.4000000000000057 0.8000000000000114 0.39999999999997726 0.7999999999999545 0.40000000000009095 0.8000000000001819 0.3999999999996362 0.7999999999992724 0.4000000000014552 0.8000000000029104 0.39999999999417923 0.7999999999883585 0.40000000002328306 0.8000000000465661 0.39999999990686774 0.7999999998137355 0.40000000037252903 0.8000000007450581 0.3999999985098839 0.7999999970197678 0.4000000059604645 0.800000011920929 0.3999999761581421 0.7999999523162842 0.40000009536743164 0.8000001907348633 0.39999961853027344 0.7999992370605469 0.40000152587890625 0.8000030517578125 0.399993896484375 0.79998779296875 0.4000244140625 0.800048828125 0.39990234375 0.7998046875 0.400390625 0.80078125 0.3984375 0.796875 0.40625 0.8125 0.375 0.75 0.5 1.0 0.0 0.0 0.0 0.0 0.0
Plots package が未インストールの場合は下記を実行しておこう.
using Pkg
Pkg.add("Plots")
一度インストールしてしまえば, その後は
using Plots
とすれば, そのセッション内ではPlots packageが有効になり(後述の)plot命令などが使える.
ベクトルを plot に渡すと, 普通の2次元グラフを描いてくれる.
plot(x_sq)
基本はこのように, データをベクトル形式に突っ込んでそれを plot に渡せばよい.
縦軸・横軸にラベルを振りたい, グラフの各点にマーカーがあったほうが良い, という場合は例えば次のようにすればよい.
plot(x_sq, xaxis = "n", yaxis = "x_n", marker = :circ) #xaxisが横軸のラベル, yaxisが縦軸のラベル, markerが各点のマーカー
上記は肉眼では分かりにくいが横軸の最初の点は0から始まっており, 最後の点も101と1ずれてしまっている.
グラフの横軸をきちんと $n$ そのものにしたい場合は, $x$ 軸用の変数も作った上で, $x$ 軸用の変数と $y$ 軸用の変数(今回は x_sq)を plot 関数に一緒に渡せばよい. 具体的には以下のような感じになる.
Rx = 0:100
plot(Rx, x_sq, xaxis = "n", yaxis = "x_n", marker = :circ)
グラフに 0.4 の値と 0.8 の値を示す「線」をそれぞれ追加してみる. hline という命令でやってみよう.
plot(Rx, x_sq, xaxis = "n", yaxis = "x_n", marker = :circ)
# hline! には定数関数の配列を渡す. 今回は配列の中身が一つだけだが...
hline!([0.8]) # コマンドの最後に ! がつくものは「追加で」を意味する.
hline!([0.4])
参考Webサイト
02. グラフを描こう: http://www.cas.cmc.osaka-u.ac.jp/~paoon/Lectures/2023-8Semester-NA-basic/02-plot/
05. モデリングと Euler法: http://www.cas.cmc.osaka-u.ac.jp/~paoon/Lectures/2023-8Semester-NA-basic/05-modeling/