【学习笔记】牛顿迭代法求立方根
【学习笔记】牛顿迭代法求立方根简介介绍使用牛顿迭代法求立方根x3{\sqrt[3]{x}}3x的C语言实现和公式的推导。代码float CubeRoot(float num){float x = num;float error = 1e-5;while (fabs(num - (x * x * x)) >= error){x = (2 * x + num / (x * x)) / 3.0;
【学习笔记】牛顿迭代法求立方根
简介
介绍使用牛顿迭代法求立方根x3{\sqrt[3]{x}}3x的C语言实现和公式的推导。
代码
float CubeRoot(float num)
{
float x = num;
float error = 1e-5;
while (fabs(num - (x * x * x)) >= error)
{
x = (2 * x + num / (x * x)) / 3.0;
}
return x;
}
代码很简单,就是使用牛顿迭代法计算,然后判断是否达到想要的精度,达到精度后退出。
这里精度设置是0.00001,可以根据自己实际情况调整。
公式推导
这里说明代码x = (2 * x + num / (x * x)) / 3.0;
是如何得到的。
牛顿迭代法公式如下。
xn+1=xn−f(xn)f′(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}xn+1=xn−f′(xn)f(xn)
我们计算立方根的公式:
y=x3=x13y = {\sqrt[3]{x}} = x^{\frac 13}y=3x=x31
所以
y3=x{{y}^3} = xy3=x
构建以y为自变量的函数方程为
f(y)=y3−x=0f(y) = {{y}^3} - x = 0f(y)=y3−x=0
f′(y)=3y2=0f'(y) = {3}{y^2} = 0f′(y)=3y2=0
将f(y)f(y)f(y)和f′(y)f'(y)f′(y)带入
y−f(y)f′(y)=y−y3−x3y2y - \frac{f(y)}{f'(y)} = y - \frac{{{y}^{3}} - x}{{3}{y^2}}y−f′(y)f(y)=y−3y2y3−x
=13(2y+xy2)= \frac{1}{3}{(2y + \frac{x}{y^2})}=31(2y+y2x)
所以
yn+1=13(2yn+xyn2)y_{n+1} = \frac{1}{3}{(2y_n + \frac{x}{y_n^2})}yn+1=31(2yn+yn2x) = (2yn+x÷yn2)÷3(2{y_n} + {x}÷{y_n^2})÷3(2yn+x÷yn2)÷3
实际计算,设x=2x = 2x=2,y1=2y_1 = 2y1=2
y2=(2×2+2÷22)÷3=1.5y_2 = (2 × 2 + 2 ÷ 2^2) ÷ 3 = 1.5y2=(2×2+2÷22)÷3=1.5
y3=(2×1.5+2÷1.52)÷3=1.296296y_3 = (2 × 1.5 + 2 ÷ 1.5^2) ÷ 3 = 1.296296y3=(2×1.5+2÷1.52)÷3=1.296296
y4=(2×1.296296+2÷1.2962962)÷3=1.260932y_4 = (2 × 1.296296 + 2 ÷ 1.296296^2) ÷ 3 = 1.260932y4=(2×1.296296+2÷1.2962962)÷3=1.260932
y5=(2×1.260932+2÷1.2609322)÷3=1.259922y_5 = (2 × 1.260932 + 2 ÷ 1.260932^2) ÷ 3 = 1.259922y5=(2×1.260932+2÷1.2609322)÷3=1.259922
经过多次迭代,计算出来的结果23≈1.259922{\sqrt[3]{2}} \approx 1.25992232≈1.259922。
本文链接:https://blog.csdn.net/u012028275/article/details/113822412
更多推荐
所有评论(0)