输入参数错误太多

时间:2015-11-05 19:24:26

标签: matlab

我正在尝试运行我的功能。它显示

[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

1 个答案:

答案 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没有做任何事情,因此我把它搞砸了。最后,您需要更新函数中的值,因此使用flfxfm,而不是xuxl

如果你按照我从命令行中显示的那样调用函数 (当然是你自己的值),它不应该抛出任何错误。

原始代码中发生的情况是,您为输入变量计算一次,获得大于acceptable的错误,因此再次执行,采用相同的输入参数,返回与以前相同的错误,它仍然大于acceptable。这就是我们所说的无限循环。我建议你使用最大迭代次数来检查它,即

while Err>=acceptable && N<1e4

并将1e4更改为您想要的最大迭代次数。如果你不小心最终无限,那么这个计数器会杀死它,而不必诉诸 crtl - c 或等价物。