Topic 8

目次

1) 課題の提出 2) *事前作業:フォルダーの作成、作業空間の変更 3) 条件式 Conditional Expression 4) if-文:条件評価 5) for-文 6) for-for文 7) function-文:関数の定義 8) 応用編1:愚数・奇数の数を数える 9) 応用編2:ランダムウォーク Random Walk 2D 10) 応用編3:Multi 複数のY軸グラフ 11) Plot & Plot!で作成したグラフの表示に関する注意点

データサイエンス CDS009    (チェン leechuin@yamanashi.ac.jp) 更新日: 2024-02-02


プログラムの流れの制御&関数


1. 課題の提出

 • *実習課題(7問)の部分は要提出です

 • 1つの課題につき、1つのプログラムファイルを使ってください。

 • 課題の出力画面、グラフをWordにまとめてください。

 • プログラムファイル (.jl 7つ) を全て提出してください。


2. *事前作業:フォルダーの作成、作業空間の変更

(1) 実習課題用のフォルダーの作成

 • 各自の「ドキュメント」 のフォルダーに今回の授業のためのフォルダーを作成してください。

 • フォルダー名は任意です。(既存のものを使ってもOK)

(2) cd で作業空間の変更

 • Julia ターミナル(REPL)を開き、下記のとおりに、cd のコマンドを使って、Julia の作業フォルダーを自分が作ったフォルダーに指定する

julia> cd("U:\\Documents\\あなたのフォルダー名")

ターミナルの出力の例:

作業空間が確実に変更されたかどうか次のコマンドで確認できる。

julia> pwd()

表示されたフォルダー名が、あなたが作ったものと一致すれば大丈夫です。

例:


(3) Visual Studio Code (vscode)

 • Visual studio code は無料でダウロードできるフリーなプログラム編集ツール(コードエディタ)です。

 • 公式サイトはこちら:https://code.visualstudio.com/

 • 普通のメモ帳より、Syntax highlighting (構文着色)の機能が付いているので、プログラム言語の文法ミスを防ぐことができる。

今回の授業では、そのWeb 版を使って実習を行う

 • Web 版のリンクはこちら:https://vscode.dev/

vscode (Web 版)の最初の画面:


(4) テスト用の .jl ファイルの作成

手順:

 • 左のフォルダーを開く」をクリックして、今回の授業の作業フォルダーを選択する。

        ► 読み取りの許可のメセージがあったら、許可を与えてください。

 • 「新しいファイル」をクリックして、新規ファイルを開きます。

 • ファイル名は任意ですが、拡張子は .jl にしてください。

        ► 例:topic_8_kadai_0.jl

 • ファイルの保存先は今回の作業フォルダーです。

 • 下記のコードをそのファイルに書き込みます。

print("hello\nこんにちは\n")
x = 2
print("x^5 = ", x^5)

 • 左上の「≡」のマークをクリックして、「ファイル」> 「保存」 にしてください。(または Ctrl-S)


(5) include 関数で .jl ファイルを実行する

 • Julia端末でinclude 関数を使って .jl ファイルを実行する。

julia> include("あなたのファイル名.jl")

実行例:

上記のような出力が出たらOKです。

次の実習課題に使うコードはこの方法で実行してください。


3. 条件式 Conditional Expression

 • 数式に似ているが、その結果が true 真 または false 偽 しかない。

 • つまり、条件式の型は Boolean ブリアンである。

\[ \begin{matrix}プログラミング &~ &数学\\\texttt{x > y} &~ &x > y & \\\texttt{x < y} &~ &x < y & \\\texttt{x >= y} &~ &x \geq y & \\\texttt{x <= y} &~ &x \leq y & \\\texttt{x == y} &~ &x = y & \\\texttt{x != y} &~ &x \neq y & \\\end{matrix}\]

例:

julia> x = 3; y = 4; z = 3;

julia> x > y
false

julia> x == z
true

julia> y != z
true

julia> x <= z
true


4. if-文:条件評価

Flow chart (if の流れ図)

練習:if - else - end

x = 2
y = 3
if x > y
    println("x は y より大きい。")
    z = 1
else
    println("x は y より小さいかもしれない。")
    z = -1
end
println("z = ", z)
x は y より小さいかもしれない。
z = -1

*実習課題 1:if - elseif - else - end

x と yの数値を変えてみてください。

x = 2
y = 3
if x > y
    println("x は y より大きい。")
    z = 1
elseif x < y
    println("x は y より小さい。")
    z = -1
else
    println("その他。つまり x = y")
    z = 0
end
println("z = ", z)
x は y より小さい。
z = -1

5. for-文

