用牛顿法求平方根
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=25
和 tol=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 条件证明为真计算
结束
结束
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=25
和 tol=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 条件证明为真计算
结束
结束