Matlab 不动点迭代

Matlab 不动点迭代,matlab,optimization,Matlab,Optimization,我是Matlab新手,我必须使用定点迭代来找到y=x和y=sqrt(10/x+4)之间的交点的x值,在绘制它之后,它看起来大约是1.4。我使用的是x1=0的初始猜测。这是我当前的Matlab代码: f = @(x)sqrt(10./(x+4)); x1 = 0; xArray(10) = []; for i = 1:10 x2 = f(x1); xArray(i) = x2; x1 = x1 + 1; end plot(xArray); fprintf('%15.8e\

我是Matlab新手,我必须使用定点迭代来找到
y=x
y=sqrt(10/x+4)
之间的交点的
x
值,在绘制它之后,它看起来大约是1.4。我使用的是
x1=0
的初始猜测。这是我当前的Matlab代码:

f = @(x)sqrt(10./(x+4));
x1 = 0; 
xArray(10) = [];
for i = 1:10
    x2 = f(x1);
    xArray(i) = x2;
    x1 = x1 + 1;
end
plot(xArray);
fprintf('%15.8e\n',xArray);

现在当我运行它时,我的
x
似乎接近0.8。有人能告诉我我做错了什么吗?

没有必要在
x1
中添加1。每次迭代的输出都是下一次迭代的输入。因此,来自
f(x1)
的输出的
x2
应该是新的
x1
。更正后的代码将是

for i = 1:10
    x2 = f(x1);
    xArray(i) = x2;
    x1 = x2;
end

干得好。你已经有了一个不错的开始

让我们看看图形解决方案。顺便说一句,这是我如何完成图形部分的:

ezplot(@(x) x,[-1 3])
hold on
ezplot(@(x) sqrt(10./(x+4)),[-1 3])
grid on

或者,我可以减去这两个函数,然后寻找差值的零,所以它穿过x轴的位置

这就是定点迭代所做的,试图为x求解,这样

x = sqrt(10/(x+4))
那么我该如何更改您的代码来修复它呢?首先,我想对变量使用更具描述性的名称。您不会因为角色而收费,让您的代码更易于阅读和遵循将在未来为您带来巨大的回报

有几个代码问题。要初始化向量,请使用以下形式之一:

xArray = zeros(1,10);
xArray(1,10) = 0;
请注意,如果因为您一直在处理此问题而已经定义了xArray,则后一种形式只会将单个元素归零。因此,第一种形式在很大程度上是最好的。它肯定地创建一个数组,或者覆盖现有数组(如果它已经存在于您的工作区中)

最后,我喜欢用一些特殊的东西初始化这样的数组,而不是零,这样我们就可以看到元素被覆盖的时间。南斯在这方面很好

接下来,不需要在代码中向x1添加一个。同样,我强烈建议使用更好的变量名。使用评论也是一个好主意。开明一点

我建议使用收敛公差。您还可以有一个迭代计数器

f = @(x)sqrt(10./(x+4));
% starting value
xcurrent = 0;

% count the iterations, setting a maximum in maxiter, here 25
iter = 0;
maxiter = 25;

% initialize the array to store our iterations
xArray = NaN(1,maxiter);

% convergence tolerance
xtol = 1e-8;

% before we start, the error is set to be BIG. this
% just lets our while loop get through that first iteration
xerr = inf;

% the while will stop if either criterion fails
while (iter < maxiter) && (xerr > xtol)
  iter = iter + 1;
  xnew = f(xcurrent);

  % save each iteration
  xArray(iter) = xnew;

  % compute the difference between successive iterations
  xerr = abs(xnew - xcurrent);

  xcurrent = xnew;
end
% retain only the elements of xArray that we actually generated
xArray = xArray(1:iter);

plot(xArray);
fprintf('%15.8e\n',xArray);
为了更准确一点,看看我们做得有多好

format long g
xcurrent
xcurrent =
          1.36523001364783

f(xcurrent)
ans =
          1.36523001338436
顺便说一下,了解循环终止的原因是个好主意。它是否因为迭代次数不足而停止


我在这里回答的重点是不要做家庭作业,因为无论如何,你都快要做好了。重点是展示一些关于如何改进代码以备将来工作的考虑。

f(x)x^3+4*x^2-10
[1,2]
中找到一个近似根

这是一个令人惊讶的回答,非常有用,谢谢!循环终止,因为我将它设置为只迭代10次。
format long g
xcurrent
xcurrent =
          1.36523001364783

f(xcurrent)
ans =
          1.36523001338436