0

ブッシングの数学的 (パラメトリック) モデルがあります。モデルへの入力は変位 (正弦波) で、力は出力 (それぞれのタイムステップ) です。

モデルのパラメーターは GA を使用して識別され、力の方程式は ode15s ソルバーを使用して解かれます。

ソルバーは、一連のパラメーターが (GA を使用せずに) 想定されている場合に出力を提供しますが、GA から呼び出されると、次のエラーがn何度も発生します。

警告: 行列が特異であるか、特異に近いか、スケールが不適切です。結果が不正確になる場合があります。RCOND = NaN。

そして最後に

警告: t=1.570796e+000 で失敗。時間 t で許容される最小値 (3.552714e-015) よりもステップ サイズを小さくしないと、積分許容誤差を満たすことができません。

コードは GA を使用せずに、GA を使用せずに正常に動作するため、少し困惑しています。ご意見をお寄せいただき、誠にありがとうございました。

よろしくお願いします。

コード : メインコール

ga_custom={@GA_test,measurement_data,excitation};
[x,fval,exitflag,output,population,scores]=ga(ga_custom,no_of_vars,[],[],[],[],lb,ub,[],options);

GA_test 関数:

function error_fnc = GA_test(x,measurement_data,excitation)
error_fnc=0;   
F=my_force_Curve(excitation,x);    
for q=1:100  
    temp=(F(q)-measurement_data(q))^2;  
    error_fnc=error_fnc+temp;   
end   
end

my_force_Curve個々のモデルの力を計算します:

[T,y]=ode15s(@(T,y)differential_BW(T,y,x),tspan,[0 0 0 0]);

differential_BW方程式を解きます。

function dy=differential_BW(t,y,initial_guess)   
dy=zeros(4,1);
dy(1)=..
dy(2)=.. 
dy(3)=..
dy(4)=..

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

再度、感謝します。

4

1 に答える 1

1

さて、いくつかのパラメータについては、ODEソルバーが方程式を解くことができないように思われます。

これには2つの考えられる原因があります。

  1. GAは、母集団のさまざまなメンバーを並行して評価する場合があります。パラメータまたは実行に応じて変更される可能性のあるグローバル値または永続値を使用すると、不確定な動作が発生し、非収束が発生する可能性があります。globalこれらの/persistent変数をリファクタリングし、これらの値を別の方法で渡すことで、これに取り組むことができます。もう1つの解決策は、GAがすべてをシリアルで実行することを確認することです。これは、 with (とにかくデフォルトのオプション)に設定UseParallelすることで実行できます。'never'gaoptimset

  2. ODEは、特定のパラメーター値に対して収束しません。これはGA自体とは何の関係もありません。GAがある時点で選択したパラメーター値を試し、手動で実行を繰り返した場合、同じ問題が発生するはずです。私がやろうとしているのは、try ... catchODEソルバーを囲んで、収束の問題をチェックすることです。収束しない場合は、いくつかのことができます。

    • パラメータ値を報告するか、どこかに保存してください。そうすれば、目的/ ODEを手動で実行することで、その時点で何が起こっているかを自分で確認できます。これでも同じ問題が発生するはずですが、少なくともすべてをデバッグしてみることができます。たとえば、一部のパラメータに互換性がないことがわかった場合は、それをチェックして、目的(0またはおそらくNaN)に好ましくない値を返すことができます。
    • 目的関数の好ましくない値を直接返すだけです。そうすれば、検索を続行でき、ミューテーション中にそのポイントは選択されません。ただし、これらのパラメーター値が適切に収束しない理由がわからない場合は、少しハックになります。
于 2012-07-01T08:51:00.227 に答える