黑马程序员技术交流社区

标题: 利用牛顿迭代法求解非线性方程组 [打印本页]

作者: 万马奔腾    时间: 2014-6-8 11:33
标题: 利用牛顿迭代法求解非线性方程组
利用牛顿迭代法求解非线性方程组
最近一个哥们,是用牛顿迭代法求解一个四变量方程组的最优解问题,从网上找了代码去改进,但是总会有点不如意的地方,迭代的次数过多,但是却没有提高精度,真是令人揪心!
       经分析,发现是这个方程组中存在很多局部的极值点,是用牛顿迭代法不能不免进入局部极值的问题,更程序的初始值有关!
       发现自己好久没有是用Matlab了,顺便从网上查了查代码,自己来修改一下!
先普及一下牛顿迭代法:(来自百度百科)
       牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。
        设r是f(x)=0的根。选取x0作为r的初始近似值,过点(x0,f(x0))做曲线的切线,求出该切线与x轴的交点,并求出该点的横坐标,称作x1是r的一次近似。如此就可以推导出牛顿迭代公式。
         已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
        在网上查了一些代码,都是能指定某几个函数进行求导的,而且要是改变函数的个数,却又要对原始程序大动干戈。真的是揪心。
        找到了http://hi.baidu.com/aillieo/item/f4d2c4de85af6be954347f25 这个程序,貌似在Matlab上不能很好的运行,对于数据的返回值为空没有做处理,后来又找了一个网易朋友的博客,将他的代码拿过来跑跑,还可以,但是对于不同的函数方程组,以及变量个数就不同了,真的是揪心,这个就是程序设计和编码的问题了!
       自己就拿来改了改,可以支持多方程组和多变量了!下面附上我的代码!求大家指导!

[python] view plaincopyprint?



[python] view plaincopyprint?



[python] view plaincopyprint?




作者: 喜爱    时间: 2014-6-8 20:04
没有看懂啊!!!
作者: 茂子    时间: 2014-6-8 20:12
这个,秒懂?!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2