計算科学

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

1
混合整数線形プログラムの効率的なソリューション
多くの重要な問題は、混合整数線形プログラムとして表現できます。残念ながら、このクラスの問題に対する最適なソリューションの計算はNP-Completeです。幸いなことに、適度な量の計算のみで高品質のソリューションを提供できる近似アルゴリズムがあります。 特定の混合整数線形プログラムを分析して、これらの近似アルゴリズムのいずれかに役立つかどうかを確認するにはどうすればよいですか?そのようなプログラムが持つ可能性のある関連する特性または品質は何ですか? 現在使用されている関連アルゴリズムは何ですか?また、これらの品質はどのようにこれらのアルゴリズムにマッピングされますか? 実験のためにどのソフトウェアパッケージを探す必要がありますか?

3
有限体積法:非構造化メッシュ対八分木適応+セル切断
私は、任意の非構造化メッシュを使用するOpenFOAM C ++ Computational Continuum Mechanicsライブラリ(流体と固体の相互作用、MHDフローなど)で作業しています。これは、複雑な形状の問題をシミュレートするために、非構造化メッシュの高速生成(通常は自動)の利点を使用するというアイデアによって推進されました。 しかし、最近、別のアプローチに遭遇しました:セル「切断」を伴う八分木適応カルテシアンメッシュ。ここでは、積極的なメッシュの洗練を使用して複雑なジオメトリを記述します。 数値の観点から、カルテシアンメッシュの方がはるかに正確であるため、私の質問は次のとおりです。彼らはお互いをどう比較しますか? 私は二相流体流のコードを開発していますが、たとえば、カルテシアンメッシュで場の勾配の再構成をより正確に行うことができますが、非構造化メッシュでは場の急激な変化に対して線形回帰が必要です...

1
C ++でのMathematicaのQuasiMonteCarlo統合の置き換え
QuasiMonteCarloメソッドを使用して3次元または4次元で積分を実行するMathematicaプログラムがあります。問題は、これらの計算の一部がHPCクラスターで利用可能な最大ジョブ時間で完了できない点まで、実行するのに非常に長い時間がかかることです。だから私はプログラムをC ++で書き直すことを考えています。 GSLのドキュメントを見て、準ランダムシーケンスと通常のMC統合に関するセクションはありますが、それらをまとめるものは見当たりません。また、1つか2つのGoogle検索では、広く信頼されている実装のように見えるものは何も見つかりませんでした。C ++でのQMC統合の十分にテストされた実装のオプションは何ですか? 一貫性を保つために、Mathematicaが実装するHalton-Hammersley-Wozniakowskiメソッドに近いものを使用することをお勧めします(オプションの場合)。

