0

我的問題是:爲什麼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]] 

enter image description here

更新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}] 

enter image description here

+0

嘗試'rhsfunc正在評估[T_ NumberQ,X_ NumberQ,1?]:= ...' – Matariki 2013-03-24 07:44:08

+0

謝謝Matariki。我試過了,但它不起作用,仍然提示「在t == 0時導數的非數值」。 – 2013-03-24 07:49:14

+0

一定要清除您的舊def ... – agentp 2013-03-24 12:30:30

回答

1

模式是不是很像if語句,尤其是在你的榜樣,其中如果ststement被延遲。 模式需要與定義完全一致,並且由於您沒有定義rhsfunc在第三個參數獲得非數值時會發生什麼情況,所以它仍未被評估,並且NDSolve無法繼續進行評估 提供的最後一個示例與您的不同它不涉及衍生工具,另外,調用的格式也不相同(例如,返回-x而不是-x [t],並且當您用x [t]調用時返回模式-x [t])

另外一個注意事項 - NDSolve在其參數運行之前對其參數進行評估(因爲它沒有HoldAll或HoldFirs或HoldRest屬性)。這意味着rhsfunc會立即使用返回非評估表達式的符號進行評估。 作爲一個經驗法則,當使用NDSolve時,總是比較偏好Piecewise/If/Which。由於這種行爲(從版本5.1開始),分段開發與NDSolve和類似功能一起運行。如果使用模式,則使用?NumericQ作爲變量的測試(對於涉及Pi或E等的表達式,NumberQ不會返回True,而NumericQ會這樣做)。 這可以防止功能從非數值變量

我希望這有助於

胡達