裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia の iterator

2021年01月18日 | ブログラミング

Python でも使われる enumerate(), zip() の他にもいろいろある。

julia> A = 1:5
julia> B = ["one", "two", "three", "four", "five"]

タプルで取り出す場合は,変数 1 個を使う。取り出した後はタプルとして使ってもよいし,ここの変数へバラしてから使ってもよい。

julia> for c in zip(A, B)
           a, b = c
           println("$c, $a, $b")
       end
(1, "one"), 1, one

(2, "two"), 2, two
(3, "three"), 3, three
(4, "four"), 4, four
(5, "five"), 5, five

各要素へ取り込む場合は,Python と異なり,(  ) でくくらないとエラーになる。

julia> for (a, b) in zip(A, B)
           println("$a, $b")
       end
1, one
2, two
3, three
4, four
5, five

enumerate() も,取り出し変数は (  ) でくくること。

julia> for (index, value) in enumerate(B)
           println("$index, $value")
       end
1, one
2, two
3, three
4, four
5, five

面白そうな iterator を一つあげておく。汎用の outer 関数を作るときに使えるかな??

julia> a = collect(Iterators.product(1:2, 3:5))
2×3 Array{Tuple{Int64,Int64},2}:
 (1, 3)  (1, 4)  (1, 5)
 (2, 3)  (2, 4)  (2, 5)

julia> println(a)
[(1, 3) (1, 4) (1, 5); (2, 3) (2, 4) (2, 5)]

julia> for x in a
           println(x)
       end
(1, 3)

(2, 3)
(1, 4)
(2, 4)
(1, 5)
(2, 5)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で微分,求解

2021年01月18日 | ブログラミング

某所で,sin(θ) + sqrt(3) * cos(θ) の最大値を求めよ。但し 0 ≦θ≦π/2。を解いていたのだが,中途半端だったので。

julia> using SymPy

julia> @syms θ f
(θ, f)

julia> f = sin(θ) + sqrt(3) * cos(θ)
sin(θ) + 1.73205080756888⋅cos(θ)

julia> x = solve(diff(f)) # 微分して 0 になるときの x の値を求める
1-element Array{Sym,1}:
 0.523598775598298 # π/6

julia> f.subs(θ, x[1]) # 元の式に代入すればその時の値(最大値)が求まる。
2.00000000000000

julia> simplify(diff(f))
-1.73205080756888⋅sin(θ) + cos(θ)

julia> using Plots # 図を描いて確認する

julia> g(x) = sin(x)+sqrt(3)*cos(x) # 元の式
g (generic function with 1 method)

julia> h(x) = -sqrt(3)*sin(x)+cos(x) # 微分した式
h (generic function with 1 method)

julia> xax = 0:0.01:pi/2
0.0:0.01:1.57

julia> plot(xax, g.(xax), label="sin(θ) + sqrt(3) * cos(θ)") # 元の式(水色)

julia> plot!(xax, h.(xax), label="-sqrt(3)*sin(θ) + cos(θ)") # 微分した式(赤)

julia> vline!([x], lw=0.3, label="") # 微分した式が 0, 元の式が最大値になるときの x を通る垂直線

julia> hline!([0.0], lw=0.3, label="") # x 軸

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で微分

2021年01月18日 | ブログラミング

うう〜ん。これって,Python の sympy 使ってるだけだよな〜〜〜

θによる媒介変数表示

x = sin θ
y = -log tan(θ/2) - cos θ   (0 < θ < π/2)

θ=π/3 における d2y / dx2 の値を求めよ。log は自然対数関数。

using SymPy

@syms a t u x y z
x = sin(t)
y = -log(tan(t/2)) - cos(t)
z = diff(diff(y)/diff(x))/diff(x)
u = simplify(z)
a = subs(u, t, pi/3)
round(Int, N(10a - a)) // 9

答え 8//3

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村