所以我有一个分配,我必须做一些...与代码斗争,以便我可以进一步了解它是如何工作/什么是方法的好参数。关于我在网上找到的所有内容都是关于rosenbrock功能的,我现在几乎可以肯定它与rosenbrock方法不同。
我刚才发现了这个问题,这与我的尝试非常相似(没有太大成功)
到目前为止我的代码是:
function [T] = rosenbrock(f,xx0,maxLoop,error,d,a,b)
delta_F=10;
x0=xx0;
y0 = f(x0);
i=0;
vF=[];
while (delta_F > error) && (i < maxLoop)
x1 = x0+d;
y0 = f(x0);
y1 = f(x1);
if y1 < y0
x0= x1;
d = a*d;
else
vF = [vF;x1];
d = -b*d;
end
i = i + 1;
if length(vF) > 1
ultm = vF(end);
pultm = vF(end-1);
delta_F = abs(ultm+pultm)/2;
end
end
T=vF;
我用另一个脚本称之为:
x0=1;
error=1e-3;
maxLoop=500;
fun=@(x)(sin(x));
[S]=rosenbrock(fun, x0, maxLoop,error,1,2,-1.5)
它给了我荒谬的数字,如10 ^ 88等。问题的一部分是我真的不知道应该如何处理这个问题,我发现给我们的理论数量很少,并且不知道如何区分好结果和坏结果
即使我得到了...用这个方法的东西(到目前为止的想法是存储使用的点,以后我可以用它们做点什么),但我也不确定要做什么,比如,绘制到函数中,缺少事物。
重点是,代码不起作用,我不明白为什么,因为据我所知,它正在做应该做的事情,并且不知道接下来该做什么。我可以进一步解释,但它是用我自己的话来说,因为维基百科有一篇很糟糕的文章,正如我所说的其他一切都是关于rosenbrock函数,它似乎相似但不完全相同。
答案 0 :(得分:0)
我在您的代码中发现了两个错误(在您复制的代码中):
您想要计算名为delta_F的步长。 &#34;德尔塔&#39; S&#34;总是计算为两个值的差值:
delta_F = abs(ultm-pultm)/2;
您的函数调用错误。将&#34; b&#34; -value替换为0.5而不是-1.5。