使用fminunc计算函数的所有局部极值点

时间:2018-02-21 15:01:34

标签: matlab

所以我想计算函数的lokal极值

enter image description here

我用this link来帮助我。这就是我所做的:

options = optimset('Display','off');    

[min1,fval1]=fminunc(@(x)(sin(x(1)+x(2))+3*(x(1)-x(2)/2)^2)*exp(-(x(1)^2+x(2)^2)),[0;-1],options
[min2,fval2]=fminunc(@(x)(sin(x(1)+x(2))+3*(x(1)-x(2)/2)^2)*exp(-(x(1)^2+x(2)^2)),[1.18;2.3],options)

[max1,fval3]=fminunc(@(x)-(sin(x(1)+x(2))+3*(x(1)-x(2)/2)^2)*exp(-(x(1)^2+x(2)^2)),[1;0],options)
[max2,fval4]=fminunc(@(x)-(sin(x(1)+x(2))+3*(x(1)-x(2)/2)^2)*exp(-(x(1)^2+x(2)^2)),[2.3;1.18],options)

format long g

p1, p2, p3p4来自WolframAlpha

命令窗口中的输出为:

min1 =
      -0.3032
      -0.5316
fval1 =
     -0.50675

min2 =
       1.1773
       2.2344
fval2 =
  -0.00043457

max1 =
      0.91017
     -0.29929
fval3 =
      -1.5746

max2 =
     -0.80798
      0.61241
fval4 =
      -1.2629

问题:

  1. 对于min2我有fval2 = -0.00043457,这是正确的。但我希望它说fval2 = -0.0004,我该怎么做?
  2. 对于max1max2,我只是将整个函数设为负值,然后应用fminunc。这给了我相应最大值的正确(x,y)-koordinates,但这些点的值用相反的符号给出。我如何让Matlab给我fval3fval4作为积极的一面?

2 个答案:

答案 0 :(得分:3)

  1. 如果您想round var myArray = [1, 2, 3, 4, 5]; function addOne(n) { return n + 1 } var results = myArray.map(addOne) console.log(results); //[2, 3, 4, 5, 6] var myObjArray = [{a: 1}, {a: 2}, {a:3}] function addOneToObj(obj) { obj.a = obj.a + 1; return (obj) } var secondResults = myObjArray.map(addOneToObj) console.log(secondResults); //[{a: 2}, {a: 3}, {a: 4}]到4位小数,请使用fval2。如果您不想要四舍五入,只想显示round(fval2,4)到小数点后4位,请使用sprintf,即fval2
    请注意,由于您已更改format,因此您首先获得了这么多位数。要将其重置为默认值,请输入sprintf('%.4f',fval2)format

  2. 你的意思是否定你的目标函数并计算否定函数的最小值。这些最小值实际上是原始函数的最大值,但format shortfval3通过将它们置于否定函数内部计算,因此您得到负号。只需再次否定它们或评估最大值的原始功能。

答案 1 :(得分:0)

您的Matlab脚本和Wolfrom的结果与p1p2相同,因为它们是最小值。 (再次看到Wolfram页面)

对于最大值,我发现了问题。你的代码还可以。只有最初的猜测应该更好地确定p3p4。使用您自己的代码,但这些猜测可用于第3和第4功能:

h=@(x) -(sin(x(1)+x(2))+3*(x(1)-x(2)/2)^2)*exp(-(x(1)^2+x(2)^2));
[max1,fval3]=fminunc(h,[-1;1]);
[max2,fval4]=fminunc(h,[1;-0.3]);

但是,我建议您使用另一种查找局部外部的方法:找出与xy相关的函数导数为零的位置。

Q1:使用round()函数对其进行舍入。

Q2:此脚本显示的Matlab答案与Wolfram完全相同。

max1 =

        -0.807979637093575
         0.612410258594483

max2 =

         0.910173217929548
        -0.299286619005528

问题3:使用x=fminunc(...);代替[x,fval]=fminunc(...);省略fval