非线性方程组的牛顿迭代法的应用

非线性方程组的牛顿迭代法的应用
非线性方程组的牛顿迭代法的应用

非线性方程组的牛顿迭代法的应用

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

迭代次数为

n =

16

为了获得更为直观的迭代收敛信息,MATLAB方便的画出了函数图形,如下所示,其中第一幅图形为x的迭代情况,第二幅为y的迭代情况。从图中可以看出,迭代的前几次有一些震荡情况,但是随着迭代次数的增加,收敛效果还是很明显的。

相关主题
相关文档
最新文档