非线性方程组的牛顿迭代法,最速下降法

数学软件实验任务书

实验一 非线性方程组的牛顿迭代法 1 实验原理

对于非线性方程

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

在x (k ) 处按照多元函数的泰勒展开,并取线性项得到 ⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫⎛x 1(k +1) -x 1(k ) ⎫ (k ) (k ) (k ) (k +1) (k ) ⎪(k ) ⎪f (x , x , , x ) x -x 1n n 2⎪ n ⎪+f '(x (k ) ) 2=0 ⎪ ⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪ x (k +1) -x (k ) ⎪⎪1n n n ⎭⎝n ⎭⎝n

其中

∂f 1⎫⎛∂f 1 ∂x ∂x n ⎪1 ⎪f '(x ) = ⎪ ⎪∂f ∂f n n ⎪ ∂x ∂x ⎪n ⎭⎝1

⎛x 1(k +1) ⎫⎛x 1(k ) ⎫⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫ (k +1) ⎪ (k ) ⎪ (k ) (k ) (k ) (k ) ⎪x x f (x , x , , x ) ⎪1n n 2⎪= 2⎪-[f '(x (k ) )]-1 n ⎪ ⎪ ⎪ x (k +1) ⎪⎪ x (k ) ⎪⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪1n n ⎝n ⎭⎝n ⎭⎝n ⎭2 数据来源

计算非线性方程组

⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡1⎤⎣1⎦

3 实验步骤

步骤一:编写牛顿迭代法的基本程序。

打开 Editor 编辑器,输入以下语句:

function [x,n,data]=new_ton(x0,tol)

if nargin==1

tol=1e-10;

end

x1=x0-f1(x0)/df1(x0);

MATLAB 241 数值分析与应用

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保存。

步骤二:编写方程函数与方程的Jacobi 矩阵函数。

(1)打开Editor 编辑器输入以下语句:

%牛顿迭代法的方程函数

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 编辑器输入以下语句:

%牛顿迭代法的jacobi 矩阵

function f=df1(x0);

x=x0(1);

y=x0(2);

f=[2*x-2 -1

2*x 8*y];

以文件名df1.m 保存。

步骤三:编写主函数。

打开 Editor 编辑器输入以下语句:

%牛顿迭代法的主函数

x0=[1 1];

[x,n,data]=new_ton(x0);

disp('计算结果为')

x

disp('迭代次数为')

n

%抽取data1中第一个变量数据画出曲线

subplot(2,1,1)

plot(data(1,:)),title('x 在迭代中的变化')

%抽取data 中的第二个变量数据画出其变化曲线

subplot(2,1,2)

plot(data(2,:)),title('y在迭代中的变化')

以文件名new_main.m保存。

4 实验结果

计算结果为

x =

-0.[**************] 0.[**************]

迭代次数为

n =

16

实验二 非线性方程组的最速下降法

1 实验原理

对于非线性方程组

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

h =f 12+f 22+ +f n 2

如果给定一个初值x 0,我们希望找到一条路线每一次x 迭代以后代价函数都会比原来小一些。

x k +1=x k +λp k

l 称为步长因子λ,p k 的不同,就构成了不同的下降算法。如果取 p (x ) =-gradh (x ), p k =p (x k )

就是所谓的最速下降法。最速下降法是大范围收敛的h 在某x k 出沿最速下降方向

p k (x ) =-gradh (x k )

下降的最快

2 数据来源

计算非线性方程组

⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡1⎤⎣1⎦

3 实验步骤

步骤一:打开 Editor 编辑器,输入以下语句:

syms x y

f1=x^2-2*x-y+0.5;

f2=x^2+4*y^2-4;

h=f1^2+f2^2

grad=[diff(h,x),diff(h,y)];

grad=simple(grad)

以文件名tidu_fuhao.m保存。

步骤二:编写梯度函数。

打开 Editor 编辑器,输入以下语句:

function f=f1_tidu(x0)

x=x0(1);

y=x0(2);

f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]';

步骤四:编写最速下降法的方法函数。

打开 Editor 编辑器,输入以下语句:

function [x,n,data]=zuisu(x0,tol)

if nargin==1

tol=1e-4;

end

x1=x0-0.001*f1_tidu(x0);

n=1;

%迭代过程

