1

ode45 に問題があります。関数を定義して ode で解こうとしましたが、実行すると時間がかかります。関数で「t」入力を表示しようとしたところ、時間ステップが 10^-8 であることがわかりました。[ode45 からエラーが発生しません]
そこで、関数の最後にブレークポイントを置き、一度ステップした後、sym.m ファイルに移動し、Function delet(h) を呼び出します。

function dxr=Dynfun(t,x)
...
dxr=[A;B]

ステップの後、

function delete(h)
    if builtin('numel',h)==1 && inmem('-isloaded','mupadmex') && builtin('numel',h.s)==1 && ~isa(h.s,'maplesym')
        mupadmex(h.s,1);
    end
    end

そしてそれが長すぎる原因です。なぜなら、そこでループに入るためです。どうしたの?!ありがとう

4

2 に答える 2

0

macduff で示されているように、問題は難しい可能性があります。(スティッフな問題用に設計されています)試してみてode15s、ステップサイズがまだ許容できないほど低い値に減少するかどうかを確認してください。

その場合は、問題に指定した初期値の特異点が含まれている可能性があります。問題の次元が 3 未満の場合、小さなevent関数を定義して各ステップの値を把握し、それらをプロットして実際に問題が発生しているかどうかを確認できます。

それでは -- 記号演算は本当に必要ですか? その背後にある哲学は、人間にとって読みやすいということです。これにより、コンピューターにとって扱いが難しくなります:)それを非記号的なものに変換できる場合は、そうしてください-これにより、パフォーマンスが著しく向上します.

また、さらにアドバイスをすると、 deleteMatlab の組み込み関数でもあります。一般に、関数に Matlab の組み込み関数の名前を付けることはお勧めできません。混乱を招き、Matlab がどちらを使用するかを決定する際に多くのオーバーヘッドが発生する可能性があります。

于 2012-09-18T04:44:16.213 に答える
0

それは私にとって「難しい」問題のように聞こえます。スティッフな問題用に設計されたソルバーを使用することをお勧めします。小さなステップ サイズ ~ 0.001 で固定ステップ ソルバーを試し、出力がどのようになるかを確認することもお勧めします。に侵入している場合はsym.m、そこでいくつかのシンボリックロジックが進行しているように聞こえます。シンボリック式を取得してmatlab スクリプトに変換する方法はありますか?

于 2012-09-17T18:41:28.680 に答える