ベクトルの内積関連の問題を Julia の SymPy で解く
https://blog.goo.ne.jp/r-de-r/e/cd7d0c0701c2541aa17d5943fe6e482b
の問題 2 の (2) で,「a = [1, 1], b = [1-√3, 1+√3] の b の定義で直接 sqrt(3) を使うと,数値解を求めようとするので,それを避けるために変数 x を用いて sqrt(x) とする。」などと書いてしまったが,誤ったことを書いてしまった。
ちゃんとやればちゃんとできる。SymPy 公式サイトの文書をよく読んだら(というか,最初の方に)解決法は書いてあった。
sqrt(3) では,Base の sqrt が呼ばれてしまうので,数値解になってゆく。
ついでに,関数を内包していく書き方ではなく,パイプ |> を使ってみる。
using SymPy
u = sqrt(3)
"u = $u, typeof(u) = $(typeof(u))" |> println
u = 1.7320508075688772, typeof(u) = Float64
ここは,sympy.sqrt(3) として,Sym オブジェクトの √3 にしなければならない。
v = sympy.sqrt(3)
"v = $v, typeof(v) = $(typeof(v))" |> println
v = sqrt(3), typeof(v) = Sym
ということで,正解は以下のとおりである。
a = Sym[1, 1]
b = Sym[1-sympy.sqrt(3), 1+sympy.sqrt(3)]
"a = $a\nb = $b" |> println
a = Sym[1, 1]
b = Sym[1 - sqrt(3), 1 + sqrt(3)]
acos((a'*b)./(sqrt(a'*a)*sqrt(b'*b))) |> println
acos(sqrt(2)/sqrt((1 - sqrt(3))^2 + (1 + sqrt(3))^2))
もう少し簡約化するために simplify を使う。
acos((a'*b)./(sqrt(a'*a)*sqrt(b'*b))) |> simplify |> println
pi/3
閉じカッコに気をつけなくてもよいので,統一感も必用だが,使えるときにはパイプもよいかな。
なお,b の定義のとき,
b = Sym[1-sqrt(Sym(3)), 1+sqrt(Sym(3))]
でもよい。
※コメント投稿者のブログIDはブログ作成者のみに通知されます