同じ処理を for のループ内に繰り返して実行することができる。

練習:同じ処理 N 回 行う

for x in 1:5
    print("これは ", x)
    print(" 回目です。\n")
end
これは 1 回目です。
これは 2 回目です。
これは 3 回目です。
これは 4 回目です。
これは 5 回目です。

練習:配列の要素を抽出して同じ処理を行う。

A = [12, 34, 56, 78]
for x in A
    println("要素 = ", x)
end
要素 = 12
要素 = 34
要素 = 56
要素 = 78

*実習課題 2 :ターミナルの表示制御

 • 下記プログラムを完成させ。

 • プログラムファイル .jl を提出してください。

 • ファイル名に課題番号を記入してください。

 • 出力画面を説明付きで Word に添付してください。

N = 6 #任意の値
println("これは例です")
for n in 1:N
    println("+"^n)
end

println("\nこれは実習課題です")
for ❓❓❓
    ❓❓❓ #hint:「文字の結合」と「スペース」を使う。
end

出力

これは例です
+
++
+++
++++
+++++
++++++

これは実習課題です
     +
    ++
   +++
  ++++
 +++++
++++++

More Hint: * を使って、文字列の結合をする。

例:

julia> println("+" * " "^3 * "+"^2)
+   ++


6. for-for文

 • for ループのなかで、 さらに for ループを実行する。

 • 「多重ループ」とも言われる。

 • 2次元 or 3次元配列の処理によく使われている。

練習:二重ループ

println("- Start ---")
for i in 1:3
    for j in 1:2
        println("This is i = ", i, "	j = ", j)
    end
end
println("- End ---")
T- Start ---
This is i = 1   j = 1
This is i = 1   j = 2
This is i = 2   j = 1
This is i = 2   j = 2
This is i = 3   j = 1
This is i = 3   j = 2
- End ---

*実習課題 3:行列の要素の抽出

 • 次のプログラムを完成させ。

 • プログラムファイル .jl を提出してください。

 • ファイル名に課題番号を記入してください。

 • 出力画面を説明付きで Word に添付してください。

A = rand(0:9, (3,4)) #ランダム整数の行列
println("行列を print で表示する")
println("A = ", A)

println("\n自己流で行列を表示する")
M = length(A[:,1]) # 行数
N = length(A[1,:]) # 列数
print("┌ " * " "^(N*2) * "┐\n")
for m in 1: M
    print("| ")
    for n in 1: N
        print(A[❓ , ❓])
        print("❓")
    end
    print("|\n")
end
print("└ " * ❓ * "┘\n")
行列を print で表示する
A = [7 2 4 0; 0 4 7 7; 7 3 4 2]

自己流で行列を表示する
┌         ┐
| 7 2 4 0 |
| 0 4 7 7 |
| 7 3 4 2 |
└         ┘

7. function-文:関数の定義

関数を定義するには最も標準的な書き方はこちら:

function 関数名(入力)
    計算・実行内容
    return 計算結果
end

例:

function myf(x, y)
    print("計算始め\n")
    Z = x^2 + y^2
    Z = sqrt(Z)
    return Z
end
print("結果:", myf(3, 4))
計算始め
結果:5.0

計算結果が関数ブロックの最終行であれば, return を書かなくても良い。

function myf(x, y)
    print("計算始め\n")
    Z = x^2 + y^2
    Z = sqrt(Z)
end

上記と等価な代入形式はこちら:

julia> f(x, y) = sqrt(x^2 + y^2) 
f (generic function with 2 methods)

julia> print("結果:", f(3, 4) )
結果:5.0

デフォルト値を持つ引数

 • 関数を定義する段階で、引数のデフォルト値の定義もできる。

 • 引数の初期値・デフォルト値があれば、関数を実行する時にその引数を入力しなくても良い。

function myg(x, y = 1)
    return x^2 + y^2
end
println("myg(2,2) = ", myg(2,2))
println("myg(2) = ", myg(2))
myg(2,2) = 8
myg(2) = 5

8. 応用編1:愚数・奇数の数を数える

愚数は 2 で割り切れる整数です。あまり=0

奇数は 2 で割り切れない整数です。あまり=1

% はあまりを求める演算子です。

練習:計算例

julia> 4%2
0

julia> 55%2
1

julia> 0%2
0

*実習課題 4:配列内の要素の分析

 • 次のプログラムを完成させ。

 • プログラムファイル .jl を提出してください。

 • ファイル名に課題番号を記入してください。

 • 出力画面を説明付きで Word に添付してください。

 
function Analyse(A)
    Gusu = 0
    Kisu = 0
    for a in A
        if ❓❓❓
            Gusu += 1
        else
            Kisu += 1
        end
    end
    println("愚数 = $(Gusu) 個")
    println("奇数 = $(Kisu) 個")
end
Analyse(rand(0:10, 100)) #もっと大きい数値を使っても良い
愚数 = 63 個
奇数 = 37 個

9. 応用編2:ランダムウォーク Random Walk 2D

 • 別名:乱歩(らんぽ)、酔歩(すいほ)

 • 高分子の幾何学的構造のモデルとして利用されている。

目的:次の 関数を作成する

RandomWalk(N, dTheta = pi/100, R = 1, xo = 0, yo=0)

 • N は 原点も含め、居場所(点)の数です。

 • dTheta 回転角度の刻み。

 • R 一歩の距離。

 • xoyo :原点の座標

 • N の入力は必須です。その他の引数が、入力がなけらば既存値を使う。

 • 注意点:「歩数」と「点の数」は同じではない。

出力の例:

*実習課題 5:乱歩

 • 上記のグラフを作成するために、下記のプログラムを完成させ。

 • プログラムファイル .jl を提出してください。

 • ファイル名に課題番号を記入してください。

 • プログラムが完成したら, 上記の例みたいに、引数を変えてみて、説明付きでWord にまとめてください。

function RandomWalk(N, dTheta = pi/100, R = 1, xo = 0, yo=0)
    X = zeros(N)
    Y = zeros(N)
    X[1] = xo
    Y[1] = yo
    for n in 1:N-1
        #-pi から piまで、dTheta 刻みで乱数を作成
        theta = rand(-pi: dTheta: pi) 

        dx = R * cos(theta)
        dy = R * sin(theta)
        X[❓] = X[n] + dx
        Y[❓] = Y[n] + dy
    end
    gmax = maximum([maximum(X), maximum(Y)])
    gmin = minimum([minimum(X), minimum(Y)])
    println("最大値 = ", gmax)
    println("最小値 = ", gmin)
    println("始点-終点距離 = ", sqrt((X[end]-xo)^2 + (Y[end]-yo)^2))

    plot(X, Y, legend = false, marker = 1, 
        xlims=(gmin,gmax), ylims = (gmin, gmax)) 
    #始点と終点を繋ぐ
    plot!(X[[1,end]],Y[[1,end]], marker = 4,
        linestyle = :dash, size = (300,300),
        title = "N = $(N)") 
end
RandomWalk(50, pi/100)

成功したグラフは、savefig で保存する。

julia> savefig("任意のファイル名.png")


10. 応用編3:Multi 複数のY軸グラフ

*実習課題 6:Plot!を用いて複数のグラフを作成

「第6回の授業資料」または「共通plotの簡易マニュアル」を参考にして、自分なりの複数のグラフを作成する。

グラフの種類、数式、テーマは自由

例:

例:

例:

例:


*実習課題 7:Plot!を用いて多数の線形写像を作成

第7回の授業の実習課題:線形写像を参考にして、自分なりの拡張版を作成する。

例:矢印(頂点を60度回転。変換したものを繰り返して回転する。全体6回)

例:矢印(10度回転 × 20回)

例:国(60度回転 × 6回)

例:矢印(頂点の行列かける1.2倍 × 10回)

例:矢印([頂点の行列をY軸反転+かける1.2倍] × 20回


11. Plot & Plot!で作成したグラフの表示に関する注意点

グラフが自動的に表示される場合

using Plots
print("はじめ\n")
plot(rand(100)) #グラフの新規作成
plot!(title = "Random", legend = false) #グラフの属性を追加

上記のコード例の最後の指令は、plot!となっています。

最後の指令は、plot または plot! であれば、作成したグラフは自動的に表示される。

plot & plot!を実行したが、グラフが表示されない場合

下記のコード例の最後指令は plot または plot! ではないので、作成したグラフは自動的に表示されない。

using Plots
print("はじめ\n")
plot(rand(100)) #グラフの新規作成
plot!(title = "Random", legend = false) #グラフの属性を追加
print("終わり") #最後の指令は plot または plot!ではない。

解決方法

方法1:コードの最後に plot!() を追加する。

using Plots
print("はじめ\n")
plot(rand(100))#グラフの新規作成
plot!(title = "Random", legend = false)  #グラフの属性を追加
print("終わり") 
plot!() #最後の行に dummy の plot!を追加。

方法2:最後の plot! の結果を強制表示する。

using Plots
print("はじめ\n")
plot(rand(100))#グラフの新規作成
display( plot!(title = "Random", legend = false) ) #強制表示
print("終わり")