求解非线性方程组的牛顿迭代法的具体思想及方法并附有matlab 源程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解非线性方程组的牛顿迭代法的具体思想及方法并附有matlab 源程序相关的知识,希望对你有一定的参考价值。

参考技术A function x=Newton(fname,dfname,x0,e,N)
%用途:Newton迭代法解非线性方程f(x)=0
%fname和dfname分别表示f(x)及其导函数的M函数句柄或内嵌函数表达式
%x0为迭代初值,e为精度(默认值1e-7)
%x为返回数值解,并显示计算过程,设置迭代次数上限N以防发散(默认500次)
%实例:解方程ln(x+sin(x))=0
%在matlab窗口中输入:Newton(@(x)log(x+sin(x)),@(x)(1+cos(x))/(x+sin(x)),0.1)
if nargin<5,N=500;end
if nargin<4,e=1e-7;end
x=x0;x0=x+2*e;k=0;
fprintf('x[%d]=%12.9f\n',k,x)
while abs(x0-x)>e&&k<N
k=k+1;
x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);
fprintf('x[%d]=%12.9f\n',k,x)
end
if k==N
fprintf('已达到迭代次数上限');
end

上面的程序段只是一个思路,你可以自己再理解一下,其实matlab中有一个内部函数fsolve,就可以直接求解非线性方程组的,很简单好用的!

祝你解决问题!
参考技术B # include <stdio.h>
# include <math.h>

int main ()

double x1,x0,f,f1;
x1 = 1.5;
do

x0 = x1;
f = ((2 * 0 - 4) * x0 + 3)* x0 - 6;
f1 = (6 * x0 - 8) * x0 + 3;
x1 = x0 - f / f1;
while (fabs(x1 - x0) >= 1e-5);
printf ("%5.2f\n",x1);
return 0;

方程组线性化方法和牛顿迭代法基础

方程组线性化方法和牛顿迭代法基础

非线性方程组线性化和牛顿迭代法

  • 参考书籍:GPS原理与接收机设计 谢钢

非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系、对数关系、指数关系、三角函数等等。求解此类方程往往很难得到精确解,经常需要求近似解问题。

一元函数的线性化和牛顿迭代

设f(x)是一个非线性方程组,现在需要求解f(x)=0的根,并且以及有一个近似解xk-1,f(x)连续可导,那么将f(x)在xk-1这一点进行泰勒展开可以得到:
f ( x ) ≈ f ( x k − 1 ) + f ′ ( x k − 1 ) ⋅ ( x − x k − 1 ) f(x) \\approx f\\left(x_k-1\\right)+f^\\prime\\left(x_k-1\\right) \\cdot\\left(x-x_k-1\\right) f(x)f(xk1)+f(xk1)(xxk1)

此时求解的方程组就变为了: f ( x k − 1 ) + f ′ ( x k − 1 ) ⋅ ( x − x k − 1 ) = 0 f\\left(x_k-1\\right)+f^\\prime\\left(x_k-1\\right) \\cdot\\left(x-x_k-1\\right) = 0 f(xk1)+f(xk1)(xxk1)=0 此时方程变成了一个线性方程。如果一阶导数不等于0,那么可以使用牛顿迭代法进行更新新的近似解xk
x k = x k − 1 − f ( x k − 1 ) f ′ ( x k − 1 ) x_k=x_k-1-\\fracf\\left(x_k-1\\right)f^\\prime\\left(x_k-1\\right) xk=xk1f(xk1)f(xk1)

将泰勒公式一阶方程近似为一个线性方程式,可得到一个迭代公式(注意敛散性和导数不为0的条件)

经过以上分析,就算是没有初始近似解,也可以从0开始迭代,经过多次迭代可以回到真实解附近。

matlab代码示例:

%% MATLAB 牛顿迭代(一元)
syms a                %定义函数变量
f(a) = a^(3/2) + 2^a - 24;  %方程式(其待求解为4)
df(a) = diff(f(a),a);       %对其一阶求导
%% 牛顿迭代
x(1) = 0;         %迭代赋初值
dt(1) = 1;        %迭代增量初值,任意值大于迭代停止条件即可
ii = 1; 
while abs(dt(ii))>1e-3   %牛顿迭代,当增量小于1E-3停止迭代
    ii = ii + 1;
    dt(ii) = - f(x(ii-1))/df(x(ii-1));
    x(ii) = x(ii-1) + dt(ii);
end
%% 绘图
figure
plot(x)
xlabel('\\fontname宋体\\fontsize10迭代次数');
ylabel('\\fontname宋体\\fontsize10迭代值');
grid on

rtklib中牛顿迭代法的使用

求偏近点角Ek

求取卫星信号发射时刻偏近点角𝐸𝑘,首先令𝐸𝑘=𝑀𝑘作为迭代初值,当 ∣ E k − E k − 1 ∣ < 1 0 − 12 ∣ \\left|E_k-E_k-1\\right|<10^-12 \\mid EkEk1<1012时结束迭代,e从卫星星历中获取, 迭代公式: E k = M k + e ∗ s i n E k − 1 E_k = M_k + e * sinE_k-1 Ek=Mk+esinEk1

/*所在函数 eph2pos*/
/*sqrt(mu/(eph->A*eph->A*eph->A)是课本中的式3.36的n,用于计算卫星的平均角速度
 * M=eph->M0+(sqrt(mu/(eph->A*eph->A*eph->A))+eph->deln)*tk;是用来计算平近点角M,
 * 如式3.53所示 Mk=M0+nTk,也可以认为是式3-37表示的 Mk=n(t-t0)*/
  M=eph->M0+(sqrt(mu/(eph->A*eph->A*eph->A))+eph->deln)*tk;
/*计算偏近点角 E时采用的是牛顿法来进行迭代求解
*  Ek=E; E-=(E-eph->e*sin(E)-M)/(1.0-eph->e*cos(E)); 这一行代码就是牛顿迭代法
*  如课本中的式5.5 Xk = Xk-1 - (f/f')
*  Ek=E;:更新本次迭代并保存
*  E-=(E-eph->e*sin(E)-M)/(1.0-eph->e*cos(E)->e*cos(E))]
*  这里的迭代起始值是M,但是并不影响,因为经过大概三次迭代之后很快就会到达真实值附近,
*  默认是30次迭代,误差在1E-13以内
*/ 
for (n=0,E=M,Ek=0.0;fabs(E-Ek)>RTOL_KEPLER&&n<MAX_ITER_KEPLER;n++) 
    Ek=E; E-=(E-eph->e*sin(E)-M)/(1.0-eph->e*cos(E));

多元非线性方程组的牛顿迭代法求解方法

参考连接:https://zhuanlan.zhihu.com/p/337392826

/最后更新时间:2022年11月4日10:28:49/

以上是关于求解非线性方程组的牛顿迭代法的具体思想及方法并附有matlab 源程序的主要内容,如果未能解决你的问题,请参考以下文章

牛顿迭代法求解非线性方程组 matlab

跪求用牛顿迭代法解三元三次非线性方程组,急!! 在线等。。。MATLAB求解要代码

牛顿迭代法的牛顿迭代公式

如何用牛顿迭代法求解方程

C++ 数学与算法系列之牛顿二分迭代法求解非线性方程

急!!如何用matlab语言编写一个用牛顿迭代法求解经过有限差分法处理过的非线性方程组