我想确定以下2个函数的局部最大值和最小值
xE[t_] := 10 (t - Sin[t]) - Sqrt[40^2 - (10 (1 - Cos[t]))^2]
vE = xE'[t]
所以我尝试使用:
解决xE[t]
的第一个派生
extremaXE = Solve[vE[t] == 0, t] (* vE is the 1st derivative of xE *)
但是我收到了这个错误:
Solve::ifun: Inverse functions are being used by Solve, so some solutions may not
be found; use Reduce for complete solution information.
然后我尝试使用reduce,我收到了这个错误:
Reduce::nsmet: This system cannot be solved with the methods available to Reduce
那么我该如何通过衍生物来确定局部最小值和最大值呢?
答案 0 :(得分:0)
使用NLOpt。
它具有查找带/不带衍生物的局部/全局极值的算法。 它可以从C,C ++,Fortran,Matlab或GNU Octave,Python,GNU Guile和GNU R中调用。
http://ab-initio.mit.edu/wiki/index.php/NLopt
这有帮助吗?
答案 1 :(得分:0)
Reduce
我没有收到错误。例如,要查找我尝试的xE
的本地极值
Reduce[xE'[t] == 0, t]
返回
C[1] \[Element] Integers && (t == 2 \[Pi] C[1] ||
t == 2 I ArcTanh[2/Sqrt[3]] + 2 \[Pi] C[1])
请注意,这为您提供了真实和复杂的解决方案。如果你只想要真正的那些,你可以尝试
Reduce[xE'[t] == 0, t, Reals]
给出了
C[1] \[Element] Integers && t == 2 \[Pi] C[1]
修改强>
要将解决方案替换回原始表达式,您可以使用例如ToRules
将其转换为规则列表。由于ToRules
无法处理C[1] \[Element] Integers
这样的表达式,我们首先简化解决方案
sol = Reduce[xE'[t] == 0, t];
sol = Simplify[sol, C[_] \[Element] Integers]
(* ==> t == 2 \[Pi] C[1] || t == 2 I ArcTanh[2/Sqrt[3]] + 2 \[Pi] C[1] *)
ToRules
然后会将此表达式转换为规则列表,您可以使用ReplaceAll
替换回您的表达式
xE[t] /. {ToRules[sol]}
(* ==> {-Sqrt[1600 - 100 (1 - Cos[2 \[Pi] C[1]])^2] +
10 (2 \[Pi] C[1] - Sin[2 \[Pi] C[1]]),
-Sqrt[1600 - 100 (1 - Cosh[2 ArcTanh[2/Sqrt[3]] - 2 I \[Pi] C[1]])^2] +
10 (2 I ArcTanh[2/Sqrt[3]] + 2 \[Pi] C[1] -
I Sinh[2 ArcTanh[2/Sqrt[3]] - 2 I \[Pi] C[1]])} *)
请注意,生成的表达式仍包含常量C[1]
。要查找特定值C[1]
的极值,您可以使用其他替换规则,例如
({t, xE[t]} /. {ToRules[sol]}) /. {C[1] -> -4}