牛顿法的简单介绍及Matlab实现

article/2025/9/14 21:16:06

目录

  • 牛顿法原理简介
  • 使用牛顿法求解一元方程
  • 使用牛顿法求解平面定位问题
  • 参考文献

牛顿法原理简介

牛顿法的原理是利用函数 f ( x ) f(x) f(x) 的泰勒级数的前几项来寻找方程 f ( x ) = 0 f(x)=0 f(x)=0 的根。

f ( x ) f(x) f(x) x 0 x_0 x0处的一阶泰勒展开
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) . f(x) = f(x_0) +f^\prime(x_0)(x-x_0). f(x)=f(x0)+f(x0)(xx0).
它的解
x 1 = x 0 − f ( x 0 ) f ′ ( x 0 ) . x_1=x_0-\frac{f(x_0)}{f^\prime(x_0)}. x1=x0f(x0)f(x0).
进而推出
x n + 1 = x n − f ( x n ) f ′ ( x n ) . x_{n+1}=x_n-\frac{f(x_n)}{f^\prime(x_n)}. xn+1=xnf(xn)f(xn).
由此迭代下去求出近似解。

参考百度百科牛顿迭代法.

使用牛顿法求解一元方程

使用牛顿法来解方程
2 = ( x − 1 ) 2 + 2. 2=(x-1)^2+2. 2=(x1)2+2.

使用牛顿法求解,先给一个初始值 x g u e s s = 10 x_{guess}=10 xguess=10,迭代结果不断逼近真实值。

在这里插入图片描述

迭代50次的结果与真实值,可以看出,牛顿法迭代逼近真实值的速度非常快,但并不是迭代次数越多越好。

在这里插入图片描述
代码如下

%牛顿法求一元二次方程的根 by wuyc
%y=(x-1)^2+2
%y'=2x-2clc; clear all;
xguess = 10;%猜的初始点
N=50;%迭代次数x1=xguess;
x=zeros(N,1);for i=1:N
deltax= -((x1-1)^2+2)/(2*x1-2);%delta x=-f'(xn)/f(xn)
x2 = x1+deltax; %xn+1=xn+delta x
x1=x2;
x(i)=x1;%x是每次迭代的结果
endfigure (1);t=[0:0.1:12];
y=(t-1).^2+2;yx=(x-1).^2+2;plot(t,y,'LineWidth',2);hold on; %画方程曲线plot([xguess,xguess],[0,(xguess-1).^2+2]);
plot([xguess,x(1)],[(xguess-1).^2+2,0]);for ii=1:2 
plot([x(ii),x(ii)],[0,yx(ii)]);
plot([x(ii),x(ii+1)],[yx(ii),0]);
end
set(gca,'LineWidth',2);
xlabel('x','FontSize',18);
ylabel('y','FontSize',18);figure (2);plot (x);
hold on
plot ([1,50],[1,1]);%真实值
set(gca,'LineWidth',2);
xlabel('迭代次数');
ylabel('迭代结果');
legend('牛顿法结果','真实值');

使用牛顿法求解平面定位问题

