牛顿迭代公式(详细)

牛顿迭代公式 X n + 1 = X n − f ( x ) f ′ ( x ) X_{n+1} = X_n -\frac{f(x)}{f'(x)} Xn+1=Xnf(x)f(x)

上网搜了很久,搞懂了一点,简单记录一下

其实弄懂了一点后会发现它并不是很高大上😅

.

先来一段代码

求9的平方根,java实现

public static void main(String[] args) {
        double t = 9;
        while (Math.abs(t-9.0/t)>.001)//牛顿迭代公式 ↓
            t = (9.0/t + t) /2.0; // (a/xn + xn) / 2.0 
        System.out.println(t);
    }
    //

运行结果
3.00009155413138

牛顿迭代公式求平方根并不能算出准确的值,只能无限接近.
	
这里精确度还不是很高,一般情况下是够用了,如果需要更精确,改一下while条件即可.

下面来说一下牛顿迭代公式的原理

牛顿法最初由艾萨克·牛顿在《流数法》(Method of Fluxions,1671年完成,在牛顿去世后于1736年公开发表)中提出。约瑟夫·鲍易也曾于1690年在Analysis Aequationum中提出此方法。

11

求导

  • 首先,我们知道要对哪个数开方,比如现在我们要求出 9 2 \sqrt[2 ]{9 } 29 ,那么可以写出 x 2 − 9 = 0 x^2-9=0 x29=0,这一步我想应该没有人看不懂.

    • . . . . . . . . . . . . f ( x ) = x 2 − 9 f(x) = x^2-9 f(x)=x29 . . . . . .
      .

切线

  • 然后画出它的二维图形,并作出点 ( 9 , f ( 9 ) ) (9,f(9)) (9,f(9))处的切线,切线方程可以表示为
    .
    • . . . . . . . . . . . . y − f ( 9 ) = f ′ ( 9 ) ∗ ( x − 9 ) y-f(9)=f'(9)*(x-9) yf(9)=f(9)(x9) . . . . . 切线方程
    • . . . . . . . . . . . . x = y − f ( 9 ) f ′ ( 9 ) + 9 x= \frac{y-f(9)}{f'(9)}+9 x=f(9)yf(9)+9
      . . . . . . . . . . . . 当 y = 0 y=0 y=0时,. . . . . . 我们求到了 x = 5 x=5 x=5
      这样就朝着结果近了一步
  • 我们的目标 9 \sqrt{9} 9 的解为3,切线与x轴的交点为5,显然不是答案,我们还得继续做点 ( 5 , f ( 5 ) ) (5,f(5)) (5,f(5))的切线

再切

又近了一步耶

  • . . . . . . . . . . . . y − f ( 5 ) = f ′ ( 5 ) ∗ ( x − 5 ) y-f(5)=f'(5)*(x-5) yf(5)=f(5)(x5) . . . . . .切线方程
  • . . . . . . . . . . . . x = y − f ( 5 ) f ′ ( 5 ) + 5 x=\frac{y-f(5)}{f'(5)}+5 x=f(5)yf(5)+5
  • . . . . . . . . . . . . 同样,当 y = 0 y=0 y=0 时, x = 3. ∗ x=3.* x=3., . . . . . .还得继续…

继续切

1

已经很接近了.,就不继续切线了,

1

回顾一下,

f ( x ) = x 2 − a f(x) = x^2 - a f(x)=x2a
f ′ ( x ) = 2 x f'(x) = 2x f(x)=2x
x n + 1 = y − f ( x n ) f ′ ( x n ) + x n x_{n+1} = \frac{y-f(x_n)}{f'(x_n)}+x_n xn+1=f(xn)yf(xn)+xn ,

y = 0 y = 0 y=0 时,

X n + 1 = − f ( x ) f ′ ( x ) + x n X_{n+1} =-\frac{f(x)}{f'(x)} +x_n Xn+1=f(x)f(x)+xn . . . . . . . . . . . . . . . .牛顿迭代公式

化简一下
X n + 1 = − x n 2 − a 2 x n + x n X_{n+1}=-\frac{x_n^2-a}{2x_n}+x_n Xn+1=2xnxn2a+xn

最后得到
X n + 1 = ( a x n + x n ) ∗ 1 2 X_{n+1}=(\frac{a}{x_n}+x_n)*\frac{1}{2} Xn+1=(xna+xn)21

以上就是牛顿迭代求平方根的过程了😅

写成java代码上面的样子
//

//

//

.总结一下:

  1. f ( x ) f(x) f(x)求导,
  2. k = f ′ ( x ) k=f'(x) k=f(x)切线,
  3. 求出 y = 0 y=0 y=0时的 x x x的值, 赋值 x 1 x_1 x1
  4. k = f ′ ( x 1 ) k=f'(x_1) k=f(x1)切线
  5. 求出 y = 0 y=0 y=0时的 x 1 x_1 x1的值,赋值 x 2 x_2 x2
  6. k = f ′ ( x 2 ) k=f'(x_2) k=f(x2)切线

.

参考:
这个动态图易懂
维基百科-牛顿法

.
.
.
.

### 拟牛顿法的数学概念与迭代公式 拟牛顿法的核心在于通过构造一个近似的Hessian矩阵或其逆矩阵,避免直接计算复杂的二阶导数矩阵及其逆矩阵。这种方法显著降低了计算成本,同时保持了较高的收敛速度。 #### 基本思想 在优化问题中,目标是最小化某个可微分的目标函数 \( f(x) \),其中 \( x \in \mathbb{R}^n \) 是变量向量。假设当前迭代点为 \( x_k \),则下一迭代点可以通过以下方式定义: \[ x_{k+1} = x_k - \alpha_k B_k^{-1} g_k, \] 这里: - \( g_k = \nabla f(x_k) \) 表示目标函数在点 \( x_k \) 处的一阶梯度[^4]; - \( B_k \) 或者它的逆矩阵 \( H_k = B_k^{-1} \) 被用来近似真实的Hessian矩阵 \( \nabla^2 f(x_k) \)[^5]; - 步长参数 \( \alpha_k \) 可以通过线搜索技术确定[^3]。 为了使 \( B_k \) 的更新满足一定的条件,通常采用所谓的 **割线方程** 来约束更新规则。具体来说,设两个连续迭代点分别为 \( x_k \) 和 \( x_{k+1} \),对应的梯度变化为 \( s_k = x_{k+1} - x_k \), \( y_k = g_{k+1} - g_k \),那么要求新的近似矩阵 \( B_{k+1} \) 满足如下关系: \[ B_{k+1}s_k = y_k. \] 这是对 \( B_{k+1} \) 的基本约束条件之一[^1]。 #### 更新公式 常见的拟牛顿法有多种具体的实现形式,例如 DFP 方法和 BFGS 方法。以下是两种典型的更新公式: ##### DFP 方法 对于 DFP 方法,\( H_k \approx (\nabla^2 f)^{-1}(x_k) \) 的更新公式为: \[ H_{k+1} = H_k + \frac{s_k s_k^\top}{s_k^\top y_k} - \frac{H_k y_k y_k^\top H_k}{y_k^\top H_k y_k}. \] 这里的每一项都具有特定的意义:第一项用于捕捉新方向上的曲率信息,而第二项则是修正之前的估计误差。 ##### BFGS 方法 相比之下,BFGS 方法更常用也更加稳定。它直接针对 \( B_k \) 进行更新而不是 \( H_k \): \[ B_{k+1} = B_k + \frac{y_k y_k^\top}{y_k^\top s_k} - \frac{B_k s_k s_k^\top B_k}{s_k^\top B_k s_k}. \] 值得注意的是,在实际应用中往往并不显式存储整个 \( B_k \) 矩阵,而是通过递归的方式来高效地完成乘积操作 \( p_k = -B_k^{-1}g_k \)[^4]。 #### 收敛性质 理论上讲,当初始猜测足够接近最优解且所选步长适当的情况下,大多数版本的拟牛顿法都能达到超线性的局部收敛速率。这意味着随着迭代次数增加,相邻两次逼近之间的差距会越来越快地下降至零[^2]。 ```python def bfgs_update(B, sk, yk): rho = 1 / (yk.T @ sk) Vk = np.eye(len(sk)) - rho * (sk.reshape(-1,1) @ yk.reshape(1,-1)) return Vk.T @ B @ Vk + rho * (yk.reshape(-1,1) @ yk.reshape(1,-1)) # Example usage of the function above within an optimization loop would involve updating matrix `B` at each step using this formula based on computed values for vectors `sk`, and `yk`. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值