0

私の質問は次のとおりです。なぜrhsexpr機能するのにrhsfunc機能しないのですか。ありがとう。:)

    m = l = 1.; \[Mu] = 100;
    beltv[t_] = .1;
    spring[x_] = 1000. (l - x);

    viscous[v_] := -30. (v - beltv[t]);
    coulomb[v_] := -25. Sign[v - beltv[t]];
    stribeck[v_] := -.3 Sign[v] Exp[-2 Abs[v]];

    friction[v_] := viscous[v] + coulomb[v] + stribeck[v];

rhsfuncと定義されている:

    rhsfunc[t_, x_, 1] := beltv'[t];
    rhsfunc[t_, x_, 0] := spring[x[t]] + friction[x'[t]];

rhsexprと定義されている:

    rhsexpr := 
      If[stuck[t] == 1, beltv'[t], spring[x[t]] + friction[x'[t]]];

rhsexpr動作します。

     NDSolveValue[{x''[t] == rhsexpr , x[0] == 1, x'[0] == 0, 
     WhenEvent[x'[t] == beltv[t] && spring[x[t]]^2 <  \[Mu]^2, stuck[t] -> 1], 
      WhenEvent[spring[x[t]]^2 >=  \[Mu]^2, stuck[t] -> 0], 
      stuck[0] == 0}, {x[t], x'[t]}, {t, 0, 2}, 
     DiscreteVariables -> stuck[t]]

rhsfunc機能せず、t == 0 で導関数に数値以外の値が発生しました

    NDSolveValue[{x''[t] == rhsfunc[t, x[t], stuck[t]] , x[0] == 1, 
      x'[0] == 0, 
      WhenEvent[x'[t] == beltv[t] && spring[x[t]]^2 <  \[Mu]^2, 
       stuck[t] -> 1], 
      WhenEvent[spring[x[t]]^2 >=  \[Mu]^2, stuck[t] -> 0], stuck[0] == 0}, {x[t], x'[t]}, {t, 0, 2},  DiscreteVariables -> stuck[t]]

ここに画像の説明を入力

更新 1

実際、私はrhsfuncm@ と同じように を定義しています。

rhs[t_, x_, 1] = -x;
rhs[t_, x_, 2] = 1;

sol = NDSolve[{x'[t] == rhs[t, x[t], a[t]], x[0] == 1, a[0] == 1, 
WhenEvent[x[t] - .1, a[t] -> 2], 
WhenEvent[x[t] - 2, a[t] -> 1]}, {x, a}, {t, 0, 15}, 
DiscreteVariables -> {a[t] \[Element] {1, 2}}];

Plot[x[t] /. sol, {t, 0, 10}]

ここに画像の説明を入力

4

1 に答える 1

1

パターンは、特にIfステートメントが遅延している例では、Ifステートメントとはあまり似ていません。パターンは定義と正確に一致する必要があり、rhsfunc が 3 番目の引数に数値以外の値を取得したときに何が起こるかを定義していないため、未評価のままであり、NDSolve はその評価を続行できません。導関数を含まず、さらに、呼び出しの形式が異なります (たとえば、-x[t] ではなく -x を返し、x[t] で呼び出すと、パターン -x[t] を返します)。

1 つ追加の注意 - NDSolve は、関数を実行する前にその引数を評価します (HoldAll、HoldFirs、または HoldRest 属性がないため)。これは、rhsfunc が評価されない式を返すシンボルで直ちに評価されることを意味します。Piecewise は、この動作のために NDSolve および同様の関数と一緒に機能するように開発されました (ver. 5.1 以降)。パターンを使用する場合は、?NumericQ を変数のテストとして使用します (NumberQ は、Pi や E などを含む式に対して True を返しませんが、NumericQ は返します)。これにより、数値以外の変数に対して関数が評価されなくなります

これが役立つことを願っています

イェフダ

于 2013-03-27T23:22:35.963 に答える