計算科学

科学的問題を解決するためにコンピュータを使用する科学者のためのQ&A

3
カオス数値モデルの回帰テスト
実際の物理システムを表す数値モデルがあり、それがカオスを示す場合(例:流体力学モデル、気候モデル)、モデルが期待どおりに動作していることをどのようにして知ることができますか?2つのモデル出力のセットを直接比較することはできません。初期条件の小さな変更でも、個々のシミュレーションの出力が劇的に変化するためです。モデルの出力を直接観測と比較することもできません。観測の初期条件を十分に詳細に知ることはできず、数値近似はいずれにせよシステム全体に伝播する小さな違いを引き起こすからです。 この質問の一部は、科学的コードの単体テストに関する David Ketchesonの質問に触発されました。私は、そのようなモデルの回帰テストをどのように実装できるかに特に興味があります。小さな初期条件の変化が大きな出力の変化につながる可能性がある場合(それでも、現実の適切な表現である場合があります)、パラメーターの変更や新しい数値ルーチンの実装による変化からこれらの変化をどのように分離できますか?
10 testing  numerics 

3
未知のノイズの多い関数を最大化する
関数を最大化することに興味があります。ここで、です。θ ∈ R Pf(θ)f(θ)f(\mathbf \theta)θ ∈ Rpθ∈Rp\theta \in \mathbb R^p 問題は、関数またはその導関数の分析形式がわからないことです。私ができる唯一のことは、値をプラグインして関数をポイントごとに評価し、そのポイントでNOISY推定を取得することです。必要に応じて、これらの推定値の変動性を減らすことができますが、計算コストを増やす必要があります。 θ∗θ∗\theta_*f^(θ∗)f^(θ∗)\hat{f}(\theta_*) これが私がこれまでに試したことです: 有限差分の確率的急降下:機能しますが、多くの調整(ゲインシーケンス、スケーリング係数など)を必要とし、多くの場合非常に不安定です。 シミュレーテッドアニーリング:機能し、信頼できますが、多くの関数評価が必要なため、かなり遅いことがわかりました。 したがって、私はこれらの条件下で機能する可能性のある代替の最適化方法についての提案/アイデアを求めています。私とは別の研究分野からの提案を奨励するために、問題をできるだけ一般的にしている。収束時のヘッセ行列を推定できる方法に非常に興味があることも付け加えておきます。これは、パラメーター不確実性を推定するために使用できるためです。それ以外の場合は、推定値を取得するために最大値の周りの有限差分を使用する必要があります。θθ\theta

2
科学計算におけるタスクベースの共有メモリ並列ライブラリ
近年、何らかの形式の汎用データ駆動型共有メモリ並列処理を提供するいくつかのライブラリ/ソフトウェアプロジェクトが登場しています。 主なアイデアは、明示的にスレッド化されたコードを書く代わりに、プログラマーがアルゴリズムを相互依存タスクとして実装し、共有メモリーマシン上の汎用ミドルウェアによって動的にスケジュールされるというものです。 そのようなライブラリの例は次のとおりです。 QUARK:もともとはMAGMA並列線形代数ライブラリ用に設計されましたが、並列高速多重極法にも使用されているようです。 Cilk:もともとはMITベースのプロジェクトで、現在Intelでサポートされています。Cの言語/コンパイラー拡張として実装され、Cilkchessコンピューターチェスソフトウェアで使用され、FFTWで実験的に使用されました。 SMPスーパースカラー:バルセロナスーパーコンピューティングセンターで開発されました#pragma。拡張機能に基づいて、多くの点でCilkに似ています。 StarPU:GPUを含むいくつかの異なるアーキテクチャ用にコンパイルおよびスケジュールできる、同様のライブラリベースの「コードレット」。 OpenMPタスク:バージョン3.0以降、OpenMPは非同期にスケジュールできる「タスク」を導入しました(仕様のセクション2.7を参照)。 Intelのスレッディングビルディングブロック:C ++クラスを使用して非同期タスクを作成および起動します。チュートリアルのセクション11を参照してください。 OpenCL:マルチコアでのタスクベースの並列処理をサポートします。 これらのライブラリ/言語拡張の内部動作と特定の問題への適用について説明している文献はたくさんありますが、科学計算アプリケーションで実際に使用されている例はほとんどありません。 だからここに質問です:誰かが共有メモリ並列処理のためにこれらのライブラリ/言語拡張、または同様のものを使用する科学計算コードを知っていますか?

