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不起作用,提示 Encountered non-numerical value for a derived at 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}]

在此处输入图像描述

4

1 回答 1

1

模式不像 If 语句,特别是在您的示例中,If 语句被延迟。模式需要与定义完全一致,并且由于您没有定义当 rhsfunc 获得第三个参数的非数值时会发生什么,所以它仍然未被评估并且 NDSolve 无法继续其评估提供的最后一个示例与您的不同,因为它确实不涉及导数,此外,调用的格式不同(例如,返回 -x 而不是 -x[t],当你用 x[t] 调用它时,它返回模式 -x[t])

另一个注意事项 - NDSolve 在对它们起作用之前评估它的参数(因为它没有 HoldAll 或 HoldFirs 或 HoldRest 属性)。这意味着 rhsfunc 立即用返回未计算表达式的符号计算。根据经验,当使用 NDSolve 时,总是首选 Piecewise/If/Which. 由于这种行为, Piecewise 被开发为与 NDSolve 和类似函数一起运行(从版本 5.1 开始). 如果您使用模式,请使用 ?NumericQ 作为变量测试(对于涉及 Pi 或 E 等的表达式,NumberQ 不会返回 True,而 NumericQ 会)。这可以防止函数被评估为非数字变量

我希望这有帮助

耶胡达

于 2013-03-27T23:22:35.963 回答