第8章非线性方程和迭代.docx
《第8章非线性方程和迭代.docx》由会员分享,可在线阅读,更多相关《第8章非线性方程和迭代.docx(16页珍藏版)》请在冰点文库上搜索。
第8章非线性方程和迭代
第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元非线性方程组的一般形式为
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([120-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-10>>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:
解方程组
解写M函数eg8_1fun.m:
functiony=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.23260.0565
y=
1.0e-006*
0.09080.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.23260.0565
y=
1.0e-006*
0.09080.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可用于求数值解,但速度很慢,且有很大的局限性,不提倡使用。
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的交线
>>holdon;contour(x1,x2,g,[0,0]);holdoff;
>>gridon
可见在(0.25,0.05)附近有一个解。
8.4.2迭代法(牛顿法,切线法)
求f(x)=0的解,从几何上说xk+1为用f(x)在xk处的切线代替f(x)求得的解,故也称为切线法。
当初值x0与真解足够靠近,Newton迭代法敛。
单根快,重根慢。
迭代格式:
例6:
求如下方程的正根(要求精度=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]);gridon;
再使用zoom按纽使得图像可用鼠标点击放大,以提高局部观察精度。
唯一正根在1附近,取x0=1,迭代格式:
M脚本eg2_2.m
clear,e=1e-6;formatlong;
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养老保险
某保险公司的一份材料指出:
在每月交费200元至60岁开始领取养老金的约定下,男子若从25岁起投保,届时月领养老金2282元;若35岁起投保,届时月领养老金1056元;若45岁起投保,届时月领养老金420元。
我们来考察这三种情况所交保险非获得的利率。
设投保人在投保后第k个月所交保险费急利息的累计总额为Fk,易得数学模型:
其中p,q分别为60岁前所交月保险费和60岁起所领月养老金的数目(单位:
元),r是所交保险金获得的月利率,N,M分别是自投保起至停交保险费和停领养老金的时间(单位:
月)。
显然M依赖于投保人的寿命,我们取为该公司养老计划所在地男性寿命的统计平均值75岁。
以25岁起投保为例,则有
p=200,q=2282,N=420,M=600
而初值F0=0,易得
在前一式中取k=N而在后一式中取k=M并注意到FM=0,这样只要消去FN,就导出关于r的方程:
记x=1+r,且将已知数据代入,则只须求解方程
显然,1是上述方程的的解,但我们要求的根显然略大于1。
利用Newton法借助计算机编程或用数学软件能很方便的求出方程的实根,只是要注意选择合理的初始值,例如在MATLAB中,应用图解法求解:
>>close;
>>fplot('x^600-12.41*x^180+11.41',[0.8,1.2]);
>>axis([0.95,1.01,-0.5,0.5]);
>>gridon;zoomon
易得略大于1的根
x=1.00485,
所以
r=0.00485
对于35岁起和45岁起投保的情况,同样可得保险金所获得的月利率分别为0.00461和0.00413。
由于银行利率和投保人寿命等随机因素,保险费的计算是比较复杂的,但通过分析,我们对总体的利率还是可以得到大致的估计。
8.7习题
1、作出f(x)=xsin(1/x)在[-0.1,0.1]内的图象,可见在x=0附近f(x)=0有无穷多个解,并设法求出它的解。
2、(月还款额)作为房产公司的代理人,你要迅速准确回答用户各方面的问题。
现在有个客户看中了贵公司一套建筑面积为120m2,单价5200元/m2的房子。
他计划首付30%,其余70%用20年按揭贷款(年利率5.58%)。
请你提供下列信息:
房屋总价格、首付款额、月付还款额。
8.8补充:
混沌
线性迭代要么收敛于它的不动点,要么趋于无穷大;而不收敛的非线性迭代可能会趋于无穷大,也可能趋于一个周期解,但也可能在一个有限区域内杂乱无章地游荡,由确定性运动导致的貌似随机的现象称为混沌现象。
下面就Logistic迭代研究这一现象。
8.8.1昆虫数量的Logistic模型
xk表示第k代昆虫数量(1表示最大值)。
(8.7)式反映了下一代对上一代的既依赖又竞争的关系。
当上一代很少,繁殖能力不够,从而后代很少;当上一代很多,会吃掉很多食物,后代难以存活,从而后代很少。
a为资源系数,0≤a≤4保证了xk在区间(0,1)上封闭。
8.8.2平衡与稳定
称a为映射g(x)的平衡解或不动点,若g(x)=ax(1-x).解方程
x=ax(1-x)
得(8.7)式两个不动点0和1-1/a.若初始值恰好为不动点,迭代式(8.7)的值永不改变。
如果对于不动点x0附近的初始值,(8.7)收敛与此不动点,我们称这一不动点是稳定的。
当0x<1,在[0,1]内只有一个不动点0,且由|g(0)|=a<1,可知它是稳定的。
说明资源匮乏时,昆虫趋于死亡。
当a>1,不动点0不再稳定,而由|g′(1-1/a)|=|2-a|<1可知18.8.3周期解、分叉和混沌
称a为映射g(x)的周期k点,若gk(a)=a,而对任意j并称a,g(a),…,gk-1(a)为周期k轨道。
我们来求(8.7)的周期2轨道:
解x-a2x(1-x)(1-ax(1-x))=0
>>solve('x-a*a*x*(1-x)*(1-a*x*(1-x))=0')
ans=
[0]
[(-1+a)/a]
[(1/2*a+1/2+1/2*(a^2-2*a-3)^(1/2))/a]
[(1/2*a+1/2-1/2*(a^2-2*a-3)^(1/2))/a]
可见当a2-2a-3>0,即a>3,出现两个周期2解,可以证明3迭代开始发生倍周期分岔,从周期2,周期4,…,周期2n,…,直到a∞=3.569945672…。
说明a在[3,a∞]取值时昆虫数量呈现规律性振荡。
当a>a∞,(8.4)是的迭代序列几乎杂乱无章,即所谓混沌。
下列例子可形象地显示上述现象。
例:
(分叉图)对a在[0,4]的不同值,画出Logistic迭代的极限形态图。
如下M文件对于每一个a值,随机产生一个初值。
文件显示前20步迭代的变化。
最后用第180~200步迭代值表示极限形态,最后结果见图8-3。
%M脚本8_3.m
clear;close;a=0:
0.01:
4;
M=length(a);K=200;X=zeros(K,M);x(1,:
)=rand(1,M);
form=1:
M,fork=1:
K-1
x(k+1,m)=a(m)*x(k,m)*(1-x(k,m));
end,end
fork=1:
20,
plot(a,x(k,:
),'.');title(['k=',int2str(k)]);pause
(2);
end;
plot(a,x(180:
K,:
),'.');xlabel('a');ylabel('x');holdoff;
8.8.3混沌的特征
混沌是由确定性系统产生的貌似随机的现象。
一般认为混沌有如下几个特征
(i)初值的敏感性:
两个任意近的点出发的两条轨迹迟早会分得很开;
(ii)遍历性:
任意点出发的轨迹总会进入[0,1]内任意小的开区间。
例:
(初值的敏感性)如下M文件eg8_4.m验证了Logistic迭代序列的初值敏感性。
对于靠得很近的两个初值(相差仅1e-4),画出了两个序列50步内的误差图(图8-4)。
可见10步以后,差异增大,有时甚至接近1。
%M脚本eg8-4.m
clear;close;a=4;e=1e-4;
x=zeros(50,2);x(1,:
)=[0.4,0.4+e];
fori=2:
50
x(i,:
)=a*x(i-1,:
).*(1-x(i-1,:
));
end
y=x(:
1)-x(:
2);plot(y)
例:
(蛛网图)混沌的遍历性
昆虫数量的Logistic模型:
xk表示第k代昆虫的数量(1表示最大可能数量)。
平面迭代式:
蛛网图正好显示迭代计算x0,y0,x1,y1,…的一系列变化过程。
如下M函数eg8_5.m是一个通用的logistic蛛网图函数。
做出系数为a,初值为x0,从第m步到第n步的迭代过程:
functionf=eg8_5(a,x0,m,n)
x=0:
0.01:
1;y=a*x.*(1-x);
plot(x,x,'r',x,y,'r');holdon;
clearx,y;x
(1)=x0;y
(1)=a*x
(1)*(1-x
(1));x
(2)=y
(1);
ifm<2,plot([x
(1),x
(1),x
(2)],[0,y
(1),y
(1)]);end
fori=2:
n
y(i)=a*x(i)*(1-x(i));
x(i+1)=y(i);
ifi>m,plot([x(i),x(i),x(i+1)],[y(i-1),y(i),y(i)]);end
end
holdoff
在命令窗口执行
>>subplot(2,2,1);eg8_5(2.7,0.1,1,100);%收敛迭代
>>subplot(2,2,2);eg8_5(3.4,0.1,50,500);%周期2
>>subplot(2,2,3);eg8_5(3.5,0.1,50,500);%周期4
>>subplot(2,2,4);eg8_5(4,0.1,50,500);%混沌
可见混沌迭代对于初值为0.1,轨迹遍历了[0,1]区间(图8-5)
8.9补充习题
(Henon吸引子)混沌和分形的著名例子,迭代模型为
取初值x0=0,y0=0,进行3000次迭代,对于k>1000,在(xk,yx)处亮一点(注意不要连线)可得所谓Henon引力线图。