問題タブ [numerical-computing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 加重平均を計算する際の小さな数値エラー
これは物理エンジンの一部です。
単純化された関数centerOfMass
は、2 つの剛体の 1D 重心を計算します ( demo ) :-
私はb
正確に= 5.55709743である必要があります。
わずかな違いが、場合によっては (私の実際のケース = 5%)、厄介な物理学の発散をもたらすことがあります。
これを解決するにはいくつかの方法があります。たとえば、いくつかの条件付きチェックを大幅に実行します。
ただし、それは私にとって非常にエラーが発生しやすいです。
質問:コードをクリーンで高速に維持しながら、計算エラーを解決するにはどうすればよいですか?
ところで、それがエレガントにできない場合は、呼び出し元を改善して、そのような数値エラーに対してより耐性を持つようにする必要があるでしょう。
編集
(重複した質問を明確にする)
はい、原因はストレージ/計算形式からの精度エラーです (浮動小数点演算は壊れていますか?で説明されています)。
ただし、この質問は、非常に特殊なケースでその症状 を中和する方法について尋ねます。
matlab - 多くの 0 と 1 を含む行列の使用はベクトル化と見なされますか?
必要な変換のために、いくつかの 1 と多くの 0 で構成される mxn 行列 A があるとします。nx1 ベクトルを A で変換する場合、これはベクトル化された実装と見なされますか?
行列 A は主に 0 で構成されていますが、それでも同じ量の FLOP が発生しますか?
必要な変換を別の方法で行う方が賢明で最適化されるでしょうか? 0*c などの不要な計算を行わないものは?
if-statement - 条件が満たされた場合でも、プログラムが Fortran で if ループに入らない
これは、期待どおりに実行されていないコードのセクションです。エラーの場所を特定するために、古いスタイルの「一時停止」ステートメントを含める必要がありました。
出力は次のようになります。
の値heun_percent_tolerance
は 0.01 で、max_heun_number
15 です。最大制限の 15 に達するまで、実行が 2 番目の if ループに入り、さらに反復することを期待していますが、コードは次のx_next
値 2 にジャンプするようです。
私は2つの条件を として組み合わせようとしましたがIf (cond1 .and. cond2)
、それもうまくいきませんでした。
python-2.7 - 後で問題を回避するために Python 2.7x で変数を宣言する
私は MATLAB 出身で、ずっと前に C から来た Python は初めてです。MATLAB で、川の土砂輸送をマルコフ過程としてシミュレートするスクリプトを作成しました。このコードは、指定された寸法の長方形の領域内にランダムな直径の円をランダムに配置します。円は不均一なサイズで、指定されたサイズの範囲からランダムに描画されます。円の配置操作を何回実行するかわからないので、while ループを使用してプロセスを完了します。よりコミュニティ指向になるように、MATLAB スクリプトを Python に変換しています。私はオンライン ツール OMPC を使用して作業を開始し、自動翻訳版から手動で作業を進めてきました (あまり役に立ちませんでしたが、これは当然のことです)。コードをデバッグするために、MATLAB で生成された結果を使用して一般的にPython の結果と比較対照します。スクリプトで計算が進むにつれて問題が発生するような方法で変数を宣言したことは明らかです。コード実行の異なるインスタンス間の一貫した問題の 2 つの例を次に示します。まず、スクリプトが次のような結果を返すため、コードは配列内の配列と思われるものを生成しました。
- array([[ True] [False]], dtype=bool)
この結果は、overlap_logix 操作で次のコード スニペットに対して生成されました。
変数についても、同じ実行で同様の結果が得られました。
- radius_check_update
- radius_overlap
- オーバーラップ_更新
動作中の MATLAB バージョンの同じコード スニペットを次に示します (要求どおり)。
Python バージョンでは、内容をより簡単に操作できるように、リストから配列を作成しました (コード スニペットの最初の 2 行)。配列結果内の配列とデータにアクセスするための配列の作成は、変数の型を間違って宣言したことを示唆していますが、よくわかりません。さらに、一部の変数には、たとえば (2L,) (円が配置されると数値次元が変化します) などのサイズがあり、2 番目の次元はありません。これは、サイズが (2L,1L) の別の配列で操作に配列を使用しようとすると、明らかな問題を引き起こします。これらの問題のために、私は配列の再形成を開始しましたが、1 つまたは複数の変数を間違って宣言したため、これらはハックであると判断したため停止しました。次に、同じ実行で次のエラーが発生しました。
- TypeError: 'numpy.ndarray' オブジェクトは呼び出し可能ではありません
操作の場合:
これは、上記のコード スニペットの下部にあります。自分でスクリプトを実行する方がおそらく便利なので、スクリプト全体を次のリンクに投稿しました。
https://github.com/smchartrand/MarkovProcess_Bedload
いくつかの初期パラメーター値で実行するようにコードをセットアップしたので、決定を下す必要はありません。これらのパラメーター値は、MATLAB ベースのスクリプトで期待される結果を生成します。プロットすると、次のようになります。
したがって、テスト値np.sum([radius_overlap])に応じて、151〜165行目の操作で特に問題が発生しているようです変数の型を間違って宣言したことが原因だと思いますが、よくわかりません。Python バージョンと MATLAB バージョンは、while ループの最初のステップまでの出力と、while ループの 2 番目のステップに入るコード 127 行目まで一貫していると自信を持って言えます。コードのこのポイントより下では、上記の文書化された問題により、最終的にスクリプトがクラッシュします。スクリプトの実行が 15% 完了する場合もあれば、5% に達しない場合もあります。これは、円の配置がランダムであるためです。私は Spyder (Python 2.7) IDE でコードを準備しており、研究の一環として作業コードを公開します。Pythonコーディングの間違いや誤用を特定するために提供できる助けをいただければ幸いです。