第8章 非线性方程和迭代

  • 格式:doc
  • 大小:163.50 KB
  • 文档页数:12

1 第8章 非线性方程和迭代

本章涉及非线性方程的求解、函数的迭代以及有关作图。通过对MATLAB关于非线性方程(组)求解的命令的学习及应用,进而说明计算机与数学结合的重要性。补充知识,以Logistic模型为例介绍由非线性方程迭代所产生的混沌现象。

8.1 引例 贷款的利率

现实生活中,许多人会向银行贷款,(比如为了买房或者买车),然后,在若干年内分期还款。这必须按一定的贷款利率付给银行利息。假如,某人向银行贷款25万,30年内每月按1435元还款。那么,这例贷款的年利率是多少?

有人可能会这样计算

年利率=(30×12×0.1435-25)/30/25=3.55%

但这是错误的,因为你并不是等到30年后一次还款。

数学模型 设xk为第 k个月的欠款数,a为月还款数,r为月利率,R=12r为年利率。我们得到如下迭代关系式

xk+1=(1+r)xk – a (8.1)

那么

xk=(1+r)xk-1-a=(1+r)2xk-2-(1+r)a-a=…

=(1+r)kx0-a[1+(1+r)+…+(1+r)k-1]

=(1+r)kx0-a[(1+r)k-1]/r

根据a=0 .1435, x0=25, x360=0得到

25(1+r)360 – 0.1435[(1+r)360-1]/r (8.2)

这是一个关于 r 的高次代数方程。从中解出r,年利率R=12r。

8.2 非线性方程(组)简介

若方程是未知量x的多项式,称为高次代数方程;若方程包含x的超越函数,称为超越方程。

一元非线性方程的一般形式为

f(x)=0 (8.3)

若对于数a有f(a)=0,则称 a 为方程(8.3)的解或根,也称为函数f(x)的零点。方程的根可能是实数也可能是复数。相应地称为实根和复根。如果对于数a有f(a)=0,f (a)0,则a称为单根,如果有k>1,f(a)=f (a)=…=f(k-1)(a)=0 但f(k)(a)≠0,称为k重根,对于高次代数方程,其根的个数与其次数相同(包括重数),至于超越方程,其解可能是一个或几个甚至无穷多,也可能无解。

常见的求解问题有如下两重要求:一种是要求定出在给定范围内的某个解,而解的粗略位置事先从问题的物理背景或应用(作图等)其他方法得知;另一种是定出方程的全部解,或者给定区域内的所有解,而解的个数未知。除少数特殊的方程可以利用公式直接求解(如4次以下代数方程),一般都没有解析求解方法,只能靠数值方法求得近似解。n元非线性方程组的一般 2 形式为

fi(x1,x2,…,xn)=0, i=1,…,m (8.4)

非线性方程组的解极少能用解析法求得。常用的数值方法是Newton法、拟Newton法和最优化方法等。

8.3 解方程和方程组的MATLAB命令

roots 求多项式的根

fsolve 方程(组)数值解

fzero 求一元函数实根

solve 符号方程(组)求解

8.3.1多项式的根

roots(p) 多项式p的所有复根。

例1: 求x3+2x2-5的根

解 >> roots([1 2 0 -5])ans = -1.6209 + 1.1826i

-1.6209 - 1.1826i

1.2419

8.3.2 一元函数零点

fzero(f,x,tol)

f为字符串表示的函数或M函数名;x为标量时,作为迭代初值;x为向量[a,b]时,返回f在[a,b]中的一个零点,这时要求x在a,b两点异号;tol为精度(缺损值1e-4)。

例2:求y=sin(x)-0.1x的零点。解:由于-1

>> fzero('sin(x)-0.1*x',6)

ans =

7.0682

>> fzero('sin(x)-0.1*x',[2,6])

ans =

3.8523

注:fzero 只能求零点附近变号的根,试用fzero求解(x-1)2=0,看看发生了什么?

8.3.3 非线性方程组求解

fsolve 用法与fzero类似。

例3:解方程组

0814110142121211xxxexxx 3 解 写M函数eg8_1fun.m:

function y=fun(x)

