説明

常微分方程式を解くための方法、プログラム及びシステム

【課題】連立常微分方程式の計算量を低減する。
【解決手段】ルンゲ・クッタ・フェールベルク法などの埋め込み型ルンゲ・クッタ法によって、連立常微分方程式の個々の常微分方程式を解く際に、次数Nの計算項と、次数N+1の計算項の差Δを計算して、その差が所定の閾値Δ0よりも小さいかどうか判断し、もしΔ=<Δ0であるなら、Δ0/Δで決まる所定の計算式に従い、ステップ・サイズを決定して次の計算に進み、Δ>Δ0となったエラーを生じた常微分方程式を計算するストランドのみに再計算が命じられる。再計算のストランドには、Δ0/Δで決まるステップ・サイズがセットされる。そこから、補間値で以って再計算することにより、エラーが所定の閾値Δ0よりも小さくなると、エラーを生じていない他の常微分方程式を計算するストランドとの足並みが揃うので、次に連立常微分方程式全体の計算が進められる。

【発明の詳細な説明】
【技術分野】
【0001】
この発明は、コンピュータを利用したシミュレーション・システム等において使用される常微分方程式を解くための方法、プログラム及びシステムに関し、特に、常微分方程式を解くための計算を高速化し、あるいは計算量を減らすための技法に関するものである。
【背景技術】
【0002】
従来より、科学技術計算、シミュレーションなどの分野で、コンピュータが利用されている。
【0003】
最近になって特に盛んに開発されるようになってきたシミュレーションの分野として、ロボット、自動車、飛行機などのメトカトロニクスのプラントのシミュレーション用ソフトウェアがある。電子部品とソフトウェア技術に発展の恩恵により、ロボット、自動車、飛行機などでは、神経のように張り巡らされたワイヤ結線や無線LANなどを利用して、大部分の制御が電子的に行われる。
【0004】
それらは、本来的には機械的装置であるのに、大量の制御ソフトウェアをも内蔵している。そのため、製品の開発に当たっては、制御プログラムの開発とそのテストに、長い時間と、膨大な費用と、多数の人員を費やす必要が出てきた。
【0005】
このようなテストにために従来行われている技法として、HILS(Hardware In the Loop Simulation)がある。特に、自動車全体の電子制御ユニット(ECU)をテストする環境は、フルビークルHILSと呼ばれる。フルビークルHILSにおいては、実験室内で、本物のECUが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ECUからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【0006】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、ソフトウェアで構成する手法が提案されている。この手法は、SILS(Software In the Loop Simulation)と呼ばれ、ECUに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオ、エンジンやトランスミッションなどのプラントを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ECUのハードウェアが存在しなくても、テストを実行可能である。
【0007】
このようなSILSの構築を支援するシステムとして例えば、MathWorks社から入手可能なシミュレーション・モデリング・システムである、MATLAB(R)/Simulink(R)がある。MATLAB(R)/Simulink(R)を使用すると、図1に示すように、画面上にグラフィカル・インターフェースによって、矩形で示す機能ブロックを配置し、矢印のようにその処理の流れを指定することによって、シミュレーション・プログラムを作成することができる。これらのブロック線図は、シミュレーションの1タイムステップ分の処理を表しており、これが所定回繰り返されることにより、シミュレーション対象となるシステムの時系列における振る舞いを得ることができる。こうして、MATLAB(R)/Simulink(R)上で、機能ブロックなどのブロック線図が作成されると、Real-Time Workshop(R)の機能により、等価な機能のC言語など既知のコンピュータ言語のソース・コードに変換することができる。このC言語のソース・コードをコンパイルすることにより、別のコンピュータ・システムで、SILSとして、シミュレーションを実行することができる。
【0008】
そこで、図2に示すように、機能ブロックを、A、B、C及びDのように、機能ブロックの複数の集合に分け、それらをCPUによって計算する技法が従来より実施されている。
【0009】
このようにして、機能ブロックの個々の集合毎のコードをコンパイルして実行可能コードを生成し、プロセッサ上で実行させることができる。
【0010】
そのような実行コードを、コンピュータ・システムの上で走らせて、シミュレーションの結果を得るということは、多くの場合、コンピュータ・システムに、微分方程式を解かせることに帰着される。特に、自動車やロボットなどのメトカトロニクスと呼ばれるシステムでは、解くべき微分方程式は、電気回路の応答システム、電子回路のフィードバック制御システム、機械的な力学方程式など、常微分方程式で記述され、従って、シミュレーションの結果を得るためには、コンピュータ・システムによって、連立常微分方程式を解く必要がある。そのような連立常微分方程式は、次のように定式化される。
y'(t) = f(t,y(t))
【0011】
但しここで、tは時間、y'(t)は時間tに関する一階微分であり、
yとfは一般的にはn次元ベクトルであり、
y(t) ≡ (y[1](t), y[2](t), ..., y[N](t))T
f(t,y(t)) ≡ (f[1](t,y(t)), f[2](t,y(t)), ...,f[N](t,y(t)))T
これは、y, f ∈ RNとも書かれる。
【0012】
すなわち、並べて書くと、
y'[1](t) = f[1](t,y(t))
y'[2](t) = f[2](t,y(t))
y'[3](t) = f[3](t,y(t))
...
y'[N](t) = f[N](t,y(t))
という連立常微分方程式になる。
典型的には、上記の1つの機能ブロックの集合に対するコードがそれぞれ、y'[i](t) = f[i](t,y(t)) (但し、i = 1,...,N)という1つの式の右辺に対応する。この明細書では、その計算処理の単位をストランドと呼ぶことにする。
【0013】
より高速なシミュレーションを達成するために、使用するコンピュータとして高性能のものを用いるだけではなく、より合理的な計算量の計算アルゴリズムを使用するという要望が強い。
【0014】
これに関して、コンピュータ上の数値計算により近似的に常微分方程式を解くためのアルゴリズムとして、ルンゲ・クッタ(Runge-Kutta)法が知られている。これは、1900年に考案されたものであり、計算のステップは固定であり、応用例によっては、計算精度の点で、十分でない場合があった。
【0015】
その後、計算精度と計算速度の両立のため、1960年代に、適応的に可変ステップを用いるルンゲ・クッタ・フェールベルク(Runge-Kutta-Fehlberg)法が考案された。ここでは、説明の便宜上、y'(t) = f(t,y(t))を1変数の場合に見立てて、ルンゲ・クッタ・フェールベルク法を説明する。すなわち、ここでは、y(t)も、f(t,y(t))もスカラーである。
【0016】
ルンゲ・クッタ・フェールベルク法のうち、特に、例として、ODE45として知られているスキームについて説明する。ここで、ODEとは、ordinary differential equation = 常微分方程式の略である。
【0017】
xnを時間、
ki(但し、i = 1,...,6)を中間変数、
hをステップ・サイズ(但し、これは定数でなく変数)、
ai, bij, ci,c*i (ここで、i,jは添字)を所定の定数とすると、
k1 = hf(xn,yn)
k2 = hf(xn+a2h,yn+b21k1)
k3 = hf(xn+a3h,yn+b31k1+b32k2)
k4 = hf(xn+a4h,yn+b41k1+b42k2+b43k3)
k5 = hf(xn+a5h,yn+b51k1+b52k2+b53k3+b54k4)
k6 = hf(xn+a6h,yn+b61k1+b62k2+b63k3+b64k4+b65k5)
【数1】

