裏 RjpWiki

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

続・ベクトルの内積関連の問題を Julia の SymPy で解く

2021年11月21日 | ブログラミング

ベクトルの内積関連の問題を 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))]

でもよい。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 高次方程式・恒等式関連の問... | トップ | SymPy/Julia(1) »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事