用牛顿法求平方根

Solving for the square root by Newton's Method


yinitial = x

y_n 当 n->infinity

接近 sqrt(x)

如果有 x 输入和 tol 输入。只要 |y^2-x| > tol 为真计算以下等式 y=0.5*(y + x/y)。我将如何创建一个 while 循环,它会在 |y^2-x| 时停止<=公差。所以每次循环 y 值都会改变。为了得到这个答案--->

>>sqrtx = sqRoot(25,100)

sqrtx =
 7.4615

到目前为止我写了这个:

function [sqrtx] = sqrRoot(x,tol)

n = 0;
x=0;%initialized variables

if x >=tol %skips all remaining code

   return

end

while x <=tol

    %code repeated during each loop

   x = x+1  %counting code

end

是的,这正是您应该做的:反复使用 y_{n+1} 的等式。

在你的代码中你应该有一个像

这样的循环
while abs(y^2 - x) > tol
   %// Calculate new y from the formula
end

另请注意,tol 应该很小,如其他答案中所述。参数 tol 实际上告诉您您希望您的解决方案有多不准确。通常您想要或多或少准确的解决方案,因此您将 tol 设置为接近零的值。

该公式使用牛顿法的修改版本来确定平方根。 y_n 是前一次迭代,y_{n+1} 是当前迭代。您只需要为每个变量保留两个变量,然后当满足公差标准时,您 return 当前迭代的输出。您还增加了错误的值。应该是 n,而不是 x。您也没有正确计算公差......更仔细地阅读问题。您获取当前迭代的输出,对其进行平方,减去所需的值 x,取绝对值并查看输出是否小于公差。

此外,您需要确保公差。将容差指定为 100 可能不允许算法迭代并给出正确答案。查看收敛到正确答案需要多长时间也可能很有用。因此,return n 作为函数的第二个输出:

function [sqrtx,n] = sqrRoot(x,tol) %// Change

%// Counts total number of iterations
n = 0;    

%// Initialize the previous and current value to the input
sqrtx = x;
sqrtx_prev = x;

%// Until the tolerance has been met...
while abs(sqrtx^2 - x) > tol

    %// Compute the next guess of the square root
    sqrtx = 0.5*(sqrtx_prev + (x/sqrtx_prev));

    %// Increment the counter
    n = n + 1;

    %// Set for next iteration
    sqrtx_prev = sqrtx;    
end

现在,当我 运行 使用 x=25tol=1e-10 这段代码时,我得到了:

>> [sqrtx, n] = sqrRoot(25, 1e-10)

sqrtx =

     5

n =

     7

25 的平方根是 5... 至少那是我当年数学 class 的记忆。它还需要 7 次迭代才能收敛。还不错。

解决这个问题的正确方法..

函数 [sqrtx] = sqRoot(x,tol)

sqrtx = x;%output = x

while abs((sqrtx.^2) - x) > tol %逻辑表达式来测试它应该什么时候

结束

sqrtx = 0.5*((sqrtx) + (x/sqrtx)); %while 条件证明为真计算

结束

结束