[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:003927] Re: 等間隔格子データでの微分メソッドの異常
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:003927] Re: 等間隔格子データでの微分メソッドの異常
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>
- Date: Sun, 07 Feb 2016 11:44:58 +0900
松葉さま:
> > 等間隔格子にもかかわらず GPhys#cderiv と GPhys#threepoint_O2nd_deriv とで
> > 結果が全然異なってくる事例に遭遇しましたので,ご報告いたします.
問題がわかりました。使われたデータは座標軸が4バイト整数で
1167372000, 1167375600, 1167379200, ... (3600間隔)となってます。
これはかなり大きな値で,2倍するだけで4バイト整数の範囲を
超えてしまいます。
両演算は等間隔のとき,数学的には一致するわけですが,計算
の仕方は違うので,こんなところから違いがでてくるというわけです。
# NArray 同士の演算はキャストされますが,座標だけについての
演算もあります。実はその中に座標軸の延長に関連して2倍する
演算があって,オーバーフローして負の値が発生した模様です。
このような大きな値の座標値を使う場合は,後々演算することを
考えて倍精度実数にしておくのが安全です。
とは言え,このような場合はあるわけですので対策はしておき
ました。具体的には lib/numru/derivative.rb 内で座標値を
入れる配列 x に対し,次のような操作を行うようにしました
(zは微分対象)。
x = x - x[0]
x = x.to_type(z.typecode) if (x.typecode < z.typecode)
git レポジトリにはコミットしました。これを使うか,
座標軸を倍精度化をすればいいです。(いずれに
しても後者はしたほうがいいと思いますが。)
堀之内
> 松葉さま:
>
> ご指摘ありがとうございます。いまちょっと立て込んでしまって
> ますが,こちらに取り組めるようになったら検討します。
> しばしお待を。
>
> > 堀之内さま,電脳 Ruby のみなさま:
> > 京都大学 気象学研究室 M1 の松葉と申します.
> >
> > 等間隔格子にもかかわらず GPhys#cderiv と GPhys#threepoint_O2nd_deriv とで
> > 結果が全然異なってくる事例に遭遇しましたので,ご報告いたします.
> >
> > 今回の描画に使用したデータ (NetCDF) とスクリプト,その実行結果の図を添付します.
> > GPhys#cderiv を用いた方が正しい結果です (自作した前進差分のメソッドで確認済).
> > 桁で合わないし,なにより変動のパターンが上下逆転してしまっています.
> >
> > 何か使い方が間違っているか,バグか,データ側の問題か,のいずれかだとは思うのですが,
> > どういうときに結果が一致しないのかが不明で困っています.当面は GPhys#cderiv を用いる
> > 方向で回避していますが,原因がわかりますと大変幸いです.
> >
> > なお,用いた GPhys のバージョンは 1.4.3 で,Ruby のバージョンは 1.8.7 です.
> > お手数おかけしますが,よろしくお願いいたします.
> >
> > --
> > 松葉 史剛 (Fumitaka MATSUBA)
> > 京都大学大学院 理学研究科 地球惑星科学専攻
> > 地球物理学教室 気象学研究室 M1
> > E-mail: matsuba@xxxxxxxxxxxxxxxxxx
>
> 堀之内 武
> 北海道大学 地球環境科学研究院 地球圏科学部門
> 〒060-0810 札幌市北区北10条西5丁目
>
堀之内 武
北海道大学 地球環境科学研究院 地球圏科学部門
〒060-0810 札幌市北区北10条西5丁目