計算科学

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

2
ノイマン境界条件でポアソン方程式有限差分行列を書く
有限差分アプローチを使用してポアソン方程式を解くことに興味があります。ノイマン境界条件で行列方程式を書く方法をよりよく理解したいと思います。誰かが以下をレビューしますか、それは正しいですか? 有限差分行列 ポアソン方程式 ∂2u (x )∂バツ2= d( x )∂2あなたは(バツ)∂バツ2=d(バツ) \frac{\partial^2u(x)}{\partial x^2} = d(x) 有限差分行列方程式で近似できます。 1(Δは、xは)2M ∙ u^= d^1(△バツ)2M∙あなたは^=d^ \frac{1}{(\Delta x)^2} \textbf{M}\bullet \hat u = \hat d ここで、は行列で、およびは(列)ベクトルです。 N × N uは dは 1 × NのMM\textbf{M}n × nn×nn \times nあなたは^あなたは^\hat ud^d^\hat d1 × n1×n1 \times n ノイマン境界条件の追加 ノイマン境界条件は、境界で既知のフラックスを強制します(ここでは、境界がである左側に適用します)。x = 0バツ=0x=0 ∂u …

3
PDEを解くためのマルチグリッド法
マルチグリッド法の簡単な説明またはこれに関するいくつかの文献が必要です。 私は、BiCGStab、CG、GS、Jacobiおよび事前調整などの反復法に精通していますが、マルチグリッド法の初心者です。 非常に初心者向けの優れた文献であっても、誰かがこれを詳細に説明したり、少なくとも明確に擬似コードまたはソースコードを提供したりできますか?ありがとう!

1
自分のコードを使用して、公開された結果を自分の記事に簡単に再現する方法
私は記事で結果を得るために使用したプログラム/ライブラリを書きました。(ここにありますが、私の質問は一般的です。)定期的に実行するテストがありますctest(実行には数分かかります)。この記事でいくつかの表または図を再現するために、スクリプトまたは単純なドライバープログラムを作成する必要があります。これは、おそらく10分以上実行される可能性があるため、通常のテストスイートのこの部分は必要ありません。同時に、記事の結果が次のようになることを確認したいと思います。 後で再現 ライブラリを開発し続けた後も、同じ/正しい結果が得られることを確認してください 現在、通常のテストスイートの一部として実行する小さなドライバープログラムを作成しようとしています。記事の結果を再現する場合は、いくつかの行のコメントを解除します。もちろん、正確な行を知りません。また、記事とまったく同じ結果を得るために他のパラメーターを微調整する必要があるかどうかはわかりません。 また、記事から正確な図/表を計算するPythonスクリプトを作成しようとしました。このようなスクリプトは、定期的に実行されていない(時間がかかりすぎる)ため、通常、ライブラリの更新後に動作を停止します。 私が思いついた最良の方法は、Fortran(またはC / C ++)の例を使用することです。これは、定期的に(ライブラリの一部として)コンパイルされますが、通常のテストスイートでは実行されません。そのように、少なくとも私はそれがうまくコンパイルされることを知っています(したがって、うまくいけば実行もできます)そして、通常のテストスイートの一部として、いくつかの単純な(より小さい)サンプルをテストします。 この問題を処理する最適な方法は何ですか?

1
多項式前提条件の現在の状態は何ですか?
多項式前提条件に何が起こったのだろうか。それらは数学的な観点からは比較的エレガントに見えるので興味がありますが、クリロフ法の調査で読んだ限り、それらは一般に前提条件として非常に貧弱です。Saadとvan der Hostの言葉で、「これらの技術に対する現在の関心は、ほとんど消え去りました」(ここ)。それにもかかわらず、最近ではマルチコアおよびGPU計算の使用が行われています。 誰も私に言うことができますか、むしろこれらの方法がどのコンテキストで生きているのか、そして現在の最先端の良い調査をどこで見つけることができますか?