【0018】
ルンゲ・クッタ・フェールベルク法においては、計算精度を所望以内に保つために、上記のようにして計算された誤差Δが、所定の閾値Δ0の範囲内かどうかが判断され、もしそうなら、上記の式により、ステップh0が計算され、それが次のループのステップとなる。
【0019】
もし、上記のようにして計算された誤差Δが、所定の閾値Δ0の範囲を超えると、ルンゲ・クッタ・フェールベルク法においては、エラーと見なして、もともと使用されたステップhよりも小さいステップに変えて、計算がやり直される。
【0020】
ところが、y'(t) = f(t,y(t))、y, f ∈ Rnという連立常微分方程式においては、y(t)は実は、y[1](t), y[2](t), ..., y[n](t)を含むため、例えば、y'[i](t) = f[i](t,y(t)) (iは、1からnまでの間のある数)でのみ上記のエラーが生じたとしても、y'(t) = f(t,y(t))、y, f ∈ RN全体の計算のやり直しが必要となる。このようなy'(t) = f(t,y(t))全体の計算のやり直しは、やり直しが多く発生する場合や、全体の計算量が大きい場合には、とても大きいオーバーヘッドとなる。
【0021】
特開平5−334337号公報は、常微分方程式の並列処理方式において、マルチプロセッサ環境下で、異なる初期刻み幅を複数プロセッサの各々に割付け、数値積分部で近似値を求め、局所的誤差計算部で局所的誤差を、許容誤差計算部で許容誤差を求め、この二つの誤差の関係から、刻み幅調節部で各プロセッサの刻み幅を調節すると共に、評価装置では複数プロセッサで処理された刻み幅の最大値を選択して各プロセッサに再設定することを開示する。
【0022】
W. H. Enright, K. R. Jackson, S. P. Norsett, P. G. Thomsen, "Interpolants for Runge-Kutta formulas" ACM Transactions on Mathematical Software, Volume 12, Issue 3 (September 1986) は、ルンゲ・クッタ法及び、ルンゲ・クッタ・フェールベルク法における補間式を構成する方法について記述する。
【先行技術文献】
【特許文献】
【0023】
【特許文献1】特開平5−334337号公報
【非特許文献】
【0024】
【非特許文献1】W. H. Enright, K. R. Jackson, S. P. Norsett, P. G. Thomsen, "Interpolants for Runge-Kutta formulas" ACM Transactions on Mathematical Software, Volume 12, Issue 3 (September 1986)
【発明の概要】
【発明が解決しようとする課題】
【0025】
上記従来技術は、コンピュータによる常微分方程式の計算における、刻み量あるいは補間量の計算技法については記述するものの、ルンゲ・クッタ法または、ルンゲ・クッタ・フェールベルク法等に従い、連立常微分方程式を解く際の計算量の低減技法については、示唆するものではない。
【0026】
従って、本発明の目的は、シミュレーション・システムなどで使用される連立常微分方程式をコンピュータで解く計算処理において、計算量を低減する技法を提供することにある。
【課題を解決するための手段】
【0027】
本発明は、上記課題を解決するためになされたものであり、以下に記述する処理によって、コンピュータによる連立常微分方程式の計算量を低減させる。
【0028】
本発明は、上記背景技術で述べた、ルンゲ・クッタ・フェールベルク法などの埋め込み型ルンゲ・クッタ法を用いた、コンピュータによる常微分方程式の数値解法を前提とする。すなわち、連立常微分方程式の個々の常微分方程式を解く際に、次数N(Nは所定の整数)の計算項と、次数N+1の計算項の差Δを計算して、その差が所定の閾値Δ0よりも小さいかどうか判断し、もしΔ =< Δ0であるなら、Δ0/Δで決まる所定の計算式に従い、ステップ・サイズを決定して、次の計算に進む。ここまでは、従来のルンゲ・クッタ・フェールベルク法による連立常微分方程式の計算方法と同じである。
【0029】
ところが、次数Nの計算項と、次数N+1の計算項の差Δが閾値Δ0よりも大きい場合に、本発明の計算処理は異なる。すなわち、従来技術では、連立常微分方程式を構成する常微分方程式のうちの1つでもエラーになると、ステップを戻って、ステップ・サイズを減らし、連立常微分方程式全体の計算をやり直す必要があった。
【0030】
しかし、本発明においては、連立常微分方程式を構成する常微分方程式のうち、Δ > Δ0となったエラーを生じた常微分方程式を計算するストランドに再計算が命じられる。再計算のため、エラーを生じたストランドには、Δ0/Δで決まるステップサイズがセットされ、その分だけ時間ステップが先に進む。そこから更に、再計算を行っていない他のストランドのステップに追いつくまで時間ステップを進めるためには、再計算を行っているストランドに関連する他のストランドの計算結果の、当該ステップ開始時点での値が必要となる。この値は、再計算を行っていない他のストランドの計算を再実行するのではなく、他のストランドの前回ステップにおける値と、最終ステップにおける値との補間値として計算される。
【0031】
そのような常微分方程式の補間値の好適な計算アルゴリズムは、上述のW. H. Enright, K. R. Jackson, S. P. Norsett, P. G. Thomsen, "Interpolants for Runge-Kutta formulas" ACM Transactions on Mathematical Software, Volume 12, Issue 3 (September 1986)に記述されている。しかし、本発明で利用可能な補間値の計算アルゴリズムは、これには限定されず、所望の精度を満たす任意の補間値の計算アルゴリズムを使用することができる。
【0032】
補間値で以って再計算することにより、エラーを生じた常微分方程式を計算するストランドにおいて、エラーを所定の閾値Δ0よりも小さく保ちながら、エラーが十分少なかった他のストランドと足並みが揃うように、時間ステップを進める。その後、連立常微分方程式全体の計算が進められる。
【発明の効果】
【0033】
この発明によれば、コンピュータによる、ルンゲ・クッタ・フェールベルク法などの埋め込み型ルンゲ・クッタ法に従う連立常微分方程式を計算する際に、閾値よりも大きい誤差を生じたストランドのみ再計算すればよくなるので、計算量が減り、処理を高速化することが可能となる。
【図面の簡単な説明】
【0034】
【図1】機能ブロックの例を示す図である。
【図2】機能ブロックのストランド作成の例を示す図である。
【図3】ハードウェア構成を示すブロック図である。
【図4】論理構成の機能ブロック図である。
【図5】連立常微分方程式を並列処理で計算するステップを示す概要フローチャートである。
【図6】ODE45のスキームに本発明を適用した処理で常微分方程式を解く処理を示すフローチャートである。
【図7】連立常微分方程式を並列処理で計算する際の、補間値のタイミングを示す図である。
【発明を実施するための形態】
【0035】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【0036】
図3を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス302には、CPU304と、主記憶(RAM)306と、ハードディスク・ドライブ(HDD)308と、キーボード310と、マウス312と、ディスプレイ314が接続されている。CPU304は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標) 2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶306は、好適には、1GB以上の容量、より好ましくは、2GB以上の容量をもつものである。
【0037】
ハードディスク・ドライブ308には、オペレーティング・システムが、格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows 7、Windows XP(商標)、Windows(商標)2000、アップルコンピュータのMac OS(商標)などの、CPU304に適合する任意のものでよい。
【0038】
ハードティスク・ドライブ308にはさらに、MATLAB(R)/Simulink(R)、Cコンパイラまたは、C++コンパイラ、後述する本発明に係る解析、ストランド作成のためのモジュール、CPU割り当て用コード生成モジュールなどが格納されており、オペレータのキーボードやマウス操作に応答して、メイン・メモリ306にロードされて実行される。
【0039】
尚、使用可能なシミュレーション・モデリング・ツールは、MATLAB(R)/Simulink(R)に限定されず、オープンソースのScilab/Scicosなど任意のシミュレーション・モデリング・ツールを使用することが可能である。
【0040】
あるいは、場合によっては、シミュレーション・モデリング・ツールを使わず、直接、C、C++などでシミュレーション・システムのソース・コードを書くことも可能であり、その場合にも、個々の機能の少なくとも一部が、常微分方程式の計算として記述できるなら、本発明は適用可能である。
【0041】
キーボード110及びマウス112は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、シミュレーションを開始したり、所定の式のパラメータを提供するために使用される。
【0042】
ディスプレイ314は、連立常微分方程式の解としてのシミュレーションの挙動を、適宜表示するために使用される。
【0043】
図4は、本発明の実施例に係る一実施例の機能ブロック図である。各々のブロックは、基本的に、ハードティスク・ドライブ308に格納されている。
【0044】
図4において、シミュレーション・モデリング・ツール402は、MATLAB(R)/Simulink(R)、Scilab/Scicosなどの既存の任意のモデリング・ツールを使用することができる。シミュレーション・モデリング・ツール402は、基本的には、オペレータが、ディスプレイ314上でGUI的に機能ブロックを配置し、数式など必要な属性を記述し、必要に応じて、機能ブロック間を関連付けてブロック線図を記述することを可能ならしめるような機能をもつ。シミュレーション・モデリング・ツール402はさらに、記述されたブロック線図に等価な機能を記述するCのソースコードを出力する機能をもつ。C以外にも、C++、FORTRANなどを使用することができる。特に、MDLファイルは、Simulink(R)独自のフォーマットであり、機能ブロック間の依存関係を記述するために、MDLファイルを生成することができる。
【0045】
なお、シミュレーション・モデリング・ツールは、別のパーソナル・コンピュータに導入して、そこで生成されたソース・コードを、ネットワークなどを経由して、ハードティスク・ドライブ316にダウンロードするようにすることもできる。
【0046】
こうして出力されたソース・コード404は、ハードティスク・ドライブ308に保存される。なお、ソース・コード404以外に、機能ブロック間の依存関係を記述するためのMDLファイルを保存してもよい。
【0047】
解析モジュール406は、ソースコード404を入力して構文解析し、ブロックのつながりを、グラフ表現に変換する。グラフ表現のデータは、好適には、ハードディスク・ドライブ316に格納される。なお、コンピュータ上のグラフ表現のデータ構造は周知であるので、ここでは説明を省略する。
【0048】
ストランド作成モジュール408は、解析モジュール406によって作成されたグラフ表現を読み取って、これには限定しないが、次のような方法で、各積分ブロックごとにストランドを構成する。すなわち、ブロック線図中の各積分ブロックごとに、その積分ブロックからフローの順方向に辿って、再び(自身および他の)積分ブロックが辿られるまでの全てのブロックの集合を見つけ、そのブロックの集合を一つのストランドとする。この操作は、ブロック線図から各常微分方程式を取り出すことに相当する。
【0049】
コード生成モジュール410は、ストランド作成モジュール408が生成したストランドの情報に基づき、コンパイラ412がコンパイルするためのソースコードを生成する。コンパイラ412が想定するプログラミング言語としては、好適にはC、C++、C#、Java(商標)などの任意のプログラミング言語を使用することができ、コード生成モジュール410はそれに対応して、ストランド毎に、ソースコードを生成することになる。
【0050】
コンパイラ412が生成した実行可能バイナリ・コード(図示しない)は、ストランド毎に、オペレーティング・システムの作用により、実行環境414で実行される。
【0051】
本発明においては、シミュレーションの処理全体は、下記のような、N個の常微分方程式からなる、連立常微分方程式として記述される。
【0052】
y'(t) = f(t,y(t)) y, f ∈ RN
【0053】
但しここで、tは時間、y'(t)は時間tに関する一階微分であり、
yとfは一般的にはn次元ベクトルであり、
y(t) ≡ (y[1](t), y[2](t), ..., y[N](t))T
f(t,y(t)) ≡ (f[1](t,y(t)), f[2](t,y(t)), ...,f[N](t,y(t)))T
【0054】
並べて書くと、
y'[1](t) = f[1](t,y(t))
y'[2](t) = f[2](t,y(t))
y'[3](t) = f[3](t,y(t))
...
y'[N](t) = f[N](t,y(t))
という連立常微分方程式になる。
典型的には、上記の1つのストランドが、y'[i](t) = f[i](t,y(t)) (但し、i = 1,...,N)という1つの式の右辺に対応する。
【0055】
すなわち、個々のストランドが、連立常微分方程式のうちの1つの常微分方程式である、y'[i](t) = f[i](t,y(t))に関する右辺の数値計算を実行する処理を行う。
【0056】
なお、シミュレーションの基礎となる制御理論によれば、制御系の特性方程式や応答関数は、ラプラス変換のパラメータsで記述され、これらは多くの場合常微分方程式に帰着されるので、シミュレーション・モデルを連立常微分方程式で記述するというこの実施例の前提は、十分に一般性を有すると言える。
【0057】
図5は、実行環境414で、コンパイラ412によって生成された実行可能モジュール(図示しない)が、連立常微分方程式を解くための数値計算を実行する処理を示す概要フローチャートである。
【0058】
図5の処理を実行するために、この実施例によれば、ストランドに対応する個々の常微分方程式を解くための個別のコード以外に、全体の処理を統合する実行コード(図示しない)が生成される。
【0059】
図5のステップ502において、管理用の実行コードは、y'(t) = f(t,y(t)) y, f ∈ RNという連立常微分方程式における、t=t0での初期値y(t0)を与える。これは実際は、実行させるシミュレーションに応じて、オペレータが事前にセットしておくものである。
【0060】
ステップ504では、管理用の実行コードは、個々のストランドの常微分方程式を解くストランド506_1、506_2、506_3、・・・、506_Nを一斉にスタートさせ、並列に動作させる。
【0061】
起動されると、ストランド506_1、506_2、506_3、・・・、506_Nは各々、本発明の特徴を含むODE45のスキームにより、常微分方程式を解く計算を行う。各々のストランド506_1、506_2、506_3、・・・、506_Nの処理の詳細は、図6のフローチャートで詳しく説明する。
【0062】
管理用の実行コードは、ステップ508で、ストランド506_1、506_2、506_3、・・・、506_Nが全て終了するのを待つ。というのは、ストランド506_1、506_2、506_3、・・・、506_Nは、計算量が同等とは限らず、また、本発明の特徴によれば、ストランド506_1、506_2、506_3、・・・、506_Nのどのストランドも、エラーが検出されたことに応答して再計算を行うことがあるので、その分、遅延する可能性があるからである。
【0063】
管理用の実行コードは、ステップ508で、ストランド506_1、506_2、506_3、・・・、506_Nの1ステップ分の計算ステップが終了したのを確認すると、ステップ510で、シミュレーションの終了かどうかの判断を行う。
【0064】
シミュレーションの終了は、オペレータの操作、予定したシナリオの終了、または予定時間経過などによって決定される。管理用の実行コードは、シミュレーションの終了でないと判断すると、ステップ504に戻り、次のステップの計算に進む。もしシミュレーションの終了であるなら、管理用の実行コードは、シミュレーションを終了させる。
【0065】
次に、図6のフローチャートを参照して、ストランド506_1、506_2、506_3、・・・、506_Nで個々に実行される計算処理について説明する。
【0066】
背景技術でも説明したが、この実施例では、ルンゲ・クッタ・フェールベルク法において、ODE45のスキームで、連立常微分方程式をコンピュータによる数値計算により解くものとする。なお、本発明は、ルンゲ・クッタ・フェールベルク法の特定の次数に限定されず、ODE34、ODE56などのその他のスキームも使用可能である。なお、ルンゲ・クッタ・フェールベルク法のより詳しい説明は、Ward Cheney, David Kincaid, "Numerical Mathematics and Computing", Brooks/Cole Pub Co; 6版 (2007/8/3) などを参照されたい。
【0067】
ステップ602では、図5のステップ502で設定された初期値が、この特定のストランドに対応する常微分方程式の処理条件としてセットされる。
【0068】
ステップ604では、シミュレーションの終了かどうかが判断され、もしそうなら、シミュレーションは終了される。ステップ604は実質的に、図5のステップ510と同一であるかまたは、連動する。
【0069】
シミュレーションの終了でないと判断されると、ステップ606に進み、ODE45のスキームに従い、計算が行われる。その具体的計算は次のとおりである。但し、ここでは、j番目のストランドに関連する、常微分方程式y'[j](t) = f[j](t,y(t))に着目するものとする。
【0070】
ここでは、x0 = xnとして、処理を開始する。
xnを時間、
ki(但し、i = 1,...,6)を中間変数、
hをステップ・サイズ(但し、これは定数でなく変数)、
ai, bij, ci,c*i (ここで、i,jは添字)を所定の定数とすると、
k1 = hf[j](xn,yn)
k2 = hf[j](xn+a2h,yn+b21k1)
k3 = hf[j](xn+a3h,yn+b31k1+b32k2)
k4 = hf[j](xn+a4h,yn+b41k1+b42k2+b43k3)
k5 = hf[j](xn+a5h,yn+b51k1+b52k2+b53k3+b54k4)
k6 = hf[j](xn+a6h,yn+b61k1+b62k2+b63k3+b64k4+b65k5)
【数2】