3
加法的な事前調整スキームは、どのような場合に乗法的なものより優れていますか?
ドメイン分解(DD)とマルチグリッド(MG)の両方の方法で、ブロック更新または粗補正のアプリケーションを加算または乗算のいずれかとして構成できます。点ごとのソルバーの場合、これはヤコビ反復とガウスザイデル反復の違いです。S (x o l d、b )= x n e wとして機能するの乗法スムーザーは、A x = bAバツ=bAx = bS(xO l d、b )= xN E WS(バツold、b)=バツnewS(x^{old}, b) = x^{new} バツi + 1= Sn(Sn − 1(。。。、S1(x私、b )。。。、b)、b )バツ私+1=Sn(Sn−1(。。。、S1(バツ私、b)。。。、b)、b) x_{i+1} = S_n(S_{n-1}( ..., S_1(x_i, b) ..., b), b) 加法平滑剤は次のように適用されます バツi + 1= x私+ ∑ℓ = 0nλℓ(Sℓ(x私、b )− …

2
ポイントのセットで大まかな線をすばやく見つける
特定のクラスの検出器では、データは2次元のポイントのペアとして出力されるため、これらのポイントをラインにストリング化する必要があります。 データはノイズが多く、一方向にビニングされますが、他の方向にはビニングされません。各検出器要素が動作している場合でも、すべてのビンでのヒットを保証することはできないため、スキップが発生する可能性があります。 現在の分析チェーンは次のようになります 個々の検出素子のキャリブレーションのヒットを調整します クラスターを見つける クラスターへのラフフィットライン クラスターをより長いライン状の構造に接続します ... この質問はステップ(3)に関するものです。 そのステップでハフ変換を使用してきましたが、うまく機能しますが、テストベッドから本格的なプロジェクトのシミュレーションにスケールアップしようとすると、許容できないほど遅くなります。 もっと速い方法を探しています。 ここで実際の使用例を気にする人のために、液体アルゴン時間投影チャンバーがあります

2
ネイティブC99複合型を使用するC用のODEソルバーのオープンソースセットはありますか?
私は多くのシミュレーションの基礎としてGSLを使用してきましたが、私の目的には少し行き過ぎであり、レガシーの理由で独自の複雑なタイプを定義しています。おそらくあまり効率的ではない自分のRunge-Kutta ODEソルバーをコーディングするのではなく、ネイティブC99複合型を使用するオープンソースODEソルバーはありますか?
12 c  ode 

1
異方性境界メッシュを使用した非圧縮性の流れに対してどのような空間離散化が機能しますか?
高レイノルズ数の流れは、非常に薄い境界層を生成します。ラージエディシミュレーションで壁の解像度が使用される場合、アスペクト比はオーダーになる場合があります10610610^6。inf-sup定数はアスペクト比の平方根またはそれ以下に低下するため、多くの方法はこの体制で不安定になります。inf-sup定数は、線形システムの条件数と離散解の近似特性に影響するため重要です。特に、次の離散誤差ホールドの先験的境界(Brezzi and Fortin 1991) μ∥u−uh∥H1≤C[μβinfv∈V∥u−v∥H1+infq∈Q∥p−q∥L2]∥p−ph∥L2≤Cβ[μβinfv∈V∥u−v∥H1+infq∈Q∥p−q∥L2]μ‖u−uh‖H1≤C[μβinfv∈V‖u−v‖H1+infq∈Q‖p−q‖L2]‖p−ph‖L2≤Cβ[μβinfv∈V‖u−v‖H1+infq∈Q‖p−q‖L2]\begin{split} \mu \lVert {\mathbf u} - \mathbf u_h \rVert_{H^1} \le C \left[ \frac{\mu}{\beta} \inf_{\mathbf v \in \mathcal V} \lVert{\mathbf u - \mathbf v}\rVert_{H^1} + \inf_{q \in \mathcal Q} \lVert p-q \rVert_{L^2} \right] \\ \lVert{p - p_h}\rVert_{L^2} \le \frac{C}{\beta} \left[ \frac{\mu}{\beta} \inf_{\mathbf v \in \mathcal V} \lVert{\mathbf …

2
自動分化はいつ安いのですか?
自動微分により、特定の入力でプログラムの導関数を数値的に評価できます。この計算は、元のプログラムを実行するコストの5倍未満のコストで実行できるという定理があります。この係数5は上限です。 どのような状況でこのコストをさらに削減できますか?多くの現場での派生コードは、元のプログラムの速度に近い速度で実行されます。この高速化を実現するために何が行われますか? 計算を高速化するために利用できる元のプログラムの特徴は何ですか? 計算を高速化するためにどのようなソフトウェアエンジニアリングトリックを使用できますか?

3
効率的な三重対角行列アルゴリズムの実装
暗黙的な数値スキームを使用して物理的な問題を解決しています。これは、三重対角行列を持つ線形方程式を解くことにつながります。私はウィキペディアからこのアルゴリズムをコーディングしました。このタイプの方程式を最適化された方法で解くことができる効率的なライブラリがあるのだろうか。重要な注意点は、システムパラメーターが変更されたときにのみマトリックス自体が変更されることです。そのため、素晴らしいパフォーマンスボーナスを得るために、いくつかのアルゴリズムステップを事前に計算する機会がありました。C ++を使用しています。

3
暗黙のサーフェスを方向付けられたポイントセットに適合させる
一連のポイントと対応する法線(または同等に接線)への2次近似に関する質問があります。二次曲面をポイントデータに近似する方法はよく研究されています。いくつかの作品は次のとおりです。 次曲面のフィッティングタイプ制約直接、ジェームズ・アンドリュース、カルロ・H.スパンコール コンピュータ支援設計&アプリケーション、10()、2013年、BBB、CCC データを二次曲面の当てはめ代数、I.アルSubaihiおよびGAワトソン、ダンディー大学 射影輪郭への適合も、このようないくつかの作品でカバーされています。 これらすべての作業から、Taubinの2次近似の方法は非常に人気があると思います。 G.タウビン、「暗示方程式で定義された平面曲線、表面および非平面空間曲線の推定、エッジおよび距離画像セグメンテーションへの応用」、IEEE Trans。PAMI、Vol。13、1991、pp1115-1138。 簡単に要約させてください。二次は代数形式で書くことができます: ここで係数ベクトルであり 3次元座標です。任意点嘘二次曲面上のなら、: QQQf(c,x)=Ax2+By2+Cz2+2Dxy+2Exz+2Fyz+2Gx+2Hy+2Iz+Jf(c,x)=Ax2+By2+Cz2+2Dxy+2Exz+2Fyz+2Gx+2Hy+2Iz+J f(\mathbf{c},\mathbf{x}) = A x^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + 2Iz + J cc\mathbf{c}xx\mathbf{x}xx\mathbf{x}QQQxTQx=0xTQx=0\mathbf{x}^TQ\mathbf{x}=0Q=⎡⎣⎢⎢⎢ADEGDBFHEFCIGHIJ⎤⎦⎥⎥⎥Q=[ADEGDBFHEFCIGHIJ] Q = \begin{bmatrix} A & D & E & G \\ D & B & …

5
高価な目的関数のグローバルな最大化
私は世界的に多くの機能(最大化に興味を持ってい)実数パラメータ(複雑なシミュレーションの結果を)。ただし、問題の関数の評価は比較的高価で、各パラメーターセットに約2日かかります。私はさまざまなオプションを比較しており、誰かに提案があるかどうか疑問に思っていました。≈30≈30\approx 30 この種のプロセスには、近似関数を開発し、それらを最大化する一連のメソッドがあることを知っています(例:Jones et al。 "高価なブラックボックス関数の効率的なグローバル最適化")。ただし、これはコードに比較的関与しているようです。 多数のシミュレーション(50以上)を並行して実行できます。これは、遺伝的アルゴリズムのようなものを使用してこの最適化を行うことを示唆しているようです。 私の質問は次のとおりです。1)この種のグローバルソルバー/推奨の自由に利用可能な実装の経験はありますか?2)ここで遺伝的アルゴリズムを好むまたは避ける理由はありますか? これは物理的な問題であり、初期の実験では、パラメータを変更すると性能指数がかなりスムーズに変化することが示されました。 更新: お手伝いありがとう!いくつかの詳細:最大の場所以外の情報は必要ありません。シミュレーションはモンテカルロではなく決定論的であるため、複雑さは大した問題ではありません。パラメーターに明示的な境界または制約はありません。私が持っている(そして前に言及しなかった)もう1つの情報は、必要な最大サイズの感覚です。私はグローバルな最大値を探していますが、この規模以上の何かに満足しています-これが助けになるかどうかはわかりません。より体系的にスクリーニングを行うと(ブライアン・ボーチャーズが示唆するラテン・ハイパーキューブ)、うまくいけばうまくいきます。

4
非構造化グリッドの効率的な補間方法?
2つの非構造化グリッド間でデータを補間するための良い方法を知りたいのですが、一方のグリッドは他方のグリッドよりも粗いバージョンです。 ソリューションのタイムステップごとにグリッド間でデータを転送する必要がある一時的なPDE問題を解決しているため、効率は非常に重要です。 与えられたポイントの最も近いノードを検索するためにkdツリーを使用することを考え、その要素の形状関数(FEMシミュレーション)を使用してデータを補間します。これは良い解決策ですか?より良いものはありますか? また、このタスクのためのC / C ++の堅牢で信頼できるライブラリを知っていますか? *同様の質問があることは知っていますが、構造化されたグリッドで最も正確な方法を求めています。

2
Matlab [Q、R、E] = qr(A)の背後にある対応するLAPACK関数は何ですか?
現在、行列適切なランク推定を安価に計算しようとしています。したがって、以下を使用してQR分解をピボット化するコラムレットを計算しますAAA [Q,R,E]=qr(A) Matlabで。を使用してのランクを推定しますAAA tol = size(A,n)*eps*norm(A,'fro'); r = sum(abs(diag(R))>tol) これは正常に機能し、Rのすべての対角要素に対するプロットは次のようになります。 RRR 入力行列は、両方の実験でまったく同じです。 私の質問は、Matlabからの列ピボットQR分解がどのLAPACK関数に依存しているかということです。 助けてくれてありがとう、グリス 編集: DGEQPFは同じ間違った結果を与えます。 編集2: AAAE+sign(E,F)E+sign(E,F)E+sign(E,F) AAA RRR LAPACK 3.4.0とOpenBlas / GotoBLAS(64ビット)を使用しました Matlab 7、2007b、2010b Linux 32ビット 編集3:-GDBを使用して、Matlab 2010bはDGEQP3を呼び出すことがわかりました:/usr/ubuntu10.04/matlabr2010b/bin/glnx86 /../../ bin / glnx86 /../からのdgeqp3_()の#3 0xaa46ce2f。 ...
12 matlab  lapack 

1
加重SVD問題?
2つの行列とBが与えられた場合、 min ∑ i j(A i j − x i y j B i j)2のようなベクトルxとyを見つけたいと思います。 行列形式では、Iは、のフロベニウスノルム最小化しようとしているA - DIAG(X )⋅ B ⋅ DIAG(Y )= A - B ∘ (XがYを⊤AAABBBバツxxyyy分∑私はj(A私はj− x私yjB私はj)2。min∑ij(Aij−xiyjBij)2. \min \sum_{ij} (A_{ij} - x_i y_j B_{ij})^2. 。- DIAG(X )⋅ B ⋅ DIAG(Y)= A - B ∘ (X 、Y⊤)A−diag(x)⋅B⋅diag(y)=A−B∘(xy⊤)A - \mbox{diag}(x) …

1
科学図書館ではどのようにエラーを報告すべきですか?
さまざまなソフトウェアエンジニアリングの分野には、ライブラリがエラーやその他の例外的な条件にどのように対処すべきかについて多くの哲学があります。私が見たもののいくつか: ポインター引数によって返された結果を含むエラーコードを返します。これがPETScの機能です。 センチネル値でエラーを返します。たとえば、メモリを割り当てることができなかった場合、mallocはNULLを返しsqrt、負の数を渡すとNaNを返します。このアプローチは多くのlibc関数で使用されます。 例外をスローします。deal.II、Trilinosなどで使用されます。 バリアント型を返します。たとえば、Result正しく実行された場合に型のオブジェクトを返し、Error失敗した方法を記述するために型を使用するC ++関数std::variant<Error, Result>。 assertとcrashを使用します。p4estおよびigraphの一部で使用されます。 各アプローチの問題: すべてのエラーをチェックすると、余分なコードが大量に発生します。結果が格納される値は常に最初に宣言する必要があり、一度しか使用されない可能性のある多くの一時変数が導入されます。このアプローチは、どのエラーが発生したかを説明しますが、原因を特定するのが難しい場合があります。 エラーケースは無視するのは簡単です。さらに、出力タイプの範囲全体が妥当な結果である場合、多くの関数は意味のあるセンチネル値さえも持つことができません。#1と同じ問題の多く。 C ++、Pythonなどでのみ可能です。CまたはFortranではできません。setjmp / longjmp sorceryまたはlibunwindを使用してCで模倣できます。 C ++、Rust、OCamlなどでのみ可能です。CまたはFortranではできません。マクロソーサリーを使用してCで模倣できます。 おそらく最も有益です。しかし、たとえばPythonラッパーを作成するCライブラリにこのアプローチを採用すると、範囲外のインデックスを配列に渡すような愚かな間違いにより、Pythonインタープリターがクラッシュします。 エラー処理に関するインターネット上のアドバイスの多くは、オペレーティングシステム、組み込み開発、またはWebアプリケーションの観点から書かれています。クラッシュは受け入れられないため、セキュリティについて心配する必要があります。科学アプリケーションには、これらの問題はほとんどありませんが、ほとんどありません。 別の考慮事項は、どの種類のエラーが回復可能かどうかです。mallocの失敗は回復不可能であり、いずれにしても、OSのメモリ不足のキラーが実行する前にそれに到達します。配列サイズの範囲外のインデックスも回復できません。ユーザーとしての私にとって、ライブラリでできることは、有益なエラーメッセージでクラッシュすることです。一方、たとえば、反復線形ソルバーの収束の失敗は、直接因子分解ソルバーを使用することで回復できます。 科学図書館はどのようにエラーを報告し、それらが処理されると期待すべきですか? もちろん、それはライブラリが実装されている言語に依存することを理解しています。しかし、私が知る限り、十分に有用なライブラリについては、実装されている言語以外の言語から呼び出したいと思うでしょう。 余談ですが、パブリックAPIの一部としてグローバルアサーションハンドラー関数ポインターを定義する場合、Cライブラリのアプローチ#5は大幅に改善できると思います。アサーションハンドラは、デフォルトでファイル/行番号を報告し、クラッシュします。このライブラリのC ++バインディングは、代わりにC ++例外をスローする新しいアサーションハンドラを定義します。同様に、Pythonバインディングは、CPython APIを使用してPython例外をスローするアサーションハンドラーを定義します。しかし、このアプローチを取る例は知りません。
11 software 

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