线性共轭梯度法-程序员宅基地

技术标签: 算法  机器学习  人工智能  数值优化  

基础知识

首先,我们需要确保你理解一些基础的数学概念和术语,这对于掌握线性共轭梯度法至关重要:

  1. 梯度(Gradient):函数在给定点的梯度指向函数值增加最快的方向。在多维空间中,梯度是一个向量,它的每个分量都是函数对该维度变量的偏导数。

  2. 方向导数(Directional Derivative):在多维空间中,函数在给定点沿某一方向的变化率。它是梯度与该方向向量的点积。

  3. 共轭方向(Conjugate Directions):在给定矩阵A下,两个非零向量pq是共轭的,如果它们满足p^T A q = 0。在共轭梯度法中,通过沿着这些共轭方向进行搜索,可以在每个方向上得到最优解,避免了方向之间的相互干扰。

共轭梯度法的步骤

线性共轭梯度法主要包含以下步骤:

  1. 选择初始点:从一个初始解x0开始迭代。
  2. 计算初始梯度:计算初始点的负梯度(即最速下降方向)。
  3. 共轭方向迭代:通过一系列迭代找到一组共轭方向,并沿这些方向更新解。
  4. 线搜索:在每次迭代中,沿着共轭方向进行线搜索,找到最小化目标函数的步长。

理解共轭梯度法

类比理解:你可以把共轭梯度法想象成在多维山谷中寻找最低点的过程。如果你只是简单地沿着最陡峭的方向(即梯度方向)下山,可能会反复经过相同的路径,费时费力。共轭梯度法通过选择一组“聪明”的方向(共轭方向),确保每走一步都尽可能接近谷底,从而更快地找到最低点。

共轭方向的概念是理解线性共轭梯度法中非常关键的一点。为了使这个概念更加清晰,我会先解释什么是共轭方向,然后用一个简单的类比来帮助你理解。

共轭方向的定义

在数学和优化问题中,假设我们有一个正定矩阵A。那么,两个非零向量pq被认为是在A下共轭的,如果它们满足下面的关系:
p T A q = 0 p^T A q = 0 pTAq=0
这个等式意味着,当向量p和向量q通过矩阵A变换后,它们在新空间中是正交的。这里的p^T表示向量p的转置。

为什么要使用共轭方向?

在优化问题中,特别是在求解二次型函数最小值的问题中,共轭方向允许我们在每一步都沿一个新的、与之前所有方向共轭的方向进行搜索。这样做的好处是,它保证了每一步都是有效的,不会重复之前的搜索方向,从而可以更快地收敛到最优解。

类比理解共轭方向

想象你在一个有很多小山的大山谷里寻找最低点。如果你只是简单地沿着下坡方向(即梯度方向)走,可能会绕来绕去,因为你每次移动都是基于当前位置的最陡下坡方向,没有考虑之前走过的路径。而共轭方向的策略,则好比是你在寻找下一个移动方向时,会考虑一条与之前所有移动方向都不会重复的路径。这就好比是你在确保每次移动都是新的探索,避免了重复和回头路,从而更有效地达到山谷的最低点。

在优化问题中,这意味着我们通过选择一组特殊的搜索方向(即共轭方向),确保在每个方向上的移动都对最终目标有正向贡献,而不会因为方向之间的相互干扰而浪费努力。
理解共轭方向对于深入学习线性共轭梯度法(Linear Conjugate Gradient Method, 简称LCG)是非常重要的一步。现在,让我们继续深入探讨线性共轭梯度法的具体内容和步骤。

线性共轭梯度法(LCG)概述

线性共轭梯度法是一种迭代方法,用于解决形如Ax = b的线性方程组,其中A是一个正定矩阵。该方法特别适用于那些矩阵太大,使得直接解法(如高斯消元法)不切实际的情况。LCG方法的优点是不需要显式地存储矩阵A,只需能够计算矩阵A与任意向量的乘积即可。

LCG方法的关键步骤

  1. 初始化:选择一个初始猜测解x0,计算初始残差r0 = b - Ax0(如果x0是精确解,则r0为零向量),并设置p0 = r0。这里,r0不仅表示了当前解的误差,而且指示了下一步搜索的方向。

  2. 迭代过程:对于第k步迭代(k从0开始),执行以下操作:

    • 计算步长αk = (r^T_k r_k) / (p^T_k A p_k)。这个步长是通过最小化沿方向pk的二次函数得到的。
    • 更新解x_{k+1} = x_k + αk p_k
    • 更新残差r_{k+1} = r_k - αk A p_k
    • 如果r_{k+1}足够小,就停止迭代。否则,继续。
    • 计算βk = (r^T_{k+1} r_{k+1}) / (r^T_k r_k)
    • 更新搜索方向p_{k+1} = r_{k+1} + βk p_k

