ode45 で微分方程式を解く際に遭遇する実際の問題

        最近、ode45 を使用して微分方程式の数値解法を解き、論文のグラフを再現しようとしています。一般的に言えば、微分方程式 (群) が応答条件に従って対応するコールバック関数を記述していれば、基本的には難しくありませんが、この記事で遭遇した問題については、解決策を実現するにはある程度のスキルが必要になる場合があります。私たちが遭遇したいくつかの問題について話しましょう。

       1. 問題提起と簡単な分析:

       式の条件と初期値は次のとおりです。

        定数係数と初期変数:        

  モデル パラメータ: Ms=1.6x10^6; a=1000; alpha=0.001;, mu0=4πx10^7; c=0.1; gamma1=7x10^-18; gamma1_p=-1x10^-25; -30; gamma2_p=2.1 x10^-38; E=2.02x10^11; ksi=2000; H=40;

        独立変数σの間隔は[0,300]MPa 注: 1 MP a= 1 ×1 0 6  P a 、計算式に代入するときはこれに注意してください。上記のモデル パラメータはすべて Pa に基づいて割り当てられます。 . 

       M の初期値は、M(0)=0 ;M(0)=10000 ;M(0)=20000;M(0)=30000;M(0)=40000;

簡単な分析、これは2 進一次定数係数微分方程式系で        ある必要があります。注意する必要があるのは dM と dMan だけです。他の変数、Heff、Hsigma は Man に関連しています。Man は比較的重要な変数ですが、 Man と dMan 直接的な形式はありません。これには注意が必要です。シグマは基本的にヘフとヒューマンをつなぐ架け橋であり、ヘフとマンは絡み合っている。

        2. 初期値問題を解く

         ode45 に取り込む式では、初期値は必須パラメーターです。

        M の初期値はタイトルに出ていますが、Man は出ていないので、どうにかして求める必要があります。方程式は、元の連立方程式の最初の 3 つの式で構成される必要があることに注意して解いてください。

        つまり、この3つの式でσ=0の条件でのManの値を解くことです。

        第3式のシグマは0なのでHsigma=0.また、ManとHeffは明らかに超越方程式であり、解析解は存在しないと推定されるので、数値解を求めます。

         fsolve を使用して数値解を解きます。初期値がわからないため、Man と Heff をランダムに 1 に設定し、Hsigma を 0 に設定します。

% Man ,Heff,Hsigma 初值,sigma=0 下
[x,fval,exitflag]=fsolve(@myfun,[1 1 0]);

myfun のキー コードは次のとおりです。

eq1 = Man -( Ms*(coth(Heff/a)-a/Heff));
eq2 = Heff- (H+Hsigma+alpha*Man);
eq3 = Hsigma - (3*sigma/mu0*((gamma1 + gamma1_p*sigma)*Man + 2*(gamma2 + gamma2_p*sigma)*Man*Man*Man));

F = [eq1;eq2;eq3];

 

結果が見つからないということは、初期値が選択されていないということであり、いくつかの初期値を見つけても機能しません. Man と Heff の関係を詳細に分析する必要があるようです. ここでは描画方法を使用します.そして実際の曲線を見て最後に2つを見る. 重なり合うポイントで、式1と式2に従って、わずかな変更を加えて、マンとヘフのトレンド曲線を描きます.

Ms = 1.6e6;
a = 1000;
H = 40;
alpha = 0.001;
Heff = [1:500];

for i = 1:length(Heff)
    
    Man1(i) =( Ms*(coth(Heff(i)/a)-a/Heff(i)));
    Man2(i) = (Heff(i)- H)/alpha;

end

plot(Heff,Man1,'r');
hold on
plot(Heff,Man2,'b');

 

おそらく交点はHeff=86、Man=46000あたりで、[このような初期値はランダムに手書きを指定することに依存し、不可能であると推定されます]、初期値問題が選択され、これでようやく最初のステップに入ることができます! 、このステップで計算される Man の初期値は 45666.419496657 です。

2. dMan の決定

[x,y] = ode45(@(x,y)f(x,y,st),[t(1),t(end)],y0,nstep); 

   y は [M0, Man0] で、コールバック関数内では、一般的な構造は次のとおりです。

 function dydt = f(x,y,st)  
    sigma = x;
    dydt = zeros(size(y));
   
    %y(1), y(2)
    %M, Man

    Man = y(2);
    
    %想办法求出来 dMan_dt

    dydt(2)= dMan_dt;       
    dydt(1) = sigma /(E*ksi) * (y(2) - y(1)) + c* dydt(2);

end

        ここでの手順は非常に特殊です. 積分独立変数 x を取り出す必要があります.これは t であり、これはシグマでもあります.さらに、y の値は y(1) = M, y(2)=Man ですが、 Mの値は基本的に使い物にならないので、sigmaとManの値を使ってdMan_dtを求め、計算したdydt(2)をdydt(1)で使うべきなので、最後に書いておきます。       

dMan は知りません。最初の 3 つの式のシグマを導き出し、5 要素の連立方程式 [ sigma、Heff、dHsigma、dMan、dHeff、dHsigma、Man        解くことは可能ですか(Man とシグマは知ることができます)。数値解でなければなりません。一番厄介なのは初期値で、Heff の初期値は扱いやすいのですが、それらの微分式の初期値を見積もるのは難しいです。

       dMan_dsigma を見つけることは非常に重要です。上記の方法ではうまくいかないことが予想され、考え方を変える必要があります。前の分析の後、Heff と Man は互いに入れ子になっています。これを利用して、

     dMan_dHeff、結果は基本的に Man の関数であり、Heff の微分も sigma と Man であり、扱いやすい、つまり、次の関数関係が見つかります。最も重要なことは、Man と sigma が既にわかっていることです!

   

 ただ連鎖微分公式の方が怖い

そんなことはどうでもいい、Matlabに任せよう

    Hsigma = (3*sigma/mu0*((gamma1 + gamma1_p*sigma)*Man + 2*(gamma2 + gamma2_p*sigma)*Man*Man*Man));
    Heff = H + Hsigma + alpha *Man;
    pp = (gamma1 + 2*gamma1_p*sigma)*Man + 2*(gamma2 + 2*gamma2_p*sigma)*Man*Man*Man;
    dMan_dt = 3*Ms/(mu0*a)*( -(csch(Heff/a))^2 + (a/Heff)^2) *pp;

 これまでのところ、これらの問題は解決されています。最後に、画像がどのように見えるかを見てみましょう。

三、心の絵

 論文の添付図面と合わせられる

 また、Man のグラフの観測値は、M の初期値によって変化しません。明らかに、まず、Man の初期値は固定されており (積分が 0 から始まる場合)、dMan のプロセスと M0 の初期値は糸の関係では、変数は、積分の初期値と積分ステップ サイズの 2 つの要因によって決定されます。M 対 Man は、ひずみ依存変数に相当します。

おすすめ

転載: blog.csdn.net/book_bbyuan/article/details/128608257
おすすめ