定位问题应用十分广泛,这里我们把问题简化为二维的矩形区域定位。
由四个台站TZ1、TZ2、TZ3、TZ4决定的矩形区域内的某一点mt ( m t r u e ) (m_{true}) (mtrue)发出信号,信号的速度是 v v v,那么根据四个台站接收到的时间的平方dobs( d o b s e r v a t i o n ) d_{observation}) dobservation),我们可以求出信号的位置。(台站只能记录信号出现的时刻,而不能记录到信号传播到台站所需的时间 t t t,这里我们又把问题简化了。)
这里插一句,在反演问题中,我们常把模型参数称为 m m m,数据称为 d d d,所谓反演问题,就是给定数据 d d d求解模型参数 m m m的过程
因为时间 t t t等于路程 s s s除以速度 v v v,有
t 2 = 1 v 2 × s 2 t^2=\frac{1}{v^2} \times s^2 t2=v21×s2
因此对应的反演问题为
[ d 1 d 2 d 3 d 4 ] = 1 v 2 [ ( x 1 2 − m t 1 2 ) + ( y 1 2 − m t 2 2 ) ( x 2 2 − m t 1 2 ) + ( y 2 2 − m t 2 2 ) ( x 3 2 − m t 1 2 ) + ( y 3 2 − m t 2 2 ) ( x 4 2 − m t 1 2 ) + ( y 4 2 − m t 2 2 ) ] \begin{bmatrix} d_1 \\ d_2 \\ d_3 \\ d_4 \\ \end{bmatrix} =\frac{1}{v^2} \begin{bmatrix} (x_1^2-mt_1^2)+(y_1^2-mt_2^2) \\ (x_2^2-mt_1^2)+(y_2^2-mt_2^2) \\ (x_3^2-mt_1^2)+(y_3^2-mt_2^2) \\ (x_4^2-mt_1^2)+(y_4^2-mt_2^2) \\ \end{bmatrix} d1d2d3d4 =v21 (x12mt12)+(y12mt22)(x22mt12)+(y22mt22)(x32mt12)+(y32mt22)(x42mt12)+(y42mt22)

这里的参数和问题显得有些混乱,主要目的是为了是反演问题简单。简单的说就是操场四个顶点有四个接收器,操场中间某一个点发出一个速度为 v v v信号,发出信号的同时接收器开始计时,因此接收器记录的时刻 t t t就是信号传输的时间。
我们要根据 t t t来求解信号的位置 m m m,为了使反演问题简单,我们把 t 2 t^2 t2看作数据 d d d.

代码运行结果如下,黑点是猜的初始点,绿点是真实点,红点是反演结果。

在这里插入图片描述

代码如下

% 根据到时反演信号位置clc;clear all;N=4;
v=100;%速度
%4个台站的位置
TZ1=[0,0];
TZ2=[400,0];
TZ3=[400,600];
TZ4=[0,600];
TZ=[TZ1;TZ2;TZ3;TZ4];
x=TZ(:,1);%台站位置横坐标
y=TZ(:,2);%台站位置纵坐标M=2;%反演的模型参数维度
mt = [100, 100]';%真实的信号位置dtrue = (1/v^2).*[(x-ones(N,1)*mt(1)).^2 + (y-ones(N,1)*mt(2)).^2];%真实的到时的平方
sd=0.4;
dobs = dtrue + random('Normal',0,sd,N,1);%真实值 加上均值是0,方差是sd,N行1列的随机数(随机误差) 生成观测值(到时平方)mg=[400,600]';%mguess 牛顿法需要一个初始点
dg = (1/v^2).*[(x-ones(N,1)*mg(1)).^2 + (y-ones(N,1)*mg(2)).^2];%dg是猜的点到时的平方
Eg = (dobs-dg)'*(dobs-dg);%生成401*601网格
L = 401;
J = 601
Dm = 1;
m1min=0;
m2min=0;
ma1 = m1min+Dm*[0:L-1]';
ma2 = m2min+Dm*[0:J-1]';
m1max = ma1(L);
m2max = ma2(J);% 计算误差
E = zeros(L,J);
for j = [1:L]
for k = [1:J]dpre = (1/v^2).*[(x-ones(N,1)*ma1(j)).^2 + (y-ones(N,1)*ma2(k)).^2];%预测值E(j,k) = (dobs-dpre)'*(dobs-dpre);%误差
end
endfigure(1);
%误差图
set(gca,'LineWidth',2);
hold on;
axis( [m2min, m2max, m1min, m1max] );
imagesc( [m2min, m2max], [m1min, m1max], E);
colorbar;
xlabel('m2','FontSize',18);
ylabel('m1','FontSize',18);
plot( mt(2), mt(1), 'go', 'LineWidth', 3 );%绿色点表示真实值
plot( mg(2), mg(1), 'ko', 'LineWidth', 3 );%黑色是猜的初始点% Newton's method, calculate derivatives
% y = 1/v^2*((x-m1)^2+(y-m2)^2)
% dy/dm1 = 2/v^2*(m1-x)
% dy/dm2 = 2/v^2*(m2-y)%Ehis用来储存每次迭代的误差 m1his、m2his用来储存每次迭代的结果
Niter=10;%迭代次数
Ehis=zeros(Niter+1,1);
m1his=zeros(Niter+1,1);
m2his=zeros(Niter+1,1);
Ehis(1)=Eg;
m1his(1)=mg(1);
m2his(1)=mg(2);G = zeros(N,M);%G矩阵的维度是N*M
for k = [1:Niter]dg = (1/v^2).*[(x-ones(N,1)*mg(1)).^2 + (y-ones(N,1)*mg(2)).^2];%dg是猜的点到时的平方dd = dobs-dg;%猜的值与观测值的差Eg=dd'*dd;Ehis(k+1)=Eg;G = zeros(N,M);%导数矩阵G(:,1) = 2/v^2.*(ones(N,1)*mg(1)-x);G(:,2) = 2/v^2.*(ones(N,1)*mg(2)-y);dm = ((G'*G)^-1)*G'*dd;%最小二乘求解 dm 相当于delta xmg = mg+dm;plot( mg(2), mg(1), 'wo', 'LineWidth', 2 );%画出迭代后的点m1his(k+1)=mg(1);m2his(k+1)=mg(2);plot( [m2his(1+k-1), m2his(1+k) ], [m1his(1+k-1), m1his(1+k) ], 'r', 'LineWidth', 2 );endplot( m2his(Niter+1), m1his(Niter+1), 'ro', 'LineWidth', 2 );%红色是迭代最终结果

