带有阶跃函数的常系数微分方程
mathematica吧
全部回复
仅看楼主
level 2
yanqbob 楼主
w = 50;
NDSolve[{D[u2[t], {t, 2}] + D[u2[t], t] + u2[t] ==
Sin[w t] + HeavisideTheta[u2 - 1], u2[0] == u2[1/w],
u2'[0] == u2'[1/w ]}, u2[t], {t, -(1/w), 1/w}]
问题是我的阶跃函数的自变量是微分方程代求函数的函数名,但我的方程就是这样。不知道怎么处理
2020年09月19日 07点09分 1
吧务
level 15
直觉上总觉得这问题本身有问题,不过可解倒是可解的,这里姑且弄一弄。
u2 - 1应该是u2[t],当然这是小问题。NDSolve是不能直接处理这个问题,最简单的处理方法似乎是,用个连续函数近似阶跃:
appro = With[{k = 10^6}, ArcTan[k #]/Pi + 1/2 &];
w=50;
tst = NDSolveValue[{D[u2[t], {t, 2}] + D[u2[t], t] + u2[t] ==
Sin[w t] + appro[u2[t] - 1], u2[0] == u2[1/w], u2'[0] == u2'[1/w]},
u2, {t, -(1/w), 1/w}]
tst // ListLinePlot
进一步的试验表明这问题并不止一组解:
w = 50; psol =
ParametricNDSolveValue[{D[u2[t], {t, 2}] + D[u2[t], t] + u2[t] ==
Sin[w t] + appro[u2[t] - 1], u2[0] == a, u2'[0] == b}, u2, {t, -1/w, 1/w}, {a, b}]
para =
FindRoot[{psol[a, b][1/w] == a, psol[a, b]'[1/w] == b}, {{a, 1.1}, {b, 0}}]
(* {a -> 1.45969, b -> 0.00142548} *)
ListLinePlot[psol[a, b] /. para, PlotRange -> All]
para =
FindRoot[{psol[a, b][1/w] == a, psol[a, b]'[1/w] == b}, {{a, -1}, {b, 1}}]
(* {a -> 0.459693, b -> 0.00142549} *)
2020年10月03日 04点10分 2
level 2
yanqbob 楼主
谢谢吧主的解答。这是一个振动能量采集的运动方程,会出现阶跃是因为包含了碰撞。不含碰撞就是下面的方程组,这个已经完成。
w=50;
ff=NDSolve[
{D[u1[t], {t, 2}] + D[u1[t], t] + u1[t] - U[t] == Sin[t],
D[u2[t], {t, 2}] + D[u2[t], t] + u2[t] + (Fm[u] - Fm[u0]) == Sin[t],
D[U[t], t] + U[t] + D[u1[t ], t] == 0,
u1[0] == u1[1/w],
u2[0] == u2[1/w],
U[0] == U[1/w ],
u1'[0]==u1'[1/w],
u2'[0]==u2'[1/w] },
{u1[t], u2[t], U[t]},
{t, -1/w,1/w,1/(500w)}
]
2020年10月08日 14点10分 3
1