正确的正确方法

时间:2018-02-02 09:14:24

标签: for-loop while-loop

我在for循环中有一个割线方法尝试将其更改为while循环,但问题只是显示一次迭代,我想让它像for循环但在while循环中。

For 循环的代码:

    clc;clear;
    x0=1;
    x1=0;
    f=@(x) 3*x+sin(x)-exp(x)
    if abs(x0) <abs(x1)
        t=x0;
        x0=x1;
        x1=t;
    end
    for i=1:5
        x2=x1-(f(x1)*((x0-x1)/(f(x0)-f(x1))))
        disp([x0,  x1,  x2,  f(x2)]);
        x0=x1;
        x1=x2;
    end

这是我的 while 循环代码:

clc; clear;
 x0=1;
 x1=0;
 error=1
 tol=0.00001;
 f=@(x) 3*x+sin(x)-exp(x)
 if abs(f(x0)) < abs(f(x1))
     t=x0;
     x0=x1;
     x1=t;
 end
 x2=x1-(f(x1)*((x0-x1)/(f(x0)-f(x1))))
 while(abs(f(x2))<tol)

         disp(x1);

         x0=x1;
         x1=x2;
 end

4 个答案:

答案 0 :(得分:0)

您不参与while循环的原因是因为abs(f(x2))<tol不满意。我想你想要优化你的结果,直到下一步小于tol。在这种情况下,您应该使用while(abs(f(x2))>tol),因为这样,循环将重复到abs(f(x2))<=tol。另外,不要忘记将x2的函数放在while循环中,否则x2将不会更新,并且您将无限循环。

答案 1 :(得分:0)

首先,您不是在循环中修改while,因此您的error循环将无法运行或无限循环。正如ViG指出的那样,当您的错误大于容差时,您的逻辑条件是向后循环的。此外,最好在不收敛的情况下为while条件添加最大循环计数。最后你定义了x0=1; x1=0; error=1; tol=0.00001; f=@(x) 3*x+sin(x)-exp(x); loopCount = 0; maxNumLoops = 100; if abs(f(x0)) < abs(f(x1)) t=x0; x0=x1; x1=t; end while(abs(error)>tol) && loopCount < maxNumLoops loopCount = loopCount +1; x2=x1-(f(x1)*((x0-x1)/(f(x0)-f(x1)))); error = f(x2); x0=x1; x1=x2; end if loopCount >= maxNumLoops disp('Method did not converge!!') end 但从未使用它。因此,我通过将其添加到循环中以提高可读性,使代码更加清晰。

first;1;little;20;111     --> should go to table called "first"
first;2;foot;30;111
second;100;donald;50;43   --> should go to table called "second"

答案 2 :(得分:0)

我有以下代码,也许可以为您提供帮助:

secant <- function(fn, x0, x1, tol, max.iter){
xn.min1 <- x0
xn <- x1
iter <- 1
while((abs(xn-xn.min1) > tol) && (iter < max.iter)){
  xn.plus1 <- xn - f(xn)*(xn-xn.min1)/(f(xn)-f(xn.min1))
  xn.min1 <- xn
  xn <- xn.plus1
  iter <- iter + 1
}
if (abs(xn.plus1 - xn) > tol){
  cat("failed to converge\n")
  return(NULL)
} else {
  return(xn.plus1)
}

答案 3 :(得分:0)

您的停止条件出了些问题。请参阅我的代码以获取工作示例。

x.n.minus.1 <- 0.5
x.n <- 6
iter <- 1
while ((abs(x.n-x.n.minus.1) > tol) && (iter < max.iter)) {
  x.n.plus.1 <- x.n - f.acc(x.n)*(x.n-x.n.minus.1)/(f.acc(x.n)-f.acc(x.n.minus.1))
  x.n.minus.1 <- x.n
  x.n <- x.n.plus.1
  iter <- iter + 1
  cat("At iteration", iter, "value of x.n is:", x.n, "\n")
}