求解非线性方程组的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
运行结果
x = [1,2]
k = 5
迭代格式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