数値解析日記

数値解析関係のネタ帳。C++,pythonなど

pythonの区間演算ライブラリ進捗2015-09-22

成果

  • interval型の配列をplotする plotinfsup,plotlengthを作成した。

反省

  • しかし、実装がとても汚いので、公開には遠い
  • 理想はplotinfsup(x,y)でplotできるようにすること

とある場所で進捗を発表したら、フィードバックがあったので。

今後の方針

行列の実装

plotinfsup(x,y)やplotlength(x,y)を実装するにしても、他のことをやるにしても、行列の実装は避けられない。
しかし、高速に行列演算を実行するnumpyのndarrayクラスは、あらかじめ決められた型でしか利用することができない。
自分でBLASを使って書くことは不可能に近いので、ndarrayクラスを利用して書いていくことになる。改善案として、以下の2つを考えた。

  1. 新しいinterval型arrayクラスを作成し、内部にndarrayクラスの行列を格納する。
    内部にintervalarray.infarray,intervalarray.suparrayという、double型のndarray配列を用意し、格納する。
    しかし、以下のような問題が発生する。
  • 確保するメモリの最適化
    infarray,suparrayのように二つに分割すると、連続したメモリ領域を確保することができない。大きく配列を確保して、分割する方法でも可能だが、
  • 計算順序の複雑化
    悪夢
  1. numpyのソースを書き換える。またはnumpyを継承して、interval型を追加する。
    numpyのソースをダウンロードして、ソースを少し見たらSAN値が下がって、一時的狂気に陥った。
    ソースを読む手間や作業量を考えると、効率が悪いように見える。C++のテンプレート機能が恋しくなった。

pythonの区間演算ライブラリ進捗2015-09-09

  • interval型の四則演算は加減乗まで完成。
  • 丸め方向問題は柏木雅英先生の無誤差変換を用いた方向付き丸めのエミュレートを利用することにした。クラス roundfloat型の中に丸め方向を指定した加算乗除の計算関数を実装。
  • str( )などの関数は未実装
  • 肝心要のplot関係の機能は未実装

pythonの区間演算ライブラリで実装したいものリスト

今期はMATLAB(Octave)で作業する時間が多かったので、すぐプロットしたりプレビューできる環境にハマってしまった。そこでpythonを用いて、似たようなものが作れないかとやってみる。

目指すべき特徴

  • python3.4.3をサポート
    • RaspberryPi上で動けば完璧だが、ARMかつ、32bitな環境でどこまでいけるか不明。
  • matplotlibのplotへの容易な受け渡し
    • spyderにも対応したいが、spyderでpython3.4.3が動くのか謎。ggってみたら、ubuntuではできるらしい。

というかmatplotlibのplotに簡単に渡せればそれで良い。

基本的なもの

interval型

  • 数値 inf
  • 数値 sup
    • todo:アクセサーをどうするか考える
      • GetInf(),GetSup()
      • lower(),upper()

interval型の四則演算

  • 関数 __add__ 和
  • 関数 __sub__ 差
  • 関数 __div__ 積
  • 関数 __mul__ 除

ここらへんはオーバーロードする関数

出力関係

  • 関数 __repr__
  • 関数 __str__

ここまでを4-5日以内に終わらせる。
やるべきことはわかっているものの、pythonに慣れていないので時間がかかりそうだ。

数学関数関連

todo:python標準のmathライブラリーをすべてオーバーロードすべきか考える。

丸め関連

これが一番の鬼門になる。単純なSuccPredで実装しても良いが、もう少し精度の良い方法を闇を見てでも採用したい。今のところtwosum,twoproductを用いる方法が良いようだ。

今後実装したい(すべき)もの

  • interval関連のユーティリティ
    • whole( )などの区間演算用の関数を作る
  • 将来的にはDockerで簡単に導入できるようにして、レンタル鯖借りれば数値解析が簡単に数値計算が可能になると嬉しい