计算方法实验报告(Newton迭代法)
数学数学实验Newton迭代法

数学实验题目4 Newton 迭代法摘要0x 为初始猜测,则由递推关系产生逼近解*x 的迭代序列{}k x ,这个递推公式就是Newton 法。
当0x 距*x 较近时,{}k x 很快收敛于*x 。
但当0x 选择不当时,会导致{}k x 发散。
故我们事先规定迭代的最多次数。
若超过这个次数,还不收敛,则停止迭代另选初值。
前言利用牛顿迭代法求的根程序设计流程问题1(1 程序运行如下:r = NewtSolveOne('fun1_1',pi/4,1e-6,1e-4,10) r = 0.7391(2 程序运行如下:r = NewtSolveOne('fun1_2',0.6,1e-6,1e-4,10) r = 0.5885问题2(1 程序运行如下:否 是否是是定义()f x输入012,,,x N εε开 始1k =01()f x ε<0100()()f x x x f x =-'102||x x ε-<k N =输出迭代失败标志输出1x输出奇 异标志结 束01x x = 1k k =+ 否r = NewtSolveOne('fun2_1',0.5,1e-6,1e-4,10)r = 0.5671(2)程序运行如下:r = NewtSolveOne('fun2_2',0.5,1e-6,1e-4,20)r = 0.5669问题3(1)程序运行如下:①p = LegendreIter(2)p = 1.0000 0 -0.3333p = LegendreIter(3)p = 1.0000 0 -0.6000 0p = LegendreIter(4)p =1.0000 0 -0.8571 0 0.0857p = LegendreIter(5)p = 1.0000 0 -1.1111 0 0.2381 0②p = LegendreIter(6)p = 1.0000 0 -1.3636 0 0.4545 0 -0.0216r = roots(p)'r= -0.932469514203150 -0.6612 0.9324695142031530.6612 -0.238619186083197 0.238619186083197用二分法求根为:r = BinSolve('LegendreP6',-1,1,1e-6)r = -0.932470204878826 -0.661212531887755 -0.2386200573979590.2386 0.661192602040816 0.932467713647959(2)程序运行如下:①p = ChebyshevIter(2)p = 1.0000 0 -0.5000p = ChebyshevIter(3)p = 1.0000 0 -0.7500 0p = ChebyshevIter(4)p = 1.0000 0 -1.0000 0 0.1250p = ChebyshevIter(5)p = 1.0000 0 -1.2500 0 0.3125 0②p = ChebyshevIter(6)p = 1.0000 0 -1.5000 0 0.5625 0 -0.0313r = roots(p)'r = -0.965925826289067 -0.7548 0.9659258262890680.7547 -0.258819045102521 0.258819045102521用二分法求根为:r = BinSolve('ChebyshevT6',-1,1,1e-6)r = -0.965929926658163 -0.7755 -0.2588289221938780.2588 0.7020 0.965924944196429与下列代码结果基本一致,只是元素顺序稍有不同:j = 0:5;x = cos((2*j+1)*pi/2/(5+1))x =0.965925826289068 0.7548 0.258819045102521-0.258819045102521 -0.7547 -0.965925826289068(3)程序运行如下:①p = LaguerreIter(2)p = 1 -4 2p = LaguerreIter(3)p = 1 -9 18 -6p = LaguerreIter(4)p = 1 -16 72 -96 24p = LaguerreIter(5)p =1.0000 -25.0000 200.0000 -600.0000 600.0000 -120.000②p = LaguerreIter(5)p =1.0000 -25.0000 200.0000 -600.0000 600.0000 -120.000r = roots(p)'r =12.6432 7.8891 3.5964257710407111.4520 0.263560319718141用二分法求根为:r = BinSolve('LaguerreL5',0,13,1e-6)r = 0.263560314567722 1.4789 3.5964257656311507.0720 12.6490(4)程序运行如下:①p = HermiteIter(2)p = 1.0000 0 -0.5000p = HermiteIter(3)p = 1.0000 0 -1.5000 0p = HermiteIter(4)p = 1.0000 0 -3.0000 0 0.7500p = HermiteIter(5)p = 1.0000 0 -5.0000 0 3.7500 0②p = HermiteIter(6)p = 1.0000 0 -7.5000 0 11.2500 0 -1.8750r = roots(p)'r =-2.3587 2.3588 -1.3358490740136961.335849074013698 -0.4367 0.4366用二分法求根为:r = BinSolve('HermiteH6',-3,3,1e-6)r =-2.3516 -1.335849********* -0.43630.4366 1.335848983453244 2.3504所用到的函数function r = NewtSolveOne(fun, x0, ftol, dftol, maxit)% NewtSolveOne 用Newton法解方程f(x)=0在x0附近的一个根%% Synopsis: r = NewtSolveOne(fun, x0)% r = NewtSolveOne(fun, x0, ftol, dftol)%% Input: fun = (string) 需要求根的函数及其导数% x0 = 猜测根,Newton法迭代初始值% ftol = (optional)误差,默认为5e-9% dftol = (optional)导数容忍最小值,小于它表明Newton法失败,默认为5e-9 % maxit = (optional)迭代次数,默认为25%% Output: r = 在寻根区间内的根或奇点if nargin < 3ftol = 5e-9;endif nargin < 4dftol = 5e-9;endif nargin < 5maxit = 25;endx = x0; %设置初始迭代位置为x0k = 0; %初始化迭代次数为0while k <= maxitk = k + 1;[f,dfdx] = feval(fun,x); %fun返回f(x)和f'(x)的值if abs(dfdx) < dftol %如果导数小于dftol,Newton法失败,返回空值r = [];warning('dfdx is too small!');return;enddx = f/dfdx; %x(n+1) = x(n) - f( x(n) )/f'( x(n) ),这里设dx = f( x(n) )/f'( x(n) )x = x - dx;if abs(f) < ftol %如果误差小于ftol,返回当前x为根r = x;return;endendr = []; %如果牛顿法未收敛,返回空值function p = LegendreIter(n)% LegendreIter 用递推的方法计算n次勒让德多项式的系数向量Pn+2(x) = (2*i+3)/(i+2) * x*Pn+1(x) - (i+1)/(i+2) * Pn(x)%% Synopsis: p = LegendreIter(n)%% Input: n = 勒让德多项式的次数%% Output: p = n次勒让德多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %P0(x) = 1p = 1;return;elseif n == 1 %P1(x) = xp = [1 0];return;endpBk = 1; %初始化三项递推公式后项为P0pMid = [1 0]; %初始化三项递推公式中项为P1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Pn+1pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的PnpBkCal(3:i+3) = pBk;pFwd = (2*i+3)/(i+2) * pMidCal - (i+1)/(i+2) * pBkCal; %勒让德多项式三项递推公式Pn+2(x) = (2*i+3)/(i+2) * x*Pn+1(x) - (i+1)/(i+2) * Pn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把勒让德多项式最高次项系数归一化function p = ChebyshevIter(n)% ChebyshevIter 用递推的方法计算n次勒让德-切比雪夫多项式的系数向量Tn+2(x) = 2*x*Tn+1(x) - Tn(x)%% Synopsis: p = ChebyshevIter(n)%% Input: n = 勒让德-切比雪夫多项式的次数%% Output: p = n次勒让德-切比雪夫多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %T0(x) = 1p = 1;return;elseif n == 1 %T1(x) = xp = [1 0];return;endpBk = 1; %初始化三项递推公式后项为T0pMid = [1 0]; %初始化三项递推公式中项为T1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Tn+1pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的PnpBkCal(3:i+3) = pBk;pFwd = 2*pMidCal - pBkCal; %勒让德-切比雪夫多项式三项递推公式Tn+2(x) = 2*x*Tn+1(x) - Tn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把勒让德-切比雪夫多项式最高次项系数归一化function p = LaguerreIter(n)% LaguerreIter 用递推的方法计算n次拉盖尔多项式的系数向量Ln+2(x) = (2*n+3-x)*Ln+1(x) - (n+1)*Ln(x)%% Synopsis: p = LaguerreIter(n)%% Input: n = 拉盖尔多项式的次数%% Output: p = n次拉盖尔多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %L0(x) = 1p = 1;return;elseif n == 1 %L1(x) = -x+1p = [-1 1];return;endpBk = 1; %初始化三项递推公式后项为L0pMid = [-1 1]; %初始化三项递推公式中项为L1for i = 0:n-2pMidCal1 = zeros(1,i+3); %构造用于计算的x*Ln+1(x)pMidCal1(1:i+2) = pMid;pMidCal2 = zeros(1,i+3); %构造用于计算的Ln+1(x)pMidCal2(2:i+3) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的Ln(x)pBkCal(3:i+3) = pBk;pFwd =( (2*i+3)*pMidCal2 - pMidCal1 - (i+1)*pBkCal )/ (i+2); %拉盖尔多项式三项递推公式Ln+2(x) = (2*n+3-x)*Ln+1(x) - (n+1)^2*Ln(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把拉盖尔多项式最高次项系数归一化function p = HermiteIter(n)% HermiteIter 用递推的方法计算n次埃尔米特多项式的系数向量Hn+2(x) = 2*x*Hn+1(x) - 2*(n+1)*Hn(x)%% Synopsis: p = HermiteIter(n)%% Input: n = 埃尔米特多项式的次数%% Output: p = n次埃尔米特多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %H0(x) = 1p = 1;return;elseif n == 1 %H1(x) = 2*xp = [2 0];return;endpBk = 1; %初始化三项递推公式后项为L0pMid = [2 0]; %初始化三项递推公式中项为L1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Hn+1(x)pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的Hn(x)pBkCal(3:i+3) = pBk;pFwd =2*pMidCal - 2*(i+1)*pBkCal; %埃尔米特多项式三项递推公式Hn+2(x) = 2*x*Hn+1(x) - 2*(n+1)*Hn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把拉盖尔多项式最高次项系数归一化function r = BinSolve(fun, a, b, tol)% BinSolve 用二分法解方程f(x)=0在区间[a,b]的根%% Synopsis: r = BinSolve(fun, a, b)% r = BinSolve(fun, a, b, tol)%% Input: fun = (string) 需要求根的函数% a,b = 寻根区间上下限% tol = (optional)误差,默认为5e-9%% Output: r = 在寻根区间内的根if nargin < 4tol = 5e-9;endXb = RootBracket(fun, a, b); %粗略寻找含根区间[m,n] = size(Xb);r = [];nr = 1; %初始化找到的根的个数为1maxit = 50; %最大二分迭代次数为50for i = 1:ma = Xb(i,1); %初始化第i个寻根区间下限b = Xb(i,2); %初始化第i个寻根区间上限err = 1; %初始化误差k = 0;while k < maxitfa = feval(fun, a); %计算下限函数值fb = feval(fun, b); %计算上限函数值m = (a+b)/2;fm = feval(fun, m);err = abs(fm);if sign(fm) == sign(fb) %若中点处与右端点函数值同号,右端点赋值为中点b = m;else %若中点处与左端点函数值同号或为0,左端点赋值为中点a = m;endif err < tol %如果在a处函数值小于tolr(nr) = a; %一般奇点不符合该条件,这样可以去除奇点nr = nr + 1; %找到根的个数递增k = maxit; %改变k值跳出循环endk = k + 1; %二分迭代次数递增endendfunction X = powerX(x,a,b)% powerX 对给定向量(x1, x2,..., xn)返回增幂矩阵(x1^a, x2^a,..., xn^a; x1^a+1, x2^a+1,..., xn^a+1; ...; x1^b, x2^b,..., xn^b;)%% Synopsis: X = powerX(x,a,b)%% Input: x = 需要返回增幂矩阵的向量% a,b = 寻根区间上下限%% Output: X = 增幂矩阵(x1^a, x2^a,..., xn^a; x1^a+1, x2^a+1,..., xn^a+1; ...; x1^b, x2^b,..., xn^b;)if round(a) ~= a | round(b) ~= berror('a,b must be integers');elseif a >= berror('a must be smaller than b!');endx = x(:)';row = b-a+1;col = length(x);X = zeros(row, col);for i = b:-1:aX(b-i+1,:) = x.^i;Endfunction [f, dfdx] = fun1_1(x)f = cos(x) - x;dfdx = -sin(x) - 1;function [f, dfdx] = fun1_2(x)f = exp(-x) - sin(x);dfdx = -exp(-x) - cos(x);function [f, dfdx] = fun2_1(x)f = x - exp(-x);dfdx = 1 + exp(-x);function [f, dfdx] = fun2_2(x)f = x.^2 - 2*x*exp(-x) + exp(-2*x);dfdx = 2*x - 2*exp(-x) + 2*x*exp(-x) - 2*exp(-2*x);function y = LegendreP6(x)p = LegendreIter(6);X = powerX(x,0,6);y = p*X;function y = ChebyshevT6(x)p = ChebyshevIter(6);X = powerX(x,0,6);y = p*X;function y = LaguerreL5(x)p = LaguerreIter(5);X = powerX(x,0,5);y = p*X;function y = HermiteH6(x)p = HermiteIter(6);X = powerX(x,0,6);y = p*X;思考题(1)由于Newton法具有局部收敛性,所以在实际问题中,当实际问题本身能提供接近于根的初始近似值时,就可保证迭代序列收敛,但当初值难以确定时,迭代序列就不一定收敛。
牛顿迭代法实验报告

材料科学与工程实验教学中心实验报告课程名称实验名称牛顿迭代法方程求根专业班级学号姓名实验日期材料科学与工程实验教学中心实验报告一.实验目的通过对牛顿迭代法作编程练习与上机运算,进一步体会牛顿迭代法的不同特点二.实验原理(方法)给定初始值x0,ε为根的容许误差,η为|f(x)|的容许误差,N为迭代次数的容许值。
①如果f′(x0)=0或迭代次数大于N,则算法失败,结束;否则执行②②计算x1=x0-f(x0)/f′(x0)。
③若|x1-x0|<ε或|f(x1)|<η,则输出x1,程序结束;否则执行④④令x0=x1,转向①三.实验仪器设备及操作步骤电脑一台操作步骤:打开电脑,打开VB程序,编辑程序四.实验数据及处理(N-S图和程序)f(x)=x³+x²-3x-3结束Private Sub Command1_Click()Dim x0, x!, eps!, kx0 = Val(InputBox("x=0", "ÊäÈë³õÖµ", 0.5))eps = Val(InputBox("eps=", "ÊäÈëepsµÄÖµ", 0.000005)) x = x0 - f(x0) / p(x0)k = 1PrintDo While Abs(x - x0) >= epsPrint "k=" & k, "x=" & x, "f(x)" & f(x)x0 = xk = k + 1x = x0 - f(x0) / p(x0)LoopEnd SubFunction f(ByVal x!) As Singlef = x ^ 3 + x ^ 2 - 3 * x - 3End FunctionFunction p(ByVal x!) As Singlep = 3 * x ^ 2 + 2 * x - 3End Function五.实验结果分析及结论(算例及结果)六.思考题成绩指导教师日期Welcome To Download !!!欢迎您的下载,资料仅供参考!。
研究生数值分析(5)牛顿(Newton)迭代法

称为埃特肯算法。
例7 用迭代法求方程
f ( x) x 2 x 0 在[0,1]内根 x *
的近似值,精确到
xk 1 xk 104
解:取初始近似根 x0 0.5 xk 1 2 x 1.用简单迭代法 2.用牛顿迭代法 3.用埃特肯算法
1 1 0 m
这表明直接用牛顿迭代法对方程 只有线性收敛速度。
f ( x) 0
求重根
对 x* 是方程 则 x* 是方程
f ( x) 0
重根的情形,如将方程改写成
(其中 F ( x) f ( x) / f ' ( x) )
F ( x) 0
F ( x) 0
的单根,再对
F ( x) 0
f ' ( x) 0
;
在 [a, b] 上保号,
则当初值 x0 [a, b] ,且 f ( x0 ) f '' ( x0 ) 0 时, 牛顿迭代公式产生的迭代序列 { xk } 收敛于方程
f ( x) 0 在 [a, b] 上的唯一实根 x* 。
定理5的简要几何说明:
条件(1)保证了曲线 y=f (x)的连续性和光滑性; 条件(2)保证了方程y = f (x) 在[a ,b]内至少有 一实根; 条件(3)说明在[a ,b]上恒有
135.607
使其精确至7位有效数字。 解:作函数 f ( x) x2 c , 则f (x)=0的正根 x* 就是 c
f ( x) 0 的牛顿迭代公式为
2 f ( xk ) xk c 1 c xk 1 xk ' xk ( xk ) f ( xk ) 2 xk 2 xk
MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告实验报告一、引言计算方法是数学的一门重要应用学科,它研究如何用计算机来解决数学问题。
其中,迭代法、牛顿法和二分法是计算方法中常用的数值计算方法。
本实验通过使用MATLAB软件,对这三种方法进行实验研究,比较它们的收敛速度、计算精度等指标,以及它们在不同类型的问题中的适用性。
二、实验方法1.迭代法迭代法是通过不断逼近解的过程来求得方程的根。
在本实验中,我们选择一个一元方程f(x)=0来测试迭代法的效果。
首先,我们对给定的初始近似解x0进行计算,得到新的近似解x1,然后再以x1为初始近似解进行计算,得到新的近似解x2,以此类推。
直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对复杂方程的迭代计算来评估迭代法的性能。
2.牛顿法牛顿法通过使用函数的一阶导数来逼近方程的根。
具体而言,对于给定的初始近似解x0,通过将f(x)在x0处展开成泰勒级数,并保留其中一阶导数的项,得到一个近似线性方程。
然后,通过求解这个近似线性方程的解x1,再以x1为初始近似解进行计算,得到新的近似解x2,以此类推,直到两次计算得到的近似解之间的差值小于规定的误差阈值为止。
本实验将通过对不同类型的方程进行牛顿法的求解,评估它的性能。
3.二分法二分法是通过将给定区间不断二分并判断根是否在区间内来求方程的根。
具体而言,对于给定的初始区间[a,b],首先计算区间[a,b]的中点c,并判断f(c)与0的大小关系。
如果f(c)大于0,说明解在区间[a,c]内,将新的区间定义为[a,c],再进行下一轮的计算。
如果f(c)小于0,说明解在区间[c,b]内,将新的区间定义为[c,b],再进行下一轮的计算。
直到新的区间的长度小于规定的误差阈值为止。
本实验将通过对复杂方程的二分计算来评估二分法的性能。
三、实验结果通过对一系列测试函数的计算,我们得到了迭代法、牛顿法和二分法的计算结果,并进行了比较。
牛顿迭代法实验

一、牛顿—迭代法迭代程序1.M文件function [p0,err,k,y]=newton(f,df,p0,delta,epsilon,max1)%Input - f is the object function input as a string 'f'% - df is the derivative of f input as a string 'df'% - p0 is the initial approximation to a zero of f% - delta is the tolerance for p0% - epsilon is the tolerance for the function values y% - max1 is the maximum number of iterations%Output - p0 is the Newton-Raphson approximation to the zero% - err is the error estimate for p0% - k is the number of iterations% - y is the function value f(p0)% NUMERICAL METHODS: Matlab Programs% (c) 2004 by John H. Mathews and Kurtis D. Fink% Complementary Software to accompany the textbook:% NUMERICAL METHODS: Using Matlab, Fourth Edition% ISBN: 0-13-065248-2% Prentice-Hall Pub. Inc.% One Lake Street% Upper Saddle River, NJ 07458for k=1:max1p1=p0-feval(f,p0)/feval(df,p0);err=abs(p1-p0);relerr=2*err/(abs(p1)+delta);p0=p1;y=feval(f,p0);if (err<delta)|(relerr<delta)|(abs(y)<epsilon),break,endend应用牛顿-拉夫森迭代程序求函数3=-+的二重根p=1,这里p0=1.2。
实验15 Newton迭代法

《数值分析》实验15一.实验名称:Newton 迭代法二、实验目的:(1) 掌握求解非线性方程的Newton 迭代法;(2) 了解Newton 迭代法的一些变体算法。
三、实验要求(1) 按照题目要求完成实验内容(2) 写出相应的语言程序(3) 给出实验原理、实验结果(4) 写出相应的实验报告。
四、实验题目1、用Newton 迭代法,割线法求方程3()310f x x x =--=在02x =附近的根,要求误差不超过410ε-=。
(给出每次迭代的结果,结果保留4位小数) 程序:#include<stdio.h>#include<math.h>#include<stdlib.h>double f(double x){return pow(x,3)-x-1;}void main(){int i,j,k,nn=1000,n,m;double t,err=1e-4,dx=1;double x[nn],y[nn];x[0]=1,x[1]=2;printf("x 估值 前后误差 迭代次数\n");for(k=1;k<nn&&dx>err;k++){x[k+1]=x[k]-f(x[k])*(x[k]-x[k-1])/(f(x[k])-f(x[k-1])); dx=fabs(x[k+1]-x[k]);printf("%0.4f %0.4f %d\n",x[k],dx,k);}}结果:x 估值 前后误差 迭代次数2.0000 0.4545 01.5455 0.1858 11.3596 0.0338 21.3258 0.0011 31.3247 0.0000 4程序:#include<stdio.h>#include<math.h>#include<stdlib.h>double f(double x){return pow(x,3)-x-1;}void main(){int i,j,k,nn=1000,n,m;double t,err=1e-4,dx=1;double x[nn],y[nn];x[0]=1,x[1]=2;printf("x估值前后误差迭代次数\n");for(k=1;k<nn&&dx>err;k++){x[k+1]=x[k]-f(x[k])*(x[k]-x[k-1])/(f(x[k])-f(x[k-1]));dx=fabs(x[k+1]-x[k]);printf("%0.4f %0.4f %d\n",x[k],dx,k);}}结果:x估值前后误差迭代次数2.0000 0.8333 11.1667 0.0864 21.2531 0.0841 31.3372 0.0134 41.3239 0.0009 51.3247 0.0000 6。
实验五 用Newton法计算方程的根

五. 讨论分析当初始值选取离零点较远时将导致算法无法使用,例如第三题,将初始值改为2就无法计算出结果了,显示如下例如求020sin 35=-+-x x e x 的根,其中控制精度1010-=eps ,最大迭代次数40=M ,在steffensen 加速迭代方法的程序中,我们只需改动:it_max=40; ep=1e-10, 其余不变 。
利用以上程序,我们只需输入:phi=inline('exp(5*x)-sin(x)+(x)^3-20');[x_star,index,it]=steffensen(phi,0.5)可得:x_star = 0.637246094753909index = 0it = 41观察上述结果,index = 0,it = 41表明迭代失败,所以使用以上方法估计的时候,应该尽量估计出解的范围,偏离不应过大,距离增加迭代次数增加,也有可能迭代失败六. 改进实验建议根据上述分析,我认为,应该先对函数作一个简图,方便知道解的大概位置,然后我们才将这个大概值代入Newton 法或者Steffensen 中进行求解。
当然,我们可以用其他数学软件实现Newton 迭代法,我们可以用z-z 超级画板,其操作流程为:牛顿迭代法的公式是:x n+1=x n-f(x n)/f'(x n)。
下面我们就用牛顿迭代法设计程序求方程f(x)=ln(x)+2*x-6的近似解。
(一)观察方程f(x)=0的零点位置(1)显示坐标系的坐标刻度。
(2)作出函数y=ln(x)+2*x-6的图像,如下图所示:可以观察到方程的根在区间[2,3]上,我们可以设定近似解的初始值为2。
(二)设计求方程近似解的程序(1)在程序工作区中输入:f(x){ln(x)+2*x-6;}执行后,返回结果为:>> f(x) #这表示在计算机已经完成了函数f(x)的定义。
(2)定义f(x)的导函数g(x),在程序工作区中输入:Diff(f(x),x);执行后,返回结果为:>> 2+1/x #得到了f(x)的导函数。
数值分析 数值分析 Newton迭代法求解非线性方程实验

}//计算出u[i][j]并输出.
第二部分 for(i=k+1;i<n;i++)
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("%Lf\n",l[i][k]);
{s=0.0;
for(r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][k];}
l[i][k]=(a[i][k]-s)/u[k][k];
printf("l[%d][%d]%Lf\n",i,k,l[i][k]);}
}
}
六、实验结果
七、上机实验体会
在这个试验中同样叶出现了很多问题,对L,U的求解输出中,输出的位置的不同,结果也就会出差错.经过多次调整,结果总算输出了.
通过此次试验,我理解了多重循环的运用,并了解了古人的聪明智慧,]讲将复杂问题简单化,现在的大学生们,应该学习他们的创新及钻研精神。
for(k=0;k<n;k++)
{for(j=k;j<n;j++)
{s=0.0;
for (r=0;r<k-1;r++)
{s=s+l[k][r]*u[r][j];}
u[k][j]=a[k][j]-s;
printf("u[%d][%d]=%Lf\n",k,j,u[k][j]); }
for(i=k+1;i<n;i++)
牛顿迭代法的实验报告

牛顿迭代法的实验报告牛顿迭代法是一种寻找函数零点的方法,它通过通过使用函数的导数来逼近实际零点。
在本实验中,我们使用了牛顿迭代法来求解一元高次方程的根。
实验目的:通过使用牛顿迭代法来求解一元高次方程的根,掌握牛顿迭代法的原理与应用。
实验器材与条件:- 电脑- MATLAB 软件实验原理:设函数 f(x) 在零点 x0 处有一阶导数f’(x0)不等于0,则 f(x)在点 x0 的切线方程为y = f’(x0) (x - x0) + f(x0)。
切线与 x 轴的交点为x1,有:f’(x0)(x1 - x0) + f(x0) = 0由于我们的目标是解方程 f(x) = 0,所以我们需要将上式改写成其中 x1 为由切线得到的下一个逼近值。
通过不断逼近 x1 直到误差满足一定要求,我们就可以以一个很高的精确度求解出方程的根。
实验步骤:本实验的目标是求解方程 x^3 - 2x -2 = 0 的根。
第一步,我们先定义该方程及其导数函数:syms x;f = x^3 - 2*x - 2;df = diff(f);其中 diff() 函数是 MATLAB 默认的求导函数。
第二步,我们设定初始值 x0,设定逼近误差 limit,然后进行牛顿迭代,直到误差小于 limit:x0 = 1;limit = 1e-6;diff_value = inf;while abs(diff_value) > limitx1 = x0 - subs(f, x0) / subs(df, x0);diff_value = subs(f, x1);x0 = x1;endx0通过运行上面的代码,我们可以得到方程的一个根,为 1.7693。
实验结果与分析:本实验顺利完成,我们使用牛顿迭代法成功求出了 x^3 - 2x - 2 = 0 的根,为 1.7693。
此结果与理论值非常接近,表明我们使用牛顿迭代法正确地找到了方程的根。
牛顿迭代法实验报告

1)x1=x0-F0/F0’,
2)计算F1=f(x1);F1’=f’(x1)
3)若F1’=0,则输出“方法失败”并结束。
3.控制:若|x1-x0|<EPS或|F1|<DELTA,则输出近似解x1和迭代次数k并结束;否则,x0=x1;F0=F1;F0’=F1’。
4.k>N时输出“经N次迭代无满足要求的近似解”结束。
输入DELTA:1e-7
输入N:100
x(1)=3.000000 x(2)=2.200000 x(3)=1.830151 x(4)=1.737795 x(5)=1.732072
最终结果为1.732051Press any key to continue
六、分析和讨论
1.输入不同的初值x0,迭代次数的变化情况
四、实验步骤
1)完成牛顿迭代法的程序设计及录入;
2)完成程序的编译和链接,并进行修改;
3)用书上的例子对程序进行验证,并进行修改;
4)分别输入两组不同的根的误差限,观察运算次数的变化;
5)分别取不同的初时值x0,观察运算结果的变化;
6)完成实验报告。
五、实验结果
1.经编译、链接及例子验证结果正确的源程序:
#include<stdio.h>
#include<math.h>
float f(float x)
{
float a;
a=x*x*x+x*x-3*x-3;
return a;
}
float f1(float x)
{
float b;
b=3*x*x+2*x-3;
return b;
}
牛顿迭代法实验报告