3
浮動小数点数の相対比較
f(x, y)いくつかの数式を実装する二重浮動小数点数を返す数値関数があり、パラメーターのすべての組み合わせの分析式に対して正しいことxとy、興味があることを確認したいと思います。計算された値と分析浮動小数点数? 2つの数値がaとであるとしましょうb。これまでのところ、絶対abs(a-b) < eps(abs(a-b)/max(abs(a), abs(b)) < eps)エラーと相対()エラーの両方がeps未満であることを確認しています。このようにすると、たとえ1e-20程度の数値であったとしても、数値の不正確さをキャッチできます。 しかし、今日、私は問題を発見しました。数値aと分析値bは次のとおりです。 In [47]: a Out[47]: 5.9781943146790832e-322 In [48]: b Out[48]: 6.0276008792632078e-322 In [50]: abs(a-b) Out[50]: 4.9406564584124654e-324 In [52]: abs(a-b) / max(a, b) Out[52]: 0.0081967213114754103 したがって、絶対誤差[50]は(明らかに)小さいですが、相対誤差[52]は大きいです。そのため、プログラムにバグがあると思いました。デバッグにより、これらの数値は非正規であることがわかりました。そのため、適切な相対比較を行うために次のルーチンを作成しました。 real(dp) elemental function rel_error(a, b) result(r) real(dp), intent(in) :: a, b real(dp) :: m, d d = …

3
パフォーマンスの問題を検索してイベントデータを視覚化する方法
高度に非同期の通信パターンでMPIアプリケーションを最適化しようとしています。各ランクには計算するもののリストがあり、入力または出力が異なるランクにある場合は、必要に応じてメッセージを送信します。さらに、各ランクはスレッド化されています(現在、1つの通信スレッドと5つのワーカー)。 コードのさまざまなパフォーマンスクリティカルな部分にタイマーを使用してコードをインストルメント化しました。これにより、各スレッドの(開始、終了、タイプ)トリプルのリストが表示されます。横軸を時間、縦軸をランクとスレッド、そして各スレッドが現在何をしているかを示す色で、わかりやすい方法でプロットすると、6スレッド/ランクの16ランクで次のような画像が得られます。 私の質問は、パフォーマンスの問題を突き止めるのに役立つこのデータを視覚化する他の方法は何ですか?誰かが非同期アプリケーションのプロファイリングに使用するお気に入りのタイプのプロットを持っていますか? このデータセットは、データフロー構造を認識していないという点で制限されていますが、より複雑なものを収集する前に、できる限り多くの洞察を得たいと思います。 誰もが見回したい場合に備えて、非圧縮画像がここにあります(通常のルートでアップロードできませんでした)。残念ながら、Firefoxは有効であると私が信じているにもかかわらず、それを受け入れません。おそらくそれが単に大きすぎるためです。

4
不完全でガンマ関数の高速かつ正確な倍精度実装
倍精度特殊関数を実装する最新の方法は何ですか?:私は、次の積分必要 ため、M=0、1、2、。。。そして、t>0で、これは下側の不完全ガンマ関数で書くことができます。これが私のFortranとCの実装です。Fm(t)=∫10u2me−tu2du=γ(m+12,t)2 トンm + 12Fメートル(t)=∫01あなた2メートルe−tあなた2dあなた=γ(メートル+12、t)2tメートル+12 F_m(t) = \int_0^1 u^{2m} e^{-tu^2} d u = {\gamma(m+{1\over 2}, t)\over 2 t^{m+{1\over 2}}} M = 0 、1 、2 、。。。メートル=0、1、2、。。。m=0, 1, 2, ...t > 0t>0t>0 https://gist.github.com/3764427 これは級数展開を使用し、指定された精度になるまで項を合計し、再帰関係を使用してより低い値を効率的に取得します。私はそれをうまくテストし、必要なすべてのパラメーター値に対して1e-15の精度を取得しました。詳細については、Fortranバージョンのコメントを参照してください。メートルメートルm それを実装するより良い方法はありますか?以下は、gfortranでのガンマ関数の実装です。 https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781 私がしている無限級数を合計する代わりに、有理関数近似を使用しています。均一な精度を得る必要があるので、これはより良いアプローチだと思います。これらのものにアプローチするためのいくつかの標準的な方法はありますか、または各特別な関数の特別なアルゴリズムを理解する必要がありますか? アップデート1: コメントに基づいて、SLATECを使用した実装を次に示します。 https://gist.github.com/3767621 おおよそ1e-15の精度で、私自身の関数の値を再現します。ただし、t = 1e-6およびm = 50の場合、項は1e-303に等しくなり、より高い "m"の場合は、誤った答えを出し始めます。Fmに直接級数展開/再帰関係を使用するため、関数にこの問題はありません。正しい値の例を次に示します。tm + 12tメートル+12t^{m+{1\over2}}FメートルFメートルF_m 、F100F100F_{100}(1e-6)=4.97511945200351715E-003 しかし、分母が爆発するため、SLATECを使用してこれを取得することはできません。ご覧のとおり、実際の値は小さく、小さくなっています。FメートルFメートルF_m アップデート2: 上記の問題を回避するために、1機能を使用することができますdgamit(Tricomiの不完全ガンマ関数)を、そしてF(m, …