1
天文学シミュレーションに統合する正しい方法は何ですか?
私は、システム内の惑星(または、あらゆるオブジェクト)の動きをシミュレートするために、ニュートン物理学を使用する単純な天文学シミュレーターを作成しています。すべての物体はユークリッド平面の円であり、位置、速度、質量、半径、合力などのプロパティを持っています。 ユニバースを小さなタイムステップ(通常は数ミリ秒)で更新したいのですが、位置の変化を正しく計算する方法がわかりません。 力は簡単ですfr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)。 しかし、そこからどのように進むのですか? 私はこれを行うことができます: a = Fr/body.m v += a*dt position += v*dt しかし、それはもちろん間違っています。位置計算の係数として0.5を追加した場合はどうでしょうか?

2
関数への合理的な近似のオープンソース実装
関数への合理的な近似のオープンソース実装(Python、C、C ++、Fortranのいずれでも構いません)を探しています。記事に沿った何か[1]。私はそれに関数を与え、それは私に2つの多項式を返します。その比は与えられた間隔での近似であり、誤差は同じ振幅で振動し、最適な近似、またはそれに近いです。 ここに私が見つけたものがあります: chebfunでできるように見えますが、Matlab *にアクセスできません。 数値レシピ(NR)のセクション5-13「合理的なチェビシェフ近似」に簡単なプログラムがあります。 MathematicaにはEconomizedRationalApproximationとMiniMaxApproximationがあります 私は、NRコードよりも新しい(おそらくテスト済みの)ものがあるかどうか疑問に思いました。 私のアプリケーションは、特別な関数のセットを持っています。これは、超幾何級数として、または数値キャンセルを含む数式として与えられます。そして、堅牢で、高速で、正確な評価関数が必要です。 Hartree Fock計算で2つの粒子行列要素を計算する最も内側のループ。[2]に、自分に合った関数の簡単な例を示します。ご覧のとおり、SymPyを使用して計算したのは、直接式を使用するか、x = 0を中心とするシリーズのいずれかです。これは一種の働きをしますが、精度はそれほど高くありません。x= 1の場合、有効数字の約半分が失われます(ただし、x = 1e5と同様にx = 0.1の場合、ほぼすべての有効数字に対して正確です)。より良い近似値を探しています。 [1] Deun、J。、およびTrefethen、LN(2011)。合理的な近似のためのCarathéodory-Fejér法の堅牢な実装。BIT数値数学、51(4)、1039〜1050。doi:10.1007 / s10543-011-0331-7(2010年6月e-print) [2] https://gist.github.com/3831580 (*)chebfunウェブサイトにも404が表示されますが、Pedroはそれが私のプロバイダーの問題であるに違いないと示唆しました。

