牛顿方法pth root- MATLAB

时间:2015-11-01 17:06:43

标签: matlab

牛顿方法可用于计算正实数的第p个根。编写一个Matlab函数myrootp.m,它计算任何a&gt;的^(1 / p)。 0和正整数p。当abs((Xk ^(p)/ a)-1)<10 ^( - 15)时,该函数应该停止。

我使用了以下代码,但找不到错误:

   function root1 = root1( a,X0,p)

    Xk=X0;
    fd= p*Xk^(p-1);
    f=(Xk^p)-a;
    if a<0 
then disp('Error:a must be positive and real')
    else
for k=1:p
    if abs(Xk^p/a-1)<10^(-15)
        then return disp('Error');
    else            
    Xk1=Xk-f/fd;
    Xk=Xk1;
    fd= p*Xk^(p-1);
    f=(Xk^p)-a;
    end
end

  end

  root1 = Xk;
  return
  end

1 个答案:

答案 0 :(得分:1)

我想指出那些不熟悉此算法的人发现nth root of a number using Newton's method

回到你的问题,有两个错误:

  1. MATLAB中没有then这样的关键字。摆脱它。
  2. 您需要迭代直到错误符合您的指定。你循环的次数与幂p一样多,并且算法很可能在此之前收敛,或者最坏的情况需要比p更多的迭代来收敛。
  3. 进行以下两项更改:

    function root1 = root1(a,X0,p)
    
    Xk=X0;
    fd= p*Xk^(p-1);
    f=(Xk^p)-a;
    if a<0 
        disp('Error:a must be positive and real')
    else
        while true
            if abs(Xk^p/a-1)<10^(-15)
                break;
            else            
                Xk1=Xk-f/fd;
                Xk=Xk1;
                fd= p*Xk^(p-1);
                f=(Xk^p)-a;
            end
        end
    end
    
    root1 = Xk;
    

    要测试一下,使用初始猜测5或X0=5,我们想要找到平方根10(a = 10, p = 2),我们得到:

    >> format long g;
    >> root1(10, 5, 2)
    
    ans =
    
          3.16227766016838
    

    将此与MATLAB的sqrt函数进行比较,得到:

    >> format long g;
    >> sqrt(10)
    
    ans =
    
          3.16227766016838