問題タブ [odeint]
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++ - boost:odeint を使用した単純な C++ プログラムでのアサーション エラー
これがすぐに明らかである場合は申し訳ありませんが、私は Python / MATLAB / Mathematica のバックグラウンドから来た C++ に非常に慣れていません。Odeintライブラリの機能を試して、パフォーマンスを他のライブラリと比較するために、有限差分空間離散化を使用して、古典的な 1D 熱方程式の単純なソルバーを作成しました。コードは一目瞭然です。
これは、g++ 4.8.2 と Ubuntu リポジトリの最新のブースト ライブラリを使用して、Ubuntu 14.04 で問題なくコンパイルされます。ただし、結果の実行可能ファイルを実行すると、次のエラーが発生します。
残念ながら、これは私の初心者の脳にとって特に役立つものではなく、これを修正する方法について途方に暮れています. エラーの原因は何ですか?
c++ - odeint 暗黙的オイラーの簡単な例
暗黙的なスキームを使用して odeint ライブラリを使用して ODE のシステムを解くことに興味があり、単純なimplicit_euler
例を実装するのが困難です。
ドキュメントを見ると、明示的なステッパー、適応型のステッパー、およびステッパーを機能させることができましたrosenbrock4
。前者は半暗黙的なようです。したがって、私は完全に暗黙的なスキームを実装することに興味がありました (同時に、各時間ステップでヤコビ行列を取得します)。しかし、このステッパーのドキュメントと実際の例を見つけることができませんでした。私が持っているのは
エラーは次のとおりです。
C:\boost_1_55_0\boost\numeric\odeint\stepper\implicit_euler.hpp:94
: エラー: C2064: 用語は、3 つの引数を取る関数として評価されません クラスは、operator()
適切な数の引数を取る関数へのポインタまたは関数への参照への ' ' またはユーザー定義の変換演算子を定義しません
私の質問は次のとおりです。誰かがそれを機能させる方法を知っていますか、または誰かがこれよりも詳細なドキュメントを教えてくれますか:
またはこれ:
ありがとう
segmentation-fault - スラストとブーストの odeint を組み合わせます。segfault の原因と考えられる誤ったポインタの受け渡し
多くの初期条件の初期値の問題を解決するために、boost::odeintの lorenz_parameters.cu の例を変更しようとしています。プログラムでセグメンテーション違反が発生しました。これは、の呼び出しにポインタを誤って渡したことが原因であると考えられますintegrate_adaptive()
。導関数を格納するためのベクトルのサイズを出力しようとすると、0 になるからです。
参考までに、例のドキュメントと同じ例のコードを次に示します(何らかの理由で、元のドキュメントのコードへのリンクが機能しません)。
プログラムの完全なソース コードを以下に添付しました。UNEXPECTED OUTPUT!
微分ベクトルのサイズを出力しようとすると、状態ベクトル (512) と同じサイズの 0 と表示されます。とマークされた行もありますLINE I DO NOT UNDERSTAND
。これは、何か間違ったことをしている可能性があると思われる場所です。operator()
この行は、intergrate_adaptive() への呼び出しの一部であり、この引数は、(最終的に / odeint パッケージを介して) の関数に渡されるものだと思いますparallel_initial_condition_problem
。しかし、例と同じことをしようとしていますが、まだ機能していません。どんな助けでも大歓迎です!
これを実行した結果は次のとおりです。
python - bz 反応の Odeint グラフ プロットが正しいグラフ結果を与えない
問題は「func」にあると思いますが、見つかりません。私が得たグラフは、0 の赤い線だけです。Belousov-Zhabotinsky 反応の時間の経過に伴う z と y の濃度のプロットを取得しようとしています。
c++ - ODEINT + THRUST オブザーバーで、式は変更可能な左辺値でなければならないというエラーを受け取る
私は、パラメーターを体系的に変化させ、効果を観察する推力 + odeint の例 [コード、ドキュメント]の拡張/変更に取り組んできました。
変更可能な特定の変数を変更しようとすると (例では変更されています)、奇妙なエラーが発生します。次のエラーが表示されます。
以下は、実行しようとしているオブザーバー構造体のソース コードで、エラーの原因となった行を示すコメントが付いています。
このエラーは、代入演算子 の左側の式が=
変更可能な値ではないことを意味していると理解しています。しかし、上記のソース例にある同じ名前の変数とまったく同じように見えます (問題なく動作します)。
...そして、参考までに、インテグレーターとこのオブザーバーを実行する main() のコードを次に示します。
コードを最も単純なケースに絞り込もうとしました。上記の 3 行目から最後の行をコメントアウトすると、プログラムが正常に実行されます。
私は一体何を間違っているのですか?私の m_count と上記にリンクされているサンプル コードの m_count の違いは何ですか? どうもありがとう!
scipy - Python odeint、初期条件の配列を返す解
以下のコードを参照してください
このコードを実行すると、初期条件の配列が取得されます
[[ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310. 0.] [ 310.0.] [310.0.]]
これについての考えは大歓迎です。
c++ - ファンクター内で読み取れるように、推力ベースの odeint オブザーバーのコンストラクターにベクトルを渡す方法
スラストで使用されるブーストの odeint からパラメータ調査の例を拡張していますが、値のベクトルをオブザーバのコンストラクタに渡す方法がわかりません。これらの値は、オブザーバのファンクタ内から (読み取り専用で) アクセスできます。 .
以下はオブザーバー専用のコードです。
m_unchingVectorstatic
またはを作成して実験しconst
ましたが、オブザーバーのインスタンス化時に設定する必要があるため、これは正しくありません。
または、おそらくこれを行う最善の方法は、 unchingVector 内の別の引数として渡すことですがthrust::make_zip_iterator( thrust::make_tuple(...
、これらの項目は状態変数のようにインデックス付けされるように感じます (これは私が望むものではありません)。ファンクターの宣言で (T t) が何を意味するのか、およびオペレーターを評価しているすべてのスレッドに unchangeingVector を同じオブジェクトとして渡す方法の説明が役立つ可能性があります。
正しいキーワード変数記述子を選択するだけの問題かもしれませんが、どの変数記述子を使用すればよいかわかりません。また、それを調べたり理解したりする方法もわかりません。
上記のコードで得られるエラーはerror: a nonstatic member reference must be relative to a specific object
. ファンクターで m_unchingVector にアクセスしようとするとスローされます。
さらに調査した結果、このタスクを達成する正しい方法を特定したような気がしますが、まだ行き詰まっています。
ファンクターにコンストラクターを追加しました。
警告:ホストデバイス関数 ("minimum_perturbation_observer::minPerturbFunctor::operator () > " ) からホスト関数 ("thrust::detail::vector_base > ::operator []") を呼び出すことは許可されていません
エラー メッセージ /usr/local/cuda/bin/..//include/thrust/detail/function.h(104): エラー:デバイス関数からホスト関数 ("thrust::device_vector > ::device_vector") を呼び出しています("thrust::detail::device_function ::device_function") は許可されていません
私は何を間違っていますか?
thrust - 引数ベクトルのサイズが異なる場合の、make_tuple を使用した推力 odeint make_zip_iterator の動作
スラストで odeint を使用する場合、多くの初期条件の問題を並行して解決しながら、状態変数のヒストグラムを生成するオブザーバーを開発しています。
初期条件の問題は並行して実行され、device_vector に次のようなデータが入力されます。
または、より簡潔に言えば、配列のインデックスは次のように計算されます。
...以降、このベクトルは変数ごとに 1 つのヒストグラムに縮小されます。
私が見てきた odeint + Thrust で使用されているパラダイムは、演算子のファンクターを、thrust のmake_zip_iterator
andを使用して呼び出すmake_tuple
ことです。したがって、次のようになります。
これは、ファンクターへの引数がすべて同じ長さの場合にうまく機能します。しかし、私の場合、上記のように入力されるヒストグラム データの device_vector はサイズが異なり、ファンクターに与えられた他の引数 (状態変数など) とは異なる方法でインデックスを付ける必要があります。
少し調べてみたところ、これを行う最善の方法は、ファンクターにヒストグラム マトリックスの入力に必要な軌跡インデックスを提供する Thrust ::counting_iteratorを渡すことだと思います。次に、(明らかに) なんらかの形でヒストグラム マトリックスへのポインターを提供して、データを入力できるようにする必要があります。おそらく、observer_functor にヒストグラム ベクトルへのポインターを提供するための最良の解決策は、オブザーバーのコンストラクターへの引数として提供することです (ここに投稿した別の質問の解決策と同様)。
渡された引数が異なる長さのベクトルを示している場合、上記のmake_zip_iterator
/パラダイムの配列がどのように機能するかについて、これらすべてが混乱を引き起こしました。make_tuple
質問:
thrust::counting_iterator
ファンクターオブジェクトのコンストラクターを介して出力配列へのポインターを使用して渡すことは、推奨されるアプローチですか?より一般的には、渡された引数が異なる長さのベクトルを示している場合、上記の
make_zip_iterator
/パラダイムはどのように機能しますか?make_tuple