3
計算手法を学ぶための優先事項、大学院生としてライブラリを使用するのと比較して、自分のコードをいつ書くべきですか?
私は大学院で工学の研究を始めており、計算科学プロジェクトに取り組んでいます。ここで、独自のアルゴリズムを実装することの利点と欠点についていくつかの議論があったことに気づきました。独自のアルゴリズムを実装する場合とライブラリを使用する場合の費用便益分析は、大学院生である場合と異なりますか?

2
「波動方程式」の有限差分スキーム、特性の方法
強制項がu 、v(定式化については以下の編集1を参照)、およびWとその1次導関数に依存する可能性がある次の問題考えます 。これは1 + 1次元の波動方程式です。{ u + v = 0 }で規定された初期データがあります。Wuv=FWあなたv=F W_{uv} = F u,vあなた、vu,vWWW{u+v=0}{あなた+v=0}\{u+v = 0\} Iは、間隔の依存のドメイン内の溶液に興味 および次有限差分スキームを考慮しています。{u+v=0,u∈[−uM,uM]}{あなた+v=0、あなた∈[−あなたM、あなたM]}\{ u+v = 0, u \in [- u_M,u_M]\} 目標は、をW u(u 、v + 1 )− W u(u 、v )= F (u 、v )で進化させ、同様にW v(u + 1 、v )− W v(u 、v )= F …