类比理解LCG的工作原理

可以把LCG方法比作在山谷中寻找最低点的过程。假设你在夜晚里仅靠手电筒寻路,手电筒的光线指向下一步应该走的方向。每走一步,你都会根据当前位置更新你的行进方向,以确保你不是在原地打转,而是在向目标移动。这里,“残差”r_k相当于告诉你距离目标还有多远,而“搜索方向”p_k指导你应该往哪个方向走。每一步都是基于当前的信息精心计算出来的,以确保你以最快的速度达到山谷底部,即求解的最优解。

深入理解步长αk和参数βk

  • 步长αk:这个参数确保我们沿着当前搜索方向p_k移动的距离既不会太远(超过最低点),也不会太近(未能充分接近最低点)。它是通过最小化当前搜索方向上的目标函数来计算得出的。

  • 参数βk:这个参数用于更新搜索方向,使得新的搜索方向与之前所有的搜索方向共轭,保证了搜索的效率和准确性。通过这种方式,LCG方法确保每一步都在新的、独立的方向上前进,避免重复工作。

步长 ( α k = r k T r k p k T A p k ) ( \alpha_k = \frac{r_k^T r_k}{p_k^T A p_k} ) (αk=pkTApkrkTrk) 的选择是线性共轭梯度法的核心组成部分,它基于几个数学原理和目标优化的需要。这个公式的设计旨在确保每一步迭代都朝着最优解前进,同时保持计算效率。下面,我将分几个方面来解释这个公式的来源和它的重要性。

目标函数的二次形式

首先,回顾一下,线性共轭梯度法主要用于解决形式为 ( A x = b ) (Ax = b) (Ax=b) 的线性方程组,其中 ( A ) (A) (A) 是一个正定矩阵。这个方程组等价于最小化以下二次形式的目标函数:
f ( x ) = 1 2 x T A x − b T x f(x) = \frac{1}{2} x^T A x - b^T x f(x)=21xTAxbTx

寻找最小值

在每一步迭代中,我们希望找到一个合适的步长 ( α k ) ( \alpha_k ) (αk),使得当前搜索方向 ( p k ) ( p_k ) (pk) 上的 ( f ( x ) ) ( f(x) ) (f(x)) 得到最小化。具体地,我们想要最小化函数 ( f ( x k + α p k ) ) ( f(x_k + \alpha p_k) ) (f(xk+αpk)) 关于 ( α ) ( \alpha ) (α) 的值。

步长 ( α k ) ( \alpha_k ) (αk) 的导出

通过对 ( f ( x k + α p k ) ) ( f(x_k + \alpha p_k) ) (f(xk+αpk)) 求导,并设导数为零,我们可以找到最小化该函数的 ( α ) ( \alpha ) (α) 值。这个导数为零的条件导出了上述步长的表达式。具体推导如下:

  1. ( g ( α ) = f ( x k + α p k ) ) ( g(\alpha) = f(x_k + \alpha p_k) ) (g(α)=f(xk+αpk)),对 ( α ) ( \alpha ) (α) 求导,得到 ( d g d α = ( A ( x k + α p k ) − b ) T p k ) ( \frac{dg}{d\alpha} = (A(x_k + \alpha p_k) - b)^T p_k ) (dαdg=(A(xk+αpk)b)Tpk)
  2. ( d g d α = 0 ) ( \frac{dg}{d\alpha} = 0 ) (dαdg=0),解这个方程得到 ( α ) ( \alpha ) (α) 的表达式。

为什么是 ( r k T r k ) ( r_k^T r_k ) (rkTrk) ( p k T A p k ) ( p_k^T A p_k ) (pkTApk) 呢?这里, ( r k = b − A x k ) ( r_k = b - Ax_k ) (rk=bAxk) 是当前解 ( x k ) ( x_k ) (xk) 的残差,表示目前的解与真实解的差异。而 ( p k ) ( p_k ) (pk) 是当前的搜索方向。

  • ( r k T r k ) ( r_k^T r_k ) (rkTrk) 是残差的二范数的平方,反映了当前解的误差大小。
  • ( p k T A p k ) ( p_k^T A p_k ) (pkTApk) 反映了在当前搜索方向上,系统如何响应这个方向的变化,是一个衡量在搜索方向上改变对目标函数影响大小的量。