3
不連続rs ODEの数値手法
不連続な右側のODEの数値解法の最先端の方法は何ですか?私は主に区分的で滑らかな右側の関数、例えばサインに興味があります。 私は次のタイプの方程式を解こうとしています: バツ˙v˙= v= { (| F外部| − | F摩擦| )サイン(F外部)0:| F外部| &lt; | F摩擦|:そうでなければバツ˙=vv˙={(|F外部|−|F摩擦|)符号⁡(F外部):|F外部|&lt;|F摩擦|0:さもないと\begin{align*} \dot x &= v\\ \dot v &= \begin{cases} (|F_\text{external}| - |F_\text{friction}|) \mathop{\rm sign} (F_\text{external}) & :|F_\text{external}| < |F_\text{friction}|\\ 0 & : \text{otherwise} \end{cases} \end{align*}
15 ode 

1
不連続ガラーキン/有限要素データの視覚化
ParaView内で不連続ガラーキン(DG)アプローチを使用して得られたシミュレーション結果を視覚化したいと思います。有限体積法と同様に、問題領域は立方体のセル(「要素」)に分割されます。有限体積法とは異なり、各セル内には解ベクトル値が1つだけではありませんが、各セルには複数のガウス積分点で解が含まれます。あなたはあなたは\mathbf{u}あなたはあなたは\mathbf{u} 私の質問は、ParaView / VTKを使用してそのようなデータを効率的に視覚化した経験があるかどうか、およびVTKでデータを表すために選択したアプローチです。考えられるいくつかの方法が思い浮かびますが、どれが最も有望かはわかりません。 (1)ボクセルを 使用する各統合ポイントに1つのボクセルを使用します。 Pro:標準のVTK非構造化セルタイプで動作するすべてのプラグインは、何も変更せずに引き続き動作します。欠点 :統合ポイントが均等に分散されていないため、頂点の正しい位置を見つけるのが難しい場合があります。また、DGフレームワークでは不連続なソリューションが許可されるため、セル表面でソリューションを2回定義できます。また、階層情報(要素に分割されたドメイン、各要素に複数のポイントが含まれる)も失われます。 (2)多角形の 使用統合ポイントごとに1つの頂点を使用します。利点 :実装が最も簡単で、異なるソリューションを使用して同じ場所に複数のポイントを簡単に指定できます。欠点 :データを「セル」として視覚化する機能が失われ、さらに上記と同じ欠点があります。 (3)VTK直交方式を 使用する直交方式の組み込みサポートを使用します。 利点:むしろ簡単な実装で、元のソリューションのすべての関係とプロパティを保持します。 欠点:これは完全に新しいセルタイプであるため、既存のプラグインの多く(ほとんど)は機能しなくなり、おそらく書き直さなければならないでしょう。

1
残基を数値的に計算する方法は?
次の積分を計算する必要があります: ここで行列(一つの粒子の運動と基礎で発現ポテンシャルエネルギー)である、依存する行列であり、(1粒子多対体のグリーンの機能)および等高線積分は左半円です。被積分関数は、負の実軸上に極を持ち、評価に費用がかかります。そのような積分を計算する最も効果的な方法は何ですか?12個のπ私∫Cf(E)dE12π私∫Cf(E)dE {1\over 2\pi i} \int_C f(E) \, d E f(E)= T r((h + E)G( E))f(E)=Tr((h+E)G(E)) f(E) = {\rm Tr}\,\left(({\bf h} + E)\,{\bf G}(E) \right) hh\bf hGG\bf GEEEf(E)f(E)f(E) これまでの私の研究は次のとおりです。 1)ガウス積分を使用します。統合パスは長方形です。左側と右側(つまり幅)を固定し、高さ(実際の軸の上と下)で遊んで、与えられた統合順序で最高の精度を得るようにしました。たとえば、次数20の場合、高さが大きすぎると精度は低下します(明らかに)が、小さすぎると低下します(私の理論では、高さが進むにつれて極の周囲にポイントが必要になるということです) 0)。私は自分の機能に最適な高さ0.5で落ち着きました。 2)次に、長方形の右側をE0に設定します。通常はE0 = 0ですが、E0 = -0.2または同様の値にすることができます。 3)長方形の左側を左に移動し始め、各ステップで積分順序の収束を行い、積分が各長方形で完全に収束することを確認します。幅を大きくすると、最終的に無限の左半円の範囲で収束値が得られます。 計算は非常に遅く、また幅が広いとあまり正確ではありません。1つの改善点は、単純に長い幅を「要素」に分割し、各要素でガウス積分を使用することです(FEと同様)。 別のオプションは、各極の周りに小さな円を統合して合計することです。問題点: a)関数極を数値的に見つける方法は?堅牢でなければなりません。私が知っている唯一のことは、それらが負の実軸上にあるということです。それらの一部(すべてではない)については、かなり良い初期推測も知っています。分析関数機能するメソッドはありますか?または、実際の形式に依存しますか?f(E)f(E)f(E)f(E)f(E)f(E)f(E)f(E)f(E) b)極がわかれば、その周りの小さな円を積分するのにどの数値スキームが最適ですか?円でガウス積分を使用する必要がありますか?または、ポイントの均一な分布を使用する必要がありますか? 別のオプションとして、a)のおかげで極を知ったら、複雑な統合を必要とせずに残基を取得するための半分析的な方法があるかもしれません。しかし今のところ、輪郭の統合を最適化するだけで満足です。

