我在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
答案 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")
}