公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
477 浏览
Clear["`*"]
P0 = 101300; c01 = 0.001*32.5; c06 = 13 Degree; c07 = 0 Degree; c18 = 
 0.001*25;
Z1 = 60/3000; N1 = 2*Pi/Z1; M2 = 0.001*60; L0 = 0.001*20; Tplot = 
 10*Z1; f20 = 1; f21 = 30;
x1[t_?NumericQ] := c01*Tan[ArcTan[Tan[c06]*Cos[N1*t]]]

d20 = P0*Pi*(0.5*c18)^2*(L0/(#1 - #2) - 1) &;
d2[f_, x1_, x11_, x111_, x2_, x22_, x222_] := 
  If[Abs[x11 - x22] < 10^-6, 
   If[Abs[M2*x111 - Evaluate@Apply[f, {x2, x1}]] <= f21, M2*x111, 
    Evaluate@Apply[f, {x2, x1}] + Sign[x111 - x222]*f21], 
   Evaluate@Apply[f, {x2, x1}] + f20*Sign[x11 - x22]];
eq = M2*x2''[t] == 
  d2[d20, x1[t], x1'[t], x1''[t], x2[t], x2'[t], x2''[t]] - 
   M2*9.8*Sin[c07]
ini1 = x2[0] == L0 + (c01*Tan[ArcTan[Tan[c06]*Cos[N1*0]]])
ini2 = x2'[0] == -0.0001
s = NDSolve[{eq, ini1, ini2}, {x2[t], x2'[t], x2''[t]}, {t, 0, Tplot},
    Method -> {"EquationSimplification" -> "Residual"}];

Plot[{x1[t], Evaluate[x2[t] /. s], 0.01*x1'[t], 
  0.01 Evaluate[x2'[t] /. s], -0.01*f20*
   Sign[Evaluate[(x1'[t] - x2'[t]) /. s]], 
  0.001*Evaluate[
    d2[d20, x1[t], x1'[t], x1''[t], x2[t], x2'[t], x2''[t]] /. 
     s]}, {t, 0, Tplot}, PlotRange -> All, AxesLabel -> {t, x2}, 
 PlotLegends -> {"1位移", "2位移", "1速度*0.01", "2速度*0.01", "2摩擦力*0.01", 
   "2合力*0.001"}, 
 PlotStyle -> {Blue, ColorData["HTML"]["CornflowerBlue"], 
   ColorData["HTML"]["DarkOrange"], 
   ColorData["HTML"]["Orange"], {Gray, Dashed}, 
   ColorData["HTML"]["DarkGray"]}]

问题存在于d2函数里的Sign[x111 - x222]*f21部分,若去除该部分,可以正常求解,但加上之后提示NDSolve::tddisc: NDSolve cannot do a discontinuity replacement for event surfaces that depend only on time. 求解的结果也不对。考虑过用WhenEvent、设置NDSolve的method属性,由于能力有限,一直没能解决。有大神可以交流下吗?

分类:函数 | 用户: whaihuan (16 分)
……我觉得警告信息已经说得比较清楚了,NDSolve目前处理不了这种分段。(不过仔细一看感觉 event surfaces that depend only on time这句说的还是有点问题,从实践来看,目前不能处理的应该是分段条件里含了待求函数及其导数的方程)这问题应该可以用WhenEvent解决,看不清d2的具体分段情况的话就用PiecewiseExpand展开一下,但是——这只是我的直觉——我觉得这个问题在构造方程的阶段就已经走偏了。还有啊,你需要的真的是Sign而不是UnitStep吗?

登录 或者 注册 后回答这个问题。

...