計算科学

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

4
ライブラリ関数のFLOPカウント
単純な関数でFLOPの数を評価するとき、基本的な算術演算子を集計する式を単純にたどることができます。ただし、偶数除算を含む数学ステートメントの場合、これを行うことはできず、加算と乗算のみの関数からのFLOPカウントと比較できると期待されます。操作がライブラリに実装されると、状況はさらに悪化します。したがって、特別な機能のパフォーマンスについて合理的な考えを持つことが不可欠です。 特別な機能とは、次のようなものを意味します。 exp() sqrt() sin / cos / tan() 通常はシステムライブラリによって提供されます。 これらの複雑さの決定は、それらの多くが適応性があり、入力依存の複雑さを持っているという事実によってさらに混乱します。たとえば、exp()の数値的に安定した実装は、多くの場合、適応的に再スケーリングしてルックアップを使用します。ここでの私の最初の印象は、この場合にできる最善の方法は、関数の平均的な動作を確認することです。 この議論全体は、もちろん、アーキテクチャに大きく依存しています。この議論では、従来の汎用アーキテクチャに限定し、特別な機能ユニット(GPUなど)を持つアーキテクチャを除外できます。 システムとシステムの比較のために、特定のアーキテクチャ向けにこれらを標準化するかなり簡単な試みを見つけることができますが、メソッドとメソッドのパフォーマンスを重視する場合、これは受け入れられません。これらの関数のフロップの複雑さを決定するためのどの方法論が受け入れられると考えられますか?大きな落とし穴はありますか?


3
数学的に、なぜ質量行列/負荷ベクトルの集中が機能するのですか?
一貫した質量行列を集中対角行列に置き換えることがよくあることを知っています。過去には、FEMに一貫した方法ではなく、集中的な方法で負荷ベクトルがアセンブルされるコードも実装しました。しかし、そもそもなぜこれを許可されているのか、私は一度も調べたことがありません。 塊と荷重ベクトルに適用できるようにする塊の背後にある直感は何ですか?それの数学的正当化とは何ですか?どのような状況で、固まりが許可されない/質量および負荷ベクトルの適切な近似ではないのですか?

2
C ++で数値ソフトウェアを書く際のデザインパターン
私は数値ソフトウェアの設計パターンと原則に関するリソースを探していますが、必ずしも必要ではありませんが、数値コードに対するオブジェクト指向のアプローチに焦点を当てています。 私は「科学ソフトウェアを書く:良いスタイルのためのガイド」というテキストを知っていますが、これはまだ浮動小数点の問題、最適化の方法とタイミングなどを扱っています。 アルゴリズムなどを扱うものではなく、数値コードの設計の全体像に関する情報を探しています。 このためのリソースがあることを願っています。特に、C ++の良いイディオムと実践に関する自分の知識を除いて、物事を正しく設計するためのガイドがないので、ライブラリを次から次へと進むだけではありません。 (これは言語固有ではありませんが、言語固有のコンテンツがある場合は、C ++を好むでしょう。)

2
ベクトル間の角度を計算する数値的に安定した方法
2つのベクトル間の角度に古典的な公式を適用する場合: α=arccosv1⋅v2∥v1∥∥v2∥α=arccos⁡v1⋅v2‖v1‖‖v2‖\alpha = \arccos \frac{\mathbf{v_1} \cdot \mathbf{v_2}}{\|\mathbf{v_1}\| \|\mathbf{v_2}\|} 非常に小さい/鋭角の場合、精度が失われ、結果が正確ではないことがわかります。このStack Overflow answerで説明されているように、1つの解決策は代わりにアークタンジェントを使用することです。 α=arctan2(∥v1×v2∥,v1⋅v2)α=arctan⁡2(‖v1×v2‖,v1⋅v2)\alpha = \arctan2 \left(\|\mathbf{v_1} \times \mathbf{v_2}\|, \mathbf{v_1} \cdot \mathbf{v_2} \right) そして、これは実際により良い結果をもたらします。しかし、これがに非常に近い角度で悪い結果を与えるのではないかと思います。そうですか?もしそうなら、ブランチ内の公差をチェックせずに角度を正確に計算する式はありますか?π/2π/2\pi / 2if

2
krylovメソッドを別のkrylovメソッドで事前調整する
gmresやbicgstabのようなメソッドでは、別のkrylovメソッドを前提条件として使用すると魅力的です。結局のところ、それらは、マトリックスを使用しない方法および並列環境で簡単に実装できます。たとえば、1つのcoulは、gmresまたはkrylovメソッドのその他の組み合わせの事前調整子として、事前調整されていないbigcstabのいくつかの(たとえば〜5回)反復を使用します。私は文学ではそのようなアプローチにあまり言及していないので、あまり効果的ではないからだと思う。なぜそれが効率的でないのかを理解したいと思います。それが良い選択である場合はありますか? 私の研究では、並列(mpi)環境での3D楕円問題の解決に興味があります。

1
ヌルスペースを削除するためにポイントを固定するのはなぜ悪いのですか?
すべてのノイマン境界条件を持つポアソン方程式には、単一の一定次元のヌル空間があります。クリロフ法で解く場合、反復ごとに解の平均を減算するか、単一の頂点の値を固定することにより、ヌル空間を削除できます。 単一の頂点を固定すると、単純化という利点があり、投影ごとの余分なグローバルな削減も回避されます。ただし、コンディショニングへの影響により、通常は悪いと見なされます。したがって、私は常に平均を差し引いてきました。 ただし、2つの方法は、最大でランク2の修正だけ異なるため、(1)によると、ほぼ同じ反復回数(少なくとも正確な算術計算)で収束する必要があります。この推論は正しいのですか、それともポイントの固定が悪い(おそらく不正確な算術)という追加の理由がありますか? (1):低ランクの変更はKrylovメソッドの収束にどのように影響しますか?

1
後者がより正確である場合、leapfrog統合はシンプレクティックであり、RK4はそうではないのはなぜですか?
理論的にエネルギーを節約する必要のあるシステムでは、最も正確なシミュレーションがエネルギーを節約します(正確な位置、速度などを提供します)。RK4はleapfrogよりも正確ですが、leapfrogはエネルギーを節約しますが、RK4はそうではありません。どうしてこれなの?


1
可変速度の移流方程式は保守的ですか?
速度係数が可変の移流方程式をもう少し良く理解しようとしています。特に、方程式がどのように保守的であるかはわかりません。 移流方程式、 ∂u∂t+∂∂x(vu)=0∂u∂t+∂∂x(vu)=0 \frac{\partial u}{\partial t} + \frac{\partial}{\partial x}(\boldsymbol{v}u) = 0 u(x,t)u(x,t)u(x,t)を、物理種(cm−3cm−3cm^{-3})の濃度または作成または破壊できない物理量として解釈してみましょう。ドメイン上でu(x、t)を統合する場合、u(x,t)u(x,t)u(x,t)定数を取得する必要があります。 ∫xmaxxminu(x,t)dx=constant∫xminxmaxu(x,t)dx=constant \int_{x_{\text{min}}}^{x_{\text{max}}} u(x,t) dx = \text{constant} (これは保守的であることの意味です。) ここで、速度を空間(および時間)の関数v(x,t)v(x,t)\boldsymbol{v}(x,t)にすると、チェーンルールを適用して、 ∂u∂t+v∂u∂x+u∂v∂x?=0∂u∂t+v∂u∂x+u∂v∂x⏟?=0 \frac{\partial u}{\partial t} + \boldsymbol{v}\frac{\partial u}{\partial x} + \underbrace{u\frac{\partial \boldsymbol{v}}{\partial x}}_{\text{?}} = 0 最後の用語はソース用語のように「見え」ますが、これは紛らわしいものです。速度場の発散に応じて、量uuu増減します。 この質問に続いて、保存境界条件を課す方法を理解しています。ただし、可変速度移流方程式については、チェーンルールを適用することによって導入される追加の「ソース項」のために、保存境界条件をどのように導出できるかがわかりません。この方程式は保守的ですか?もしそうなら、どのように正しい境界条件を適用できますか?

2
Matlabで「for」ループを記述する最も効率的な方法は何ですか?
たとえば、forマトリックスのインデックスを実行するダブルループがある場合、外側のループにインデックスを実行する列を配置する方が効率的であることを読みました。例えば: a=zeros(1000); for j=1:1000 for i=1:1000 a(i,j)=1; end end 3つ以上のforループがある場合、それをコーディングする最も効率的な方法は何ですか? 例えば: a=zeros(100,100,100); for j=1:100 for i=1:100 for k=1:100 a(i,j,k)=1; end end end

2
PDE逆問題における点ごとの観測と連続的な観測
私は博士号の逆問題に取り組んでいます。簡単にするために、を決定しますββ\beta L (β)U ≡ - ∇ ⋅ (K0eβ∇ U )= FL(β)あなたは≡−∇⋅(k0eβ∇あなたは)=fL(\beta)u \equiv -\nabla\cdot(k_0e^\beta\nabla u) = f いくつかの観測からあなたはoあなたはou^o ; k0k0k_0は定数で、fffは既知です。これは通常、極値化のための最適化問題として定式化されます J[ u 、λ ; β] = 12∫Ω(u (x )− uo(x ))2dx + ∫Ωλ (L (β)u − f)dバツJ[あなたは、λ;β]=12∫Ω(あなたは(バツ)−あなたはo(バツ))2dバツ+∫Ωλ(L(β)あなたは−f)dバツJ[u, \lambda; \beta] = \frac{1}{2}\int_\Omega(u(x) - u^o(x))^2dx + \int_\Omega\lambda(L(\beta)u - f)dx ここで、λλ\lambdaはラグランジュ乗数です。\ betaに関するJの関数微分は、随伴方程式を解くことにより計算できます。JJJββ\beta L (β)λ …