这个比例 ( α k = r k T r k p k T A p k ) ( \alpha_k = \frac{r_k^T r_k}{p_k^T A p_k} ) (αk=pkTApkrkTrk) 确保了在当前搜索方向上能够有效地减小目标函数的值,同时避免了步长过大导致超过最小值点或步长过小导致收敛缓慢的问题。

类比理解

想象你正在山谷中寻找最低点,你有一个指南针(搜索方向 ( p k ) ( p_k ) (pk))和一个步长计算器( ( α k ) ( \alpha_k ) (αk) 公式)。这个步长计算器帮助你确定在当前方向上应该走多远才能更接近山谷的最低点,而不是偏离轨道或在半路就停下来。

现在,我们可以继续探讨线性共轭梯度法(LCG)的其他重要方面,特别是搜索方向的更新和整个方法的收敛性。

搜索方向的更新

在线性共轭梯度法中,除了计算步长 ( α k ) ( \alpha_k ) (αk),搜索方向 ( p k ) ( p_k ) (pk) 的更新也非常关键。这个更新确保了每一步我们不仅是朝着减少当前残差的方向前进,而且还保持了与前面所有搜索方向的共轭性,这对于算法的效率和收敛性至关重要。

更新公式为:
p k + 1 = r k + 1 + β k p k p_{k+1} = r_{k+1} + \beta_k p_k pk+1=rk+1+βkpk
其中, ( β k = r k + 1 T r k + 1 r k T r k ) ( \beta_k = \frac{r_{k+1}^T r_{k+1}}{r_k^T r_k} ) (βk=rkTrkrk+1Trk+1),这个比例因子 ( β k ) ( \beta_k ) (βk) 的计算保证了新的搜索方向 ( p k + 1 ) ( p_{k+1} ) (pk+1) 与之前所有的搜索方向共轭。

算法的收敛性

线性共轭梯度法的一个显著特点是其良好的收敛性质。在理想情况下(不考虑数值精度问题),对于一个 ( n ) ( n ) (n) 维问题,LCG方法最多需要 ( n ) ( n ) (n) 步就能找到精确解。在实际应用中,由于舍入误差,可能需要更多步骤,但LCG方法通常比其他迭代方法更快收敛,尤其是对于大规模稀疏系统。

预处理

为了进一步提高LCG方法的效率,常常使用预处理技术。预处理的目的是通过变换原问题来改善条件数,从而加快收敛速度。一个好的预处理器可以将问题转化为一个条件数更低的等价问题,使得共轭梯度法能够更快地收敛。

预处理后的系统形式为:
M − 1 A x = M − 1 b M^{-1}Ax = M^{-1}b M1Ax=M1b
其中, ( M ) ( M ) (M) 是预处理矩阵,其选择对算法的效率影响很大。

为了进一步深化理解线性共轭梯度法(LCG),我们可以通过一个具体的例子来演示该方法是如何工作的。让我们考虑一个简单的线性方程组问题,并通过LCG方法来解决它。

例子:解线性方程组

假设我们有以下线性方程组:

A x = b Ax = b Ax=b

其中,

A = ( 4 1 1 3 ) , b = ( 1 2 ) A = \begin{pmatrix} 4 & 1 \\ 1 & 3 \\ \end{pmatrix} , \quad b = \begin{pmatrix} 1 \\ 2 \\ \end{pmatrix} A=(4113),b=(12)

目标是解出向量 ( x ) (x) (x)

步骤 1: 初始化

选择一个初始猜测解 ( x 0 ) (x_0) (x0),通常可以是零向量。于是,

x 0 = ( 0 0 ) x_0 = \begin{pmatrix} 0 \\ 0 \end{pmatrix} x0=(00)

计算初始残差 ( r 0 = b − A x 0 = b ) (r_0 = b - Ax_0 = b) (r0=bAx0=b),因为 ( x 0 ) (x_0) (x0) 是零向量。所以,

r 0 = ( 1 2 ) r_0 = \begin{pmatrix} 1 \\ 2 \end{pmatrix} r0=(12)

