所以我想计算函数的lokal极值
我用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, p3
和p4
来自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
问题:
min2
我有fval2 = -0.00043457
,这是正确的。但我希望它说fval2 = -0.0004
,我该怎么做?max1
和max2
,我只是将整个函数设为负值,然后应用fminunc
。这给了我相应最大值的正确(x,y)-koordinates,但这些点的值用相反的符号给出。我如何让Matlab给我fval3
和fval4
作为积极的一面?答案 0 :(得分:3)
如果您想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
。
你的意思是否定你的目标函数并计算否定函数的最小值。这些最小值实际上是原始函数的最大值,但format short
和fval3
通过将它们置于否定函数内部计算,因此您得到负号。只需再次否定它们或评估最大值的原始功能。
答案 1 :(得分:0)
您的Matlab脚本和Wolfrom的结果与p1
和p2
相同,因为它们是最小值。 (再次看到Wolfram页面)
对于最大值,我发现了问题。你的代码还可以。只有最初的猜测应该更好地确定p3
和p4
。使用您自己的代码,但这些猜测可用于第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]);
但是,我建议您使用另一种查找局部外部的方法:找出与x
和y
相关的函数导数为零的位置。
Q1:使用round()
函数对其进行舍入。
Q2:此脚本显示的Matlab答案与Wolfram完全相同。
max1 =
-0.807979637093575
0.612410258594483
max2 =
0.910173217929548
-0.299286619005528
问题3:使用x=fminunc(...);
代替[x,fval]=fminunc(...);
省略fval
。