实验报告课程:数值计算方法与算法班级:20091113实验名称:牛顿迭代法实验姓名:张燕玲实验日期:2011年11月18日学号:2009111303 实验报告日期:2011年11月18日实验牛顿迭代法实验一、实验目的:1.熟悉和掌握牛顿迭代法2.通过实验让我们更加了解牛顿迭代法二、实验设备及实验环境:计算机;Microsoft Visual C++三、实验原理:牛顿迭代法四、程序源代码#include<stdio.h>#include<math.h>#define f(x) x-(x*x*x-3*x-2)/(3*x*x-3)#define x0 1.5#define MAXREPT 1000#define epsilon 0.001void main(){ int i;double x_k=x0,x_k1=x0;for(i=0;i<MAXREPT;i++){printf("Got...%f\n",x_k1);x_k1=f(x_k);if(x_k1-x_k<epsilon && x_k1-x_k>-epsilon){printf("!Root:%f\n",x_k1);return;}x_k=x_k1;}printf("After %d repeate,no solved.\n",MAXREPT);}五、实验结果六、实验心得体会1.经过实验,自己编程,先掌握熟悉弦截法的程序,然后根据弦截法来编出牛顿迭代法实验的程序,学以致用。
2.在编程调试的过程中发现程序的错误,在修改程序中学会了耐心以及发现自己对该单元哪一部部分知识掌握得不好。
3.通过自己编程,既掌握记住了牛顿迭代法又掌握了弦截法,一举两得。
数值分析实验报告之迭代法求非线性方程的根

