即使将变量设置为整数,MATLAB脚本也可以为我提供NaN

时间:2014-10-08 20:08:44

标签: matlab optimization

运行此脚本后,所有内容都设置为NaN,没有任何反应。我只想尝试在一个2-d函数上进行割线方法,其中一个变量设置为0。

hi = @(x,y) exp(-3*((x + 0.5).^2 + 2*y.^2)) + exp(-x.^2 - 2*y.^2).*cos(4*x) - 1e-3;

tol = 1e-10;

yi = 0;

x0 = -2; x1 = 2;
f0 = hi(x0,yi); f1 = hi(x1,yi);

    for jj = 1:24
        x2 = x1 - f1*(x1-x0)/(f1-f0);
        f2 = hi(x2,yi);

    if (abs(x2-x1) < tol)
        root = x2;
        break
    else
        x0 = x1; x1 = x2;
        f0 = f1; f1 = f2;
    end
end

3 个答案:

答案 0 :(得分:2)

这里有两个问题。第一个是这一行:

x2 = x1 - f1*(x1-x0)/(f1-f0);

当函数变平时,分母f1-f0会导致x2爆炸。您可以通过在abs(f1-f0) < tol停留或将tol添加到分母时来避免这种情况:

x2 = x1 - f1*(x1-x0)/(f1-f0+tol);

然而,这不会找到你想要的根。绘制函数图表可以解决问题:

enter image description here

您在x0=-2x1=+2处开始搜索,这是两个绑定三个根的值,但搜索将以x2=-10.5203开头,并将继续尝试找到根这是负无穷大。如果您选择更好的起始值,则可以使用原始代码找到三个根中的任何一个。例如:

  x0      x1       root
------  ------    ------
 -1.0    +1.0      1.9522
 -0.5    +0.5      0.4164
 +0.6    +1.0      1.1789

当找到根(或最小化/最大化函数)时,搜索的起点通常会有所不同。最好仔细检查您的起点,并尽可能多地了解您正在使用的功能。

答案 1 :(得分:0)

f1*(x1-x0)/(f1-f0)

在某个时刻f1 = f0这会给你Inf

答案 2 :(得分:0)

通过快速查看,您的代码看起来很好,但正如@sfstewman指出的那样,您在包含函数中最大值和最小值的范围内开始搜索,从而导致不同的行为。

尝试使用其他范围开始搜索,例如

x0 = 0; x1 = 2;

它会收敛。