【0071】
ステップ608では、次の式により誤差Δが計算される。
【数3】

【0072】
ステップ610では、計算した誤差Δが、予め定めた閾値Δ0より大きいかどうか、判断される。
【0073】
ステップ610で、Δ > Δ0なら、ステップ612で、次の式により、hpを計算する。ただし、計算されたhpとx0を加えた値がxn+1を超える場合には、x0 + hp = xn+1とする。
【数4】

【0074】
次に、ステップ614では、次の式に従い、i = 1, .., Nの5次エルミート補間値U[i]が計算される。
【数5】


但し、
【数6】

【0075】
ここで、f[i]lは、次の式であらわされる。
【数7】

【0076】
さらに、
【数8】

【0077】
ところで、k1〜k6の右辺にあらわれるynは実際は、
yn ≡ yn(y[1],y[2],...,y[N])のように、
y[1],y[2],...,y[N]の関数である。
【0078】
そこで、数5で決定される補間式U[i](xn+hp)を、y[i]に置き換えて(但し、i = 1, ,,,, Nの各々に亘る)、ステップ616では、x0+hpから出発して、ステップ606と同様のODE45の計算が行われる。なお、補間式U[i](xn+hp)のより詳しい説明については、前述のW. H. Enright, K. R. Jackson, S. P. Norsett, P. G. Thomsen, "Interpolants for Runge-Kutta formulas" ACM Transactions on Mathematical Software, Volume 12, Issue 3 (September 1986)などを参照されたい。
【0079】
エラーを生じたストランドjは、対応するストランドi(但し、i = 1, ,,,, Nで、jは除く)にxn+hpを渡し、ストランドiが補間式U[i](xn+hp)を計算して、その値を、ストランドjに送り返してくるという処理により、ストランドjは、U[i](xn+hp)(但し、i = 1, ,,,, N)の値を集める。この処理は、図7に関連して、後で説明する。
【0080】
ステップ618では、ステップ608と同様の処理で誤差が計算され、ステップ620では、ステップ610と同様の処理で、誤差と閾値が比較され、誤差が閾値より大きいと判断されると、ステップ612に戻る。
【0081】
ステップ620で、誤差が閾値より小さいか閾値と等しいと判断されると、ステップ622に進む。
【0082】
ステップ622では、x0+hp < xn+1かどうかが判断され、そうであれれば、ステップ612に戻って、hpが再計算され、その再計算されたhpに基づき、ステップ614で補間値Uが計算され、ステップ616でODE45の計算が行われる。
【0083】
ルンゲ・クッタ・フェールベルク法の誤差式の性質により、ステップ610からステップ612に分岐した直後は必ず、ステップ622での判断はx0+hp < xn+1であり、その後、ステップ612、ステップ614、ステップ616、ステップ618、ステップ620、ステップ622のループが廻る毎にhpの値は次第に増加する。
【0084】
そうして、x0+hpがxn+1に等しくなると、ステップ624に進み、下記の式で次ステップhの計算をする。ここで、式右辺のhは、hpで読み替えるものとする。
【数9】

