FindMaximum函数的问题
mathematica吧
全部回复
仅看楼主
level 3
以下是我的代码,请问为啥这个地方填16.5就说输入数据位于插值函数的数据范围之外?而且显示的根本就不是我输入的数据,输入17就没有任何问题。
L = 67.0; \[CurlyPhi] = 48.85 \[Degree]; g = 9.8;
\[Omega] = 2 \[Pi]/(24*3600.0); x0 = 0.05; time = 100;
equ = {x''[t] == -g x[t]/L + 2 \[Omega] Sin[\[CurlyPhi]] y'[t],
y''[t] == -g y[t]/L -
2 \[Omega] (Sin[\[CurlyPhi]] x'[t] + Cos[\[CurlyPhi]] z'[t]),
z[t] == (x[t]^2 + y[t]^2)/(2 L),
x[0] == x0, x'[0] == 0,
y[0] == 0, y'[0] == 0,
z[0] == x0^2/(2 L), z'[0] == 0};
s = NDSolve[equ, {x, y, z}, {t, 0, time}];
{x, y, z} = {x, y, z} /. s[[1]];
r[t_] := Sqrt[x[t]^2 + y[t]^2];
Plot[r[t], {t, 0, time}, PlotRange -> All,
AxesLabel -> {"t/s", "r/m"}]
s = FindMaximum[r[t], {t, 16.5}]
Print["t1= ", t1 = t /. s[[2]], " s"]
Print["y1= ", y1 = y[t1], " m"]
\[Theta] = ArcSin[Abs[y1]/r[t1]];
Print["\[CapitalOmega]= ", \[CapitalOmega] = \[Theta]/
t1*180/\[Pi]*3600, " \[Degree]/h"]
Print["T2= ", 360/\[CapitalOmega], " h"]
Clear["Global`*"]
2022年03月18日 05点03分 1
吧务
level 10
NDSolve的结果是插值函数,只在0~time范围可靠。
你FindMaximum要加约束区间的。
2022年03月20日 06点03分 2
level 3
不是呀,我把16.5改成17就没有问题
2022年03月20日 07点03分 3
17可能是改变了搜索方向和策略,暂时避免了问题。总之加约束就不会出界。
2022年03月21日 07点03分
吧务
level 15
就如3楼的楼中楼所说,以17为起点的时候运气好没砸出界而已。顺便你可以使用程序包
<< Optimization`UnconstrainedProblems`
里的 FindMinimumPlot 函数来可视化这个“砸”的过程,具体内容参看帮助,简单地说,对于非线性函数,并不是靠得近就一定能砸准的。
2022年04月01日 16点04分 4
1