4
数値最適化手法のテスト:Rosenbrockと実際のテスト関数
導関数なしのオプティマイザには、主に2種類のテスト関数があるようです。 Rosenbrock関数 ff。のようなワンライナー 、開始点付き 補間器を使用した実データ点のセット 10d Rosenbrockを実際の10d問題と比較することは可能ですか? さまざまな方法で比較することができます。局所的な最小値の構造を記述する か、Rosenbrockおよびいくつかの実際の問題に対してオプティマイザABCを実行します。 しかし、これらは両方とも難しいようです。 (たぶん、理論家と実験者はまったく異なる2つの文化なので、キメラを求めていますか?) こちらもご覧ください: scicomp.SEの質問:アルゴリズム/ルーチンをテストするための優れたデータセット/テスト問題はどこで入手できますか? フッカー、「ヒューリスティックのテスト:すべてが間違っています」は痛烈です:「競争に重点を置いていることは、どのアルゴリズムが優れているが理由ではないことを教えてくれます。」 (2014年9月に追加された): 以下のプロットは、10個のランダムな開始点から8Dに14のテスト機能に3つのDFOアルゴリズムを比較:BOBYQA PRAXIS SBPLXをからNLOpt 14 N次元のテスト機能、パイソンを下gist.github このからのMatlab A.によってHedar ×各機能のバウンディングボックス内の10一様乱数startpoints。××\times ××\times たとえば、Ackleyでは、最上行にSBPLXが最適であり、PRAXISがひどいことを示しています。Schwefelでは、右下のパネルにSBPLXが5番目のランダムな開始点で最小値を見つけていることが示されています。 全体として、BOBYQAは1で最高であり、PRAXISは5で、SBPLX(〜Nelder-Mead with restarts)は13のテスト機能のうち7つで、Powersumは最高です。YMMV!特に、ジョンソン氏は、「グローバル最適化では、関数値(ftol)またはパラメーター許容値(xtol)を使用しないことをお勧めします。」 結論:1頭の馬や1つのテスト機能にすべてのお金をかけないでください。

2
移流方程式の陰的有限差分スキーム
移流方程式のための多数のFD制度がありウェブで議論します。例:http: //farside.ph.utexas.edu/teaching/329/lectures/node89.html∂T∂t+u∂T∂x=0∂T∂t+u∂T∂x=0\frac{\partial T}{\partial t}+u\frac{\partial T}{\partial x}=0 しかし、次のような「暗黙の」風上スキームを提案する人はいません。 。Tn+1i−Tniτ+uTn+1i−Tn+1i−1hx=0Tin+1−Tinτ+uTin+1−Ti−1n+1hx=0\frac{T^{n+1}_i-T^{n}_i}{\tau}+u\frac{T^{n+1}_i-T^{n+1}_{i-1}}{h_x}=0 私が見た風上のスキームはすべて、空間微分の前のタイムステップのデータを扱っていました。その理由は何ですか?古典的な風上のスキームは、私が上で書いたものと比較してどうですか?

4
数値解析の書籍リファレンス
私はCalculusクラスで数値解析(主に、根の発見、二次方程式、その他の予備的なもののような数値的手法)を垣間見ましたが、今は自分の仕事をもっと洗練したいと思っています。 より一般的な観点から、アルゴリズムの安定性、安定したアルゴリズムの設計、エラー伝播、収束解析などの概念を理解するのに役立つ良い本はありますか? 基本的に、クリロフ部分空間法(QMR、GMRES、およびCG)およびいくつかの非線形最適化アルゴリズムをよりよく理解および分析できるようにしたいと考えています。特に、浮動小数点近似がアルゴリズムにどのように違いをもたらすか。 私が見たほとんどの本の問題は、読者が線形代数について何も知らないと仮定して始め、LU、Gaussian Elimination、QRなどの基本に進む必要がないことです。私が欲しいのは、特定の方法の詳細に入らない数値解析の「鳥瞰図」です。簡潔さが高く評価されます。

3
粒子分解およびドメイン分解の並列化アルゴリズムの長所と短所は何ですか?
GromacsやDL_POLYなどのいくつかのソフトウェアパッケージを使用して、分子動力学(MD)シミュレーションを実行しています。 Gromacsは、粒子分解アルゴリズムとドメイン分解アルゴリズムの両方をサポートするようになりました。デフォルトでは、Gromacsシミュレーションはドメイン分解を使用しますが、長年、最近まで、粒子分解はGromacsで実装された唯一の方法でした。Gromacsの論文の1つ(DOI 10.1002 / jcc.20291)で、著者は粒子分解の最初の選択の理由を示しています。 「初期の設計決定は、プロセッサに作業を分散するためにドメイン分解ではなく粒子分解を使用する選択でした。後者の場合、空間ドメインはプロセッサに割り当てられます。ドメイン分解は、線形システムのサイズが相互作用の範囲を大幅に超える場合にのみ適切な選択です(分子動力学ではほとんどありません)。粒子分解では、各プロセッサが力と座標/速度の更新を計算しますプロセッサに均等に分散された事前計算されたネイバーリストを使用して、割り当てられたパーティクルの一部に対して。F私はjF私jF_{ij}粒子 と間のペア相互作用から生じるは、粒子と 両方の速度更新に必要です。私私ijjj私私ijjj、一度だけ計算され、他のプロセッサに伝達されます。すべてのプロセッサは、ストレージを必要な座標に制限するのではなく、システムの完全な座標セットをローカルメモリに保持します。これはより単純で通信のオーバーヘッドを節約しますが、メモリクレームは通常、何百万ものパーティクルであっても制限要因ではありません。一方、近隣リストは、最大1000倍の数のパーティクルを含むことができ、プロセッサに分散されます。通信は本質的に、座標の送信とプロセッサリングの周りのタイムステップごとに1回の強制に制限されます。これらの選択肢は、長期にわたって堅牢であり、最新のプロセッサクラスタに簡単に適用できることが実証されています。」 「ドメイン分解は、線形システムのサイズが相互作用の範囲を大幅に超える場合にのみより良い選択です。これは分子動力学ではめったにありません」という文の「線形システムのサイズ」とはどういう意味ですか?上記の段落から、粒子の分解には、ドメインの境界を越えて移動する粒子を処理する必要がないという利点があります。むしろ、システム構成全体を保存するのに十分なメモリが各プロセッサに必要です。したがって、ドメイン分解は非常に好ましくないように見えますが、粒子分解は非常に好ましいように見えます。 これは非常に複雑な質問(そしておそらく多くの本の主題)であると確信していますが、基本的に、粒子の分解が非常に好ましいと思われる場合、ドメイン分解を使用する必要があるのはなぜですか? システムのサイズが非常に大きい場合(各プロセッサに構成全体を保存するのが困難または不可能になる場合)、ドメインの分解は適切ですか?上記の引用された段落に基づいて、ドメイン分解が最近、Gromacsのデフォルトの並列化アルゴリズムである理由がわかりません。 DL_POLY(バージョン4)もドメイン分解を使用しているようです。バージョン4のマニュアルから: 「この方法での構成データの分割は、シミュレーションセル内の原子の位置に基づいています。このようなシステムデータの幾何学的割り当ては、DDアルゴリズムの特徴です。この戦略が効率的に機能するために、システムは合理的に均一な密度を持たなければならないので、各プロセッサには原子データのほぼ等しい部分が割り当てられます(可能な限り)。この方法は概念的には簡単ですが、プログラミングは難しく、効率が最も高い大規模なシミュレーションに特に適しています。 ... DD戦略の場合、SHAKE(RATTLE)アルゴリズムはDL_POLY ClassicのReplicated Dataメソッドよりも単純です。この場合、原子位置のグローバルな更新(マージとスプライシング)が必要です。 これにより、実装が困難になる可能性がありますが、より効率的になる可能性があるため、ドメイン分解が良好であるかのように聞こえます。 一方、以前のバージョン(DL_POLY Classic)は複製されたデータの並列化を使用していました。これは、パーティクル分解の別名と思われます。そのバージョンのマニュアルから: レプリケートデータ(RD)戦略は、MDで並列化を実現するいくつかの方法の1つです。その名前は、並列コンピューターの各ノード上の構成データの複製に由来します(すなわち、原子座標、速度 定義する配列、およびを強制しますすべてr私r私\textbf{r}_iv私v私\textbf{v}_if私f私\textbf{f}_iNNNシミュレートされたシステム内の原子は、すべての処理ノードで再現されます)。この戦略では、力の計算と運動方程式の統合のほとんどは、ノード間で簡単かつ均等に共有でき、大部分は各ノードで独立して処理できます。この方法は、プログラムが比較的簡単であり、かなり効率的です。さらに、単一のプロセッサで非常に簡単に実行できるように「折りたたみ」できます。ただし、この戦略はメモリを大量に消費し、通信のオーバーヘッドが高くなる可能性がありますが、全体的に見て、幅広いアプリケーションで成功することが実証されています。 この段落は一般に、この質問の最初の段落と一致しているように見えますが、複製されたデータ/粒子の分解には「高い通信オーバーヘッド」があると書かれています。Gromacsの論文のパラグラフは、その逆を言っているようです。つまり、粒子分解は、ドメイン分解よりも通信のオーバーヘッドが少ないため、好ましいと言えます。 何か考えはありますか?

2
SciCompモデリングジョブ
メタはキャリアアドバイスがOKであることを示唆するように見えました。。。ここに行きます。 私はMLと数学モデリングの分野で数人の親しい友人がいて、博士号を終えて就職活動を始めました。どちらも非常に適格で才能がありますが、どちらもアカデミアに留まることに興味はありません。 個人的な紹介やコミュニケーションに加えて、私はいつも最高の幸運に恵まれてきましたが、その地域で仕事を探している人を助けることができるリソース/ウェブサイト/アグリゲーターはありますか?

3
大規模なデータセットを使用した計算問題のI / O戦略
私の研究グループは、分子動力学に焦点を当てています。分子動力学は、明らかに分析しなければならない単一の軌跡の一部としてギガバイトのデータを生成する可能性があります。 私たちが懸念している問題のいくつかは、データセットの相関関係に関係しています。つまり、より逐次的なアプローチを使用するのではなく、メモリ内の大量のデータを追跡して分析する必要があります。 私が知りたいのは、大規模なデータセットのI / Oをスクリプトに処理するための最も効率的な戦略です。通常、Pythonベースのスクリプトを使用するのは、ファイルI / OのコーディングがCやFortranよりもはるかに簡単になるためですが、処理する必要のある行が数千または数億ある場合、最適なアプローチが明確ではありません。Cでコードのファイル入力部分を実行することを検討する必要がありますか、または別の戦略がより便利ですか?(単に配列全体をメモリにプリロードする方が、一連の「チャンク」(メガバイトのオーダー)の順次読み取りよりも優れているでしょうか? いくつかの追加のメモ: 私たちは、「オンライン」ツールではなく、後処理用のスクリプトツールを主に探しています。そのため、Pythonを使用しています。 上記のように、MDシミュレーションを行っています。関心のあるトピックの1つは拡散計算です。そのためには、アインシュタイン拡散係数を取得する必要があります これは、計算を開始する前にすべてのデータをメモリにロードする必要があることを意味します。すべてのデータの塊(個々の時間の記録)は互いに相互作用します。D = 16リムΔ T → ∞⟨ (X(T + Δ T )- X(T))2⟩D=16リム△t→∞⟨(バツ(t+△t)−バツ(t))2⟩D = \frac{1}{6} \lim_{\Delta t \rightarrow \infty} \left< \left( {\bf x}(t + \Delta t) - {\bf x}(t) \right)^2 \right>
15 python  c  efficiency 

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