此代码参考了William Menke 的Geophysical Data Analysis: Discrete Inverse Theory.

需要指出的是,虽然牛顿法原理简单收敛快,但这个过程并非总能实现,这里就涉及到全局极小和局部极小的问题了。幸运的是上述两个例子不存在这个问题,但在下图中,只有当初始值在红色区域内时,牛顿法才可以收敛到全局极小。

在这里插入图片描述

参考文献

链接:
1:牛顿迭代法.
2: Geophysical Data Analysis: Discrete Inverse Theory


http://chatgpt.dhexx.cn/article/QAQq3Kx5.shtml

相关文章

牛顿法介绍

目录 牛顿法介绍推导海森矩阵、泰勒公式、梯度下降法牛顿法特点 牛顿法介绍 首先牛顿法是求解函数值为0时的自变量取值的方法。如果你看不懂这句没关系,继续往下看就好。利用牛顿法求解目标函数的最小值其实是转化成求使目标函数的一阶导为0的参数值。这一转换的理…

牛顿法,障碍法,内点法

基于对数障碍函数法的内点法 牛顿法(Newton Method)对数障碍函数方法一个简单的例子python代码 牛顿法(Newton Method) 牛顿法与梯度下降法,最速下降法等优化算法类似,是基于梯度的方法。给定一个二次可微的…

牛顿法python 实现

有用请点赞,没用请差评。 欢迎分享本文,转载请保留出处。 牛顿法也是求解无约束最优化问题的常用方法,有收敛速度快的优点。牛顿法是迭代算法,每一步需要求解目标函数的海赛矩阵的逆矩阵。同时还有拟牛顿法、阻尼牛顿法、修正牛顿…

牛顿法及牛顿法求解优化问题

牛顿法及牛顿法求解优化问题 牛顿法 1. 由来和基本思想 牛顿法也叫牛顿迭代法和牛顿-拉夫森法 1. 牛顿迭代法:因为牛顿法的是通过迭代来实现的,每次运算都让结果比之前好一点。哪怕只好一点点,在很多次迭代之后也可以得到一个很好的结果甚…

最优化-牛顿法(Newton)

转:https://blog.csdn.net/qq_36330643/article/details/78003952 平时经常看到牛顿法怎样怎样,一直不得要领,今天下午查了一下维基百科,写写我的认识,很多地方是直观理解,并没有严谨的证明。在我看来&…

高斯牛顿法详解