while (norm(x1-x0)>tol)& (n

x0=x1;

%0.001 为步长因子

x1=x0-0.001*f1_tidu(x0);

n=n+1;

%data 用来存放中间数据

data(:,n)=x1;

end

x=x1;

以文件名zuisu.m 保存。

步骤四:编写主函数。

打开 Editor 编辑器,输入以下语句:

4 实验结果

运行程序得到计算结果

x =

-0.21412 0.99395

迭代次数为

n =

426

实验三 非线性方程组的不动点迭代法

1 实验原理

对于非线性方程组

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

可以构造如下形式结构

⎧x 1=ϕ1(x 1, x 2, , x n ) ⎪x =ϕ(x , x , , x ) ⎪2112n ⎨ ⎪⎪⎩x n =ϕ1(x 1, x 2, , x n )

由上式可以构造如下迭代格式

⎧x 1(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪x 2 ⎨ ⎪

(k +1) ⎪=ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎩x n

000选择初值向量x (0)=ϕ1(x 1, x 2, , x n ,) 边可以逐步递推下去。这就是不动

点迭代法的基本原理。

记矩阵

⎛∂ϕ1 ∂x 1

ϕ'(x ) = ∂ϕn ∂x ⎝1

可以证明如果∂ϕ1⎫∂x n ⎪⎪ ⎪ ⎪∂ϕn ⎪ ∂x 1⎪⎭ ϕ'(x )

2 数据来源

计算非线性方程组

⎧x +x sin y =2.2378 ⎨3⎩x -y -cos y =0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡0⎤⎣0⎦

3 实验步骤

步骤一:编写不动点迭代方法。

打开 Editor 编辑器,输入以下语句:

%不动点迭代法计算非线形方程组

%08-6-26

%输入量x0 为初值,tol 为误差容限

%输出量r 为计算结果 n为迭代次数data1为计算的中间数据 function [r,n,data]=budong(x0,tol)

%如果输入量少于两个默认误差为10 的-3 次方

if nargin==1

tol=1.0e-3;

end

x1=budong_fun(x0);

n=1;

%迭代过程

while (norm(x1-x0)>tol)&(n

x0=x1;

x1=budong_fun(x0);

n=n+1;

%data1用于存放计算的中间数据这样可以分析运算收敛情况 data(:,n)=x1;

end

r=x1;

以文件名字budong.m 保存。

步骤二:编写要计算的函数文件。

打开 Editor 编辑器,输入以下语句:

function f=budong_fun(x)

f(1)=-sin(x(2))*x(1)+2.2378;

f(2)=x(1)^3-cos(x(2))£»

f=[f(1) f(2)];

以文件名budong_fun.m保存。

步骤三:编写主函数文件。

打开 Editor 编辑器,输入以下语句: x0=[0 0];

[r,n,data]=budong(x0);

disp('计算结果为')

r

disp('迭代次数为')

n

%抽取data1中第一个变量数据画出曲线 subplot(2,1,1)

plot(data(1,:))

%抽取data 中的第二个变量数据画出其变化曲线 subplot(2,1,2)

plot(data(2,:))

%以下为数据保存部分,注意查看当前工作空间 num=(1:n)';

a=[num data'];

save data1.txt a –ascii

以文件名budong_main.m保存。

4 实验结果

运行程序得到计算结果

计算结果为

r =

1.[1**********]494 1.[1**********]258

迭代次数为

n =

211

数学软件实验任务书

实验一 非线性方程组的牛顿迭代法 1 实验原理

对于非线性方程

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

在x (k ) 处按照多元函数的泰勒展开,并取线性项得到 ⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫⎛x 1(k +1) -x 1(k ) ⎫ (k ) (k ) (k ) (k +1) (k ) ⎪(k ) ⎪f (x , x , , x ) x -x 1n n 2⎪ n ⎪+f '(x (k ) ) 2=0 ⎪ ⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪ x (k +1) -x (k ) ⎪⎪1n n n ⎭⎝n ⎭⎝n

其中

∂f 1⎫⎛∂f 1 ∂x ∂x n ⎪1 ⎪f '(x ) = ⎪ ⎪∂f ∂f n n ⎪ ∂x ∂x ⎪n ⎭⎝1

⎛x 1(k +1) ⎫⎛x 1(k ) ⎫⎛f 1(k ) (x 1(k ) , x n (k ) , , x n (k ) ) ⎫ (k +1) ⎪ (k ) ⎪ (k ) (k ) (k ) (k ) ⎪x x f (x , x , , x ) ⎪1n n 2⎪= 2⎪-[f '(x (k ) )]-1 n ⎪ ⎪ ⎪ x (k +1) ⎪⎪ x (k ) ⎪⎪ f (k ) (x (k ) , x (k ) , , x (k ) ) ⎪⎪1n n ⎝n ⎭⎝n ⎭⎝n ⎭2 数据来源

计算非线性方程组

⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡1⎤⎣1⎦

3 实验步骤

步骤一:编写牛顿迭代法的基本程序。

打开 Editor 编辑器,输入以下语句:

function [x,n,data]=new_ton(x0,tol)

if nargin==1

tol=1e-10;

end

x1=x0-f1(x0)/df1(x0);

MATLAB 241 数值分析与应用

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保存。

步骤二:编写方程函数与方程的Jacobi 矩阵函数。

(1)打开Editor 编辑器输入以下语句:

%牛顿迭代法的方程函数

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 编辑器输入以下语句:

%牛顿迭代法的jacobi 矩阵

function f=df1(x0);

x=x0(1);

y=x0(2);

f=[2*x-2 -1

2*x 8*y];

以文件名df1.m 保存。

步骤三:编写主函数。

打开 Editor 编辑器输入以下语句:

%牛顿迭代法的主函数

x0=[1 1];

[x,n,data]=new_ton(x0);

disp('计算结果为')

x

disp('迭代次数为')

n

%抽取data1中第一个变量数据画出曲线

subplot(2,1,1)

plot(data(1,:)),title('x 在迭代中的变化')

%抽取data 中的第二个变量数据画出其变化曲线

subplot(2,1,2)

plot(data(2,:)),title('y在迭代中的变化')

以文件名new_main.m保存。

4 实验结果

计算结果为

x =

-0.[**************] 0.[**************]

迭代次数为

n =

16

实验二 非线性方程组的最速下降法

1 实验原理

对于非线性方程组

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

h =f 12+f 22+ +f n 2

如果给定一个初值x 0,我们希望找到一条路线每一次x 迭代以后代价函数都会比原来小一些。

x k +1=x k +λp k

l 称为步长因子λ,p k 的不同,就构成了不同的下降算法。如果取 p (x ) =-gradh (x ), p k =p (x k )

就是所谓的最速下降法。最速下降法是大范围收敛的h 在某x k 出沿最速下降方向

p k (x ) =-gradh (x k )

下降的最快

2 数据来源

计算非线性方程组

⎧x 2-2x -y +0.5=0 ⎨22⎩x +4y -4=0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡1⎤⎣1⎦

3 实验步骤

步骤一:打开 Editor 编辑器,输入以下语句:

syms x y

f1=x^2-2*x-y+0.5;

f2=x^2+4*y^2-4;

h=f1^2+f2^2

grad=[diff(h,x),diff(h,y)];

grad=simple(grad)

以文件名tidu_fuhao.m保存。

步骤二:编写梯度函数。

打开 Editor 编辑器,输入以下语句:

function f=f1_tidu(x0)

x=x0(1);

y=x0(2);

f= [8*x^3-12*x^2-4*x*y-6*x+4*y-2+16*x*y^2 -2*x^2+4*x-62*y-1+16*y*x^2+64*y^3]';

步骤四:编写最速下降法的方法函数。

打开 Editor 编辑器,输入以下语句:

function [x,n,data]=zuisu(x0,tol)

if nargin==1

tol=1e-4;

end

x1=x0-0.001*f1_tidu(x0);

n=1;

%迭代过程

while (norm(x1-x0)>tol)& (n

x0=x1;

%0.001 为步长因子

x1=x0-0.001*f1_tidu(x0);

n=n+1;

%data 用来存放中间数据

data(:,n)=x1;

end

x=x1;

以文件名zuisu.m 保存。

步骤四:编写主函数。

打开 Editor 编辑器,输入以下语句:

4 实验结果

运行程序得到计算结果

x =

-0.21412 0.99395

迭代次数为

n =

426

实验三 非线性方程组的不动点迭代法

1 实验原理

对于非线性方程组

⎛f 1(x 1, x 2, , x n ) ⎫ ⎪f (x , x , , x ) 212n ⎪ f = ⎪ ⎪f (x , x , , x ) n ⎭⎝n 12

可以构造如下形式结构

⎧x 1=ϕ1(x 1, x 2, , x n ) ⎪x =ϕ(x , x , , x ) ⎪2112n ⎨ ⎪⎪⎩x n =ϕ1(x 1, x 2, , x n )

由上式可以构造如下迭代格式

⎧x 1(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪(k +1) =ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎪x 2 ⎨ ⎪

(k +1) ⎪=ϕ1(x 1(k ) , x 2(k ) , , x n (k ) ) ⎩x n

000选择初值向量x (0)=ϕ1(x 1, x 2, , x n ,) 边可以逐步递推下去。这就是不动

点迭代法的基本原理。

记矩阵

⎛∂ϕ1 ∂x 1

ϕ'(x ) = ∂ϕn ∂x ⎝1

可以证明如果∂ϕ1⎫∂x n ⎪⎪ ⎪ ⎪∂ϕn ⎪ ∂x 1⎪⎭ ϕ'(x )

2 数据来源

计算非线性方程组

⎧x +x sin y =2.2378 ⎨3⎩x -y -cos y =0

初值取⎢⎥=⎢⎥ ⎡x ⎤

⎣y ⎦⎡0⎤⎣0⎦

3 实验步骤

步骤一:编写不动点迭代方法。

打开 Editor 编辑器,输入以下语句:

%不动点迭代法计算非线形方程组

%08-6-26

%输入量x0 为初值,tol 为误差容限

%输出量r 为计算结果 n为迭代次数data1为计算的中间数据 function [r,n,data]=budong(x0,tol)

%如果输入量少于两个默认误差为10 的-3 次方

if nargin==1

tol=1.0e-3;

end

x1=budong_fun(x0);

n=1;

%迭代过程

while (norm(x1-x0)>tol)&(n

x0=x1;

x1=budong_fun(x0);

n=n+1;

%data1用于存放计算的中间数据这样可以分析运算收敛情况 data(:,n)=x1;

end

r=x1;

以文件名字budong.m 保存。

步骤二:编写要计算的函数文件。

打开 Editor 编辑器,输入以下语句:

function f=budong_fun(x)

f(1)=-sin(x(2))*x(1)+2.2378;

f(2)=x(1)^3-cos(x(2))£»

f=[f(1) f(2)];

以文件名budong_fun.m保存。

步骤三:编写主函数文件。

打开 Editor 编辑器,输入以下语句: x0=[0 0];

[r,n,data]=budong(x0);

disp('计算结果为')

r

disp('迭代次数为')

n

%抽取data1中第一个变量数据画出曲线 subplot(2,1,1)

plot(data(1,:))

%抽取data 中的第二个变量数据画出其变化曲线 subplot(2,1,2)

plot(data(2,:))

%以下为数据保存部分,注意查看当前工作空间 num=(1:n)';

a=[num data'];

save data1.txt a –ascii

以文件名budong_main.m保存。

4 实验结果

运行程序得到计算结果

计算结果为

r =

1.[1**********]494 1.[1**********]258

迭代次数为

n =

211


相关文章

  • 基于三点二次插值的方程求根算法
  • 第7卷第12期2008年12月 南阳师范学院学报 JoumalofNanyang Nomal Unive鹉ity V01.7No.12Dec.2008 基于三点二次插值的方程求根算法 张天良 (南京信息工程大学数理学院.江苏南京210044 ...查看


  • 牛顿迭代法及其应用
  • 编号 毕 业 设 计(论文) 题目 Newton Raphson 算法及其应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 108010101 学生姓名 侯杰 学号[1**********] 指导教师 职称 时 间 目 录 摘 ...查看


  • 线性方程组的最速下降法与共轭梯度法
  • 西京学院数学软件实验任务书 [实验课题] 线性方程组的最速下降法与共轭梯度法 [实验目的] 学习和掌握线性方程组的最速下降法与共轭梯度法的求解方法. [实验内容] 1.问题重述 对于线性方程组AX=b,即: ⎧a11x1+a12x2+ +a ...查看


  • 优化理论和最优控制
  • 分 数: ___________ 任课教师签字:___________ 华北电力大学研究生结课作业 学 年 学 期:2013-2014第二学期 课 程 名 称:优化理论和最优控制 学 生 姓 名: 学 号: 提 交 时 间:2014年4月2 ...查看


  • 差分方程模型
  • 第7章 差分方程模型 在第三章中我们看到,动态连续模型用微分方程方法建立,与此相应,当时间变化离散后,可以用差分方程方法建立.有些实际问题既可建立连续模型,又可建立离散模型.本章将主要讨论差分方程模型. 7.1市场经济中的蛛网模型 在自由贸 ...查看


  • 超越方程解法
  • 超越方程解法 超越方程解法 当一元方程ƒ(z )=0的左端函数ƒ(z ) 不是z 的多项式时,称之为超越方程.这类方程除极少数情形(如简单的三角方程)外,只能近似地数值求解,此种数值解法的研究至今仍是计算数学的主要课题.超越方程的数值解法也 ...查看


  • 求解复杂非线性方程组的新方法
  • ComputerEngineeringandApplications计算机工程与应用 . 2009,45(28)41 求解复杂非线性方程组的新方法 阳万安,曾安平 YANGWan-an,ZENGAn-ping 宜宾学院计算机与信息科学系,四 ...查看


  • 共轭梯度法实验报告
  • 数值代数实验报告 一.实验名称:用共轭梯度法解线性方程组. 二.实验目的:进一步熟悉理解掌握共轭梯度法解法思路,提高matlab编程能力. 三.实验要求:已知线性方程矩阵,应用共轭梯度法在相关软件编程求解线性方程组的解. 四.实验原理: 1 ...查看


  • 用matlab解线性方程组
  • 用matlab解线性方程组 2008-04-12 17:00 一.高斯消去法 1.顺序高斯消去法 直接编写命令文件 a=[] d=[]' [n,n]=size(a); c=n+1 a(:,c)=d; for k=1:n-1 a(k+1:n, ...查看


热门内容