任课教师:刘新儒,座位号: ,学号: ,姓名:
共 19 页,第 1 页
数值计算实践
实验报告
任课教师: 刘新儒
任课教师:刘新儒,座位号: ,学号: ,姓名:
共 19 页,第 1 页
1 实验一:非线性方程组的数值解法
在实际问题中,数量之间的关系通常是非线性的,而非线性问题较线性问题难解。
在精度要求不高的情形下,常用线性模型代替非线性模型。对于精度要求较高的问题,
线性模型已不能满足实际需要,必须直接求解原来的非线性问题。非线性方程的求解是
科学和工程领域中最常见的问题,而且非线性科学是科学研究的重要研究方向,非线性
方程组的解法是其中的重要研究内容。
非线性方程组的主要解法不动点迭代法,Newton 迭代法,拟 Newton 法,每种解法
都有自己的特点,在这里我们将介绍 Newton 迭代法的计算原理和算法实现,Newton 迭
代法的最大优点是在方程 f(x) = 0 的单根附近具有平方收敛,而且该法还可以用来求方
程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广
泛用于计算机编程中。
1.1 问题描述
多数方程不存在求根公式,因此将所求方程视作函数进行泰勒展开作为近似函数从
而将非线性方程线性化进行迭代求解。
Newton 迭代法的局部收敛性有定理
且 f(x)在包含解的一个区间上有二阶连续导数,若 Newton 迭代法收敛,则至少二
阶收敛并且
对于某些非线性方程,Newton 迭代法具有全局收敛性。
1.2 算法公式
Newton 迭代法的原理是通过泰勒展开的方式,将非线性方程线性
化
以方便求解。
首先是简单的一元非线性方程:设 f(x)为关于 x 的非线性函数,且在给定值 xk-1 附近连
续可导,对其进行泰勒展开,再通过 xk-1 对应函数值和导数求得增量,将增量叠加至
估值上,反复进行直至增量小于某个设定条件,即停止迭代。
对于多元非线性方程组,原理同样基于一元方程,只不过泰勒展开时需要对每个变
量求偏微分。设多元方程组为 f(x,y,z,u)=v,其中 x,y,z 为待测未知量,u 为输入量
(可能为一个也可能为多个),v 为输出量。将其进行泰勒展开,化为矩阵的形式得到:
,0)(,0)(
*'*
�� xfxf
� �
.
*'2
*)("
*)(
*
lim
2
1
xf
xf
xx
xx
k
k
k
�
�
�
�
��
xxx
xf
xf
xxx
xxxfxfxf
k
k
k
k
kkk
���
�����
����
�
�
�
�
���
1
1
1
1
111
)('
)(
0))((')()(
任课教师:刘新儒,座位号: ,学号: ,姓名:
共 19 页,第 2 页
对其求解即为
BXG
uzyxfv
uzyxfv
uzyxfv
B
z
y
x
z
y
x
XXX
z
uzyxf
y
uzyxf
x
uzyxf
z
uzyxf
y
uzyxf
x
uzyxf
z
uzyxf
y
uzyxf
x
uzyxf
G
nkkkn
kkk
kkk
k
k
k
k
nkkknkkknkkk
kkkkkkkkk
kkkkkkkkk
���
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
����
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
���
���
���
�
�
�
�
���������
���������
���������
),,,(
),,,(
),,,(
),,,(),,,(),,,(
),,,(),,,(),,,(
),,,(),,,(),,,(
111
21112
11111
1
1
1
1
111111111
211121112111
111111111111
�
���
XXXBGX k ������� �
�
1
1
任课教师:刘新儒,座位号: ,学号: ,姓名:
共 19 页,第 3 页
1.3 算法描述
任课教师:刘新儒,座位号: ,学号: ,姓名:
共 19 页,第 4 页
function varargout=newtons(fun,x0,ep,maxiter)
% NEWTONS 牛顿法求非线性方程组的根
if nargin<4
maxiter=500; % 默认最大迭代次数
end
if nargin<3
ep=1e-8; % 默认允许误差
end
if iscell(fun) % 若给出多元向量函数及其雅可比矩阵函数
Jfun=fun{2}; % 雅可比矩阵的匿名函数形式
fun=fun{1}; % 函数的匿名函数形式
else
if isa(fun,'function_handle') % 函数以匿名函数的形式给出
fun=sym(fun); % 将匿名函数转化为符号表达式
elseif ~isa(fun,'sym') % 若 fun 不是符号函数
error('fun 必须是符号表达式或匿名函数.') % 给出错误提示
end
vars=symvar(fun); % 提取 fun 的符号变量
J=jacobian(fun,vars); % 求多元向量函数 fun 的雅可比矩阵
fun=matlabFunction(fun,'vars',{vars}); % 将 fun 转换成成匿名函数的形式
Jfun=matlabFunction(J,'vars',{vars}); % 将 J 转换成成匿名函数的形式
end
iter=1; % 迭代次数
xs(iter,:)=x0; % 迭代序列初始值
exitflag=1; % 迭代发散标志,1 表示迭代收敛,0 表示迭代发散
while exitflag
fx0=fun(x0(:).'); % 计算 x0 处的函数值
Jx0=Jfun(x0(:).'); % 计算 x0 处的雅可比矩阵
if abs(det(Jx0))<=eps || iter>maxiter % 若雅克比矩阵奇异或迭代次数大于
最大迭代次数
exitflag=0; % 认为迭代发散,即根不可靠
break % 退出循环
end
x1=x0(:)-Jx0\fx0(:); % 牛顿迭代计算
xs(iter+1,:)=x1; % 将迭代值依次存入迭代序列中
if norm(x1(:)-x0(:))<=ep % 前后两次迭代值差的绝对值在允许的误差范围内
break % 跳出循环
end
x0=x1; % 更新迭代初始值
评论0