非线性方程组的牛顿迭代法的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非线性方程组的牛顿迭代法的应用
CENTRAL SOUTH UNIVERSITY
数值分析实验报告
非线性方程组的牛顿迭代法的应用
一、问题背景
非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化的,为得到更符合实际的解答,往往需要直接研究非线性科学,它是21世纪科学技术发展的重要支柱,非线性问题的数学模型有无限维的如微分方程,也有有限维的。道遥咏计算机进行科学计算都要转化为非线性的单个方程或方程组的求解。从线性到非线性是一个质的变化,方程的性质有本质不同,求解方法也有很大差别。本文主要介绍的是非线性方程组的牛顿迭代法的数值解法。
二、数学模型
对于方程()0=x f ,如果()x f 湿陷性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将线性方程()0=x f 逐步归结为某种线性方程来求解。
设已知方程()0=x f 有近似根k x (假定()0'≠k x f ),将函数()x f 在点k x 展开,有
()()()()k k k x x x f x f x f -+≈',
于是方程()0=x f 可近似地表示为
()()()0'=-+k k k x x x f x f
这是个线性方程,记其根为1+k x ,则1+k x 的计算公式
()
()
k k k k x f x f x x '
1-
=+, ,1,0=k 这就是牛顿法。
三、算法及流程
对于非线性方程
()()()⎥⎥⎥⎥
⎦⎤⎢⎢⎢⎢⎣⎡=n n n n x L x x f M x L x x f x L x x f f ,,,,,,,,,2
12
12211 在()k x 处按照多元函数的泰勒展开,并取线性项得到
()()()()()()()(
)()()()
()
()()()()
()()()()0,,,,,,,,,1212
1
11
'21
212211=⎥
⎥
⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎢⎣⎡---+⎥⎥⎥⎥⎥⎦
⎤
⎢⎢
⎢
⎢⎢⎣⎡+++k n k n k k k k k
k n k k n k n k k k n k k x x M x x
x x x f x L x x f M x L x x f x L x x f 其中
()⎥⎥⎥⎥⎥⎥⎦
⎤
⎢⎢⎢
⎢⎢⎢⎣⎡∂∂∂∂∂∂∂∂=n n n
n n x f L x f M M x f K x f x f 0
11
1
' 这样便得到迭代公式:
()()()()()()()
()[]
()()()()
()()()()()(
)()()()()
(
)
⎥⎥⎥⎥⎥⎦
⎤⎢⎢
⎢⎢⎢⎣⎡-⎥⎥⎥
⎥⎥⎦
⎤
⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡-+++k n k k k n
k n k k k k n k k k k k n k k k n k k x L x x f M x L x x f x L x x f x f x M x x x M x x ,,,,,,,,,212122111'2111211 这边是牛顿迭代法的算法过程,牛顿迭代法是工程上应用最多的一种非线性方程组的计算方程法。
MATLAB 编写的牛顿迭代法的基本程序如下: % 牛顿迭代法计算非线性方程 % 输入x0为迭代初值
% tol 为误差容限,如果缺省,则默认为10的-10次方 % data 用来存放计算的中间数据便于计算收敛情况分析 function [x,n,data]=new_ton(x0,tol) if nargin==1 tol=1e-10; end
x1=x0-f1(x0)/df1(x0); n=1; %迭代过程
while (norm(x1-x0)>tol) x0=x1;
x1=x0-f1(x0)/df1(x0); n=n+1;
% data 用来存放中间数据 data(:,n)=x1; end
x=x1;
以文件名new_ton.m 保存文件。
四、计算结果与分析
计算非线性方程组
4405.022
2
2=-+=+--y x y x x
取初值为⎥⎦
⎤
⎢⎣⎡=⎥⎦⎤⎢⎣⎡11y x 。
(1) 先编写方程函数与方程的Jacobi 矩阵函数。
% 牛顿迭代法的方程函数 function f=f1(x0) x=x0(1); y=x0(2);
f1=x^2-2*x-y+0.5; f2=x^2+4*y^2-4;
% 最后方程函数以行向量输出 f=[f1 f2];
以文件名f1.m 保存。
(2) 打开editor 编辑器输入以下语句并以文件名df1.m 保存。
function f=df1(x0) x=x0(1); y=x0(2); f=[2*x-2 -1 2*x 8*y];
(3) 编写主函数,并以文件名new_main.m 保存文件。
%牛顿迭代法的主函数 x0=[1 1];
[x,n,data]=new_ton(x0); disp('计算结果为') x
disp('迭代次数为') n
% 抽取data 中的第一个变量数据画出曲线 subplot(2,1,1)
plot(data(1,:)),title('x 在迭代中的变化')
% 抽取data 中的第二个变量数据画出其变化曲线 subplot(2,1,2)
plot(data(2,:)),title('y 在迭代中的变化')
(4) 运行程序,在MATLAB 命令窗口输入new_main ,以enter 键结束,输出为: 计算结果为 x =
-0.222214555069498
0.993808418603981