数值计算讨论组

欢迎来到数值计算讨论组。 本论坛旨在增强师生交流的时效性,主要讨论数值计算相关问题,包括初等数值分析、矩阵计算、非线性方程(组)数值解法、微分方程数值解法等方面的内容。


    [非]非线性方程组-Newton方法

    分享

    Admin
    Admin

    帖子数 : 46
    注册日期 : 10-05-13

    [非]非线性方程组-Newton方法

    帖子 由 Admin 于 周六 五月 15, 2010 4:55 pm

    求解非线性方程组的Newton方法与求解非线性方程的Newton切线法想法一致,都是使用“以直代曲”的形式近似方程左端的函数。非线性方程组相对非线性方程复杂之处在于其左端是向量值函数,所以在某点作Taylor展开的时候涉及的1阶导数为Jacobi矩阵(即偏导数矩阵),2阶导数为2阶张量,3阶导数为3阶张量...。而Newton法仅考虑用展开式1阶导数之前的项去近似原向量值函数,故Jacobi矩阵就成为了迭代格式中重要的组成部分。

    迭代格式x(k+1) = xk - F(xk)/F'(xk)
    对于非线性方程(其左端函数为一元数值函数),F'(xk)即为一实数,所以很容易处理迭代格式第2项F(xk)/F'(xk)的除法运算。
    非线性方程组中,F'(xk)为一个方阵,事实上,在处理F(xk)/F'(xk)时是在求解以F'(xk)为系数矩阵,F(xk)为右端向量的线性方程组。

    建议:复习多元向量值函数微分学,重新思考反函数存在性定理,隐函数存在性定理

    下面的程序与子程序可求解实验项目6中的第1个问题

    test6.m
    代码:

    clear;clc;
    err = 1;
    xk = [1,1]';% 赋初值
    temp = zeros(2,1); % 中间需要的临时存储
    k = 0; % 迭代步数

    while err > 0.0000001
        fk = [f1(xk(1),xk(2)),f2(xk(1),xk(2))]';
        % dfk 为xk处的Jacobi矩阵(即偏导数矩阵)
        dfk = [df1x(xk(1),xk(2)),df1y(xk(1),xk(2));df2x(xk(1),xk(2)),df2y(xk(1),xk(2))];
        temp = xk;
        % 此处迭代时处理以dfk为系数矩阵,以fk为右端项的线性方程组时使用了matlab自带的函数
        % 在具体问题中,一般根据Jacobi矩阵的特点在此处选取消元法或合适的迭代方法来求解
        xk = xk - dfk\fk;
        % 前一步迭代结果与后一步之间的差(这是一个向量),其大小用范数来衡量
        err = norm(temp - xk);
        k = k + 1;
    end
    % 输出结果
    xk(1)
    xk(2)
    f1(xk(1),xk(2))
    f2(xk(1),xk(2))
    k
    下面是一些用到的函数,若想使用,请自行分别处理
    代码:

    function dy = df2y(x,y)
    dy = x+1;

    function dx = df2x(x,y)
    dx = y - 3;

    function dy = df1y(x,y)
    dy = 2*y;

    function dx = df1x(x,y)
    dx = 2*x;

    function fval = f1(x,y)
    fval = x^2 + y^2 - 5;

    function fval = f2(x,y)
    fval = (x+1)*y - (3*x+1);

    运行结果
    x = [1,2]
    k = 5

      目前的日期/时间是周二 七月 17, 2018 7:48 am