第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,迭代格式:
213223kkkxkkkkxxxexxxeM脚本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 养老保险