信息与计算科学系Matlab软件实习(论文)——非线性方程求根
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab软件实习论文
非线性方程求根
系别信息与计算科学
专业信息与计算科学
学号
姓名
指导教师
2008年8 月10 日
非线性方程求根
摘要
随着科学技术,生产力经济的发展,在科学与工程计算中存在着大量方程求根问题,例如贷款购房问题,工厂的最佳订货问题等都需要求解一类非线性方程的根,而本文就针对这些求根问题提出了解决方案,本文利用牛顿迭代法来结决方程的求根问题.首先根据实际问题列出数学模型,确定变量,给出各个条件及相关函数;然后对建立的模型进行具体分析和研究,选择合适的求解方法;编写函数的程序,用计算机求出方程的解,通过所求解分析具体情况.
关键词:非线性方程,牛顿迭代法,Matlab
目录
摘要 (I)
1 绪论 (1)
1.1非线性方程求根的背景 (1)
1.2非线性方程求根的目的: (1)
1.3非线性方程求根的内容: (1)
2 牛顿迭代法的实现及应用 (3)
2.1N EWTON迭代法具体例子的实现 (3)
2.2应用牛顿法解决购房贷款利率问题 (4)
2.3应用牛顿迭代法计算最佳订货量 (6)
结论 (8)
参考文献 (9)
1 绪 论
1.1 非线性方程求根的背景
随着社会的进步,科学技术的快速发展,各种工程等也如雨后春笋一般破土而出,对我们的日常生活产生了巨大的影响如天气预报、石油的勘探、地质灾害的预报等.牛顿迭代法是牛顿在17世纪提出的一种求解方程()0f x =.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.
而在各种科学和工程计算中往往要用到非线性方程组的求解,而牛顿法又是最基础的迭代法,在各种计算力学、控制工程等领域中发挥了不可代替的作用.而在数值计算中,非线性方程组的求解同样具有重要意义.
随着计算机技术的成熟和高速发展,对于非线性方程求根问题出现了大量的数学软件(如MATLAB,Matheamatica,Maple,SAS,SPSSD 等),计算机已经成为工程师应用数学解决工程问题的主要运算工具.同时,工程专业的学生对数学教育的需求重点正在从手工演绎和运算能力的培养转变到结合计算机软件进行建模、求解和论证能力的培养
[]
1.本文采用Matlab 作为软件平台,介绍了非线性方程求根的内容.
1.2 非线性方程求根的目的
为了推动科学的进步,能够很简便的完成各种工程计算,非线性方程组的求解方法以其独有的方法解决了各种计算,为今天以及将来的应用打下了坚实的基础.非线性方程组的求解正是为了这个目的才广泛被人们应用,此文也将给出非线性方程组求解的实际应用.
1.3 非线性方程求根的内容
解非线性方程()0f x =的主要算法是迭代法,如fsolve 、二分法、牛顿迭代法等.迭代法是从已知的解的初始近似值0 x (简称初值)开始,利用某种迭代格式
( )x g x =
求得一近似值序列121,,,,,
k k x x x x +逐步逼近于所求的解α(称为不动点).这一方
法是否成功取决于三个因素,首先 ( )x g x =应与()0f x =同解,其次初值0 x 的选取是否合适,一般要与真解靠近,最后也是最关键的是迭代序列是否收敛,为了保证收敛性,
在真解附近应有
'| ()|1g x <
否则迭代序列可能发散.
最基本的迭代法是Newton 迭代法,其迭代格式为
1'()
()
k k k k f x x x f x +=-
. 从几何上说1k x +为用 ()f x 在 k x 出切线代替 ()f x 求得的解,所以也称为切线法,当
初值0 x 与真值α足够靠近,Newton 迭代法收敛.对于单根,Newton 法收敛速度很快;对于重根,收敛较慢.
牛顿迭代法的大概算法为:
给定初始值0x ,ε为根的容许误差,η为()f x 的容许误差,N 为迭代次数的容许值.
① 如果'0()0f x =或迭代次数大于N ,则算法失败,结束;否则执行② ② 计算010'
0()
()
f x x x f x =-
③ 若10x x ε-<或1()f x η<,则输出1x ,程序结束;否则执行④ ④ 令01x x =,转向①
下面给出了Newton 迭代法的计算程序. function x=newton(fname,dfname,x0,e) %用途:Newton 迭代法解非线性方程f(x)=0
%格式:x=nanewton( fname,dfname,x0,e) x 返回数值解, %fname 和dfname 分别表示f(x)及其导函数 %f'(x),x0为迭代初值,e 精度要求(默认为1e-4) if nargin<4,e=1e-4; %精度默认为1e-4 end
x=x0;x0=x+2*e; %使while 成立,进入while 后x0得到赋值 while abs(x0-x)>e x0=x;
x=x0-feval(fname,x0)/feval(dfname,x0); end
2 牛顿迭代法的实现及应用
2.1 Newton 迭代法具体例子的实现
用Newton 迭代法解方程 32() -3-30 f x x x x =+= 在1.5附近的根.
解:当2x >时,()0, ()0f x f x >>,即()f x 恒正,所以根在[0,2].我们先用图解法找初值,在用Newton 法程序newton.m 求解.
fun= inline('x^3+x^2-3*x-3'); fplot(fun,[0,2]); grid on;
图 2.1 ()f x 的函数图像
由图可知方程有唯一正根在[1.6,1.8]之间,我们取初值1.5代入Newton 程序中. dfun=inline('3*x^2+2*x-3'); format long;
newton(fun,dfun,1.5,1e-4); format short; ans =
1.73205080756888
而用Matlab 本身的函数fzero 求出来的结果为: format long;
fzero(inline('x^3+x^2-3*x-3'),1.5); format short ans =
1.73205080756888
下面用牛顿迭代法解决一些实际问题 2.2 应用牛顿法解决购房贷款利率问题
住房是居民消费的一个主要部分,大部分人选择银行按揭贷款,然后在若干年内逐月分期还款.如果你借了10万,还款额一定超过10万.
设贷款总额为0x ,贷款期限为N 个月,采取逐月等额方式偿还本息.若k x 为第k 个月的欠款数,a 为月还款,r 为月利率.我们得到些列迭代关系式
1 (1) - ,k k x r x a +=+
那么
1(1)k k x r x a -=+-
22(1)(1)k r x r a a -=+-+-= 210(1)[1(1)(1)]k r x a r r -=+-+++
++
0(1)[(1)1]/k k r x a r r =+-+-, 由此可以得到月还款计算公式
(1)(1)1
N N
r x a r +=+-
下面是《新民晚报》2000年3月30日第七版上的一则房产广告:
不难算出,你向银行总共借了25.2万,30年内共要还51.96万,约为当初借款的两倍.这个案例中的贷款年利率是多少呢?
我们根据a =0.1436, 0x =25.2, 360N =,由以上a 的求解公式得到:
360360
++=.
25.2(1)-0.1436[(1)-1]0
r r r
我们令
360360
=++,
( ) 25.2(1)-0.1436[(1)-1]
f r r r r
则次问题就转化成非线性方程求根的问题,令
( )0,
f r=
求出r.
我们先用Newton函数求解.在Matlab中输入如下程序:
常识上,r应比当时活期存款月利率略高一些.我们用当时的活期存款月利率0.0198/2作为迭代初值,为了剔除0
r=这个没有意义的根,我们对( )
f r稍作变形:
clear;
fun=inline('25.2*(1+r)^360/0.1436-((1+r)^360-1)/r','r')
fun =
Inline function:
fun(r) = 25.2*(1+r)^360/0.1436-((1+r)^360-1)/r
dfun=inline('25.2*360*(1+r)^359/0.1436-(360*(1+r)^359*r-((1+r)^360-1))/(r^2)');
r=newton(fun,dfun,0.0198/2,1e-4);
R=12*r
然后求得结果:
R =
0.0553
于是得出年利率为 5.53%.
下面我们用Matlab中的fzero函数检验一下:
clear;
fun=inline('25.2*(1+r)^360-((1+r)^360-1)/r*0.1436','r')
fun =
Inline function:
fun(r) = 25.2*(1+r)^360-((1+r)^360-1)/r*0.1436
r=fzero(fun,0.0198/2);
R=12*r
R =
0.0553
结果相同,可见牛顿迭代法的正确性. 2.3 应用牛顿迭代法计算最佳订货量
汽车工厂为了保证生产的正常运作,配件供应一定要由保障.这些配件并不是在市场上随时可以买到的,所以往往要预先从配件供应商那里定货.由于配件供应商并不是生产单一产品,为你的定货必须要在流水线上作出调整,所以每次定货需要收取一定量的生产准备费.配件供应商的生产能力很大,开工后很快可以生产许多配件,但是你的汽车工厂并不是立即需要这么多,往往要在仓库里储存一段时间,为此你要付出储存费.如果订货量很小,必然需要频繁定货,造成生产准备费的增加;反之,若订货量很大,定货周期必然延长,生产准备费下降,但这样会造成储存费的增加.如何确定合适的订货量?
实践中,这是一个相当复杂的问题,因为市场波动的影响是多方面的.我们先作一些必要的假设将问题简化.
1) 汽车工厂对配件的日需量是恒定的,每日为r 件; 2) 所订配件按时一次性交货,生产准备费每次1 k 元; 3) 储存费按当日实际储存量计算,储存费每日每件2k 元; 4) 你的工厂不许缺货.
设一次定货x 件,由于工厂不允许缺货,而为了节省存储费,交货日期应定为恰好用完时,所以定货日期
/.T x r = (1)
由于日需求量是恒定的,可以计算出第t 天的存储量为
( )-, 0.q t x rt t T =<< (2)
由于第t 天的储存费为2k q( t ),一个周期的总储存费为
220
1
()()T
T
t t k q t k q t d -≈∑⎰. (3)
根据(1),(2),(3)得到一个周期总费用
2
12() 2x C x k k r
=+,
优化目标是使单位产品费用
12()()2k k x
C x f x x x r
=
=+, 达到最小.由'(
)0f x =即
122-02k k x r
+=, 可直接解得x =
这就是著名的经济批量定货公式. 当我们给出具体值时,非线性方程就可以求解了,由于具体的值不定,在此就不给出具体程序了.
结论
通过以上的论述我们可以知道计算机在现代生活中的应用已经如此普及,尤其是在数学计算当中,Matlab软件更是发挥了不可替代的作用.Matlab以其强大的功能,方便了当今数值计算,数学教程,及工程计算等众多领域.
本文在以Matlab软件为平台的基础上,给出了非线性方程的一般解法,非线性方程的求解有二分法,牛顿迭代法,简单牛顿法,牛顿下山法,弦截法,抛物线法等.二分法的优点是算法简单,且总是收敛的,但由于二分法的收敛速度太慢,故一般不单独将其用于求根,只用其为根求得一个较好的近似[]2
值.其他的求根方法各有优缺点,这里就不一一赘述.
本文主要介绍了牛顿迭代法及其在现实生活中的应用.牛顿迭代法为平方收敛,故其收敛速度较快,但对初值的选取需要谨慎,如果初值选取错误,则可能导致方程迭代发散,最终不能求解出正确解.在计算一些对精度要求特别苛刻时,最好给出较高的精度输入及输出,防止因为精度问题导致误差过大,最终影响结果.
牛顿迭代法可以应用于分形理论.分形理论是近二、三十年才发展起来的一门新的学科,其主要描述自然界和非线性系统中不光滑和不规则的几何形体.在地质、材料科学、物理学、计算机科学、艺术设计等方面有着十分广阔的应用前景. 利用牛顿迭代的数学原理和方法,实现牛顿迭代法的分形图形生成算法,将分形理论应用于计算机图形设计中,
形.
利用VC++6.0开发工具,实现了生成绚丽多彩的分形图[]3
非线性方程的求根问题在计算机发展的基础上,被广泛应用于各种工程计算,大大方便了工程师们的计算过程,在现代的工业发展中发挥了重要作用.牛顿迭代法简便易学,为今后的学子们提供了更多的学习内容.
参考文献
[1] 胡良剑,孙晓君.Matlab数学实验[M]. 高等教育出版社,2006.
[2] 李庆扬,王能超,易大义.数值分析(第4版)[M].清华大学出版社.施普林格出版社.2001.
[3] 吴运兵,李勇.《西安科技大学学报》2005年03期.。