Mathematica:使用Solve,Reduce和FindRoot查找Extrema位置。 (衍生物)

时间:2012-04-29 20:09:15

标签: function wolfram-mathematica derivative

我想确定以下2个函数的局部最大值和最小值

  1. xE[t_] := 10 (t - Sin[t]) - Sqrt[40^2 - (10 (1 - Cos[t]))^2]
  2. vE = xE'[t]
  3. 所以我尝试使用:

    解决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
    

    那么我该如何通过衍生物来确定局部最小值和最大值呢?

2 个答案:

答案 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}