【0085】
ステップ626では、x0 = xn+1によって時間が進められ、ステップ628では、
状態y0が、yn+1で更新される。そして処理は、判断ステップ604に戻る。
【0086】
判断ステップ610に戻って、誤差Δが閾値Δ0に等しいか、閾値Δ0より小さい場合は、既に説明したステップ624、626、及び628を経て、判断ステップ604に戻る。
【0087】
図7は、ストランド1〜Nの動作を示す概要タイミング図である。ストランド1〜Nに対応する実行コードによる計算の結果、ストランドjだけが、エラー、すなわち、ステップ610で誤差Δ > 閾値Δ0となったとする。すると、ストランド1〜j−1と、ストランドj+1〜Nが、ステップ624、ステップ処理626、及びステップ628を経てxn+1に到達している一方で、ストランドjは、ステップ612から再計算の処理に入る。ストランドjは、ステップ614で補間値を計算するが、その際、自己充足的に計算できるのは自ストランドの補間値だけなので、その常微分方程式の右辺に現れるy[i]に対応するそれぞれのストランドに、x0+hpの値を渡して、それらのストランドから、計算された補間値を受け取る。それぞれのストランドでは、ステップ614で説明した補間の計算式が用いられる。
【0088】
図7では、そのようにして、対応するそれぞれのストランドで計算された補間値は、それぞれ、y*[1]n,y*[2]n,...,y*[N]nとして示されている。
【0089】
再計算のため、対応するそれぞれのストランドは、ストランドjに補間値を通信するが、それ以外は、ストランドjだけが再計算のループを廻すので、それぞれのストランドにはほとんど計算の負荷がかからない。
【0090】
こうして、ストランドjだけが再計算を終了すると、図5のステップ508で、ストランドjが他のストランドとステップを合わせることになり、次のステップを計算する準備ができたことになる。尚、ストランドjのステップを揃えるための計算は、実質的に、ステップ612で実行される。
【0091】
以上、特定の実施例に基づき本発明を説明してきたが、これには限定されず、例えば、ルンゲ・クッタ・フェールベルク法は、ODE45以外に、ODE34、ODE56など、任意の次数のスキームを使用することができる。その際の補間の計算式は、例えば、前述のW. H. Enright, K. R. Jackson, S. P. Norsett, P. G. Thomsen, "Interpolants for Runge-Kutta formulas" ACM Transactions on Mathematical Software, Volume 12, Issue 3 (September 1986)に記載されている式から計算することができる。
【0092】
また、本発明は、ルンゲ・クッタ・フェールベルク法に限定されず、それを一般化した埋め込み型ルンゲ・クッタ法、例えば、Dormand prince法にも適用可能である。
【0093】
さらに、補間の計算式は、実施例に示されている5次のエルミート補間式に限定されず、必要な精度を満たすものであるなら、線形補間など、ニュートンの補間式など、任意の補間式を用いることができる。
【0094】
また、上記実施例は、シングル・プロセッサを例として説明されたが、これには限定されず、本発明の技法は、マルチプロセッサ、マルチコアなどの複数のCPUをもつシステムにでも同様に適用することができる。
【符号の説明】
【0095】
316 ハードディスク・ドライブ
402 シミュレーション・モデリング・ツール
404 ソース・コード
406 解析モジュール
404 ソースコード
408 ストランド作成モジュール
410 コード生成モジュール
412 コンパイラ
414 実行環境