1
直接ソルバーは行列の条件数の影響を受けますか?
比較的小さな問題、つまりLUのような直接的な方法で処理できる問題を解決する場合、線形演算子の条件数は解の精度に影響しますか? 私が取り組んでいる研究上の問題の1つは、線形連立方程式を解くための最適化手法の開発に焦点を当てています。 これは、反復法と前提条件を使用する場合に考慮する重要な要素ですが、今は小さな問題(1M自由度未満)を解いているため、今のところ直接ソルバーが適切です。

2
ノイズの多いデータや微細構造のデータの場合、ミッドポイントルールよりも優れた求積法がありますか?
この長い質問の最初の2つのセクションのみが必須です。その他は、単に説明のためのものです。 バックグラウンド 高次複合ニュートン・コート、ゴース・レジェンドレ、およびロンバーグなどの高度な求積法は、主に、関数を細かくサンプリングできるが分析的に統合できない場合を対象としています。ただし、サンプリング間隔(例については付録Aを参照)または測定ノイズよりも細かい構造を持つ関数については、中間点や台形規則(デモについては付録Bを参照)などの単純なアプローチと競合することはできません。 これは、例えば、シンプソンの複合ルールが基本的に情報の4分の1に低い重みを割り当てることで「破棄」するため、やや直感的です。このような求積法が十分に退屈な関数に適している唯一の理由は、境界効果を適切に処理することは、破棄される情報の効果を上回ることです。別の観点から、微細な構造またはノイズのある関数の場合、統合ドメインの境界から離れたサンプルは、ほぼ等距離であり、ほぼ同じ重みを持たなければならないことは直感的に明らかです(多数のサンプルの場合) )。一方、このような関数の直角位相は、(中間点の方法よりも)境界効果の処理を改善することから恩恵を受ける場合があります。 質問 ノイズの多い、または微細構造の1次元データを数値的に統合したいとします。 サンプリングポイントの数は固定されています(関数の評価に費用がかかるため)が、自由に配置できます。ただし、I(またはメソッド)は、他のサンプリングポイントの結果に基づいて、対話的にサンプリングポイントを配置することはできません。また、潜在的な問題領域を事前に知りません。したがって、Gauß–Legendre(非等距離サンプリングポイント)のようなものは問題ありません。適応求積法は、インタラクティブに配置されたサンプリングポイントを必要とするため、そうではありません。 そのような場合、中間点の方法を超える方法が提案されていますか? または:そのような条件下で中点法が最適であるという証拠はありますか? より一般的に:この問題に関する既存の作業はありますか? 付録A:微細構造化関数の具体例 私は推定したいの場合: F (T )= k個のΣ iは= 1つの罪(ω I T - φ I)∫10f(t)dt∫01f(t)dt\int_0^1f(t)\, \mathrm{d}t とφI∈[0、2π]とログωI∈[1、1000年]。典型的な関数は次のようになります。f(t)=∑i=1ksin(ωit−φi)ωi,f(t)=∑i=1ksin⁡(ωit−φi)ωi, f(t) = \sum_{i=1}^{k} \frac{\sin(ω_i t-φ_i)}{ω_i},φi∈[0,2π]φi∈[0,2π]φ_i∈ [0,2π]logωi∈[1,1000]log⁡ωi∈[1,1000]\log{ω_i} ∈ [1,1000] 次のプロパティにこの機能を選択しました。 制御結果を分析的に統合できます。 私が使用しているサンプル数()ですべてをキャプチャすることを不可能にするレベルの微細構造を持っています。&lt;102&lt;102<10^2 微細構造に支配されていません。 付録B:ベンチマーク 完全を期すために、Pythonのベンチマークを次に示します。 import numpy as np from numpy.random import uniform from scipy.integrate …

2
代数的マルチグリッド:補間と制限の積がノルム1の結果にならないのはなぜですか?
私は現在、ブリッグスらによる第8章の「マルチグリッドチュートリアル」で作業しています。 補間演算子の構成は次のとおりです。 次に、制限演算子と細かいグリッド演算子の構築は次のように与えられます: 3つのグリッドポイントx0、x1、x2があり、中央のグリッドポイントx1は細かく、他のグリッドポイントは粗いものと仮定します。真ん中のものはによって補間されx1 = x0*w0 + x2*w2ます。したがって、補間演算子は(Matlabで): I = [1, 0, 0; w0, 0, w2; 0, 0, 1] I = [ 1, 0, 0] [ w0, 0, w2] [ 0, 0, 1] 制限演算子は次のとおりです。 transpose(I) ans = [ 1, w0, 0] [ 0, 0, 0] [ 0, w2, 1] では、制限してから直接補間するとどうなるのか、Iそしてandの乗算になる結果を見てみましょうtranspose(I)。 …

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