您好!想请教一下Matlab 拟牛顿求根法

您好!想请教一下Matlab 拟牛顿求根法,第1张

拟牛顿法是求解线性(非线性)方程(组)的一种数值分析方法。拟牛顿法的求解方法与割线法相类似,其目的是减少由于计算导数而带来的纤首大量的计算量,构造的秩为1的昌竖贺迭代法。其迭代格式为

实现主要耐派代码

n = 1

while (norm(x - x0) >tol) &&(n <1000)

x0 = x

x = x0 - A \ funm(x0)

p = x - x0

q = funm(x) - funm(x0)

A = A + (q - A*p)*p'^rm(p)^2

n = n + 1

end

根据二阶泰勒展开,用一阶和二阶倒数确定参数迭代步长和方向

设初始向量 ,它在 处的泰勒展开如下:

,当 时

注:矩阵求导公式:

 晌猛

对上式相对于 求导:

因此可以得到 处的迭代方程:

对应 这种形式,步长 ,方向

从上述公式可以知道,牛顿法的每一次迭代都需要计算二阶海塞矩阵,当特征和数据非常多时,时间和空间开销都会比较大。

拟牛顿法只是一种方法的统称,即用一个近似矩阵B去替代逆海塞矩阵 ,然后在每一轮迭代中更新B

怎样找到逆海塞矩阵的替代矩阵?

对上一节中的①式做一下变换:

令 , ,上式变成:

再令凳谨指 , ,得到:

也就是说,第k步迭代的海塞矩阵可以通过第k步的迭代步长和一阶导数差值拟合。

BFGS( Broyden–Fletcher–Goldfarb–Shanno ):

https://blog.csdn.net/itplus/article/details/21897443

用 表示 的近似, 表示 的枣配近似:

那么 的迭代公式为

设 ②,再根据①式得到的 :

交换 和 的位置:

令: ,以及

解出:

再带入到②中:

L-BFGS:

BFGS中B矩阵的每次更新都需要nXn的空间开销,L-BFGS不会直接存储B,而是①只存取需要用到的n个向量,并且②只保存了最近的m次迭代的结果,所以L-BFGS算法又做了近似。

采用第一个。

首先你的两个代码的计算缺清过程和方法以及步骤是一致的。

只不过第二个将k==N放在循环内部判断是没有必要指银的。

放唯扮宴在while外面,可以节省点计算量。

如果你要求结果精度高一些的话,你调用:

x=nanewton1(fname,dfname,x0,e,N)

时e要小一些,比如说取1e-6这样。

另外:

if nargin<4

e=1e-4 %这个值也下调几个量级,作为缺省的精度。

end


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12484005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存