请问大神,微分方程WhenEvent怎么高效判断点在参数方程上
mathematica吧
全部回复
仅看楼主
level 1
Sylvanashe 楼主
求质点s的运动轨迹,当碰到f时反弹,代码:
Clear@"`*"
f[{u_, v_}] = {6 Cos[u] Sin[v], 5 Sin[u] Sin[v], 4 Cos[v]};
c = {u, v};
fxl = TrigFactor[Cross @@ (D[f[c], #] & /@ c)];
s[t_] = {x[t], y[t], z[t]};
ru = Cancel[s'[t] -> s'[t] - 2 s'[t] . fxl/fxl . fxl fxl];
s0 = {0, 0, 6};
v0 = {9, 6, 0};
a[t_] = -1000 s[t]/Norm[s[t]]^3;
cond = WhenEvent[True, tmp = Flatten@FindInstance[f[c] == s[t], c];
If[Length[tmp] > 0, ru /. tmp]];
sol[t_] =
NDSolveValue[{s''[t] == a[t], s'[0] == v0, s[0] == s0, cond},
s[t], {t, 0, 30}, AccuracyGoal -> 20, PrecisionGoal -> 20,
WorkingPrecision -> 35, MaxSteps -> \[Infinity]];
gra = Show[{ParametricPlot3D[f[c], {u, 0, 2 \[Pi]}, {v, 0, \[Pi]},
Mesh -> None, PlotRange -> 9, PlotStyle -> Opacity[.8]],
ParametricPlot3D[sol[t], {t, 0, 30}]}];
Animate[Show[{gra,
ParametricPlot3D[
sol[t] + 1/2 {Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0,
2 \[Pi]}, {v, 0, \[Pi]}]}], {t, 0, 30},
AnimationRunning -> False, AnimationRate -> 1, RefreshRate -> 60,
DisplayAllSteps -> True]
问题在于WhenEvent判断质点s与f相碰,当f是隐式方程时很容易判断,但是当f是参数方程时就不知道有什么高效的判断方法了,求各位大神指点
2023年12月23日 12点12分 1
吧务
level 10
椭球的话,直接坐标变换到椭球座标系吧。。。奇点以外都是有反函数的,多美好
2023年12月25日 11点12分 2
另外椭球的隐函数方程也好写,可能你是想找一般的方法?
2023年12月25日 11点12分
@asdasd1dsadsa 是的呀,隐式方程我已经搞好了,就想问参数方程的一般方法
2023年12月25日 14点12分
1