Ⅰ 数学牛顿迭代法的例子
牛顿迭代公式编辑
设r是
的根,选取
作为r的初始近似值,过点
做曲线
的切线L,L的方程为
,求出L与x轴交点的横坐标
,称x1为r的一次近似值。过点
做曲线
的切线,并求该切线与x轴交点的横坐标
,称
为r的二次近似值。重复以上过程,得r的近似值序列,其中,
称为r的
次近似值,上式称为牛顿迭代公式。
用牛顿迭代法解非线性方程,是把非线性方程
线性化的一种近似方法。把
在点
的某邻域内展开成泰勒级数
,取其线性部分(即泰勒展开的前两项),并令其等于0,即
,以此作为非线性方程
的近似方程,若
,则其解为
, 这样,得到牛顿迭代法的一个迭代关系式:
。
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。[1]
军人在进攻时常采用交替掩护进攻的方式,若在数轴上的点表示A,B两人的位置,规定在前面的数大于后面的数,则是A>B,B>A交替出现。但现在假设军中有一个胆小鬼,同时大家又都很照顾他,每次冲锋都是让他跟在后面,每当前面的人占据一个新的位置,就把位置交给他,然后其他人再往前占领新的位置。也就是A始终在B的前面,A向前迈进,B跟上,A把自己的位置交给B(即执行B = A),然后A 再前进占领新的位置,B再跟上,直到占领所有的阵地,前进结束。像这种两个数一前一后逐步向某个位置逼近的方法称为迭代法。
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量
在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。
Ⅱ 数值计算方法上机题编程,,,用c语言编程序,用牛顿迭代法求18的倒数,精度为0.0005,求大神解
用牛顿迭代法求方程(2*(X-4)+3)X-6=0的根。
其迭代公式为X2=X1-F(X1)/F'(X1)
F'(X1)为对方程求导。本题中P'(X1)=(6*x1-8)*x1-3;
编译显示正确,但一运行就死机,我已经死了3次了。(一开始还以为电脑的问题)
#include<iostream.h>
#include<math.h>
void main(void)
{float x1,x2=100;
do
{x1=x2;
x2=(float)x1-(((2*x1-4)*x1+3)*x1-6)/((6*x1-8)*x1-3);
}while(fabs(x2-x1)>pow(10,-5));
cout<<x2;
}
Ⅲ 牛顿法解方程
如果寻找方程f(x)=0的零点t,假定f二阶可导,那么在t附近的点u有
0=f(t)=f(u)+f'(u)(t-u)+f''(x)(t-u)^2
略去二阶小量得
f(u)+f'(u)(t-u)=0
于是
t=u-f(u)/f'(u)
但是实际上因为f不一定是线性的,不可以忽略略去二阶小量的影响,所以上述过程就要迭代地进行
f(x_{n+1})=x_n-f(x_n)/f'(x_n)
并且这个迭代具有(局部)二次收敛性。
就写这些,教材上一般都会有的,你自己去看看。
Ⅳ 用牛顿法求下列方程,要求精度为10∧-5
这个没有解析解,只能用数值方法解。
令f(x)=X^5+X^4+X^3+X^2+X-1,则f(0)=-10,可见在(0,1)中有一解,取中点0.5,f(0.5)=-0.03,如果满足精度要求的话取x=0.5即可,否则继续二分。在(0.5,1)中有一解,取中点0.75,f(0.75)>0,继续去(0.5,0.75)的。
Ⅳ 用牛顿迭代法解方程X^5-2X^4+X-3=0,,结果保留两位小数
先根据函数f(x)判断根所在的区间
f(x)=x^5-2x^4+x-3
f'(x)=5x^4-8x^3+1
设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)
f'(x0)(x-x0),求出L与x轴交点的横坐标
x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,如果|f(x1)-0|小于指定的精度,那么继续过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标
x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程。得r的近似值序列{Xn},其中Xn
1=Xn-f(Xn)/f'(Xn),称为r的n
1次近似值。
Ⅵ 求解一道matlab题,选了数值分析,结果悲惨的发现自己不会用matlab
clear,clc
%% 求ln(x+sinx)=0的根。初值x0分别取0.1, 1,1.5, 2, 4进行计算
eq1 = @(x) log(x+sin(x));
x10 = [.1,1.5,2,4];
[x1,val1,flag1] = arrayfun(@(i)newton(eq1,x10(i)),1:length(x10));%未加速
[x1s,val1s,flag1s] = arrayfun(@(i)newton(eq1,x10(i),1),1:length(x10));%加速
%% 求sinx=0的根。初值x0分别取1,1.4,1.6, 1.8,3进行计算
eq2 = @(x) sin(x);
x20 = [1,1.4,1.6,1.8,3];
[x2,val2,flag2] = arrayfun(@(i)newton(eq2,x20(i)),1:length(x20));%未加速
[x2s,val2s,flag2s] = arrayfun(@(i)newton(eq2,x20(i),1),1:length(x20));%加速
以上程序要用到的newton函数如下,已经帮你集成了Steffensen加速法,具体用法函数里边写得很清楚,自己复制粘贴到m文件保存,m文件命名为newton.m,放在同一路径下方可使用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%牛顿法解方程
%[x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)
%x为方程的解;
%val为上述x带入eq的值;
%exitflag为1,求解成功;exitflag为0,达到最大迭代次数未收敛;
%exitflag为-1,步长达到最小未收敛;
%eq:函数句柄;
%x0:初值,默认为0到1随机;
%steff为加速参数,非负则加速。默认不加速;
%tol:容差,默认1e-10;
%mindx:最小迭代步长,默认1e-8;
%maxiter:最大迭代数目,默认1e4;
%例如 x = newton(@(x)log(x+sin(x)),1) 得到 x = 0.5110;
%14-Nov-2011 11:39:48,by JJBNJZ
if ~isa(eq,'function_handle')
error('我擦,要我说几遍你才知道要用函数句柄啊')
end
if nargin < 6
maxiter = 1e4;
if nargin < 5
mindx= 1e-8;
if nargin < 4
tol= 1e-10;
if nargin < 3
steff = -1;
if nargin < 2
warning('初值都没给,那从0到1之间随便选了啊')
x0 = rand;
end
end
end
end
end
x = x0;
val = eq(x0);
exitflag = 1;
eval(['df =@(x)' char(diff(eq(sym('x')))),';']);
if abs(val) <= tol
disp('你给的初值就是解,还算个毛啊,再见')
return
end
if steff <= 0
for iter = 1 : maxiter
val = eq(x);
dval = df(x);
xnew = x - val/dval;
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
end
if abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步长已经小于设定的最小步长(默认1e-8),',...
'而表达式的值没有小于给定容差(默认1e-10)'])
x = xnew;
return
end
x = xnew;
end
else
st=@(x)x - eq(x)/df(x);
for iter = 1 : maxiter
xnew = x - (st(x)-x)^2 / (st(st(x)) -2*st(x) + x);
val = eq(xnew);
if abs(val) < tol
x = xnew;
return
end
if abs(x-xnew) < mindx
exitflag = -1;
disp(['迭代步长已经小于设定的最小步长(默认1e-8),',...
'而表达式的值没有小于给定容差(默认1e-10)'])
x = xnew;
return
end
x = xnew;
end
end
disp('因达到最大迭代次数而终止,求解失败;解决方法,要么增大容差(精度下降),要么增大迭代次数(变慢)')
exitflag = 0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
问题分析什么的就自己写吧,无非是些:“解方程,初值是关键”,“自从我用了Steffensen的加速方法后,嘿,还别说,还真对得起咱这张脸,从前不收脸的也收脸了,收脸的速度的也快了”,“牛顿法求解方程得到的解和初值间的距离居然和初值的导数值有关,导数值越小的初值解出来离初值越远,怎么回事呢?自己看书吧”,“不管怎么说,steffensen还是收敛的比较好的,相比没有他,我们离初值更近了╮(╯_╰)╭”
Ⅶ 牛顿迭代法解高次方程详细过程谁能举一个简单易懂的例子啊
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。
Ⅷ 牛顿法解方程如何选初值,看一下这道题
hbj
Ⅸ 牛顿法求方程的根,牛顿法求x的3次方-2x-5=0在[0,3]的根
先粗略画一下f(x)=x的3次方-2x-5的图像,其与x轴的交点在x=2附近.
然后用牛顿法逼近,请看下面,点击放大:
Ⅹ 如何用牛顿迭代法求解方程
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。