我的問題是:爲什麼rhsexpr
有效,但rhsfunc
沒有。謝謝。 :)爲什麼我的函數在NDSolve中不等於「If」?[更新1]
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
實際上,我定義了rhsfunc
,就像m @和它的內部文件一樣以下是表明:
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}]
嘗試'rhsfunc正在評估[T_ NumberQ,X_ NumberQ,1?]:= ...' – Matariki 2013-03-24 07:44:08
謝謝Matariki。我試過了,但它不起作用,仍然提示「在t == 0時導數的非數值」。 – 2013-03-24 07:49:14
一定要清除您的舊def ... – agentp 2013-03-24 12:30:30