背景
Scalaの入門がてら連立方程式を解いてみた。
が、特殊な解の判定方法で悩んだのでメモメモ
解き方
解き方については参考させていただいたサイトに詳しく書いているので、省略する。
ざっというと連立方程式とは行列の演算を利用して解ける。
また、Scalaの線形代数のライブラリにBreezeというものがあるので、
これで用いて演算してみる
Breezeを用いると、ベクトルをDenseVectorオブジェクトで表現できる
計算自体は(以下サイト参考にすれば)割と簡単にできるのだが、
与えられた式によっては解のない場合及び解が複数ある場合がある。
解のない場合。
x + y = 1
x + y = 2
当然、上記両方満たすx,yは存在しない
これを計算すると
x = -Infinity, y = Infinityとなる。
判定方法は
if (x.isInfinite)
解が複数ある場合。
x + y = 1
2x + 2y = 2
上記両方満たすx,yは無数に存在する
(実は等価の方程式であるから)
これを計算すると
x = NaN, y = NaNとなる。
判定方法は
if (x.equals(Double.NaN) && y.equals(Double.NaN) )
どうでもいいけど、解がない時はinfinityで、複数ある時はNaNになるって、イメージとは逆
参考サイト
参考にさせていただきました。ありがとうございます。
http://modegramming.blogspot.jp/2016/05/breeze.html
https://qiita.com/TakashiOshikawa/items/20ba0e50d59b1b5ef93c