問題タブ [ode]
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.
matlab - ode45 の使用中に予期しない結果が得られる
Matlab でコードを記述して微分方程式系を解こうとしています。誰かが私を助けてくれることを願って、私はこのフォーラムに投稿しています。10 個の結合微分方程式のシステムがあります。これは、人間の集団と昆虫の集団の間での病気の伝染を捉えたベクター宿主流行モデルです。これは微分方程式の単純なシステムであるode45
ため、非スティッフな問題タイプにはソルバー ( ) を使用しています。
10 個の微分方程式があり、それぞれが 10 個の異なる状態変数を表しています。10 連成 ODE の同じシステムを持つ関数が 2 つあります。NoEffects_derivative_6_15_2012.m
ODE の元のシステムを含む1 つが呼び出されます。もう 1 つの関数が呼び出さOnlyLethal_derivative_6_15_2012.m
れます。この関数には、同じ ODE のシステムが含まれており、時間から始まる引き出し率が増加しgamma=32 %days
、その引き出し率は時間とともに指数関数的に減衰します。
ode45
同じ初期条件を使用して、両方のシステムを解決するために使用します。時間ベクトルも両方のシステムで同じで、 から に進みt0
ますtfinal
。このベクトルには からまでtspan
の時間値が含まれており、それぞれが 0.25 日の増分で、合計 157 の時間値になります。t0
tfinal
解の値は、行列ye0
およびに格納されyeL
ます。これらの行列はどちらも、157 行と 10 列 (10 個の状態変数値) を含みます。10 番目の状態変数の値をtime=tfinal
行列ye0
で比較しyeL
、差をプロットすると、いくつかの時間値で負になっていることがわかります。(コマンドを使用: plot(te0,ye0(:,10)-yeL(:,10))
)。これは想定外です。t0
からまでのすべての時間値についてtfinal
、10 状態変数の値は、増加した引き出し率が適用されていない ODE のシステムから得られた解であるため、より大きくなるはずです。
私の matlab コードにバグがあると言われました。そのバグを見つける方法がわかりません。または、私が使用している matlab のソルバー ( ode45
) が効率的でなく、この種の問題が発生する可能性があります。誰でも助けることができます。
私も試してみode23
ましode113
たが、それでも同じ問題が発生します。図 (2) は、時間値 32 と 34 で負になる曲線を示しており、これは予期しない結果を示しています。この曲線は、すべての時間値に対して正の値を持つ必要があります。誰かが提案できる他のフォーラムはありますか?
メインのスクリプト ファイルは次のとおりです。
関数ファイル:NoEffects_derivative_6_15_2012
関数ファイル:OnlyLethal_derivative_6_15_2012
関数ファイル:artificialdeathrate1
関数ファイル:iOFt
関数ファイル:oOFt
matlab - 常微分方程式表現の誤り
更新リンクLE で指定されたリアプノフ指数を見つけようとしています。私の場合、次の式を使用して、それを理解し、理解しようとしています。これらは一連の常微分方程式です (これらは cos と sin を ODE として扱う方法をテストするためのものです)
とx=X(1); y=X(2); cos(y)=X(3);
f1 はdx/dt
;f2dy/dt
を意味し、この場合の f3 は になります-10sinx
。ただし、x=X(1);y=X(2); と表現する場合、cos をどのように表現すればよいかわかりません。 cos、sin などの項を別の変数の関数として。
ode45 を使用してこれらの方程式を解く場合
次のエラーがスローされます
??? (2) にアクセスしようとしました。index は正の整数または論理値でなければなりません。
- 私の代理は
x=X(1); y=X(2); cos(y)=X(3);
大丈夫ですか? - エラーを解決するには?ありがとうございました
genetic-algorithm - GA 内で呼び出されたときに matlab ode15s が機能しない
ブッシングの数学的 (パラメトリック) モデルがあります。モデルへの入力は変位 (正弦波) で、力は出力 (それぞれのタイムステップ) です。
モデルのパラメーターは GA を使用して識別され、力の方程式は ode15s ソルバーを使用して解かれます。
ソルバーは、一連のパラメーターが (GA を使用せずに) 想定されている場合に出力を提供しますが、GA から呼び出されると、次のエラーがn
何度も発生します。
警告: 行列が特異であるか、特異に近いか、スケールが不適切です。結果が不正確になる場合があります。RCOND = NaN。
そして最後に
警告: t=1.570796e+000 で失敗。時間 t で許容される最小値 (3.552714e-015) よりもステップ サイズを小さくしないと、積分許容誤差を満たすことができません。
コードは GA を使用せずに、GA を使用せずに正常に動作するため、少し困惑しています。ご意見をお寄せいただき、誠にありがとうございました。
よろしくお願いします。
コード : メインコール
GA_test 関数:
my_force_Curve
個々のモデルの力を計算します:
differential_BW
方程式を解きます。
長すぎる場合はお詫び申し上げます。
再度、感謝します。
python - 配列サイズに関するScipy odeint ODEエラー
物理学の場の理論における N 体の問題から生じる ODE を解こうとしています。そのために、私は scipy.integrate.odeint 関数を使用することを考えました。次の場所にあるコードをいくつか書きました。
http://pastebin.com/yuBbEjwg (質問が最初に提起されてから更新)
ただし、実行しようとすると、次のエラーが発生します。
誰かが私が間違っていることを指摘できますか? そして、なぜ私のコードが機能しないのですか? また、私の場合、ode 関数と odeint 関数の使用に違いがあるかどうかを尋ねたかったのですか?
ありがとう。
EDIT : ばかげた間違い (shape() -> shape) を修正しました。それを指摘してくれた Talonmies に感謝します。上記のリンクは正しいスクリプトを指しているはずです。
EDIT 2 : odeint 関数が ODE 関数によって返されるタプルを好まないのではないかと疑っています。結合ベクトル ODE を解決する必要がある場合、タプルをフォーマットする方法について誰か助けてもらえますか? 私は、人々が結合 ODE またはベクトル ODE を解いているケースを見つけましたが、両方ではありません...
EDIT 3 : odeinit 関数に初期条件の行列を与え、ODE という名前の関数から返される行列が同じ次元の行列になるように例を作り直しました...ただし、同じエラーが発生します。
java - 優れたJavaODEソルバーを探して
私は、ODEソルバー(ode45)を使用してMATLABでアルゴリズムのGUIを作成するプロジェクトに取り組んでいます。したがって、MATLABコードをJavaに変換する必要があります。問題はode45ソルバーです。Javaにはすぐに使えるソルバーがないようで、ODEは私の専門ではありません。私は見栄えが悪いだけですか、それともJava用のODEソルバーが実際に実装されていませんか?
ありがとう
c++ - コンパイルエラー Odeint CUDA Visual studio 2008
ODEint を使用して、結合された ode 方程式のセットを解いています。CPU用の作業コードがあり、CUDAを使用してGPUに同じコードを実装しようとしています. スラスト ライブラリで指定された CUDA コードをコンパイルしましたが、それらは CUDA コンピューティング ツールキットで提供されているものと同様に正常に動作するようです。ただし、スラスト セクションの下の ODEint に付属する CUDA コードの例をコンパイルしているときに、コンパイル中に次のエラーが発生します。
CPUコードにもブーストライブラリを以前に使用しましたが、それらは正常に機能しているようです。しかし、boost ライブラリを組み込み、コードを変換して GPU で実行しようとすると、再び同じエラーが表示されました。私はコンパイルに Visual Studio 2008 IDE を使用しています。
c - MPI ワーカーに配布された完全なベクターにアクセスして印刷するにはどうすればよいですか?
MPI で個々のスレッドからグローバル ベクトルにアクセスするにはどうすればよいですか?
CVODE ( SUNDIALSの一部) と呼ばれるライブラリ、具体的には ODE ソルバー ライブラリを使用しています。ライブラリは MPI で動作するため、複数のスレッドが並行して実行されます。それらはすべて同じコードを実行しています。各スレッドは、「隣の」スレッドにデータを送信します。しかし、スレッドの 1 つ (ランク = 0) が、ある時点でデータの状態を出力するようにします。
ライブラリには、各スレッドが独自のデータ (ローカル ベクトル) にアクセスできるようにする関数が含まれています。しかし、グローバルベクトルにアクセスする方法はありません。
特定の時間にすべての方程式の値を出力する必要があります。そのためには、グローバル ベクトルにアクセスする必要があります。MPI ベクトル内のすべてのデータを取得する方法を知っている人はいますか (可能であれば CVODE を使用)。
たとえば、各スレッドが実行する私のコードは次のとおりです
関数f
(私が解いている関数) では、 and を使用してデータをやり取りしMPI_Send
ますMPI_Recv
。しかし、他のプロセスが先に実行されているため、PrintData で実際にそれを行うことはできません。また、メッセージングのオーバーヘッドを追加したくありません。のグローバル ベクトルにアクセスして、PrintData
必要なものを出力したいだけです。出来ますか?
編集:より良い答えを待っている間、データを0番目のスレッドに戻す各スレッドをプログラムしました。メッセージングのオーバーヘッドが増えすぎているとは思いませんが、より良い方法があれば、専門家の意見を聞きたいです (悪い方法はないと確信しています! :D )。
編集 2 : angainor のソリューションは確かに優れていますが、私が作成したものに固執しました。同じ質問をした人の将来の参考のために、ここに私がそれをした方法の基本があります:
matlab - tspan=[to:very_small_step:tf] を設定することで、ode45 ソルバーのステップ サイズに影響を与えることができますか?
ode45
ソルバーには、Matlab プログラム自体によって制御される適応ステップ サイズがあることを知っています。以下の説明は、Matlab Web サイトによって提供されます。
2 つ以上の要素で tspan を指定しても、ソルバーが tspan(1) から tspan(end) までの間隔をトラバースするために使用する内部時間ステップには影響しません。ODE >suite のすべてのソルバーは、基本的な数式を継続的に拡張することによって出力値を取得します。ソルバーは必ずしも tspan で指定された時点まで正確に進むとは限りませんが、指定された時点で生成された解は、内部の時点で計算された解と同程度の精度です。
ただし、で指定するvery_small_step
とtspan=[to:very_small_step:tf]
、プログラム制御のステップ サイズに影響します。この強制ステップ サイズは の値より小さくなりますvery_small_step
か? または matlab は補間計算を行い、指定された時点で対応する結果を取得しますか?
wolfram-mathematica - 連立方程式の動的生成
私はMathematicaに不慣れで、ODEのシステムを動的に生成する方法を理解しようとしています。たとえば、100の方程式のシステムがあり、10ごとに基本的に同じですが、ベクトル(長さ10)から読み取ることができるパラメーターがわずかに異なります。10個の方程式を書き出してから、イテレータをループして100個すべての方程式を生成したいと思います。これを行うための標準的な方法はありますか?
たとえば、これは30の方程式のシステムです(1:10のiの場合)。
iを100に増やすと、新しい方程式をコピーして貼り付けるのは冗長に思えます(つまり、300のODEが得られます)。
matlab - Matlab: 通常の Matlab ODE 引数を取る CVODE インターフェイス
CVODE は、人気のあるSUNDIALS パッケージの一部である 2 つの ODE ソルバーの 1 つです。ode*
Matlab インターフェイスが提供されていますが、使用方法は標準の Matlabインターフェイスと同じではありません。ソルバーを初期化し、必要な各時点をステップ実行し、最後にメモリを解放する必要があります。明らかに、これは のようなものを簡単に置き換えるものではありませんode15s
。Matlab ODE ソルバーの通常の引数を取る CVODE のラッパーを書いた人はいますか?