运行此脚本后,所有内容都设置为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
答案 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);
然而,这不会找到你想要的根。绘制函数图表可以解决问题:
您在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
当找到根(或最小化/最大化函数)时,搜索的起点通常会有所不同。最好仔细检查您的起点,并尽可能多地了解您正在使用的功能。
答案 1 :(得分:0)
f1*(x1-x0)/(f1-f0)
在某个时刻f1 = f0
这会给你Inf
答案 2 :(得分:0)
通过快速查看,您的代码看起来很好,但正如@sfstewman指出的那样,您在包含函数中最大值和最小值的范围内开始搜索,从而导致不同的行为。
尝试使用其他范围开始搜索,例如
x0 = 0; x1 = 2;
它会收敛。