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

Matlab 使用fminunc计算函数的所有局部极值点,matlab,Matlab,所以我想计算函数的lokal极值 我过去常常帮我。以下是我所做的: 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

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

我过去常常帮我。以下是我所做的:

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、p3
p4
从以下位置获得:

命令窗口中的输出如下所示:

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
问题:

  • 对于
    min2
    我有
    fval2=-0.00043457
    ,这是正确的。但是我想让它说
    fval2=-0.0004
    ,我该怎么做
  • 对于
    max1
    max2
    ,我只是将整个函数设置为负值,然后应用
    fminunc
    。这给了我相应最大值的正确(x,y)-坐标,但这些点的值用相反的符号给出。如何使Matlab将
    fval3
    fval4
    作为正值

  • 对于
    p1
    p2
    ,来自Matlab脚本和Wolfrom的结果是相同的,因为它们是最小值。(再次查看Wolfram页面)

    对于最大值,我发现了问题。你的代码没问题。对于
    p3
    p4
    ,应该更好地确定初始猜测。使用您自己的代码,但对第三个和第四个函数进行猜测:

    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]);
    
    但是,我建议您使用另一种方法来查找局部外部:查找函数对
    x
    y
    的导数为零的位置

    Q1:使用
    round()
    函数将其舍入

    问题2:Matlab为此脚本显示的答案与Wolfram完全相同

    max1 =
    
            -0.807979637093575
             0.612410258594483
    
    max2 =
    
             0.910173217929548
            -0.299286619005528
    
    问题3:使用
    x=fminunc(…)而不是
    [x,fval]=fminunc(…)
    省略
    fval

  • 如果要将fval2的小数位数
    4位,请使用
    四舍五入(fval2,4)
    。如果您不想舍入,只想显示
    fval2
    直到小数点后4位,请使用
    sprintf('.4f',fval2)

    请注意,自从您更改了密码后,您首先会得到那么多的数字。要将其重置为默认值,请输入
    format
    format short

  • 你要否定你的目标函数,并计算被否定函数的极小值。这些最小值实际上是原始函数的最大值,但是
    fval3
    fval4
    是通过将它们放在求反函数中进行内部计算得到的,因此得到负号。只需再次否定它们或在maximas上计算原始函数


  • 你想要所有的固定点吗?或者仅仅是局部极值?首先,如果不转换目标函数,极小化将无法找到最大值(或双曲线点)。第二,简单地将初始猜测放在潜在最小值附近并不能保证解算器会收敛于该点。@SardarUsama-我只想找到局部极值点。然后在问题中进行更正。在收到有效答案后,不要更改问题。相反,将对你有用的答案标记为已接受,如果你有新问题,请提出新问题。不要否定现有的答案,因为这是对他们努力的一记耳光,而你的表现就像一个吸血鬼。谢谢你的回答。是的,我很清楚fminunc是一个函数,只用于寻找极小值,但这是我应该只使用的。我怀疑你的把戏会成功,但当我尝试它时,我得到了错误的马克西马斯。你是这个意思吗<代码>[max1,fval3]=fminunc(@(x)1/((sin(x(1)+x(2))+3*(x(1)-x(2)/2^2)*exp(((x(1)^2+x(2)/2),[1;-0.5],options)\[max2,fval4]=fminunc(@(x)1/((sin(x(1)+x(2))+3*(x(1)-x(2)/2)/2)/2)*exp(-(x(1)^2+x(2)/2)),[0.5],options])。这个答案很简单也很准确。这个答案不能解决问题的任何部分。Q1和Q2都不是我所尝试的,但是我得到了错误“输入参数太多”@ParseVal谢谢你的回复Sardar。我已经编辑了我的代码和输出。我确实有正确的答案,但我不想让事情变得更干净。如何删除所有的
    fval
    -条目?@Parseval在您编辑的帖子中,最后只有一个
    fval
    变量。你想从记忆中清除它吗?然后您只需执行
    清除fval
    。你说的条目是什么意思?或者只需要分号
    在行尾?对不起,我抄错了代码。我的意思是,我不希望在运行脚本时,
    fval
    -值在命令窗口中可见。有办法吗?@Parseval是否希望
    min1
    min2
    等可见?是的,我只想删除
    fval