一、高斯牛顿法发展历程 1、从上倒下为高斯牛顿法的前世今生已经未来的演化: 最速下降法(一阶梯度法) 牛顿法(二阶梯度法) 高斯牛顿法 列文伯格法 马夸尔特法 二、问题的引出 1、考虑如下优化目标函数:…

牛顿法,高斯-牛顿法

牛顿法(Newton’s method) 假如已知函数 f ( x ) f(x) f(x),想要求 f ( x ) 0 f(x)0 f(x)0 的解(或者叫根)。 牛顿法(Newton’s method)大致的思想是: (1&#xff0…

优化算法——牛顿法(Newton Method)

一、牛顿法概述 除了前面说的梯度下降法,牛顿法也是机器学习中用的比较多的一种优化算法。牛顿法的基本思想是利用迭代点 处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断…

牛顿法(Newton‘s method)求函数极小值

牛顿法一般指牛顿迭代法,也叫做牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),其最初的作用是用来求解函数的零点,但是也可以像梯度下降方法一样,以迭代的形式来求函数的极值。而事实上,牛顿…

牛顿法(Newton Method)的原理和实现步骤

牛顿法的法的目的 牛顿法不仅可以用来求解函数的极值问题,还可以用来求解方程的根,二者在本质上是一个问题,因为求解函数极值的思路是寻找导数为0的点,这就是求解方程。 牛顿法的法的原理 一元函数的情况 根据一元函数的泰勒展…

牛顿法

《牛顿法》   牛顿法(Newton method)和拟牛顿法(quasi Newton method)是求解无约束最优化问题的常用方法,有收敛速度快的优点。牛顿法是迭代算法,每一步都需求解目标函数的海塞矩阵(Hessian …

使用Andriod Device Moniter时用正则表达式筛选指定日志

有时候我们想过滤出指定的一个或者几个日志,又或者屏蔽掉一些无意义的日志,那么可以创建一个筛选,在此页面的by Log Tag填写如下格式的表达式: 过滤出指定tag的日志信息:^(?:tag1|tag2|tag3) 忽略指定tag的日志信息…

使用Memberane Moniter监控HTTP SOAP requests

Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求,如图所示。 但是个人认为仍然有几个问题: 1.不能真正的监控8080端口,我个人认为他的原理是类似于复制了一遍8080端口的内容&am…

linux( sudo bmon ) 流量监控工具----类似于 moniter interface

sudo bmon monitor bandwidth interface eth0 &#xff08;vyos 把 bmon 的linux 改为 了 moniter interface 了&#xff0c;底层还是调用的 bmon&#xff09; Linux:~$ sudo bmon -h bmon 3.5 Copyright (C) 2001-2013 by Thomas Graf <tgrafsuug.ch> Copyright (C) 2…

Android Device Moniter部分问题的解决办法:

一、Android Device Moniter中File explorer显示空白的问题不显示内容&#xff1a; 解决办法&#xff1a; 如上图所示 1.Tools->Android->Enable ADB Integration处于关闭状态。 2.重新打开Android Device Moniter。 3.若还处于空白状态&#xff0c;则极有可能是ja…

操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...

本文是《深入理解多线程系列文章》的第四篇。点击查看原文&#xff0c;阅读该系列所有文章。 在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter…

操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理

文章来源&#xff1a;深入理解多线程&#xff08;四&#xff09;—— Moniter的实现原理 原文作者&#xff1a;Hollis 来源平台&#xff1a;微信公众号 在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理 中介绍过关于Synchronize的实现原理&#xff0c;无…

【深入理解多线程】 Moniter的实现原理(四)

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

synchronized实现原理之---Moniter的实现原理

上一篇synchronized的实现原理提到了moniter&#xff0c;当时没有介绍它。 无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大…

dubbokeeper-moniter部署指南

moniter在整个dubbo架构中的角色: 使用的1.0.1版本: ## 1.0.1版本变动内容 dubbokeeper在1.0.1版本对监控数据存储模块抽离出来&#xff0c;做为单独的应用部署&#xff0c;而不是和1.0.0版本和前端展示集成在一个应用里面在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene…