Chapter2

コメント

In [1]:
# コメントです 
print(1) # 1を表示
1
In [2]:
#===

複数行のコメント
こめんと
こめんと

===#
In [3]:
x = 1
Out[3]:
1
In [4]:
x = 1; # セミコロンをつけると結果が表示されない

Print文

In [5]:
print(x)
1
In [6]:
print("Control")
Control
In [7]:
print("制御") # 改行なし
print("工学")
制御工学
In [8]:
println("制御") # 改行する場合
print("工学")
制御
工学
In [9]:
print("制御\n工学")
制御
工学
In [10]:
print("制御", "工学")
制御工学
In [11]:
x = 10
println(x)
println("x = ", x)
println("x = $x")
10
x = 10
x = 10

Unicode

変数にUnicodeが使える

In [12]:
制御 = 2
3制御
Out[12]:
6

LaTeXコードが使える

In [13]:
π #\pi
Out[13]:
π = 3.1415926535897...
In [14]:
3π
Out[14]:
9.42477796076938
In [15]:
 #\euler
Out[15]:
ℯ = 2.7182818284590...
In [16]:
α = 1 # \alpha
Out[16]:
1
In [17]:
P₀ = 1 # P\_0
Out[17]:
1
In [18]:
Pₘ = 10
Out[18]:
10
In [19]:
G⁰ = 1 # G\^0
Out[19]:
1

カウント

In [20]:
length("せいぎょこうがく")
Out[20]:
8
In [21]:
 #\euler
Out[21]:
ℯ = 2.7182818284590...
In [22]:
α = 1 # \alpha
Out[22]:
1
In [23]:
P₀ = 1 # P\_0
Out[23]:
1
In [24]:
G⁰ = 1 # G\^0
Out[24]:
1

数値

In [25]:
typeof(1)
Out[25]:
Int64
In [26]:
typeof(1.0)
Out[26]:
Float64
In [27]:
2 * 1.0
Out[27]:
2.0
In [28]:
10 / 5
Out[28]:
2.0
In [29]:
17 ÷ 5 # \div
Out[29]:
3
In [30]:
17 % 5
Out[30]:
2
In [31]:
15 // 4
Out[31]:
15//4
In [32]:
x = 1
x += 1
# x = x + 1
Out[32]:
2
In [33]:
x = 2
x *= 3
Out[33]:
6
In [34]:
3^5
Out[34]:
243
In [35]:
3*10^-2
Out[35]:
0.030000000000000006
In [36]:
3e-2
Out[36]:
0.03
In [37]:
3e2
Out[37]:
300.0

演算子の省略

In [38]:
x = 1
2x
Out[38]:
2
In [39]:
2(x+2)
Out[39]:
6

変数

In [40]:
x = 1
println(x)
println(typeof(x))
1
Int64
In [41]:
y = 1.0
println(y)
println(typeof(y))
1.0
Float64
In [42]:
z = 1 + 2im
println(z)
println(typeof(z))
1 + 2im
Complex{Int64}
In [43]:
msg = "Control"
println(msg)
println(typeof(msg))
Control
String
In [44]:
chr = 'C'
println(chr)
println(typeof(chr))
C
Char
In [45]:
ok = true
println(ok)
println(typeof(ok))
true
Bool
In [46]:
# nothing
typeof(nothing)
Out[46]:
Nothing
In [47]:
# missing
typeof(missing)
Out[47]:
Missing

型変換

In [48]:
z = convert(Int, y)
println(z)
println(typeof(z))
1
Int64
In [49]:
word = string(x)
println(word)
println(typeof(word))
1
String
In [50]:
x = 1
2x
Out[50]:
2
In [51]:
2(x+2)
Out[51]:
6

リスト

In [52]:
data1 = [3, 5, 2, 4, 6, 1]
Out[52]:
6-element Vector{Int64}:
 3
 5
 2
 4
 6
 1
In [53]:
println(typeof(data1))
println(eltype(data1))
Vector{Int64}
Int64
In [54]:
data2 = [ [3, 5, 2], [4, 6, 1] ]
data2
Out[54]:
2-element Vector{Vector{Int64}}:
 [3, 5, 2]
 [4, 6, 1]
In [55]:
data1[1]
Out[55]:
3

スライス

In [56]:
data1[1:2]
Out[56]:
2-element Vector{Int64}:
 3
 5
In [57]:
data1[3:4]
Out[57]:
2-element Vector{Int64}:
 2
 4
In [58]:
data1[3:end]
Out[58]:
4-element Vector{Int64}:
 2
 4
 6
 1

リスト用の関数

In [59]:
data2 = [3, 5, 2, 4, 6, 1] 

# 先頭に要素を追加
pushfirst!(data2, 1)
Out[59]:
7-element Vector{Int64}:
 1
 3
 5
 2
 4
 6
 1
In [60]:
# 先頭の要素を取り出す
popfirst!(data2)
Out[60]:
1
In [61]:
# 末尾に要素を追加
push!(data2, 10)
Out[61]:
7-element Vector{Int64}:
  3
  5
  2
  4
  6
  1
 10
In [62]:
# 末尾の要素を取り出す
pop!(data2)
Out[62]:
10
In [63]:
# i番目に要素を挿入する
insert!(data2, 2, 20)
Out[63]:
7-element Vector{Int64}:
  3
 20
  5
  2
  4
  6
  1
In [64]:
# i番目の要素を削除
deleteat!(data2, 2)
Out[64]:
6-element Vector{Int64}:
 3
 5
 2
 4
 6
 1

タプル

In [65]:
tuple = (1,2,3,4) 
println(tuple)
println(typeof(tuple))
(1, 2, 3, 4)
NTuple{4, Int64}
In [66]:
# 書き換え不可
tuple[1] = 5
MethodError: no method matching setindex!(::NTuple{4, Int64}, ::Int64, ::Int64)

Stacktrace:
 [1] top-level scope
   @ In[66]:2
 [2] eval
   @ ./boot.jl:373 [inlined]
 [3] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1196
In [67]:
data = [1, 2, 3, 4]
data[1] = 5 #リストは書き換えができる
data
Out[67]:
4-element Vector{Int64}:
 5
 2
 3
 4
In [68]:
d = ( linestyle = "-.", color="k") 
println(d)
println(typeof(d))
(linestyle = "-.", color = "k")
NamedTuple{(:linestyle, :color), Tuple{String, String}}
In [69]:
d.linestyle
Out[69]:
"-."
In [70]:
d.color
Out[70]:
"k"

辞書

In [71]:
dic = Dict();
In [72]:
dic["linestyle"] = "-.";
dic["color"] = "k";
In [73]:
dic["color"]
Out[73]:
"k"
In [74]:
dic2 = Dict( "linestyle" => "-.", "color" => "k" );
dic2["color"]
Out[74]:
"k"

if文

In [75]:
x = 1

if x < 0
    print("x is negative")
elseif x == 0
    print("x is zero")
else
    print("x is positive")
end
x is positive
In [76]:
x ,y = -1, -1

if x < 0 && y < 0
    print("x and y are negative")
end
x and y are negative
In [77]:
x, y = 1, -1

if x < 0 || y < 0
    print("x or y is negative")
end
x or y is negative
In [78]:
x = 2
y = [1, 2, 3] 

if x in y
    println("x is in y")
end

if x  y #\in
    println("x is in y")
end
x is in y
x is in y
In [79]:
x = 0
y = [1, 2, 3] 

if x  y #\notin
    print("x is not in y")
end
x is not in y

3項演算子

条件 a が真(true)なら b を、偽なら c を値とする

In [80]:
x = 1

x > 2 ? "x>2" : "x≤2"
Out[80]:
"x≤2"

for文

In [81]:
for x in [0, 1, 2]
    println(x)
end
0
1
2
In [82]:
for x=0:1:2
    println(x)
end
0
1
2
In [83]:
for (i, word) in enumerate(["a", "b", "c"])
    println(i, ":",  word)
end
1:a
2:b
3:c

練習問題

In [84]:
# プログラム1
for x=0:1:2
    println(x) 
    println("julia")
end
0
julia
1
julia
2
julia
In [85]:
# プログラム2
for x=0:1:2
    println(x) 
    continue
    println("julia")
end
0
1
2

関数定義

In [86]:
function say_hello()
    println("こんにちは")
end
Out[86]:
say_hello (generic function with 1 method)
In [87]:
say_hello()
こんにちは
In [88]:
function subject(name)
    println(name * "工学")
end
Out[88]:
subject (generic function with 1 method)
In [89]:
subject("制御")
制御工学
In [90]:
function add(a, b)
    c = a + b
    return c
end
Out[90]:
add (generic function with 1 method)
In [91]:
result = add(3, 5)
print(result)
8
In [92]:
add2(a, b) = a + b
Out[92]:
add2 (generic function with 1 method)
In [93]:
add2(3, 5)
Out[93]:
8
In [94]:
# 引数の型で関数の中身を変えることができる
test(x::Int64) = "せいすう"
test(x::Float64) = "しょうすう"
Out[94]:
test (generic function with 2 methods)
In [95]:
test(2)
Out[95]:
"せいすう"
In [96]:
test(2.0)
Out[96]:
"しょうすう"

クロージャ

In [97]:
function outer(a, b)
    function inner(c)
        return c * (a + b) 
    end
    return inner
end
Out[97]:
outer (generic function with 1 method)
In [98]:
f = outer(1, 2) 
r = f(3) 
println(r)
9
In [99]:
f2 = outer(3, 4)
r2 = f2(3)
println(r2)
21

無名関数

In [100]:
c = (a, b) -> 2*a + 3*b
c(1, 4)
Out[100]:
14
In [101]:
map(x -> x^2 + 2x + 1, [0, 1 ,-1])
Out[101]:
3-element Vector{Int64}:
 1
 4
 0
In [102]:
data1 = [1, 2, 3, 4, 5]
data2 = [10, 9, 8, 7, 6]
result = map( (a, b) -> 2*a + 3*b, data1, data2)
println(result)
[32, 31, 30, 29, 28]

ジェネレータ

In [103]:
function linestyle_generator(lineID)
    linestyle = ["-", "--", "-.", ":"] 
    lineID = (lineID-1) % (length(linestyle)) + 1
    return linestyle[lineID]
end
Out[103]:
linestyle_generator (generic function with 1 method)
In [104]:
LS = (linestyle_generator(i) for i=1:1:5)
for i in LS
    println(i)
end
-
--
-.
:
-

リスト内包表記

In [105]:
t = (1, 2, 3, 4, 5) 
r1 = [i for i in t] 
print(r1)
[1, 2, 3, 4, 5]
In [106]:
r2 = [i for i in t if i % 2 == 0] 
print(r2)
[2, 4]

練習問題

In [107]:
# for文を使って足し合わせる 

s=0
for x = 1:1:50
    s += x
end
println(sqrt(s))

# sumを使う
s = sum(1:1:50) 
println(sqrt(s))

# generator式を使う
s = sum(x for x = 1:1:50) 
print(sqrt(s))
35.70714214271425
35.70714214271425
35.70714214271425

ライブラリ

In [108]:
using LinearAlgebra
In [109]:
A = [ 1 2 ; -3 4 ]
Out[109]:
2×2 Matrix{Int64}:
  1  2
 -3  4
In [110]:
A'
Out[110]:
2×2 adjoint(::Matrix{Int64}) with eltype Int64:
 1  -3
 2   4
In [111]:
inv(A)
Out[111]:
2×2 Matrix{Float64}:
 0.4  -0.2
 0.3   0.1
In [112]:
I
Out[112]:
UniformScaling{Bool}
true*I
In [113]:
A*I
Out[113]:
2×2 Matrix{Int64}:
  1  2
 -3  4
In [114]:
A*inv(A)
Out[114]:
2×2 Matrix{Float64}:
 1.0  2.77556e-17
 0.0  1.0
In [115]:
A/A
Out[115]:
2×2 Matrix{Float64}:
 1.0  -0.0
 0.0   1.0
In [116]:
Diagonal(A)
Out[116]:
2×2 Diagonal{Int64, Vector{Int64}}:
 1  ⋅
 ⋅  4
In [117]:
det(A)
Out[117]:
10.0
In [118]:
rank(A)
Out[118]:
2
In [119]:
x = [1 2]'
Out[119]:
2×1 adjoint(::Matrix{Int64}) with eltype Int64:
 1
 2
In [120]:
norm(x)
Out[120]:
2.23606797749979
In [121]:
norm(x, Inf)
Out[121]:
2.0
In [122]:
norm(x, 1)
Out[122]:
3.0
In [123]:
w, v = eigen(A)
println(w)
println(v)
ComplexF64[2.5 - 1.9364916731037083im, 2.5 + 1.9364916731037083im]
ComplexF64[0.38729833462074165 + 0.5im 0.38729833462074165 - 0.5im; 0.7745966692414835 - 0.0im 0.7745966692414835 + 0.0im]

Plots

In [124]:
using Plots
gr()
Out[124]:
Plots.GRBackend()
In [125]:
x = 0 : 0.1 : 4π
y = sin.(x)

plot(x, y,
     xlabel="x",   #X軸のラベル
     ylabel="y",   #Y軸のラベル
     lc=:red,     #線の色
     lw=2,           #線幅
     ls=:solid,        #線種
     legend=false,
     xticks=0:2:12,
     yticks=-1.0:0.25:1.0,
     size=(300,230)   #プロットのサイズ 
    
)
Out[125]:
In [126]:
x = 0:0.1:4π
y = sin.(x)
z = cos.(x)
w = y + z

p1 = plot(x, y,
     xlabel="x",   #X軸のラベル
     ylabel="y",   #Y軸のラベル
     lw=2,           #線幅
     ls=:solid,        #線種
     label="sin",
     legend=false,
     xticks=0:2:12,
     yticks=-1.0:0.25:1.0,
)

p1 = plot!(x, z,
     xlabel="x",   #X軸のラベル
     ylabel="y",   #Y軸のラベル
     lw=2,           #線幅
     ls=:dash,        #線種
     label="cos",
     legend=true,
     xticks=0:2:12,
     yticks=-1.0:0.25:1.0,
)

p2 = plot(x, w,
     xlabel="x",   #X軸のラベル
     ylabel="y",   #Y軸のラベル
     lw=2,           #線幅
     ls=:dot,        #線種
     lc=:black,
     legend=false,
     xticks=0:2:12,
     yticks=-1.0:0.25:1.0,
)

plot(p1, p2, layout=(2,1))
Out[126]:

DifferentialEquations

In [1]:
using DifferentialEquations
using Plots; gr()
Out[1]:
Plots.GRBackend()
In [2]:
function system(y, p, t)
    if t < 10.0
        u = 0.0
    else
        u = 1.0
    end
    
    dydt = (-y + u)/5.0 
    return dydt
end

y0 = 0.5
tspan = (0.0, 40.0)

prob = ODEProblem(system,y0,tspan)
sol = solve(prob, DP5()) 

plot(sol)

plot(sol,
     xlabel="t",   #X軸のラベル
     ylabel="u, y",   #Y軸のラベル
     lw=2,           #線幅
     ls=:solid,        #線種
     legend=false,
     size=(300,230)   #プロットのサイズ     
)

t = 0:0.01:40;
u = 1*(t.>10);
plot!(t, u, lc=:red)
Out[2]:
In [ ]: