牛顿迭代法求根的matlab实现
本篇是在课程学习中自己编程实现的牛顿迭代法计算非线性方程或者超越方程近似根的算法,写一下,后边便于复习和期末课程设计引用。
牛顿迭代法本质上是一种特殊的不动点迭代,只不过它的迭代函数的构造比较特殊,所以就代码上来看,和不动点迭代法求根的是完全一样的,所不同的是,其输入的不动点迭代函数满足f_x=x-f(x)/f’(x).下面是简要证明
- 源码
% 牛顿迭代法求根的matlab算法
function [X_k,x0,counter]=newton(a,err,f_x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%输入参数a为迭代初值 %
%输入参数err为误差精度 %
%输入参数f_x为牛顿迭代函数,即满足f_x=x-f(x)/f'(x)的函数 %
%输出参数X_k为迭代序列 %
%输出参数x0为满足精度要求的根 %
%输出参数counter为迭代的次数 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
counter=0;%计数器初始化
X_k=(0);%序列初始化
while(sign(f_x(a))==0)%如果a的函数值为0停止迭代输出x0为a的值,迭代次数为0
x0=a;
X_k(1)=a;
counter=0;
return;
end
while(sign(f_x(a))~=0&&abs(f_x(a)-a)>=err)%a的函数不为零且不满足误差精度进行迭代
X_k(counter+1)=a;%将a赋给序列第一个值
a=f_x(a);%迭代
counter=counter+1;%每迭代一次计数器加一
X_k(counter+1)=a;%将当前值赋值给序列
x0=a;%最终输出最后一个迭代值作为根
newton(a,err,f_x);%不满足精度时重复调用迭代函数本身进行迭代
end
end
- 引用实例:计算
迭代初值取为x0=0.5,误差不超过0.00001 - 构造牛顿迭代函数
方程xe^x-1=0可以等价为x-exp^(-x)=0,即f(x)=x-exp^(-x),因此其导数f’(x)=1+exp^(-x),因此,牛顿迭代函数为f_x=x-(x-exp^(-x))/(1+exp^(-x)),又x=exp^(-x),又可以写为f_x=x-(x-exp^(-x))/(1+x),这么写的目的是为了减小误差。 - 调用函数
f=@(x)x-(x-exp(-x))./(1+x)
[X_k,x0,counter]=newton(0.5,0.00001,f) - 结果
转载请注明出处!
转载:https://blog.csdn.net/myDearing_lulu/article/details/108936819
查看评论