数值分析实验报告之迭代法求非线性方程的根1.实验目的掌握迭代法求非线性方程根的基本原理和使用方法,加深对数值计算方法的理解与应用。
2.实验原理迭代法是一种通过不断逼近的方法求解非线性方程的根。
根据不同的函数特点和问题需求,可以选择不同的迭代公式进行计算,如牛顿迭代法、二分法、弦截法等。
3.实验内容本次实验使用牛顿迭代法求解非线性方程的根。
牛顿迭代法基于函数的局部线性逼近,通过不断迭代逼近零点,直至满足收敛条件。
具体步骤如下:Step 1:选择初始点X0。
Step 2:计算函数f(x)在X0处的导数f'(x0)。
Step 3:计算迭代公式Xn+1 = Xn - f(Xn) / f'(Xn)。
Step 4:判断收敛准则,若满足则迭代结束,输出解Xn;否则返回Step 2,继续迭代。
Step 5:根据实际情况判断迭代过程是否收敛,并输出结果。
4.实验步骤步骤一:选择初始点。
根据非线性方程的特点,选择恰当的初始点,以便迭代公式收敛。
步骤二:计算导数。
根据选择的非线性方程,计算函数f(x)的导数f'(x0),作为迭代公式的计算基础。
步骤三:迭代计算。
根据迭代公式Xn+1=Xn-f(Xn)/f'(Xn),计算下一个迭代点Xn+1步骤四:判断收敛。
判断迭代过程是否满足收敛条件,通常可以通过设置迭代次数上限、判断前后两次迭代结果的差值是否足够小等方式进行判断。
步骤五:输出结果。
根据实际情况,输出最终的迭代结果。
5.实验结果与分析以求解非线性方程f(x)=x^3-x-1为例,选择初始点X0=1进行迭代计算。
根据函数f(x)的导数计算公式,得到导数f'(x0)=3x0^2-1,即f'(1)=2根据迭代公式Xn+1=Xn-f(Xn)/f'(Xn),带入计算可得:X1=X0-(X0^3-X0-1)/(3X0^2-1)=1-(1-1-1)/(3-1)=1-0/2=1根据收敛准则,判断迭代结果是否满足收敛条件。
数值计算方法实验报告

