牛顿方法可用于计算正实数的第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
答案 0 :(得分:1)
我想指出那些不熟悉此算法的人发现nth root of a number using Newton's method。
回到你的问题,有两个错误:
then
这样的关键字。摆脱它。p
一样多,并且算法很可能在此之前收敛,或者最坏的情况需要比p
更多的迭代来收敛。进行以下两项更改:
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