y(1)=4*x(1)-x(2)+exp(x(1))/10-1;

y(2)=-x(1)+4*x(2)+x(1)^2/8;

然后在命令窗口用

>> [x,y,f]=fsolve('eg8_1fun',[0,0])

x =

0.2326 0.0565

y =

1.0e-006 *

0.0908 0.1798

f =

1

注:x返回解向量,y返回误差向量,f>0则解收敛。

或直接用

>> [x,y,f]=fsolve('[4*x(1)-x(2)+exp(x(1))/10-1,-x(1)+4*x(2)+x(1).^2/8]',[0,0])

x =

0.2326 0.0565

y =

1.0e-006 *

0.0908 0.1798

f =

1

注意:fsolve采用最小二乘优化法,稳定性比fzero好,但fsolve 可能陷入局部极小。试用fsolve解x2+x+1=0,看会发生什么?不要完全相信计算机。

8.3.4解析求解solve

例4:解 ax2+bx+c=0

>> solve('a*x^2+b*x+c','x')

ans =

[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))]

[ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]

>> [x,y]=solve('4*x-y+exp(x)/10=1','-x+4*y+y^2/8=0','x,y')

x =

.23297580773115396971569236570313

y =

.58138324907069742242891748561961e-1

注意所得的解与fsolve的不同。

注意:虽然solve可用于求数值解,但速度很慢,且有很大的局限性,不提倡使用。

4 8.4 数值解法:图解法和迭代法

8.4.1 图解法

利用作图的方法可以求一元或二元方程(组)的低精度解,或者寻找迭代初值。

例5:解方程

sinx=0.1x (8.5)

解 显然,解在[-10,10]内,函数y=sinx-0.1x的零点就是(8.5) 的解,

出y=sinx-0.1x在[-10,10]范围内的图象(图8.1),可看出根的大致位置。作图可使用如下MATLAB语句:

close;fplot('sin(x)-0.1*x',[-10,10]);grid;

可知±8.5,±7,±3,0 附近各有一解。

(在figure窗口用matlab的zoom命令演示)

例6:利用作图法解例3的方程组。

>> clear;close;

>> x1a=-1:0.01:1;x2a=-1:0.01:1;[x1,x2]=meshgrid(x1a,x2a);

>> f=4*x1-x2+exp(x1)/10-1;g=-x1+4*x2+x1.^2/8;

>> contour(x1,x2,f,[0,0]);%曲面与平面x2=0的交线

>> hold on;contour(x1,x2,g,[0,0]);hold off;

>> grid on 5 可见在(0.25,0.05)附近有一个解。

8.4.2 迭代法(牛顿法,切线法)

求f(x)=0的解,从几何上说xk+1为用f(x)在xk处的切线代替f(x)求得的解,故也称为切线法。当初值x0与真解足够靠近,Newton迭代法敛。单根快,重根慢。迭代格式:

例6: 求如下方程的正根(要求精度e=10-6)

x2-3x+ex=2

解 令f(x)=x2-3x+ex-2, f(0)=-1<0, x>2, f(x)>0 , f´(x)>0, 即f(x)单调上升,根在[0,2]内,先用图解法找初值。

>> fplot('x^2-3*x+exp(x)-2',[0,2]);grid on; )6.8()(')(1kkkkxfxfxx 6 再使用zoom按纽使得图像可用鼠标点击放大,以提高局部观察精度。

唯一正根在1附近,取x0=1,迭代格式:

213223kkkxkkkkxxxexxxeM脚本eg2_2.m

clear,e=1e-6;format long;

x1=1

x0=x1+2*2;%使while成立

while(abs(x0-x1)>e)

x0=x1,x1=x0-(x0^2-3*x0+exp(x0)-2)/(2*x0-3+exp(x0))

end;format

得x1 = 1.44623868596643

8.5贷款利率问题求解

考虑方程(8.2). 常识上,r应比当时活期存款月利率略高。用活期存款月利率0.0198/12作为迭代初值,用fzero求解。

(使用Matlab)

>> r=fzero('25.2*(1+x)^360-((1+x)^360-1)/x*0.1436',0.0198/12), R=12*r

r =

0.0046

R =

0.0553

8.6 养老保险