牛顿-雅可比迭代法是一种用于求解非线性方程和非线性方程组的数值方法。这种方法结合了牛顿法和雅可比矩阵的概念,旨在通过迭代方式逼近方程的根。牛顿法依赖于泰勒展开和线性近似来快速找到方程根的近似值,而雅可比矩阵则提供了一种处理多变量函数的方式,使得该方法可以广泛应用于求解多维非线性问题。

1 牛顿法原理

牛顿法基于以下原理:假设你想找到一个函数 f ( x ) = 0 f(x)=0 f(x)=0的根,可以从一个初始猜测值 x 0 x_0 x0 开始,然后使用函数在该点的泰勒展开的线性部分来找到一个更好的近似。数学上,这可以表示为: x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f^{\prime}(x_n)} xn+1=xnf(xn)f(xn)
其中 x n + 1 x_{n+1} xn+1是下一个近似根, x n x_n xn 是当前的近似根, f ′ ( x n ) f^{\prime}(x_n) f(xn)是函数在 x n x_n xn点的导数。

2 雅可比矩阵

雅可比矩阵是一个非常重要的概念,用于描述多变量函数相对于其各自变量的一阶偏导数。它是多维非线性系统分析中的核心工具,因为它提供了一种量化函数输出相对于输入变化率的方法。在牛顿-雅可比迭代法中,雅可比矩阵的作用是帮助我们理解多变量函数在某一点附近的行为,从而指导我们如何调整变量以逼近方程的根。
对于由 n n n 个方程构成的非线性方程组,其中每个方程都是 m m m 个变量的函数,雅可比矩阵是一个 n × m n×m n×m 矩阵,其元素由下式给出: J i j = ∂ f i ∂ x j J_{ij}=\frac{\partial f_i}{\partial x_j} Jij=xjfi
这里, f i f_i fi 是方程组中的第 i i i 个方程, x j x_j xj是变量向量中的第 j j j 个变量。雅可比矩阵提供了方程组输出相对于输入的局部线性近似。
在使用牛顿-雅可比迭代法求解非线性方程组时,在多变量的情况下, f ( x ) f(x) f(x) 变成了一个向量函数 f ( x ) = 0 f(x)=0 f(x)=0,其中 x x x 是变量的向量。这时, f ′ ( x n ) f'(x_n ) f(xn) 由雅可比矩阵 J ( x ) J(x) J(x) 替代,它是函数 f ( x ) f(x) f(x) 相对于 x x x 的所有偏导数的矩阵。牛顿法的多变量形式可以写成: x n + 1 = x n − J − 1 ( x n ) f ( x n ) x_{n+1} =x_n-J^{-1}(x_n)f(x_n) xn+1=xnJ1(xn)f(xn)
这里, J − 1 ( x n ) J^{-1}(x_n) J1(xn)是雅可比矩阵在 x n x_n xn 点的逆矩阵。

3 使用牛顿雅可比迭代法求解非线性方程组的步骤

1、选择初始猜测:选择一个接近方程根的初始猜测值 x 0 x_0 x0
2、计算雅可比矩阵和函数值:在当前猜测值 x n x_n xn 处计算雅可比矩阵 J ( x n ) J(x_n) J(xn) 和函数值 f ( x n ) f(x_n) f(xn)
3、求解线性方程组:求解线性方程组 J ( x n ) Δ x = − f ( x n ) J(x_n)Δx=-f(x_n) J(xn)Δx=f(xn) 以找到 Δ x Δx Δx
4、更新猜测值:更新猜测值 x n + 1 = x n + Δ x x_{n+1} =x_n +Δx xn+1=xn+Δx
5、检查收敛性:如果 x n + 1 x_{n+1} xn+1 足够接近于方程的根,或者 f ( x n + 1 ) f(x_{n+1}) f(xn+1) 足够小,那么停止迭代。否则,回到步骤2继续迭代。

4 牛顿雅可比迭代法和牛顿法的区别

牛顿法通常用于单一方程的根求解,利用函数的导数来迭代寻找根的近似值。
牛顿-雅可比迭代法扩展了牛顿法的应用范围,允许求解多变量的非线性方程组。它使用雅可比矩阵代替导数,适用于多维问题。

5 实例及MATLAB代码

针对下列非线性方程组: f 1 ( x , y ) = x 2 + y 2 − 4 = 0 f 2 ( x , y ) = e x + y − 1 = 0 \begin{aligned}f_1(x,y)&=x^2+y^2-4=0\\f_2(x,y)&=e^x+y-1=0\end{aligned} f1(x,y)f2(x,y)=x2+y24=0=ex+y1=0
下面是一个使用牛顿-雅可比迭代法求解该方程组的MATLAB代码示例:

% 初始猜测
x0 = [1; 0]; % 初始猜测值
tol = 1e-6; % 容忍误差
max_iter = 100; % 最大迭代次数

for iter = 1:max_iter
    [f, J] = func_and_jacobian(x0);
        
    % 检查收敛性
    if norm(f) < tol
        fprintf('Solution found after %d iterations.\n', iter);
        fprintf('Solution is: x = %f, y = %f\n', x0(1), x0(2));
        return;
    end
        
    % 牛顿-雅可比迭代步骤
    delta = -J\f;
    x0 = x0 + delta;
end
    
fprintf('Max iterations reached without convergence.\n');

function [f, J] = func_and_jacobian(x)
    % 方程组
    f(1, 1) = x(1)^2 + x(2)^2 - 4;
    f(2, 1) = exp(x(1)) + x(2) - 1;
    
    % 雅可比矩阵
    J = [2*x(1), 2*x(2); exp(x(1)), 1];
end

此代码定义了一个脚本实现了牛顿-雅可比迭代法来求解特定的非线性方程组。通过函数 func_and_jacobian 同时计算方程组的值和雅可比矩阵。初始猜测设置为 x 0 = [ 0 , 0 ] T x_0=[0,0]^T x0=[0,0]T,通过迭代更新解直到满足容忍误差或达到最大迭代次数。
代码运行结果为:
在这里插入图片描述
可得在经历8次迭代后找到方程组的一组根为: x = 1.004169 , y = − 1.729637 x=1.004169,y=-1.729637 x=1.004169,y=1.729637

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