如何使用函数和变量列表使用NMaximize / NMinimize

时间:2014-07-10 15:26:58

标签: wolfram-mathematica mathematica-8

我创建了这个函数来计算获得的数据的品质因数。 Loading变量是一个带有一些随机数的论坛。在现实生活中,我有真实的数据。

DD = 20; Days = 3; Peak = 1;
Loading = Table[Table[{RandomReal[{-1500, 1500}], RandomReal[{-1, 1}/100]}, {i, 1, 150}], {j, 1, Days}];
coo = Loading[[All, All, 1]];
TimeSwapFunction[lst_] := 
Norm[{Temp = 
Sort[Partition[
  Flatten[Riffle[
    Flatten[Table[coo[[i]] + lst[[i]], {i, 1, Days}]], 
    Flatten[Loading[[1 ;; Days, All, Peak + 1]]]]], 
  2], #1[[1]] < #2[[1]] &];
Mean[Select[
  Partition[
   Riffle[Mean[Transpose[Partition[Temp[[All, 1]], DD]]], 
    Abs[Mean[
       Transpose[
        Partition[Temp[[All, 2]], DD]]]/(StandardDeviation[
         Transpose[Partition[Temp[[All, 2]], DD]]]/Sqrt[DD])]], 
   2], #1[[1]] > 0 &][[All, 2]]]}]

该功能现在正在运行。 如您所见,如果我们绘制TimeSwapFunction(见下文),则会有一些最大值。目的是使用NMaximize来查找已经在mathematica中编码的算法(如遗传算法)的最大值。

但如果我直接使用NMaximize(只有一个变量),它就无法正常工作。您可以通过查看输入19和21来查看它。输出是一些值,我不知道它来自何处。

如果我允许两个变量,那就是同一个故事(输入第25个)。如果我把第三个,它就不再工作了。

如果有人可以帮助我完成这件事,我会很高兴。

The image in order to put the error and the commands

1 个答案:

答案 0 :(得分:1)

这可以通过定义TimeSwapFunction来修复,这样它只需要数字参数:

 Clear[TimeSwapFunction]
 TimeSwapFunction[lst_ /; (And @@ ( NumericQ /@ lst))] :=  (*the rest the same*)


 NMaximize[TimeSwapFunction[{c, b, a}], {c, b, a}]                
  

{0.804359,{c - &gt; 7.35047,b - &gt; -4.85534,a - &gt; 3.51407}}

这是许多N数字函数(NIntegrate等)常见的问题

顺便说一下,你不应该使用以大写字母开头的变量,以避免与内置插件发生冲突(但在这种情况下显然不是问题)

另外另外要注意这种高度非线性的功能,你可能会发现局部而非全局的极端情况。