【特許請求の範囲】
【請求項1】
コンピュータの処理により、埋め込み型ルンゲ・クッタ法を用いて連立常微分方程式を解くための方法であって、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、次数N(Nは所定の整数)の状態値と次数N+1の状態値の間の誤差を値を計算するステップと、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記誤差が所定の閾値を超えたことに応答して、前記誤差と前記閾値とから、ステップ・サイズを計算するステップと、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズに対応する補間値を計算するステップと、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズと、前記補間値を用いて、再計算するステップを実行させるステップとを有する、
常微分方程式を解くための方法。
【請求項2】
前記前記誤差が所定の閾値を超えたことに応答して、前記計算されたステップ・サイズを以って、前記連立常微分方程式の他の常微分方程式の計算式から前記補間値の計算値を受け取るステップをさらに有する、
請求項1の方法。
【請求項3】
前記埋め込み型ルンゲ・クッタ法が、ODE45である、請求項2の方法。
【請求項4】
前記埋め込み型ルンゲ・クッタ法が、ルンゲ・クッタ・フェールベルク法である、請求項1の方法。
【請求項5】
前記補間式が、5次エルミート補間式である。請求項3の方法。
【請求項6】
コンピュータの処理により、埋め込み型ルンゲ・クッタ法を用いて連立常微分方程式を解くためのプログラムあって、
前記コンピュータをして、
前記連立常微分方程式の各常微分方程式毎に、次数N(Nは所定の整数)の状態値と次数N+1の状態値の間の誤差を値を計算するステップと、
前記連立常微分方程式の各常微分方程式毎に、前記誤差が所定の閾値を超えたことに応答して、前記誤差と前記閾値とから、ステップ・サイズを計算するステップと、
前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズに対応する補間値を計算するステップと、
前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズと、前記補間値を用いて、再計算するステップを実行させるステップ、
とを実行させる、
常微分方程式を解くためのプログラム。
【請求項7】
前記前記誤差が所定の閾値を超えたことに応答して、前記計算されたステップ・サイズを以って、前記連立常微分方程式の他の常微分方程式の計算式から前記補間値の計算値を受け取るステップをさらに有する、
請求項6のプログラム。
【請求項8】
前記埋め込み型ルンゲ・クッタ法が、ODE45である、請求項7のプログラム。
【請求項9】
前記埋め込み型ルンゲ・クッタ法が、ルンゲ・クッタ・フェールベルク法である、請求項6のプログラム。
【請求項10】
前記補間式が、5次エルミート補間式である。請求項8のプログラム。
【請求項11】
コンピュータの処理により、埋め込み型ルンゲ・クッタ法を用いて連立常微分方程式を解くためのシステムあって、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、次数N(Nは所定の整数)の状態値と次数N+1の状態値の間の誤差を値を計算する手段と、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記誤差が所定の閾値を超えたことに応答して、前記誤差と前記閾値とから、ステップ・サイズを計算する手段と、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズに対応する補間値を計算する手段と、
前記コンピュータの処理により、前記連立常微分方程式の各常微分方程式毎に、前記計算されたステップ・サイズと、前記補間値を用いて、再計算するステップを実行させるステップを実行させる手段とを有する、
常微分方程式を解くためのシステム。
【請求項12】
前記前記誤差が所定の閾値を超えたことに応答して、前記計算されたステップ・サイズを以って、前記連立常微分方程式の他の常微分方程式の計算式から前記補間値の計算値を受け取る手段をさらに有する、
請求項11のシステム。
【請求項13】
前記埋め込み型ルンゲ・クッタ法が、ODE45である、請求項12のシステム。
【請求項14】
前記埋め込み型ルンゲ・クッタ法が、ルンゲ・クッタ・フェールベルク法である、請求項11のシステム。
【請求項15】
前記補間式が、5次エルミート補間式である。請求項13のシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate


【公開番号】特開2011−186991(P2011−186991A)
【公開日】平成23年9月22日(2011.9.22)
【国際特許分類】
【出願番号】特願2010−54251(P2010−54251)
【出願日】平成22年3月11日(2010.3.11)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】