牛顿迭代法的实验报告
数值分析求解非线性方程根的二分法简单迭代法和牛顿迭代法
实验报告一:实验题目一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。
二、 实验内容1、编写二分法、并使用这两个程序计算02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。
2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。
3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭代法求这个方程的最小正根。
4、用牛顿法求方程的根,精确至8位有效数字。
比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。
第1题:02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。
画图函数:function Test1()% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0r = 0:0.01:1;y = r + exp(r) - 2plot(r, y);grid on 二分法程序:计算调用函数:[c,num]=bisect(0,1,1e-4)function [c,num]=bisect(a,b,delta)%Input –a,b 是取值区间范围% -delta 是允许误差%Output -c 牛顿迭代法最后计算所得零点值% -num 是迭代次数ya = a + exp(a) - 2;yb = b + exp(b) - 2;if ya * yb>0return;endfor k=1:100c=(a+b)/2;yc= c + exp(c) - 2;if abs(yc)<=deltaa=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif abs(b-a)<deltanum=k; %num为迭代次数break;endendc=(a+b)/2;err=abs(b-a);yc = c + exp(c) - 2;牛顿迭代法程序:计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:function [y] = func1(x)y = x + exp(x) - 2;end迭代算法:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;%num为迭代次数break;endendc=p0;第2题:由题意得到算式:计算调用函数:[c,num]=newton(@func2,0.02,1e-8)程序:先用画图法估计出大概零点位置在0.02附近。
牛顿迭代、割线法、二分法算法实验报告
三、牛顿法计算实验
3.1 牛顿法算法思想和简要描述 我们有一个函数 f,其零点由数值计算得出,设 r 是 f 的一个零点,x 是 r 的一个近似。若 f 的二阶导数存在并且连续,则有泰勒定理,得 0=f(r)=f(x+h)=f(x)+hf ’(x)+o(h^2) 其中 h=r-x。若 h 较小(即 x 在 r 附近) ,则有理由略去 o(h^2)项并且 在余下方程中求 h。即得到 h=-f(x)/f ’(x)。故 x-f(x)/f ’(x)是比 x 更好的一个 近似。牛顿法从 r 的一个估计 x0 开始,得到更加准确的近似值 xn。递推 式定义为: f(xn ) xn+1 = xn − ′ f (xn ) 3.2 MATLAB 运行牛顿法程序 牛顿法求解 f=x^3-9 的根 参数设置:x0 设置为函数 f 零点的近似。 n 设置为牛顿法 for 语句迭代次数。 alpha 设置为最后结果 f(x)的精度。 delta 设置为最后结果 x 的精度。 (若 alpha,delta 都符合设置的计算精度时,结束迭代并得 出计算结果,否则一直迭代到 n 次) 设置初始值:设置参数 x0 分别为为 3;迭代次数 n 为 50 次;alpha 和 delta 都设置为 0.001。 列出计算结果: >> newton(f,50,3,0.001,0.001) n x f(x) delta alpha 1.0000 2.3333 3.7037 0.6667 3.7037 2.0000 2.1066 0.3483 0.2268 0.3483 3.0000 2.0804 0.0043 0.0262 0.0043 Elapsed time is 0.166680 seconds.
4.0000 2.0625 2.1250 5.0000 2.0625 2.0938 6.0000 2.0781 2.0938 7.0000 2.0781 2.0859 8.0000 2.0781 2.0820 9.0000 2.0801 2.0820 10.0000 2.0801 2.0811 11.0000 2.0801 2.0806 12.0000 2.0801 2.0803 13.0000 2.0801 2.0802 14.0000 2.0801 2.0801 elapsed time is 0.316426 seconds.
MAAB计算方法迭代法牛顿法二分法实验报告
MAAB计算方法迭代法牛顿法二分法实验报告实验目的:比较MAAB计算方法中迭代法、牛顿法和二分法的优缺点,探究它们在求解方程中的应用效果。
实验原理:1、迭代法:将方程转化为x=f(x)的形式,通过不断迭代逼近方程的根。
2、牛顿法:利用函数在特定点的切线逼近根的位置,通过不断迭代找到方程的根。
3、二分法:利用函数值在区间两端的异号性质,通过不断二分缩小区间,最终逼近方程的根。
实验步骤:1、选择一元方程进行求解,并根据方程选择不同的计算方法。
2、在迭代法中,根据给定的初始值和迭代公式,进行迭代计算,直到满足预设的迭代精度要求。
3、在牛顿法中,选择初始点,并根据切线方程进行迭代计算,直到满足预设的迭代精度要求。
4、在二分法中,选择区间,并根据函数值的异号性质进行二分,直到满足预设的迭代精度要求。
5、根据计算结果,比较三种方法的求解效果,包括迭代次数、计算时间、求解精度等指标。
实验结果与分析:通过对多个方程进行测试,得到了以下实验结果:1、迭代法的优点是简单易懂,适用范围广,但当迭代公式不收敛时会导致计算结果不准确。
2、牛顿法的优点是收敛速度较快,但需要计算函数的一阶导数和二阶导数,对于复杂函数较难求解。
3、二分法的优点是收敛性较好,不需要导数信息,但收敛速度较慢。
4、对于线性方程和非线性方程的求解,牛顿法和迭代法通常比二分法更快速收敛。
5、对于多重根的方程,二分法没有明显优势,而牛顿法和迭代法能更好地逼近根的位置。
6、在不同的方程和初值选择下,三种方法的迭代次数和求解精度略有差异。
7、在时间效率方面,二分法在收敛速度较慢的同时,迭代次数较少,牛顿法在收敛速度较快的同时,迭代次数较多,而迭代法对于不同方程有较好的平衡。
结论:1、对于不同类型的方程求解,可以根据具体情况选择合适的计算方法。
2、迭代法、牛顿法和二分法各有优缺点,没有绝对的最优方法,需要权衡各种因素选择最适合的方法。
3、在实际应用中,可以根据方程的特点和精度要求综合考虑不同方法的优劣势,以获得较好的求解效果。
牛顿法的实现实验报告
《机器学习》课程实验报告实验:牛顿法的实现姓名:彭文婷专业:生物技术学号:20132123012015年5月5日一、 实验内容1. 构建有效迭代公式求1020x e x +-=的解。
2. 利用牛顿法求上述方程的解。
二、 实验结果及分析1.迭代公式为X=(2-e x )/10由于e^x 大于0,则2-10x 大于0,则x 小于0.2X 小于0时,0小于e^x 小于1, 2-10x 大于2因此【0,0.2】为有根区间取初始值X 0=0X1=0.1X2=0.089482908X3=0.090639136X4=0.090512617X5=0.090526468X6=0.090524952X7=0.090525118X8=0.090525019因为X8-X7≤10-6所以X=0.0905250192.牛顿法函数为f (x) = e x +10x-2一阶导数为f ’(x )= e x +10Xn+1 = Xn-f(Xn)/f ’(Xn) = Xn-(e Xn +10Xn-2)/(e Xn +10)初始值X0=0X1=0.090909091X2=0.090525108X3=0.090525101因为X3-X2≤10-6所以X=0.090525101分析:迭代法关键在于选取收敛的迭代公式和选取适当的初始值,而牛顿法更为优化,收敛速度快。
但二者都只能得出局部最优解。
三.实验总结通过练习对迭代法和牛顿法有了更深刻的理解,原本使用计算器算的,但输入过于繁琐,后来在Excel中编辑公式计算简便了很多,但要实现计算机自动计算程还是十分困难,在以后的学习中应尽快掌握C语言编程技能。
数学数学实验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 !!!欢迎您的下载,资料仅供参考!。
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],再进行下一轮的计算。
直到新的区间的长度小于规定的误差阈值为止。
本实验将通过对复杂方程的二分计算来评估二分法的性能。
三、实验结果通过对一系列测试函数的计算,我们得到了迭代法、牛顿法和二分法的计算结果,并进行了比较。
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迭代公式中,程。
数值分析 数值分析 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++)
牛顿迭代上机实习报告
实习报告一、实验目的通过上机实习,利用计算机编程进行数值分析课程中关于牛顿迭代法的求解。
由于所需迭代次数较多、数据运算复杂,手工求解非常困难甚至无法进行,通过计算机编程实现相应的算法可以大大提高计算效率和准确率。
二、实验原理牛顿法是求方程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. 比较不同方法计算π的精度和效率。
二、实验原理π(派)是一个数学常数,表示圆的周长与直径的比值。
在数学、物理、工程等领域中,π具有广泛的应用。
π的近似值通常取3.14159,但实际上π是一个无理数,其小数位数无限不循环。
本实验通过以下几种方法计算π的近似值:1. 牛顿迭代法2. 阿基米德法3. 蒙特卡洛法三、实验步骤1. 牛顿迭代法(1)选择初始值x0,通常取x0=3。
(2)根据牛顿迭代公式x1 = x0 - f(x0)/f'(x0)计算下一个近似值。
(3)重复步骤(2),直到满足精度要求。
2. 阿基米德法(1)在坐标轴上画一个半径为1的圆。
(2)画一个内接正六边形,计算其面积S1。
(3)画一个外切正六边形,计算其面积S2。
(4)计算π的近似值:π ≈ 6(S2 - S1)。
3. 蒙特卡洛法(1)在坐标轴上画一个半径为1的圆。
(2)随机生成N个点,计算其中落在圆内的点的数量M。
(3)计算π的近似值:π ≈ 4M/N。
四、实验结果与分析1. 牛顿迭代法选择初始值x0=3,精度要求为10^-6。
经过迭代,计算得到π的近似值为3.1415926535。
2. 阿基米德法选取内接正六边形的边长为1,外切正六边形的边长为2。
计算得到π的近似值为3.1415926535。
3. 蒙特卡洛法选取N=10000,计算得到π的近似值为3.1415926535。
三种方法计算得到的π近似值相差不大,但牛顿迭代法和阿基米德法在计算过程中具有较高的精度。
蒙特卡洛法虽然精度较低,但计算简单,适合大规模计算。
五、实验结论1. 本实验通过三种方法计算π的近似值,结果表明,牛顿迭代法和阿基米德法具有较高的精度。
2. 蒙特卡洛法虽然精度较低,但计算简单,适用于大规模计算。
3. π在数学、物理、工程等领域具有广泛的应用,掌握计算π的方法具有重要意义。
牛顿迭代法实验报告总结
一、实验目的本次实验旨在通过牛顿迭代法求解非线性方程的根,并分析牛顿迭代法的原理、过程、优缺点以及在实际应用中的表现。
二、实验原理牛顿迭代法,又称牛顿-拉弗森方法,是一种在实数域和复数域上近似求解方程的方法。
其基本思想是利用函数的一阶导数来寻找函数的零点,即函数的根。
设函数f(x)在x0附近连续可导,且f(x0)≠0,那么牛顿迭代法的迭代公式为:x_{n+1} = x_n - f(x_n) / f'(x_n)其中,x_n表示第n次迭代得到的近似根,f(x_n)表示函数在x_n处的函数值,f'(x_n)表示函数在x_n处的导数值。
三、实验过程1. 选择初始值:根据题目要求,选择一个接近方程根的初始值x0。
2. 迭代计算:根据牛顿迭代法公式,计算x1,x2,...,直到满足误差要求。
3. 误差分析:计算每次迭代后近似根与实际根之间的误差,分析迭代过程是否收敛。
四、实验结果与分析1. 实验结果:以方程f(x) = x^3 - 3x + 2 = 0为例,选取初始值x0 = 1,经过6次迭代后,近似根x6 ≈ 1.324718,实际根为x ≈ 1.324717957244746。
2. 结果分析:(1)收敛性:从实验结果可以看出,牛顿迭代法在求解方程f(x) = x^3 - 3x + 2 = 0时具有较好的收敛性。
(2)误差分析:通过计算迭代过程中的误差,可以观察到误差随着迭代次数的增加逐渐减小,说明牛顿迭代法具有较好的精度。
(3)迭代次数:在本次实验中,经过6次迭代即可达到误差要求,说明牛顿迭代法具有较高的效率。
(4)适用范围:牛顿迭代法适用于连续可导且导数不为零的函数,对于不可导或导数为零的函数,牛顿迭代法可能无法得到有效的解。
五、实验结论1. 牛顿迭代法是一种有效的求解非线性方程根的方法,具有较好的收敛性和精度。
2. 牛顿迭代法在实际应用中具有较高的效率,适用于求解连续可导且导数不为零的函数。
牛顿迭代法实验报告
用牛顿迭代法求方程的根一、 实验目的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次。
牛顿迭代法的实验报告
牛顿迭代法的实验报告牛顿迭代法是一种寻找函数零点的方法,它通过通过使用函数的导数来逼近实际零点。
在本实验中,我们使用了牛顿迭代法来求解一元高次方程的根。
实验目的:通过使用牛顿迭代法来求解一元高次方程的根,掌握牛顿迭代法的原理与应用。
实验器材与条件:- 电脑- 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。
此结果与理论值非常接近,表明我们使用牛顿迭代法正确地找到了方程的根。
牛顿迭代法实验报告
实验报告课程:数值计算方法与算法班级: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根据收敛准则,判断迭代结果是否满足收敛条件。
数值分析-牛顿迭代法
������ (������ )
方程 1:设f1 (x)=x������ -1
������
当∣ ������������ +1 − ������������ ∣≤ ������ =10−5 时停止循环
∴ ������������+1 = ������������ − ������ ������ ,k=0,1,2,3…… x������ +������
四、 实为 x=0.5671
方程 2:
所以得出结果为 x=1.7556
五、 说明与分析
牛顿迭代法公式:������������ +1 = ������������ − ������ (������ ������ ),k=0,1,2,3……
������
������ (������ )
对于方程 1,由于方程简单,并且初始值与最终值相差较小,所以迭代次数 也少,方法快捷、准确。 对于方程 2,因为涉及到对数并且初始值与最终值相差有一定距离,所以迭 代次数较多。 在以上两个方程的计算中,我发现初始值对牛顿迭代法影响很大。 牛顿迭代法在初始值接近于近似根处的迭代速度要比远离近似根初始值的 迭代速度快很多, 而且近似值和函数近似值要精确很多,所以在进行牛顿迭代法 进行根的近似求解时,初始值的选择非常重要。 牛顿迭代法能快速求出其他方法求不出或者难以求出的解,但牛顿迭代法计 算量比较大。因每次迭代除计算函数值外还要计算其他数据。
fprintf('The procedure was successful.') return else n=n+1; x0=x1;f0=f1; end end if n==N+1 fprintf('the method failed after N iterations. '), end 保存为:newton1.m 方程 1: fx='x-exp(-x)'; dfx='1+exp(-x)'; newton1(fx,dfx,.5,10^(-5),10) 方程 2: fx='log(10)+x-2'; dfx='log(10)/x+1'; newton1(fx,dfx,1.5,10^(-5),15)
牛顿迭代法
实验十七 牛顿迭代法【实验目的】1. 了解牛顿迭代法的基本概念。
2. 了解牛顿迭代法的收敛性和收敛速度。
3. 学习掌握MATLAB 软件有关的命令。
【实验内容】用牛顿迭代法求方程0123=-++x x x 的近似根,误差不超过310-。
【实验准备】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 -=+ 这就是著名的牛顿迭代公式,它相应的不动点方程为)(')()(x f x f x x g -=. 2. 牛顿迭代法的几何解析 在0x 处作曲线的切线,切线方程为))((')(000x x x f x f y -+=。
令0=y ,可得切线与x 轴的交点坐标)(')(0001x f x f x x -=,这就是牛顿法的迭代公式。
因此,牛顿法又称“切线法”。
图17.1 牛顿迭代法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.牛顿迭代法的收敛速度定理(牛顿法收敛定理) 设)(x f 在区间],[b a 上有二阶连续导数,且满足0)()(<b f a f ,)("x f 在],[b a 上不变号,)('x f 在],[b a 上不等于0,令,)("max ,)(min x f M x f m bx a b x a ≤≤≤≤== 有Mm a b 2<-.则对任意],[0b a x ∈,牛顿迭代格式收敛于0)(=x f 在],[b a 中的唯一实根*x ,并且: (1) .12,2*02*<-=≤-x x m M q q M m x x n n (2) .221*--≤-n n n x x mM x x (3) )('2)(")(lim **2**1x f x f x x x x nn n =--+∞→,牛顿迭代法为2阶收敛. 5.迭代过程的加速对不动点方程)(x g x =,它导出的迭代过程有可能发散,也可能收敛得非常缓慢.这时,我们有没有办法改进不动点方程,让迭代过程收敛得快一些呢?(1) 一个简单办法 注意到x x =和)(x g x =都是不动点方程,他们的加权平均x x g x h )1()()(λλ-+=也是不动点方程,而且)(x h 与)(x g 有完全相同的不动点.适当选取λ的值,可以使发散的迭代过程变得收敛,使收敛慢的迭代过程变得收敛迅速.(2)加速的原因 在下面的实验中我们可以看到,)(x h 在不动点*x 附近的导数值在很大程度上决定了迭代过程的收敛性.)('x h 的绝对值越小,收敛性越好.因此,选择λ使得0)('=x h .计算得到理想的λ值为)('11x g -=λ,相应可计算出)('1)(')()(x g x xg x g x h --=. (3) λ的选取 由于理想的λ值为)('11x g -=λ,当)('x g 变换不大时可以取)('0x g 近似计算λ.(4) 回到牛顿迭代法的讨论 为求解方程0)(=x f ,可以使用不动点方程)(x f x x +=,相应的迭代函数为)()(x f x x g +=.对)(x g 进行加速)(')()]('1[1)]('1[)]([)('1)(')()(x f x f x x f x f x x f x x g x xg x g x h -=+-+-+=--=, 所以,牛顿迭代法是对基本迭代格式进行加速的结果.6. 迭代的MATLAB 命令MATLAB 中主要用for, while 等控制流命令实现迭代.【实验方法与步骤】练习1 用牛顿迭代法求方程0123=-++x x x 在5.0=x 附近的近似根,误差不超过310-.牛顿迭代法的迭代函数为1231)(')()(223++-++-=-=x x x x x x x f x f x x g , 相应的MA TLAB 代码为:>>clear;>>x=0.5;>>for i=1:3>>x=x-(x^3+x^2+x-1)/(3*x^2+2*x+1)>>end可算得迭代数列的前3项0.5455, 0.5437, 0.5437.近三次迭代,就大大超过了精度要求.练习2用牛顿迭代法求方程)0(2>=a a x .的近似正实根,由此建立一种求平方根的计算方法.由计算可知,迭代格式为)(21)(x a x x g +=.,在实验12的练习4种已经进行了讨论. 练习3用牛顿迭代法求方程1=x xe 的正根.牛顿迭代法的迭代函数为,)1(1)(')()(x x ex xe x x f x f x x g +--=-= 如果取初值为00=x ,相应的MA TLAB 代码为:>>clear;>>x=0.0;>>for i=1:6>>x=x-(x*exp(x)-1)/((x+1)*exp(x))>>end可算得迭代数列的前6项1, 0.6839, 0.5775, 0.5672, 0.5671, 0.5671,说明迭代是收敛的.如果取初值为100=x ,相应的MA TLAB 代码为:>>clear;>>x=10.0;>>for i=1:20>>x=x-(x*exp(x)-1)/((x+1)*exp(x))>>end可算得迭代数列的前20项为9.0909, 8.1900, 7.2989, 6.4194, 5.5544, 4.7076, 3.8844, 3.0933, 2.3487, 1.6759,1.1195, 0.7453, 0.5902, 0.5676, 0.5671, 0.5671, 0.5671, 0.5671, 0.5671, 0.5671说明迭代是收敛的.如果取初值为10-=x ,或5.10-=x ,可算得(MATLAB 代码略去)迭代数列是发散的.请根据函数图形分析原因,练习4求方程x e x -=在5.0=x 附近的根,精确到510-.先直接使用x e x g -=)(的迭代格式, 相应的MA TLAB 代码为:>>n=0; eps=1.0e-5; x=0.5;>>while abs(x-exp(-x))>eps>>p(-x); n=n+1;>>end>>x, n结果为x= 0.5671, n = 17,说明迭代17次后达到精度要求.为加快收敛速度,用x x g x h )1()()(λλ-+=构造迭代格式,由实验的预备知识中可知取625.0)5.0('11≈-=g λ, 相应的MA TLAB 代码为: >>n=0; eps=1.0e-5; x=0.5;>>while abs(x-0.625*exp(-x)-0.375*x)>eps>>x=0.625*exp(-x)+0.375*x; n=n+1;>>end>>x, n结果为x= 0.5671, n = 3,说明迭代3次后达到精度要求..练习5对练习中方程x e x -=,用加快后的迭代格式)('1)(')()(x g x xg x g x h --=求在5.0=x 附近的根,精确到510-. 计算可得xxe e x x g x xg x g x h --++=--=1)1()('1)(')()(, 相应的MATLAB 代码为: >>n=0; eps=1.0e-5; x=0.5;>>while abs(x-(x+1)*exp(-x)/(1+exp(-x)))>eps>>x=(x+1)*exp(-x)/(1+exp(-x)); n=n+1;>>end>>x, n结果为x= 0.5671, n =2,说明迭代2次后达到精度要求.【练习与思考】1. 用牛顿迭代法求方程1ln =x x 的近似根.2. 为求出方程013=--x x 的根,在区间]2,1[内使用迭代函数进行迭代,记录迭代数据,问迭代是否收敛?对迭代进行加速,对比加速前的数据,比较加速效果.3. 使用在不动点*x 的泰勒公式,证明牛顿迭代法收敛定理.。
牛顿迭代法实训总结
牛顿迭代法实训总结一、实验目的及原理通过上述牛顿迭代法实验,我们可以观察到水力坡度不仅与径向压强有关,而且还与径向剪应力和切向压强有关。
因此,当对水流进行控制时,我们必须将切向压强及径向剪应力综合考虑。
设想,将水流分为上下两层:上层为较小面积的稳定层;下层为较大面积的运动层。
如图1所示,在实际工程中,人们往往把稳定层作为输水管道的中间部分。
同时,也会在稳定层内增设一定厚度的保护层,这样可以使运动层承受一部分径向压强,而运动层内的流体又被稳定层阻挡,从而使其不能全部流出。
3))按步骤实验并记录数据,得出实验结论。
1)检查设备,了解仪器的名称、功能及用途。
2)将一支标准刻度的水压力表1支,装满标准容积的量筒2只,并注明它们的正确读数。
3)称取0。
5ln 水于两只量筒中,同时记录正确读数。
在该实验中,选择“ 0。
5— 0。
9”的一段量筒,利用它与固定管直径之比,即可调节管道的水力坡度。
4)将“ 0。
5— 0。
9”的那段量筒移至管内另一端,再次将量筒水位记录于“ 0。
5— 0。
9”处,使其“水头”恰等于管道上游最高水位加“上游水头”,此时,该段量筒就成为正确的“测量杯”。
4)设计方案,测定并记录水力坡度实验时,首先应确定被测定的水力坡度( 0。
02~0。
04)。
其次,要选择合适的管道口径,以便选用合适的刻度水压表。
一般应根据所需水头,使测定的值为工程需要的最小坡度。
5)在安全的前提下,尽可能采用多个刻度水压表。
如图2所示,将一支带有圆弧形的长柄直尺(或三角尺)装在水压力表上,将“水头”标在圆弧形水压力表下方,通过改变量尺长度的方法,使量尺圆弧半径依次变大,由此得到相应的水力坡度。
这种量尺叫做“百分表”。
如果水压力表是可调节式的,则可以通过改变量尺圆弧半径,来改变量尺水头高度,以改变水力坡度。
5)处理数据,绘出图象。
6)按步骤实验并记录数据,得出实验结论。
1)检查设备,了解仪器的名称、功能及用途。
MAAB计算方法迭代法牛顿法二分法实验报告
姓名 实验报告成绩评语:指导教师(签名) 年 月 日 说明:指导教师评分后,实验报告交院(系)办公室保存。
实验一 方程求根一、 实验目的用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。
并比较方法的优劣。
二、 实验原理(1)、二分法对方程0)(=x f 在[a ,b]内求根。
将所给区间二分,在分点2a b x -=判断是否0)(=x f ;若是,则有根2ab x -=。
否则,继续判断是否0)()(<•x f a f ,若是,则令x b =,否则令x a =。
否则令x a =。
重复此过程直至求出方程0)(=x f 在[a,b]中的近似根为止。
(2)、迭代法将方程0)(=x f 等价变换为x =ψ(x )形式,并建立相应的迭代公式=+1k x ψ(x )。
(3)、牛顿法若已知方程 的一个近似根0x ,则函数在点0x 附近可用一阶泰勒多项式))((')()(0001x x x f x f x p -+=来近似,因此方程0)(=x f 可近似表示为+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(')(00x f x f 。
取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。
迭代公式为:=+1k x -0x )(')(k k x f x f 。
三、 实验设备:MATLAB 7.0软件四、 结果预测 (1)11x =0.09033 (2)5x =0.09052 (3)2x =0,09052五、 实验内容(1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超过3105.0-⨯。
(2)、取初值00=x ,用迭代公式=+1k x -0x )(')(k k x f x f ,求方程0210=-+x e x 的近似根。
要求误差不超过3105.0-⨯。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
牛顿迭代法实验报告
1.功能
本程序采用牛顿法,求实系数高次代数方程
f(x)=a0x n+a1x n-1+…+a n-1x+a n=0(a n≠0)(1)
的在初始值x0附近的一个根。
2.使用说明
(1)函数语句
Y=NEWTON_1(A,N,X0,NN,EPS1)
调用M文件newton_1.m。
(2)参数说明
A n+1元素的一维实数组,输入参数,按升幂存放方程系数。
N整变量,输入参数,方程阶数。
X0 实变量,输入参数,初始迭代值。
NN整变量,输入参数,允许的最大迭代次数。
EPS1实变量,输入参数,控制根的精度。
3.方法简介
解非线性议程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。
把f(x)在x0点附近展开成泰勒级数
f(x)=f(x0)+(x-x0)fˊ(x0)+(x-x0)2
!2)
(0x
f''
+…
取其线性部分,作为非线性方程f(x)=0的近似方程,则有
f(x0)+fˊ(x0)(x-x0)=0
设fˊ(x0)≠0则其解为
x1=x0-f(x0)/fˊ(x0)
再把f(x)在x1附近展开成泰勒级数,也取其线性部分作f(x)=0的近似方程。
若f(x1)≠0,则得
x2=x1-f(x1)/fˊ(x1)
这样,得到牛顿法的一个迭代序列
x n+1=x n-f(x n)/fˊ(x n)
4.newton_1.m程序
function y=newton_1(a,n,x0,nn,eps1)
x(1)=x0;
b=1;
i=1;
while(abs(b)>eps1*x(i))
i=i+1;
x(i)=x(i-1)-n_f(a,n,x(i-1))/n_df(a,n,x(i-1));
b=x(i)-x(i-1);
if(i>nn)error(ˊnn is fullˊ);
return;
end
end
y=x(i);
i
5.程序附注
(1)程序中调用n_f.m和n_df.m文件。
n_f.m是待求根的实数代数方程的函数,n_df.m 是方程一阶导数的函数。
由使用者自己编写。
(2)牛顿迭代法的收敛速度:如果f(x)在零点附近存在连续的二阶微商,ξ是f(x)的一个重零点,且初始值x0充分接近于ξ,那么牛顿迭代是收敛的,其收敛速度是二阶的,即平方收敛速度。
6.例题
用牛顿法求下面方程的根
f(x)=x3+2x2+10x-20
7.运行结果
>>a=[1,2,10,-20] ;
>>n=3;
>>x0=1;
>>nn=1000;
>>eps1=1e-8;
>>y=newton_1(a,n,x0,nn,eps1)
y=
1.368808107821373e+000
i=
6
程序中调用的n_f.m和n_df.m文件如下:
function y=n_f(a,n,x)
y=0.0;
for i=(n+1)(n+1)
y=y+a(i)*xˆ(n+1-i);
end
function y=n_df(a,n,x)
y=0.0;
for i=1:n
y=y+a(i)*(n+1-i)*xˆ(n-i);
end
参考文献:
张培强. MA TLAB语言---演算纸式的科学工程语言. 合肥:中国科技大学出版社,1995。