MATLAB脚本为我提供了NaN,甚至用于将变量设置为整数

MATLAB脚本为我提供了NaN,甚至用于将变量设置为整数,matlab,optimization,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 =

运行此脚本后,所有内容都设置为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
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);
对于jj=1:24
x2=x1-f1*(x1-x0)/(f1-f0);
f2=高(x2,yi);
如果(abs(x2-x1)

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

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

x2 = x1 - f1*(x1-x0)/(f1-f0);
分母
f1-f0
将在函数变为平坦时导致
x2
爆炸。您可以通过在
abs(f1-f0)
时停止,或在分母中添加
tol
来避免这种情况:

x2 = x1 - f1*(x1-x0)/(f1-f0+tol);
但是,这将找不到您想要的根。通过绘制函数图可以发现问题:

您从
x0=-2
x1=+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

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

快速查看您的代码似乎很好,但正如@sfstewman所指出的,您开始搜索的范围包括函数中的最大值和最小值,从而导致不同的行为

尝试使用不同的范围开始搜索,例如

x0 = 0; x1 = 2;

它将汇聚在一起

嘿,@TryHard!已经很久了:-)欢迎回到Matlab!谢谢@LuisMendo-好久不见了;)
x0 = 0; x1 = 2;