设置 ( p 0 = r 0 ) (p_0 = r_0) (p0=r0),即:

p 0 = ( 1 2 ) p_0 = \begin{pmatrix} 1 \\ 2 \end{pmatrix} p0=(12)

步骤 2: 迭代过程

对于第 ( k ) (k) (k) 步迭代:

  1. 计算步长 ( α k ) ( \alpha_k ) (αk)

α k = r k T r k p k T A p k \alpha_k = \frac{r_k^T r_k}{p_k^T A p_k} αk=pkTApkrkTrk

  1. 更新解 ( x k + 1 ) (x_{k+1}) (xk+1)

x k + 1 = x k + α k p k x_{k+1} = x_k + \alpha_k p_k xk+1=xk+αkpk

  1. 更新残差 ( r k + 1 ) (r_{k+1}) (rk+1)

r k + 1 = r k − α k A p k r_{k+1} = r_k - \alpha_k A p_k rk+1=rkαkApk

  1. 计算 ( β k ) (\beta_k) (βk)

β k = r k + 1 T r k + 1 r k T r k \beta_k = \frac{r_{k+1}^T r_{k+1}}{r_k^T r_k} βk=rkTrkrk+1Trk+1

  1. 更新搜索方向 ( p k + 1 ) (p_{k+1}) (pk+1)

p k + 1 = r k + 1 + β k p k p_{k+1} = r_{k+1} + \beta_k p_k pk+1=rk+1+βkpk

实际计算

我们将只执行一次迭代来展示方法的核心。

  1. 计算 ( α 0 ) ( \alpha_0 ) (α0)

α 0 = ( 1 2 ) ( 1 2 ) ( 1 2 ) ( 4 1 1 3 ) ( 1 2 ) = 5 14 \alpha_0 = \frac{\begin{pmatrix} 1 & 2 \end{pmatrix} \begin{pmatrix} 1 \\ 2 \end{pmatrix}}{\begin{pmatrix} 1 & 2 \end{pmatrix} \begin{pmatrix} 4 & 1 \\ 1 & 3 \end{pmatrix} \begin{pmatrix} 1 \\ 2 \end{pmatrix}} = \frac{5}{14} α0=(12)(4113)(12)(12)(12)=145

  1. 更新 ( x 1 ) (x_1) (x1)

x 1 = ( 0 0 ) + 5 14 ( 1 2 ) = 5 14 ( 1 2 ) x_1 = \begin{pmatrix} 0 \\ 0 \end{pmatrix} + \frac{5}{14} \begin{pmatrix} 1 \\ 2 \end{pmatrix} = \frac{5}{14} \begin{pmatrix} 1 \\ 2 \end{pmatrix} x1=(00)+145(12)=145(12)

  1. 更新 ( r 1 ) (r_1) (r1) ( p 1 ) (p_1) (p1)(略)

结论

通过这个简化的例子,我们可以看到,LCG方法通过一系列迭代步骤,利用残差和搜索方向的更新,逐步接近方程组的解。在实际应用中,这个过程会通过编程实现,并且通常需要多次迭代来获得足够精确的解。

MATLAB程序示例

下面是一个简单的MATLAB程序,用于通过线性共轭梯度法(LCG)解决前面提到的线性方程组问题。这个程序将遵循LCG方法的核心步骤,包括初始化、计算步长、更新解、更新残差,以及更新搜索方向。

