問題タブ [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.

0 投票する
1 に答える
1128 参照

matlab - ode45 の使用中に予期しない結果が得られる

Matlab でコードを記述して微分方程式系を解こうとしています。誰かが私を助けてくれることを願って、私はこのフォーラムに投稿しています。10 個の結合微分方程式のシステムがあります。これは、人間の集団と昆虫の集団の間での病気の伝染を捉えたベクター宿主流行モデルです。これは微分方程式の単純なシステムであるode45ため、非スティッフな問題タイプにはソルバー ( ) を使用しています。

10 個の微分方程式があり、それぞれが 10 個の異なる状態変数を表しています。10 連成 ODE の同じシステムを持つ関数が 2 つあります。NoEffects_derivative_6_15_2012.mODE の元のシステムを含む1 つが呼び出されます。もう 1 つの関数が呼び出さOnlyLethal_derivative_6_15_2012.mれます。この関数には、同じ ODE のシステムが含まれており、時間から始まる引き出し率が増加しgamma=32 %days、その引き出し率は時間とともに指数関数的に減衰します。

ode45同じ初期条件を使用して、両方のシステムを解決するために使用します。時間ベクトルも両方のシステムで同じで、 から に進みt0ますtfinal。このベクトルには からまでtspanの時間値が含まれており、それぞれが 0.25 日の増分で、合計 157 の時間値になります。t0tfinal

解の値は、行列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

0 投票する
1 に答える
295 参照

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 は正の整数または論理値でなければなりません。

  1. 私の代理はx=X(1); y=X(2); cos(y)=X(3);大丈夫ですか?
  2. エラーを解決するには?ありがとうございました
0 投票する
1 に答える
1896 参照

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方程式を解きます。

長すぎる場合はお詫び申し上げます。

再度、感謝します。

0 投票する
0 に答える
1491 参照

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 という名前の関数から返される行列が同じ次元の行列になるように例を作り直しました...ただし、同じエラーが発生します。

0 投票する
2 に答える
2490 参照

java - 優れたJavaODEソルバーを探して

私は、ODEソルバー(ode45)を使用してMATLABでアルゴリズムのGUIを作成するプロジェクトに取り組んでいます。したがって、MATLABコードをJavaに変換する必要があります。問題はode45ソルバーです。Javaにはすぐに使えるソルバーがないようで、ODEは私の専門ではありません。私は見栄えが悪いだけですか、それともJava用のODEソルバーが実際に実装されていませんか?

ありがとう

0 投票する
0 に答える
362 参照

c++ - コンパイルエラー Odeint CUDA Visual studio 2008

ODEi​​nt を使用して、結合された ode 方程式のセットを解いています。CPU用の作業コードがあり、CUDAを使用してGPUに同じコードを実装しようとしています. スラスト ライブラリで指定された CUDA コードをコンパイルしましたが、それらは CUDA コンピューティング ツールキットで提供されているものと同様に正常に動作するようです。ただし、スラスト セクションの下の ODEint に付属する CUDA コードの例をコンパイルしているときに、コンパイル中に次のエラーが発生します。

CPUコードにもブーストライブラリを以前に使用しましたが、それらは正常に機能しているようです。しかし、boost ライブラリを組み込み、コードを変換して GPU で実行しようとすると、再び同じエラーが表示されました。私はコンパイルに Visual Studio 2008 IDE を使用しています。

0 投票する
1 に答える
704 参照

c - MPI ワーカーに配布された完全なベクターにアクセスして印刷するにはどうすればよいですか?

MPI で個々のスレッドからグローバル ベクトルにアクセスするにはどうすればよいですか?

CVODE ( SUNDIALSの一部) と呼ばれるライブラリ、具体的には ODE ソルバー ライブラリを使用しています。ライブラリは MPI で動作するため、複数のスレッドが並行して実行されます。それらはすべて同じコードを実行しています。各スレッドは、「隣の」スレッドにデータを送信します。しかし、スレッドの 1 つ (ランク = 0) が、ある時点でデータの状態を出力するようにします。

ライブラリには、各スレッドが独自のデータ (ローカル ベクトル) にアクセスできるようにする関数が含まれていますしかし、グローバルベクトルにアクセスする方法はありません。

特定の時間にすべての方程式の値を出力する必要があります。そのためには、グローバル ベクトルにアクセスする必要があります。MPI ベクトル内のすべてのデータを取得する方法を知っている人はいますか (可能であれば CVODE を使用)。

たとえば、各スレッドが実行する私のコードは次のとおりです

関数f(私が解いている関数) では、 and を使用してデータをやり取りしMPI_SendますMPI_Recv。しかし、他のプロセスが先に実行されているため、PrintData で実際にそれを行うことはできません。また、メッセージングのオーバーヘッドを追加したくありません。のグローバル ベクトルにアクセスして、PrintData必要なものを出力したいだけです。出来ますか?

編集:より良い答えを待っている間、データを0番目のスレッドに戻す各スレッドをプログラムしました。メッセージングのオーバーヘッドが増えすぎているとは思いませんが、より良い方法があれば、専門家の意見を聞きたいです (悪い方法はないと確信しています! :D )。

編集 2 : angainor のソリューションは確かに優れていますが、私が作成したものに固執しました。同じ質問をした人の将来の参考のために、ここに私がそれをした方法の基本があります:

0 投票する
1 に答える
483 参照

matlab - tspan=[to:very_small_step:tf] を設定することで、ode45 ソルバーのステップ サイズに影響を与えることができますか?

ode45ソルバーには、Matlab プログラム自体によって制御される適応ステップ サイズがあることを知っています。以下の説明は、Matlab Web サイトによって提供されます。

2 つ以上の要素で tspan を指定しても、ソルバーが tspan(1) から tspan(end) までの間隔をトラバースするために使用する内部時間ステップには影響しません。ODE >suite のすべてのソルバーは、基本的な数式を継続的に拡張することによって出力値を取得します。ソルバーは必ずしも tspan で指定された時点まで正確に進むとは限りませんが、指定された時点で生成された解は、内部の時点で計算された解と同程度の精度です。

ただし、で指定するvery_small_steptspan=[to:very_small_step:tf]、プログラム制御のステップ サイズに影響します。この強制ステップ サイズは の値より小さくなりますvery_small_stepか? または matlab は補間計算を行い、指定された時点で対応する結果を取得しますか?

0 投票する
1 に答える
301 参照

wolfram-mathematica - 連立方程式の動的生成

私はMathematicaに不慣れで、ODEのシステムを動的に生成する方法を理解しようとしています。たとえば、100の方程式のシステムがあり、10ごとに基本的に同じですが、ベクトル(長さ10)から読み取ることができるパラメーターがわずかに異なります。10個の方程式を書き出してから、イテレータをループして100個すべての方程式を生成したいと思います。これを行うための標準的な方法はありますか?

たとえば、これは30の方程式のシステムです(1:10のiの場合)。

iを100に増やすと、新しい方程式をコピーして貼り付けるのは冗長に思えます(つまり、300のODEが得られます)。

0 投票する
1 に答える
1027 参照

matlab - Matlab: 通常の Matlab ODE 引数を取る CVODE インターフェイス

CVODE は、人気のあるSUNDIALS パッケージの一部である 2 つの ODE ソルバーの 1 つです。ode*Matlab インターフェイスが提供されていますが、使用方法は標準の Matlabインターフェイスと同じではありません。ソルバーを初期化し、必要な各時点をステップ実行し、最後にメモリを解放する必要があります。明らかに、これは のようなものを簡単に置き換えるものではありませんode15sMatlab ODE ソルバーの通常の引数を取る CVODE のラッパーを書いた人はいますか?