matlab程序设计实践 联系客服

发布时间 : 星期日 文章matlab程序设计实践更新完毕开始阅读b895e48d79563c1ec5da71b0

1. 编程实现以下科学计算算法,并举一例应用之。(参考书籍《精通MATLAB科学计算》,王正林等著,电子工业出版社,2009年) “牛顿下山法求非线性方程组解” 解: 算法说明:

牛顿下山法的迭代公式为:

Xn+1= xn -ω(F(xn))-1F(xn)

ω的取值范围为0<ω≤1,为了保证收敛,还要要求ω的取值使得:

‖F(xn+1)‖<‖F(xn)‖

可以用逐次减半法来确定ω。为了减少计算量,还可以用差商来代替偏导数。在MATLAB中编程实现的非线性方程组的牛顿下山法的函数为:mulDNewton。

功能:用牛顿下山法求非线性方程组的一个解。 调用格式:[r,n]=mulDNewton(x0,eps)。 其中,x0为初始迭代向量; eps为迭代精度; r为求出的解向量; n为迭代步数。

牛顿下山法的MATLAB代码如下:

function [r,n]=mulDNewton(x0,eps)

%牛顿下山法求非线性方程组的一个解 %初始迭代向量:x0 %迭代精度:eps

%解向量:r %迭代步数:n

if nargin==1 eps=1.0e-4; end

r=x0-myf(x0)/dmyf(x0); n=1; tol=1; while tol>eps x0=r; ttol=1; w=1;

F1=norm(myf(x0));

while ttol>=0 %下面的循环是选取下山因子w的过程 r=x0-w*myf(x0)/dmyf(x0); %核心的迭代公式 ttol=norm(myf(r))-F1; w=w/2; end

tol=norm(r-x0); n=n+1;

if (n>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!'); return; end end

实例:牛顿下山法求解非线性方程组应用实例。采用牛顿下山法求下面方程组的一个根。

0.5sinx1+0.1cos(x1x2)- x1=0 0.5cosx1-0.1sinx2–x2 =0 其初始迭代值取(0,0)。

解:首先建立myf.m函数文件,输入以下内容:

function f=myf(x)

f(1)=0.5*sin(x(1))+0.1*cos(x(2)*x(1))-x(1);

f(2)=0.5*cos(x(1))-0.1*sin(x(2))-x(2); f=[f(1) f(2)];

再建立dmyf.m导数的雅克比矩阵,输入以下内容:

function df=dmyf(x)

df=[0.5*cos(x(1))-0.1*x(2)*sin(x(2)*x(1))-1 -0.1*x(1)*sin(x(2)*x(1)); -0.5*sin(x(1)) -0.1*cos(x(2))-1];

然后,在MATLAB命令窗口中输入:

>> [r,n]=mulDNewton([0,0])

输出计算结果为:

r =

0.1979 0.4470 n = 5

由计算结果可知,初始迭代值取(0,0)时,用5步迭代得到了方程组的一组解(0.1979,0.4470),牛顿下山法也是一种快速且有效的求解非线性方程组的方法。 流程图: ⑴ 源程序

开始 r=x0-myf(x0)/dmyf(x0); n=1;tol=1; 否

tol>eps 是

否 是 ttol>=0 x0=r;ttol=1; w=1;F1=norm(myf(x0));

否 r=x0-w*myf(x0)/dmyf(x0); ttol=norm(myf(r))-F1; w=w/2; tol=norm(r-x0); n=n+1; n>100000 是

disp('迭代步数太多,可能不收敛!'); 结束