function x = conjugateGradient(A, b, tol, maxIter)
    % A: 正定矩阵
    % b: 结果向量
    % tol: 容忍误差,用于判断是否收敛
    % maxIter: 最大迭代次数

    % 初始化
    x = zeros(size(b)); % 假设初始猜测解为零向量
    r = b - A * x; % 计算初始残差
    p = r; % 设置初始搜索方向
    rsold = r' * r;

    for i = 1:maxIter
        Ap = A * p;
        alpha = rsold / (p' * Ap); % 计算步长
        x = x + alpha * p; % 更新解
        r = r - alpha * Ap; % 更新残差
        rsnew = r' * r; % 计算新的残差的二范数平方

        % 检查是否收敛
        if sqrt(rsnew) < tol
            break;
        end

        p = r + (rsnew / rsold) * p; % 更新搜索方向
        rsold = rsnew; % 更新旧的残差二范数平方
    end

    if i == maxIter
        disp('最大迭代次数达到,解可能未完全收敛。');
    else
        disp(['在迭代次数 ', num2str(i), ' 次后收敛。']);
    end
end
% 示例矩阵和向量
A = [4 1; 1 3];
b = [1; 2];

% 调用函数
tol = 1e-6; % 容忍误差
maxIter = 100; % 最大迭代次数
x = conjugateGradient(A, b, tol, maxIter);

% 显示解
disp('解 x:');
disp(x);

使用说明

  • 这个函数conjugateGradient接收四个参数:矩阵A、向量b、容忍误差tol和最大迭代次数maxIter
  • 函数初始化解向量x为零向量,计算初始残差r,并将初始搜索方向p设置为r
  • 在每次迭代中,函数计算步长alpha,更新解x,更新残差r,然后根据新的残差更新搜索方向p
  • 迭代会在残差的二范数小于tol时停止,或者当达到最大迭代次数maxIter时停止。
  • 最后,函数会输出解x,并显示实际迭代次数或是否达到了最大迭代次数。

运行示例

你可以直接复制上述代码到MATLAB中,并运行它。该代码会使用我们前面讨论的矩阵A和向量b作为输入,输出LCG方法找到的解向量x以及实际的迭代次数。

A矩阵的说明

线性共轭梯度法(LCG)要求矩阵 ( A ) (A) (A) 必须是正定的,这一要求保证了算法的数学性质和收敛性。下面是几个原因说明为什么 ( A ) (A) (A) 必须是正定的:

1. 保证了搜索方向是下降方向

在LCG中,步长 ( α k ) (\alpha_k) (αk) 是通过 ( α k = r k T r k p k T A p k ) ( \alpha_k = \frac{r_k^T r_k}{p_k^T A p_k} ) (αk=pkTApkrkTrk) 计算的。如果 ( A ) (A) (A) 是正定的,那么对于所有非零向量 ( v ) (v) (v),都有 ( v T A v > 0 ) (v^T A v > 0) (vTAv>0)。这确保了步长 ( α k ) (\alpha_k) (αk) 总是正的,因此更新的解 ( x k + 1 = x k + α k p k ) (x_{k+1} = x_k + \alpha_k p_k) (xk+1=xk+αkpk) 是沿着能够减少函数值的方向前进的。

2. 确保收敛性

LCG方法的收敛性基于 ( A ) (A) (A) 是正定的这一前提。正定矩阵保证了定义在 ( A ) (A) (A) 上的二次型函数 ( 1 2 x T A x − b T x ) (\frac{1}{2} x^T A x - b^T x) (21xTAxbTx) 是严格凸的,这意味着函数有一个唯一的全局最小值。LCG方法正是利用这一性质,通过迭代逼近这个最小值。

3. 避免数值不稳定和无解的情况

如果 ( A ) (A) (A) 不是正定的,那么可能存在数值不稳定的情况,比如步长 ( α k ) (\alpha_k) (αk) 可能计算出负值,这会导致解向错误的方向更新,使算法发散而不是收敛。此外,如果 ( A ) (A) (A) 是奇异的或不定的,那么方程组 ( A x = b ) (Ax = b) (Ax=b) 可能没有唯一解或根本没有解,这与LCG方法试图找到唯一全局最小值的目标相矛盾。

4. 算法的理论基础

LCG方法的设计和理论分析都是基于正定矩阵的性质,如保证了共轭方向间的关系和优化问题的凸性。如果 ( A ) (A) (A) 不是正定的,这些理论基础不再成立,算法也就失去了它的数学根据和实际应用的意义。

总结来说, ( A ) (A) (A) 必须是正定的,是为了确保LCG方法能够在数学和数值上稳定地运行,并最终收敛到一个唯一的解。这是利用LCG方法求解线性方程组或最优化问题时必须遵守的重要前提条件。

方向导数

理解方向导数是掌握许多数学和物理概念的关键,尤其是当你在处理函数在特定方向上的变化率时。让我们用一种直观的方式来探讨方向导数的概念。

方向导数的基本定义

方向导数衡量的是在多维空间中,函数在某一点沿特定方向的变化率。想象一下,你站在山坡上的某一点,方向导数告诉你,如果你向北行走,海拔高度将如何变化?如果向东行走又会如何?换句话说,方向导数描述了函数在给定点沿不同方向的斜率。

数学表达

数学上,如果你有一个函数 ( f ( x , y ) ) (f(x, y)) (f(x,y)),在点 ( ( x 0 , y 0 ) ) ((x_0, y_0)) ((x0,y0)) 处沿向量 ( v = ( v x , v y ) ) (\mathbf{v} = (v_x, v_y)) (v=(vx,vy)) 的方向导数定义为:
D v f ( x 0 , y 0 ) = lim ⁡ h → 0 f ( x 0 + h v x , y 0 + h v y ) − f ( x 0 , y 0 ) h D_{\mathbf{v}}f(x_0, y_0) = \lim_{h \to 0} \frac{f(x_0 + h v_x, y_0 + h v_y) - f(x_0, y_0)}{h} Dvf(x0,y0)=h0limhf(x0+hvx,y0+hvy)f(x0,y0)
简而言之,它测量了当你沿着向量 ( v ) (\mathbf{v}) (v) 方向微小移动时,函数值的变化率。

几何解释

方向导数的一个更直观的理解是,假设你在一个山谷(代表函数的图形)中,站在一个具体的位置(即函数的某个点)。你想知道如果你向某个具体的方向移动,你的高度变化会有多快。方向导数就是这个“高度变化速度”的量度。

与梯度的关系

方向导数与另一个重要的概念——梯度——密切相关。梯度是一个向量,指向函数增长最快的方向,其大小是增长率。对于任意方向 ( v ) (\mathbf{v}) (v),函数在 ( v ) (\mathbf{v}) (v) 方向上的方向导数可以通过梯度 ( ∇ f ) (\nabla f) (f) 计算为:
D v f = ∇ f ⋅ v ∥ v ∥ D_{\mathbf{v}}f = \nabla f \cdot \frac{\mathbf{v}}{\|\mathbf{v}\|} Dvf=fvv
这表明,方向导数是梯度向量在 ( v ) (\mathbf{v}) (v) 方向上的投影。

类比理解

想象你有一个小球,你放在了函数图形(比如山丘)的某个点上。现在,你打算推动这个球,让它朝一个你选择的方向滚动。方向导数就告诉你,球开始滚动时加速度有多大,即球滚动的初始速度。如果方向与梯度方向一致,球将会以最快的速度加速;如果方向正好相反,球会以最快的速度减速;如果方向垂直于梯度方向,球在该方向上的初速度为零,因为那是局部的“平坦方向”。

方向导数的使用在线性共轭梯度法(LCG)

在线性共轭梯度法(LCG)中,方向导数的概念间接体现在选择搜索方向和计算步长的过程中。虽然LCG中通常不直接计算方向导数,但方法的整体思想和步骤紧密关联于函数在给定方向上的变化率,即方向导数的核心概念。

搜索方向与方向导数

在LCG算法中,每一步的搜索方向 (p_k) 被精心选择以确保它们之间相互共轭,这意味着它们在由系数矩阵 (A) 定义的度量下是正交的。虽然这些搜索方向并不直接由方向导数决定,但每一步的移动方向实际上是基于当前梯度(或等价地,基于当前残差 (r_k))和之前所有搜索方向的信息综合决定的。这个决策过程考虑了函数在这些共轭方向上的变化,与方向导数衡量函数沿特定方向的变化率的目的是一致的。

步长计算与方向导数

步长 ( \alpha_k ) 的计算反映了方向导数的影响。步长是通过最小化沿当前搜索方向的函数值来确定的,这实际上是在评估函数沿这个方向的局部变化。尽管LCG中步长的具体公式 (\alpha_k = \frac{r_k^T r_k}{p_k^T A p_k}) 是根据共轭方向和目标函数的二次性质导出的,但它的计算依赖于评估函数在这一方向上的变化率,这与方向导数的目的紧密相关。

梯度与方向导数

LCG中梯度的角色通过残差 (r_k) 体现,它是目标函数相对于当前点的负梯度。在每次迭代中,残差的更新反映了函数在新的解 (x_{k+1}) 处相对于原点的梯度变化。这种方式,尽管不是直接计算方向导数,实际上利用了方向导数的思想来指导搜索方向的更新和优化过程的进行。

总结

虽然线性共轭梯度法的实现细节中不直接出现方向导数的计算,但该方法的核心原理——如何在每一步选择最优的搜索方向以及如何确定沿该方向前进的最佳步长——与方向导数衡量函数沿特定方向的变化率的概念密切相关。通过这种策略,LCG能够高效地在多维空间中导航,快速逼近最优解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FHKHH/article/details/137379342

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签