错误与此MATLAB代码

时间:2015-09-27 19:26:29

标签: matlab

我编写了这个脚本来测试MATLAB中的割线方法

%Test of the Secant Method

function secantm1(x0,x1)

    tol=10^-6; % tolerance
    itmax=1000; % max number of iterations
    itnum=0; % iterations counter


    disp([itnum,x0,x1])
    x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));
    itnum=itnum+1;
    disp([itnum,x1,abs((x0-x1)/x0)])

    while abs((x1-x2)/x1)>tol && itnum<itmax
        x0=x1; % I think here is mistake
        x1=x2;
        x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));
        itnum=itnum+1;
        disp([itnum,x1,abs((x1-x2)/x1),x2])
    end

end


function y=f1(x)
y=x^3+x-3;
end
function y=f2(x)
    y=x-tan(x);
end

但问题是它没有运行,我已经指出了我认为是错误的地方,但我不确定我是否正确,我该如何解决它。

有人可以帮我解决这个错误吗?

问题是,当我输入f1时,我希望得到1.23 ......但是方法并没有收敛,而另一个函数我希望不会收敛

当我运行它时,它给了我以下内容:

secantm1(1,2)

 0     1     2


 1     2     1

1.0e + 03 *

0.0020   -0.0060    0.2612   -1.5730

1.0e + 11 *

0.0000   -0.0000    0.0056    8.7573

1.0e + 45 *

0.0000    0.0000    0.0000   -2.6139

1.0e + 172 *

0.0000   -0.0000    0.0000   -1.1995

1.0e + 172 *

0.0000   -1.1995       Inf       Inf

 7   Inf   NaN   NaN

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题是你在迭代更新的分母中缺少一组括号。

x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));

应该是

 x2=x1-f1(x1)*((x1-x0)/( f1(x1)-f1(x0) ));

更正后的割线代码应为:

    function secantm1(x0,x1)

        tol=10^-6; % tolerance
        itmax=1000; % max number of iterations
        itnum=0; % iterations counter


        disp([itnum,x0,x1])
        x2=x1-f1(x1)*((x1-x0)/ ( f1(x1)-f1(x0) ));
        itnum=itnum+1;
        disp([itnum,x1,abs((x0-x1)/x0)])

        while abs((x1-x2)/x1)>tol && itnum<itmax
            x0=x1; % This was OK
            x1=x2;
            x2=x1-f1(x1)*((x1-x0)/( f1(x1)-f1(x0) ));
            itnum=itnum+1;
            disp([itnum,x1,abs((x1-x2)/x1),x2])
        end
end

这将收敛到现在的结果:

secantm1(1,2)

 0     1     2

 1     2     1

2.0000    1.1250    0.0471    1.1780

3.0000    1.1780    0.0320    1.2156

4.0000    1.2156    0.0019    1.2134

5.0000    1.2134    0.0000    1.2134

6.0000    1.2134    0.0000    1.2134