我正在尝试运行我的功能。它显示
[root, ni]=value1(xu,xl,acceptable) Error using value1 Too many input arguments.
function[root, ni]=value1(xu,xl,acceptable)
fu=HW10B(xu);
fl=HW10B(xl);
Err=1;
N=0;
if fu*fl>=0
end
while Err>=acceptable;
m=(xu+xl)/2;
fm=HW10B(m)
if fm*fu<0;
fl=m;
else fu=m;
Err=abs(xu-xl)/xu*100;
end
N=N+1;
end
function [ y] = HW10B( x)
%equation of x
y=3*x^3-8*x^2-4*x+9;
end
root=m;
ni=N;
end
答案 0 :(得分:1)
function[m, N]=value1(xu,xl,acceptable)
y=@(x)3*x.^3-8.*x.^2-4.*x+9;%//Used anonymous function instead of private
fu=y(xu);%//Used above definition
fl=y(xl);
Err=1;%//Initialise error
N=0;%//Initialise counter
while Err>=acceptable && N<1e4;%//check for convergence
m=(fu+fl)/2;%//Get new midpoint
fm=y(m);%//Get value at midpoint
if fm*fu<0;%//Get left or right value to move
fl=m;
else
fu=m;
Err=abs(fu-fl)/fu*100;%//Calculate the error
end
N=N+1;%//Update iteration counter
end
end
从命令行调用它:
xu=15;xl=2;acceptable=1e-3;
[root, ni]=value1(xu,xl,acceptable)
root =
2.7554
ni =
29
正如您所看到的,我清理了很多代码。在代码末尾使用两个独立的存储变量只占用了超出必要的空间。 if
声明fu*fl>0
没有做任何事情,因此我把它搞砸了。最后,您需要更新函数中的值,因此使用fl
,fx
和fm
,而不是xu
和xl
。
如果你按照我从命令行中显示的那样调用函数 (当然是你自己的值),它不应该抛出任何错误。
原始代码中发生的情况是,您为输入变量计算一次,获得大于acceptable
的错误,因此再次执行,采用相同的输入参数,返回与以前相同的错误,它仍然大于acceptable
。这就是我们所说的无限循环。我建议你使用最大迭代次数来检查它,即
while Err>=acceptable && N<1e4
并将1e4
更改为您想要的最大迭代次数。如果你不小心最终无限,那么这个计数器会杀死它,而不必诉诸 crtl - c 或等价物。