数值计算方法实验报告数值计算方法实验报告引言:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。
在科学研究和工程应用中,数值计算方法被广泛应用于求解方程、优化问题、模拟仿真等领域。
本实验报告将介绍数值计算方法的基本原理和实验结果。
一、二分法求根二分法是一种通过不断折半缩小搜索区间来求解方程根的方法。
在实验中,我们选取了一个简单的方程f(x) = x^2 - 4 = 0来进行求根实验。
通过不断将搜索区间进行二分,我们可以逐步逼近方程的根。
实验结果表明,通过二分法,我们可以得到方程的根为x = 2。
二、牛顿迭代法求根牛顿迭代法是一种通过不断逼近方程根的方法。
在实验中,我们同样选取了方程f(x) = x^2 - 4 = 0进行求根实验。
牛顿迭代法的基本思想是通过对方程进行线性近似,求得近似解,并不断迭代逼近方程的根。
实验结果表明,通过牛顿迭代法,我们可以得到方程的根为x = 2。
三、高斯消元法求解线性方程组高斯消元法是一种通过变换线性方程组的系数矩阵,将其化为上三角矩阵的方法。
在实验中,我们选取了一个简单的线性方程组进行求解实验。
通过对系数矩阵进行行变换,我们可以将其化为上三角矩阵,并通过回代求解得到方程组的解。
实验结果表明,通过高斯消元法,我们可以得到线性方程组的解为x = 1,y = 2,z = 3。
四、插值与拟合插值与拟合是一种通过已知数据点来构造函数模型的方法。
在实验中,我们选取了一组数据点进行插值与拟合实验。
通过拉格朗日插值多项式和最小二乘法拟合,我们可以得到数据点之间的函数模型。
实验结果表明,通过插值与拟合,我们可以得到数据点之间的函数关系,并可以通过该函数模型来进行预测和拟合。
结论:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。
通过本次实验,我们学习了二分法求根、牛顿迭代法求根、高斯消元法求解线性方程组以及插值与拟合的基本原理和应用。
这些方法在科学研究和工程应用中具有广泛的应用前景。
Newton迭代法、弦截法上机实验报告 2