3
明示的なオイラー法は反応拡散問題には遅すぎる
私は次のC ++コードでチューリングの反応拡散システムを解決しています。これは遅すぎます。128x128ピクセルのテクスチャの場合、許容可能な反復数は200です。これにより、2.5秒の遅延が発生します。興味深い画像を取得するには400回の反復が必要ですが、5秒の待機時間は多すぎます。また、テクスチャのサイズは実際には512x512である必要がありますが、これにより、待機時間が非常に長くなります。デバイスはiPad、iPodです。 これを速くするチャンスはありますか?オイラー法はゆっくりと収束します(ウィキペディア)–より速い方法があれば、反復回数を減らすことができますか? 編集: Thomas Klimpelが指摘したように、行:「if(m_An [i] [j] <0.0){...}」、「if(m_Bn [i] [j] <0.0){...}」は収束を遅らせています。削除後、75回の反復後に意味のある画像が表示されます。以下のコードの行をコメントアウトしました。 void TuringSystem::solve( int iterations, double CA, double CB ) { m_iterations = iterations; m_CA = CA; m_CB = CB; solveProcess(); } void set_torus( int & x_plus1, int & x_minus1, int x, int size ) { // Wrap "edges" …
10 pde  stiffness 

3
GPUプログラミングの推力
私はGPGPUプログラミングに非常に慣れていないので、質問が特に適切でない場合はご容赦ください。私が理解していることから、GPUプログラミングは、通常のCPUプログラミングと比較すると、非常に複雑なエンジニアリング作業です。分岐の問題、タイリング、固定されたメモリ割り当て、およびホストとデバイスの通信/デバイスの計算のオーバーラップについては、非常に注意する必要があります。 少し調べたところ、C ++ STLを模倣しようとしているように見えるスラストライブラリが見つかりました。これはかなりいいです。ただし、私の非常に限られた経験と、優れたパフォーマンスを得るために必要なすべてのマイクロ管理を見てきたので、私はパフォーマンスについて少し懐疑的です。推力は、すべての複雑なプログラミング部分を内部で効率的に処理できますか?PETScなどのいくつかの非常に有名なライブラリは、このパッケージを使用しているようです。 低レベルのCUDAプログラミングと比較した場合、CUDAの経験が豊富で推力のある人がパッケージのパフォーマンスについて一言、または二言言うことができるかと思いました。いつ推力を使用できますか?いつCUDAに戻す必要がありますか?

2
2Dのオイラー方程式
大学での課題として、1Dシミュレーションを行いました。問題の説明は、作動流体として圧縮可能な理想気体を含む1dショックチューブ問題を解決することでした。この問題について、Roeのリーマンソルバーを使用してオイラー方程式系を解きました。オイラーの方程式を2次元または3次元で解くために、どこから始めればよいですか。テストの問題はどれですか、最初に検討する必要がありますか?(商用ソルバーを提案しないでください。自分のコードを書きたいのですが)自分のコードを書くのに助けが必要です。 最も実用的な方法で2D問題を引き起こす良いリソースは何ですか?


2
密で不良な条件付き行列の対角化
いくつかの密で悪条件の行列を対角化しようとしています。マシン精度では、結果は不正確です(負の固有値を返す、固有ベクトルには期待される対称性がありません)。MathematicaのEigensystem []関数に切り替えて、任意の精度を利用しましたが、計算が非常に遅くなっています。私はいくつもの解決策を受け入れます。悪条件の問題に適したパッケージ/アルゴリズムはありますか?私はプレコンディショニングの専門家ではないので、これがどれだけ役立つかわかりません。それ以外の場合は、並列化された任意精度の固有値ソルバーしか考えられませんが、Mathematica、MATLAB、およびC ++以外には何も知りません。 問題の背景を説明するために、行列は大きくはありますが、巨大ではありません(最大で4096x4096〜32768x32768)。それらは実数で対称であり、固有値は0から1(排他的)の範囲にあり、多くの固有値は0に非常に近く、1に近いものはありません。行列は本質的に畳み込み演算子です。すべての行列を対角化する必要はありませんが、大きくできるほど良いです。多くのプロセッサと分散コンピューティング機能を備えたコンピューティングクラスタにアクセスできます。 ありがとうございました

3
C ++で再帰的スプライン関数を作成する方法
現在、私は基底スプライン選点と呼ばれる微分方程式解法に取り組んでいます。私が問題を抱えているのは、という関係で、任意次数のスプラインを作成するメソッドを作成することです と初期条件 そして、この問題は「上部」または「下部」のどちらからでも再帰的に開始される可能性があるため、この問題から始めても問題があり、一般的なライターブロックタイプに遭遇しています何が必要なのか気になっていないところです。B 1 i(x)={ 1Bk + 1私(x )= x − x私バツk + i− x私Bk私+ xk + i + 1− xバツk + i + 1− xi + 1Bki + 1(x )B私k+1(バツ)=バツ−バツ私バツk+私−バツ私B私k+バツk+私+1−バツバツk+私+1−バツ私+1B私+1k(バツ) B^{k+1}_{i}(x)= \frac{x-x_i}{x_{k+i}-x_i}B^k_i + \frac{x_{k+i+1}-x}{x_{k+i+1}-x_{i+1}}B^k_{i+1}(x) B1私(x )= { 10ために バツ私≤ X < Xi + 1そうでなければB私1(バツ)={1ために バツ私≤バツ<バツ私+10そうでなければB^1_i(x)=\begin{cases} 1 & \; \text{for …
10 c++  b-spline 

3
スパース行列乗算のオーバーヘッドは何ですか
行列の乗算(Mat * MatとMat * Vecの両方)は、0以外の数、または行列のサイズでスケーリングされますか?または、2つの組み合わせ。 形状についてはどうでしょう。 たとえば、100個の値を含む100 x 100のマトリックス、または100個の値を含む1000 x 1000のマトリックスがあります。 これらの行列を2乗する(または、同様のスパース性を持つ同様の行列を掛ける)と、最初の(100x100)は2番目の(1000x1000)よりも速くなりますか?値がどこにあるかに依存しますか? 実装に依存している場合は、PETScの回答に興味があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.