中国矿业大学(北京)理学院数值分析实验报告实验名称 已知数据点,求Lagrange 插值多项式.实验时间 2012.4.3组长签名龙纯鹏 班级 信息与计算科学(1)班学号11107200110 成绩组员签名111072001011110720010211107200103 1110720011911107200120一、实验目的,内容 二、相关背景知识介绍 三、代码四、数值结果 五、计算结果的分析 六、计算中出现的问题,解决方法及体会一、实验目的、内容 实验目的:内容:已知数据点)9,10(),1,9(),1,8(),3,7(,求三次Lagrange 插值多项式)(3x P , 并求?)5.9(?)5.8(?)5.7(333≈≈≈P P P二、相关背景知识介绍 1.牛顿迭代法原理:设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大.设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得)(')(0001x f x f x x -= 重复这一过程,得到迭代格式)(')(1n n n n x f x f x x -=+. 2. 牛顿迭代法的几何解析在0x 处作曲线的切线,切线方程为))((')(000x x x f x f y -+=。
令0=y ,可得切线与x 轴的交点坐标)(')(0001x f x f x x -=,这就是牛顿法的迭代公式。
因此,牛顿法又称“切线法”。
3.牛顿迭代法的收敛性计算可得2)]('[)(")()('x f x f x f x g -=,设*x 是0)(=x f 的单根,有0)(',0)(**≠=x f x f ,则 0)]('[)(")()('2****=-=x f x f x f x g , 故在*x 附近,有1)('<x g .根据不动点原理知牛顿迭代法收敛. 4.程序设计思路:先用m 文件先定义一个名为f1.m 的函数文件。
newton迭代法求方程

newton迭代法求方程引言在数学和计算机科学中,求解方程是一个重要的问题。
在许多情况下,我们无法从方程的解析解中得到准确的解,因此需要使用数值方法来逼近方程的解。
本文将介绍一种常用的数值方法——newton迭代法来求解方程。
newton迭代法概述newton迭代法是一种使用初始估计值来逼近方程解的迭代方法。
它基于牛顿-莱布尼茨公式和泰勒级数展开的思想,通过不断迭代进行局部线性逼近,最终逼近方程的解。
newton迭代法数学原理newton迭代法的数学原理可以概括为以下几个步骤:1. 选择初始估计值根据方程的性质和问题的特点,选择一个合适的初始估计值x0。
初始估计值的选择对于newton迭代法的收敛性和精度有重要影响。
2. 进行迭代计算根据newton迭代法的迭代公式,进行迭代计算,直到满足终止条件。
迭代公式如下:x n+1=x n−f(x n) f′(x n)其中,f(x)表示方程的函数形式,f′(x)表示f(x)的导数。
3. 判断收敛性在迭代计算过程中,需要判断newton迭代法的收敛性。
一般来说,如果迭代过程中逼近的速度足够快且逼近的值足够接近实际解,我们可以认为newton迭代法收敛。
4. 终止条件设置终止条件,如逼近的误差小于某个阈值或达到最大迭代次数等。
newton迭代法的优缺点newton迭代法作为一种数值求解方程的方法,具有如下优点和缺点:优点:•收敛速度快:在一些情况下,newton迭代法的收敛速度非常快,可以在少量迭代次数内得到较为精确的解。
•高精度:如果初始估计值足够接近实际解,newton迭代法可以得到高精度的近似解。
缺点:•对初始估计值敏感:初始估计值的选择对于newton迭代法的收敛性和精度有很大影响。
如果初始估计值选择不当,可能导致发散或收敛到错误的解。
•需要导数信息:newton迭代法需要计算方程函数的导数,对于一些复杂的方程,计算导数可能非常困难甚至无法得到。
newton迭代法的应用newton迭代法在数学和计算机科学中有广泛的应用。
Newton迭代法数值分析实验报告

数值分析实验报告x=0.5;y=x-exp(-x);z=x-y/(1+exp(-x));k=1;while abs(z-x)>=1.0e-8 k=k+1;x=z;y=x-exp(-x);z=x-y/(1+exp(-x));endk如图所示结果为下图2、用Newton 切线法求方程310x x --=在1.5附近的一个根.主要代码:clear; x=1.5; y=x^3-x-1; z=x-y/(3*x^2-1); k=1;while abs(z-x)>=1.0e-8 k=k+1; x=z; y=x^3-x-1; z=x-y/(3*x^2-1); end k z 如图所示结果为下图3、用Newton 切线法计算3k =,4k =时,方程2(2)(3)0k x x --=在1.3附近的根(2)以及2.5附近的根(3)K=3时在1.3附近的根主要代码:clear;x=1.3;y=(x-sqrt(2))^3*(x^2-3);m=3*(x^2 - 3)*(x - 2^(1/2))^2 + 2*x*(x - 2^(1/2))^3; z=x-y/m;k=1;while abs(z-x)>=1.0e-8k=k+1;x=z;y=(x-sqrt(2))^3*(x^2-3);m=3*(x^2 - 3)*(x - 2^(1/2))^2 + 2*x*(x - 2^(1/2))^3;z=x-y/m;endk结果为下图K=4时在1.3附近的根主要代码结果为下图K=4时在2.5附近的根主要代码clear;x=2.5;y=(x-sqrt(2))^4*(x^2-3);m= 4*(x^2 - 3)*(x - 2^(1/2))^3 + 2*x*(x - 2^(1/2))^4; z=x-y/m;k=1;while abs(z-x)>=1.0e-5k=k+1;x=z;y=(x-sqrt(2))^4*(x^2-3);m= 4*(x^2 - 3)*(x - 2^(1/2))^3 + 2*x*(x - 2^(1/2))^4; z=x-y/m;endkz结果为下图K=3时在2.5附近的根主要代码结果为下图四、调试和运行程序过程中产生的问题及采取的措施:1、编译时,想用diff求出y的一阶导数,但出现错误,必须把x变成syms形式,编译过程出现错误,就采取把y的一阶导数先算出来,带入newton迭代公式中,程。
牛顿迭代上机实习报告

实习报告一、实验目的通过上机实习,利用计算机编程进行数值分析课程中关于牛顿迭代法的求解。
由于所需迭代次数较多、数据运算复杂,手工求解非常困难甚至无法进行,通过计算机编程实现相应的算法可以大大提高计算效率和准确率。
二、实验原理牛顿法是求方程f(x)=0近似根的重要方法,是非线性方程线性化的方法。
牛顿迭代法的一般迭代公式:x n+1=x n-f(x n)/f’(x n) n=0,1,2……牛顿迭代法就是用线性的根来逐步逼近方程f(x)=0的跟x*,因而也称为切线法。
三、实验过程1、问题题目:求f(x)=x^3+x^2-3*x-3=0在1.5附近的根,初始值取1.0,1.5,2.5,要求根的精度为0.000001。
2、实验环境本实验在C#环境下进行编程实现。
3、编程思路使用C#建立一个窗体应用程序并进行界面设计,界面包括三个文本框,分别用于输入初始值、输出迭代次数、输出近似值。
同时包括三个按钮,单击按钮时实现的功能分别是进行迭代计算、清空文本框内容以便进行下一次运算、退出程序。
单击Calculate按钮时,首先将初始值输入文本框的值赋给一个double变量,然后设计了一个使用牛顿迭代公式的循环结构,通过判断前每一次迭代后的结果和前一次迭代的值进行比较,当两者相差不超过0.000001时终止循环,并将循环的次数和最后的近似值在下面两个文本框中显示。
设计界面如图所示:所用代码如下:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace ZUOYE{publicpartialclass Form1 : Form{public Form1(){InitializeComponent();}privatevoid button1_Click(object sender, EventArgs e){double a = double.Parse(txtInput.Text);double b = a - (a * a * a + a * a - 3 * a - 3) / (3 * a * a + 2 * a - 3); int num = 1;for(num=1;System.Math.Abs(a-b)>0.000001;num++){double temp = b;b = temp - (temp * temp * temp + temp * temp - 3 * temp-3) / (3 * temp *temp + 2 * temp - 3);a = temp;}txtNum.Text = num.ToString();txtOutput.Text = Math.Round(b, 6).ToString();}privatevoid button3_Click(object sender, EventArgs e){this.Close();}privatevoid button2_Click(object sender, EventArgs e){txtInput.Clear();txtNum.Clear();txtOutput.Clear();}}}四、实验结果1、当初始值为1.0时:2.初始值为1.5时:3.初始值为2.5时:五、实验总结通过进行上机实习,动手进行相关算法的编程实现,使我对牛顿迭代法的原理有了更加深刻的认识和理解。
牛顿迭代法实验报告

用牛顿迭代法求方程的根一、 实验目的1. 用牛顿迭代法求解方程的根2. 了解迭代法的原理3. 改进和修缮迭代法二、 实验原理给定初始值0x ,ε为根的容许误差,η为()x f 的容许误差,N 为迭代次数的容许值。
1. 如果()0='x f 或迭带次数大于N ,则算法失败,结束;否则执行2.2. 计算()()0001x f x f x x '-=. 3. 若ε<-21x x 或()η<1x f ,则输出1x ,程序结束;否则执行4.4. 令10x x =,转向1.三、 实验题目求方程()03323=--+=x x x x f 在5.1附近的根。
四、 程序代码function Newtondiedai(f,a,b) %f 为a,b 是方程根的取值区间[a ,b]x1=a;% x1,x2为迭代中的Xn.Xn+1.x2=0; %最后输出的方程的根n=100;%迭代次数eps=1.0e-6;%根的容许误差ea=1.0e-8;%|f(x)|的容许误差df=diff(sym(f));%求导%求方程某点的值f1=subs(sym(f),findsym(sym(f)),a);f2=subs(sym(f),findsym(sym(f)),b);%当端点的函数值为0的时候,直接输出根if(f1==0)x2=a;x2endif(f2==0)x2=b;x2endfor(i=1:n)f1=subs(sym(f),findsym(sym(f)),x1);dfx=subs(sym(df),findsym(sym(df)),x1);x2=x1-f1/dfx;%迭代方程if(abs(x2-x1)<eps||abs(subs(sym(f),findsym(sym(f)),x2)<ea)) %当根的容许误差或f(x)|的容许误差都小于设定值的时候输出迭代根x2 %输出方程最后的根i %输出迭代次数returnendx1=x2;end五、求解结果在Mtalab中输入Newtondiedai('x^3+x^2-3*x-3',1,2)输出x2 =1.73205080787106i =6在Mtalab中输入Newtondiedai('x^3+x^2-3*x-3',1.5,2)输出x2 =1.73205080756970i =4六、实验分析1.在求解在1.5处附近的根,不难发现在输入区间左端值为1时需要迭代6次,而输入区间左端值为1.5时,却只要4次。