数值计算实验:牛顿迭代法求根

合集下载

使用牛顿迭代法求解平方根

使用牛顿迭代法求解平方根

使用牛顿迭代法求解平方根牛顿迭代法是一种用于求解方程的数值方法,它可以用来近似求解平方根。

本文将介绍牛顿迭代法的原理和步骤,并通过一个简单的示例来说明其应用。

牛顿迭代法的基本思想是通过不断逼近函数的零点来求解方程。

对于求解平方根的问题,我们可以将其转化为求解方程f(x) = x^2 - a = 0的根,其中a为待求平方根的数。

我们需要选择一个初始点x0作为迭代的起点。

然后,通过牛顿迭代公式x = x0 - f(x0)/f'(x0)来计算下一个近似解x1,其中f'(x)表示函数f(x)的导数。

这个公式的意义是用切线与x轴的交点作为下一个近似解。

接下来,我们用x1作为新的起点,再次应用迭代公式计算x2。

不断重复这个过程,直到我们得到一个满足精度要求的近似解。

下面,通过一个具体的例子来演示牛顿迭代法的求解过程。

假设我们要求解的平方根是2,我们可以选择初始点x0 = 1作为起点。

我们计算f(x0)和f'(x0)的值。

代入f(x) = x^2 - 2的表达式,我们得到f(1) = 1^2 - 2 = -1和f'(1) = 2。

然后,代入牛顿迭代公式,得到x1 = 1 - (-1)/2 = 1.5。

接着,我们计算f(x1)的值,代入f(1.5) = 1.5^2 - 2 = 0.25。

由于f(x1)的值不满足精度要求,我们继续迭代。

以x1作为新的起点,计算f(x1)和f'(x1)的值。

代入公式,得到x2 = 1.5 - 0.25/2 = 1.375。

计算f(x2)的值,代入f(1.375) = 1.375^2 - 2 = -0.140625。

再次迭代,以x2作为新的起点,计算f(x2)和f'(x2)的值。

代入公式,得到x3 = 1.375 - (-0.140625)/2 = 1.4140625。

计算f(x3)的值,代入f(1.4140625) = 1.4140625^2 - 2 = -0.0009765625。

数学数学实验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法具有局部收敛性,所以在实际问题中,当实际问题本身能提供接近于根的初始近似值时,就可保证迭代序列收敛,但当初值难以确定时,迭代序列就不一定收敛。

二分法、牛顿迭代法、普通迭代法

二分法、牛顿迭代法、普通迭代法

数值球根试验报告《数值计算方法》专业班级软件08-1姓名熊文成学号08083117时间2010年10月24日星期天一、 实验目的熟悉二分法以及牛顿迭代法求方程近似根的数值方法,掌握各种迭代方法,自己扩张研究迭代法的效率与收敛性和初始值的关系。

二、 实验内容1.已知0104)(23=-+=x x x f 在[]21,上有一个实根*x ,14)2(5)1(=-=f f ,,用二分法和牛顿迭代法求该实根,要求精度满足条件:321*1021-+⨯≤-k x x 。

2.条件允许的话,扩展研究各种迭代法的效率,以及迭代的效率和收敛性与初始值的关系,并通过比较采用两点加速的方法与普通的方法的效率体验加速迭代的优点。

总而言之,本实验中的用到的求根方法有①二分法,②牛顿迭代法,③迭代函数为213)10(21)(x x -=ϕ的迭代方法,以及④对函数213)10(21)(x x -=ϕ采用两点加速迭代的方法。

三、 主函数流程程序是按顺序运行的,流程图如下图所示:四、源程序#include <stdio.h>#include <conio.h>#include <math.h>//根据x的值计算函数值//函数f(x)=x*x*x+4*x*x-10double func(double x){double value;value=x*x*x+4*x*x-10;return value;}//根据参数x的值计算函数f(x)的导数值double divFunc(double x){return 3*x*x+8*x;}//二分法计算方程f(x)=0在[1,2]上的跟//二份迭代结束条件由参数precision精度给出void biSectionMethod(double precision){int k=0; //均分次数double x1=1.0,x2=2.0; //区间[1.0,2.0]double midx; //二分之后的值printf("\n\t k 有根区间k+1 f(x(k+1)) ");do{printf("\n\t%3d",k);printf(" [%.3f,%.3f]",x1,x2);midx=(x1+x2)/2;printf(" %f",midx);printf(" %.6f",func(midx));if (func(midx)<0)x1=midx;else x2=midx;k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>=precision); //区间的长度超过5e-3就一直迭代printf("\n\t二分法分区间的次数:%d,所求的根是:%lf",k-1,x2);}//牛顿迭代法//根据初值值x0,在区间[1.0,2.0]上迭代求根//迭代次数由参数precision精度决定void NewTonMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=x2-func(x1)/divFunc(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t牛顿迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//迭代函数g(x)=(sqrt(10-x*x*x))/2;double funcTwo(double x){return (sqrt(10-x*x*x))/2;}//普通迭代函数void ordinaMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=funcTwo(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t普通迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//使用两个跌代值的组合加速跌代//对迭代函数f(x)=(sqrt(10-x*x*x))/2的加速void twoValue(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=(funcTwo(x1)+x1)/2;if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t两点加速迭代初值:%lf,次数:%d,根:%lf",x0,k,x2);}void main(){double orgin=1.5; //初始值double precision=5e-6; //精度char sel=0; //操作符while(1){printf("\n\t选择:");printf("\n\t1.二分法\n\t2.迭代法\n\t");sel=getch();printf("\n\n\t注:程序停止处按任意键继续");if (sel=='1'){printf("\n\n\t ************二分法求解过程***********");biSectionMethod(precision); //测试函数}else{printf("\n\t输入迭代的初值:");scanf("%lf",&orgin);//if (orgin>2.0||orgin<1.0) //限制迭代初值范围,根据情况决定//orgin=1.5; //如果输入非法,则按1.5计算printf("\n\n\t ************牛顿迭代法求解过程************");NewTonMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t *******普通迭代g(x)=(sqrt(10-x*x*x))/2*****");ordinaMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t ************两个值组合加速迭代x=(g(x)+x)/2***********");twoValue(orgin,precision);}printf("\n\t任何键继续:");getch();}}五、运行结果1、选择求根方法2、 选择二分法下面给出二分法的结果:3、 选择迭代法查看结果:首先显示的是牛顿迭代法的结果:然后是普通迭代法函数是:213)10(21)(x x -=ϕ,结果如下:接着可以看到的是用两点加速法对函数213)10(21)(x x -=ϕ的加速:下面采用不同的初值查看普通迭代函数的收敛性与效率: 各个结果如下:上图对应的是收敛性:收敛的。

实验五 用Newton法计算方程的根

实验五 用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)的导函数。

牛顿迭代法求方程x^3+2=0的根

牛顿迭代法求方程x^3+2=0的根
新建参数 r = 0.00001 、 p0 = 0 ,使当点 z 与点 z − f ( z ) / f '( z ) 间的距离首 次小于误差 r 时停止迭代,此时的点 z 就是 f ( z ) = 0 的近似解。为了记录停止
2 2 2 迭代时的迭代次数,我们计算 sgn(1 + sgn( x # + y # − r )) , 设标签为 p , 计算
第 3 页 共 3 页
近似解的精度。 在复数集中, 求可导函数 w = f ( z ) 的复数零点, 可类似地通过作复平面上 的迭代 z → z − f ( z ) / f '( z ) ,便可找到所有复数零点。使用特殊的扫描方法, 扫描出来的图形,在三个复根两两间的边界处,会呈现出漂亮的“项链”, 这就是著名的牛顿分形。
H、S;计算 1-S
0.01
0.5
,设标签为 V。依次选中 H、S、V 和点 Z,对点 Z 进行着
色 HSV,设此色点为 Z HSV ,并作颜色变换 Z → Z HSV 。改 n=50,作扫描框并
3 0 的牛顿分形图(如下左 对扫描线施行颜色变换 Z → Z HSV , 跟踪扫描得 z + 2 =
图)。选择“项链”从右边第 2 个环放大 5.5 倍,得下右图。
及其与 x 轴的交点, ……这样重复下去得到的 x 轴上的一列点, 且此点列无限 趋近于函数 y = f ( x) 的零点。
第 1 页 共 3 页
新建参数 n=2, 以 n 为深度作 A→B 的完整迭代, 选中 B 的迭代像求迭代
3 0 近似解。增加 n 的值便增加 终点 D,度量 D 的横坐标 xD ,即方程的 x + 2 =
) x3 + 2 为例,在 x 轴上图象的零点附近任取一点 A,度量出 A 的横坐 以 f ( x= y A + f '( x A )( x − x A ) 与 x 轴的交点 B,同法度量出 B 标,作出 f ( x) 的切线 y = x A − f ( x A ) / f '( x A ) ),再作切线 的横坐标(也可以在切线方程中令 y=0,得 x= B

matlab牛顿迭代法算重根

matlab牛顿迭代法算重根

一、简介Matlab是一种十分常用的科学计算软件,其功能强大,可以进行各种数值计算、数据分析和可视化操作。

而牛顿迭代法是一种用于求解方程的数值算法,可以有效地计算出函数的根。

本文将重点介绍如何使用Matlab进行牛顿迭代法来计算重根。

二、牛顿迭代法原理1. 牛顿迭代法是一种迭代逼近的方法,通过不断迭代得到更接近函数零点的近似值。

其公式如下:X_{n+1} = X_n - \frac{f(X_n)}{f'(X_n)}其中,X_{n+1}为下一次迭代的近似值,X_n为当前的近似值,f(X)为函数值,f'(X)为函数的导数值。

2. 牛顿迭代法的优点是收敛速度快,而缺点是对初始值的选择敏感,可能会产生不收敛的情况。

三、在Matlab中使用牛顿迭代法1. 在Matlab中,可以使用内置的函数`fzero`来进行牛顿迭代法的计算。

其语法如下:x = fzero(fun,x0)其中,fun为要求解的函数句柄,x0为起始点的初始值,x为函数的根。

2. 需要注意的是,在使用`fzero`函数时,需要提供函数的句柄,即在Matlab中定义要求解的函数,并使用`(x)`符号来表示函数的自变量。

另外,还需要提供初始值x0,可以根据具体问题来选择较为合适的初始值。

3. 以下是一个简单的使用牛顿迭代法求解函数根的示例代码:```matlabf = (x) x^3 - 2*x - 5;x0 = 2;x = fzero(f, x0);disp(x);```四、示例接下来,我们将通过一个具体的示例来演示如何使用Matlab的牛顿迭代法来计算重根。

1. 问题描述假设有如下方程:f(x) = x^3 - 2x^2 + 3x - 6我们希望使用牛顿迭代法来计算函数f(x)的重根。

2. 解决过程在Matlab中定义函数f(x):```matlabf = (x) x^3 - 2*x^2 + 3*x - 6;```选择初始值x0,并利用`fzero`函数进行牛顿迭代法的计算:```matlabx0 = 2;x = fzero(f, x0);disp(x);```3. 结果分析经过计算,可以得到函数f(x)的一个重根为x=2.这样,我们就成功地使用Matlab的牛顿迭代法来计算重根。

数值计算迭代法

数值计算迭代法

习题二3、证明:当X 0=1.5时,迭代法X k+1=Xk +410和X k+1=21k X 310-都收敛于方程f(x)=x 3+4x 2-10=0在区间[1,2]内唯一实根x *,并分别用上述迭代法求满足于精度要求︱X k+1-X k ︱≤10-5的近似根。

解:证明:{先用迭代法求f(x)=x 3+4x 2-10=0的根。

(a )对x 3+4x 2-10=0变形有:4x 2=10-x 3所以:X=21310X - 则相应的迭代公式为:X k+1=21k X 310- 取:X 0=1.5,根据计算可以看出看,我们认为得到的迭代序列是收敛的。

}(此行可忽略){ 由 f(x)=x 3+4x 2-10=0得迭代方程:X=21310X -=g (x ) 先证明在区间【1,2】上x=g (x )有实根。

由于[1,2]上g ‘(x )存在,所以g (x )连续。

作Q (x )=x-g(x),则Q(x)在[1,2]上也连续。

由定理1条件2有:Q (1)=1-g (1)≤0,Q (,2)=1-g (2)≥0故存在x *∈[1,2]使Q *(x )=0,即x *= Q *(x )又因为,x *是方程f(x)=x 3+4x 2-10=0在区间[1,2]内的唯一实根,(由定理一条件2)对任意的x 0∈[1,2]时,X k ∈[1,2](k=0,1,2,3…)因为:x *- X k+1=g (x *)-g (X k )=g ‘(h k )(x *- X k )故由条件1知:︱X *-X k+1︱≤L ︱X *-X k ︱(k=0,1,2,3…)于是有:0≤︱X *-X k ︱≤L k ︱X *-X 0︱,0<L <1,立即可知:lim (k 趋于无穷)︱X *-X k ︱=0,从而lim (k 趋于无穷)X k= X *。

所以当X 0=1.5时,迭代法X k+1=Xk +410和X k+1=21k X 310-都是由迭代法X k+1=g (X k )产生的迭代序列{ X k }收敛于方程f(x)=x 3+4x 2-10=0在区间[1,2]内唯一实根x *。

牛顿迭代法实验课件

牛顿迭代法实验课件

05
结论与展望
牛顿迭代法的优缺点总结
收敛速度快
牛顿迭代法在初始点接近真实根的情况下具有非常快的收敛速度。
适用于多维问题
可以推广到多维问题,通过引入更多的方程和变量来求解复杂的问题。
牛顿迭代法的优缺点总结
• 适用于非线性问题:能够处理非线性方程 的求解问题,这是许多其他方法无法做到 的。
牛顿迭代法的优缺点总结
初始值影响
初始值对迭代结果有一定影响,但只要在合理范围内,最终都能 收敛到正确解。
结果误差分析
绝对误差
(|x - x_{true}| = 0.00002698)
相对误差
(frac{|x - x_{true}|}{|x_{true}|} = 0.0027%)
误差来源
主要来源于舍入误差和计算过程中的近似处理。
牛顿迭代法实验课件
目录
• 引言 • 牛顿迭代法的基本原理 • 牛顿迭代法的实现步骤 • 实验结果与分析 • 结论与展望
01
引言
牛顿迭代法的定义
牛顿迭代法是一种数值计算方法,通 过迭代的方式求解非线性方程的根。
它基于牛顿定理,即函数在某点的切 线与x轴的交点即为该函数的根。
牛顿迭代法的应用场景
在金融领域的应用
牛顿迭代法可以用于求解金融领 域中的复杂模型和优化问题,例 如资产定价和风险管理。
在工程领域的应用
牛顿迭代法可以用于求解各种工 程领域的优化问题,例如结构分 析和控制系统设计。
感谢您的观看
THANKS
通过改进初始点的选择方法,提 高迭代过程的成功率和收敛速度。
在迭代过程中引入阻尼因子,以 避免迭代过程在鞍点处停滞不前。
根据迭代过程中的误差信息,自 适应地调整步长,以提高收敛速 度和稳定性。

牛顿求根法计算

牛顿求根法计算

x→2x/3+(x2-y2)/[3(x2+y2)2], y→2y/3-2xy/[3(x2+y2)2]
三、实验程序 N=160; warning off [X,Y]=meshgrid((-N:N)/N*2); [m,n]=find(X==0&Y==0); X(m,n)=1; Y(m,n)=1; R=zeros(321); G=R; B=R; for k=1:30; Xn=2*X/3+(X.^2-Y.^2)./(3*(X.^2+Y.^2)); Yn=2*Y/3-2*X.*Y./(3*(X.^2+Y.^2)); X=Xn; Y=Yn; end R(X>0.8)=1; G(Y<-0.5)=1; B(Y>0.5)=1; imshow(cat(3,R,G,B)) 四、实验数据结果及分析 程序运行后,图形如下:
牛顿求根法计算
20020801027 李生寿 一、问题叙述 求代数方程 f(x)=0 的精确解是很难的事情,特别地当 f(x)是 高于 5 次的多项式时, 不能通过多项式系数的有限次运算得到根的表达式。 在这种情况下求方程的近似解却是可以 的,牛顿法就是一种比较好的逐次逼近法。以 f(x)=x3-1 为例,用牛顿法生成分形图形。 二、问题分析 首先猜测一个值 x1,用它近似方程的根 c,用过(x1,f(x1))点的切线 y=f(x1)+f’(x1)(x-x1)近似代替曲线 f(x),然后用切线方程 y=f(x1)+f’(x1)(x-x1)=0 的 根 x=x2=x1-f(x1)/f’(x1)近似代替曲线方程的根 c,这样就得到 c 的第二个近似值。 依此类 推可得到迭代公式。 在复平面上选定一个区域,对于任意初始点(除去(0,0)点),讨论它在牛顿法迭代过程 中的行为。一般选 f(x)=xp-1,其中 p 是大于 2 的正整数。这样,迭代公式还可以 改写为对 于 x3-1=0,有三个根:x1=1,x2=[-1+SQR(3)i]/2,x3=[-1-SQR(3)i]/2,三个根均匀地分布 在单位圆上。迭代过程要先将复数分解为实部和虚部:

第二次实验报告(非线性方程求根)

第二次实验报告(非线性方程求根)

班级: 学号: 姓名: 成绩:实验2 非线性方程的数值解法实验1实验目的1)进一步熟练掌握求解非线性方程的牛顿迭代法和弦截法。

2)根据牛顿迭代法和弦截法的原理,编写程序求解非线性方程,提高编程解决问题的能力。

2 实验内容(1)用牛顿法和割线法求下列方程的根x^2-e^x=0;x*e^x-1=0;(23实验原理(1)牛顿迭代公式:1()/'()k k k k x x f x f x +=- 双点弦法公式:111()()()()k k k k k k k f x x x x x f x f x +--=--- (2)令2()f x x A =-,再用牛顿法求根。

4实验步骤1)根据牛顿迭代法,双点弦法的算法编写相应的求根函数;2)用牛顿迭代法和双点弦法分别对方程进行求解;5 程序设计牛顿迭代法x0=1.0;N=100;k=0;eps=5e-6;delta=1e-6;while(1)x1=x0-fc1(x0)/fc2(x0);k=k+1;if k>Ndisp('Newton method failed')breakendif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endx0=x1;endfprintf('%f',x0)fprintf('%f',abs(fc1(x1)))双点弦法function cutline(x0,x1)N=100;k=0;delta=5e-8;while(1)(abs(x1-x0)>=delta)c=x1;x1=cutnext(x0,x1);x0=c;k=k+1;if k>Ndisp('Cutline method failed')break;endif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endendfprintf('%10f\n',x1);function y=cutnext(a,b)y=b-fc(b)/(fc(b)-fc(a))*(b-a);1)原函数function fc1=fc1(x)fc1=x^2-exp(x);end导函数function fc2=fc2(x)fc2=2*x-exp(x);end2)原函数导函数3)原函数导函数6实验结果及分析注:牛顿迭代法由于设置delta=1e-6,所以算出的误差e<1.0*10^-6;割线法由于设置delta=5e-8,所以误差e<5.0*10^-8.7总结。

牛顿迭代法实验报告

牛顿迭代法实验报告

用牛顿迭代法求方程的根一、 实验目的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次。

牛顿迭代法解方程的根

牛顿迭代法解方程的根

北方民族大学学生上机报告课程名称数值计算方法上机名称牛顿迭代法求方程的根院系数学与信息科学学院专业数学与应用数学班级12级应数2班第组组长周海龙同组成员周海龙上机日期2014.6成绩第 次上机一、 上机目的进一步了解掌握牛顿迭代法求方程的根算法的设计思路和算法流程,培养动手实践能力和分析能力。

二、 上机内容(问题描述)第一部分: 牛顿迭代法求方程的根10(B 类)、利用迭代法求解32310x x +-=的全部根,要求绝对误差限小于81102-⨯(先确定含根区间,然后构造迭代公式进行求解)三、算法描述(流程图)四、上机程序function [k,x,wuca,yx]=newton(x0,tol) k=1;x1=x0-fun(x0)/fun1(x0);disp('x=')while abs(x1-x0)>tolx0=x1;k=k+1;x1=x0-fun(x0)/fun1(x0);disp(x1)endk;x=x1;wuca=abs(x1-x0)/2;yx=fun(x);end%分程序1:function y1=fun(x)y1=x^3+3*x^2-1;end%分程序2:function y2=fun1(x)%函数fun(x)的导数y2=3*x^2+6*x;end%调用函数输入数据x0=1.0;xr=-2.5;xp=-0.5;tol=0.5*10^-8;[k,x,wuca,yx]=newton(x0,tol) [k,x,wuca,yx]=newton(xr,tol) [k,x,wuca,yx]=newton(xp,tol) 五、运行结果x=0.54860.53240.53210.53210.53216x =0.5321 wuca =5.9952e-015 yx =2.2204e-016x=-2.9009-2.8797-2.8794-2.8794-2.8794k =6x =-2.8794 wuca =2.6645e-015-3.5527e-015x=-0.6528-0.6527-0.6527k =4x =-0.6527 wuca =1.0850e-009 yx =-1.1102e-016。

(完整word版)数值分析报告-二分法和牛顿法方程求根(word文档良心出品)

(完整word版)数值分析报告-二分法和牛顿法方程求根(word文档良心出品)

《数值分析》实验报告一**: **学号: PB********实验一一、实验名称方程求根二、实验目的与要求:通过对二分法和牛顿法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;比较二者的计算速度和计算精度。

三、实验内容:通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点 。

(一)二分法算法:给定区间[a,b],并设f (a )与f (b )符号相反,取δ为根的容许误差,ε为值的容许误差。

(1)令c=(a+b)/2(2)如果(c-a)< δ或)(c f <ε,则输出c ,结束;否则执行(3)(3)如果f(a)f(c)<0,则令)()(,c f b f c b ←←;否则,则令)()(,c f a f c a ←←,重复(1),(2),(3)。

(二)牛顿迭代法:给定初值0x ,ε为根的容许误差,η为)(x f 的容许误差,N 为迭代次数的容许值。

(1)如果)(x f <η或迭代次数大于N ,则算法结束;否则执行(2)。

(2)计算)('/)(0001x f x f x x -=(3)若 < 或 < ,则输出 ,程序结束;否则执行(4)。

(4)令 = ,转向(1)。

四、实验题目与程序设计1、二分法3.1.1、用二分法求方程a. f(x)= x x tan 1--在区间[0,π/2]上的根,c. f(x)=6cos 22-++-x e x x 在区间[1,3]上的根。

源程序:3.1.1.a#include<stdio.h>#include<math.h>void main(){float a,b;double c,y,z;printf("plese input two number a and b:\n");scanf("%f%f",&a,&b);c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);while(fabs(b-a)>0.00001|| fabs(y)>0.00001){z=1/a-tan(a);if(z*y<0)b=c;elsea=c;c=(a+b)/2;y=1/c-tan(c);printf("a=%f,b=%f,b-a=%f,c=%f,f(c)=%f\n",a,b,b-a,c,y);}x x 01-ε)(1x f ηx 1x 0x 1}输入0 1.5707563( /2~1.5705563)得到下表:由上表可以看出刚开始时f(c)取值幅度很大,但是经过一段历程之后,幅度变得平缓甚至基本接近与零,我们认为,x=0.8603是方程的根,结果与实际想要得到的值相当接近。

数值分析实验报告之迭代法求非线性方程的根

数值分析实验报告之迭代法求非线性方程的根

数值分析实验报告之迭代法求非线性方程的根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:源程序
附录2:实验报告填写说明
1.实验项目名称:要求与实验教学大纲一致。

2.实验目的:目的要明确,要抓住重点,符合实验教学大纲要求。

3.实验原理:简要说明本实验项目所涉及的理论知识。

4.实验环境:实验用的软、硬件环境。

5.实验方案(思路、步骤和方法等):这是实验报告极其重要的内容。

概括整个实验过程。

对于验证性实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。

对于设计性和综合性实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。

对于创新性实验,还应注明其创新点、特色。

6.实验过程(实验中涉及的记录、数据、分析):写明具体实验方案的具体实施步骤,包括实验过程中的记录、数据和相应的分析。

7.实验结论(结果):根据实验过程中得到的结果,做出结论。

8.实验小结:本次实验心得体会、思考和建议。

9.指导教师评语及成绩:指导教师依据学生的实际报告内容,给出本次实验报告的评价。

数值计算方法实验报告

数值计算方法实验报告

数值计算方法实验报告数值计算方法实验报告引言:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。

在科学研究和工程应用中,数值计算方法被广泛应用于求解方程、优化问题、模拟仿真等领域。

本实验报告将介绍数值计算方法的基本原理和实验结果。

一、二分法求根二分法是一种通过不断折半缩小搜索区间来求解方程根的方法。

在实验中,我们选取了一个简单的方程f(x) = x^2 - 4 = 0来进行求根实验。

通过不断将搜索区间进行二分,我们可以逐步逼近方程的根。

实验结果表明,通过二分法,我们可以得到方程的根为x = 2。

二、牛顿迭代法求根牛顿迭代法是一种通过不断逼近方程根的方法。

在实验中,我们同样选取了方程f(x) = x^2 - 4 = 0进行求根实验。

牛顿迭代法的基本思想是通过对方程进行线性近似,求得近似解,并不断迭代逼近方程的根。

实验结果表明,通过牛顿迭代法,我们可以得到方程的根为x = 2。

三、高斯消元法求解线性方程组高斯消元法是一种通过变换线性方程组的系数矩阵,将其化为上三角矩阵的方法。

在实验中,我们选取了一个简单的线性方程组进行求解实验。

通过对系数矩阵进行行变换,我们可以将其化为上三角矩阵,并通过回代求解得到方程组的解。

实验结果表明,通过高斯消元法,我们可以得到线性方程组的解为x = 1,y = 2,z = 3。

四、插值与拟合插值与拟合是一种通过已知数据点来构造函数模型的方法。

在实验中,我们选取了一组数据点进行插值与拟合实验。

通过拉格朗日插值多项式和最小二乘法拟合,我们可以得到数据点之间的函数模型。

实验结果表明,通过插值与拟合,我们可以得到数据点之间的函数关系,并可以通过该函数模型来进行预测和拟合。

结论:数值计算方法是一种通过数学模型和计算机算法来解决实际问题的方法。

通过本次实验,我们学习了二分法求根、牛顿迭代法求根、高斯消元法求解线性方程组以及插值与拟合的基本原理和应用。

这些方法在科学研究和工程应用中具有广泛的应用前景。

数值计算方法实验报告

数值计算方法实验报告
#include<stdio.h>
#include<math.h>
double f(double x)
{
double s;
s=x*x*x/3-x;
return fabs(s);
}
void main()
{double x=-0.99,y;
int k=0;
printf("%d ,%lf\n",k,x);
{if(r>=x[i]&&r<=x[i+1])
{s=m[i]*pow(x[i+1]-r,3)/6*h[i]+m[i+1]*pow(r-x[i],3)/6*h[i]+(y[i]-m[i]*pow(h[i],2)/6)*(x[i+1]-r)/h[i]+(y[i+1]-m[i+1]*pow(h[i],2)/6)*(r-x[i])/h[i];
28.65
39.62
50.65
5.28794
9.4
13.84
20.2
24.9
28.44
31.1
k
7
8
9
10
11
12
78
104.6
156.6
208.6
260.7
312.5
35
36.5
36.6
34.6
31.6
31.0
k
13
14
15
16
17
18
364.4
416.3
468
494
507
520
20.9
14.8
7.8
do
{y=x;

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

本科生实验报告实验课程______________ 数值计算方法 _______________________ 学院名称_____________ 信息科学与技术学院_________________ 专业名称______________ 计算机科学与技术 ___________________ 学生 _________________________________________学生学号_______________________________________________指导教师___________________________________________实验地点_______________________________________________实验成绩__________________________________________________二0 一六年五月二◦一六年五月实验一非线性方程求根1.1问题描述实验目的:掌握非线性方程求根的基本步骤及方法,。

实验容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-仁0在区间[-8,8]上的全部实根,误差限为10-6。

要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较,第2章算法思想2.1 二分法思想:在函数的单调有根区间,将有根区间不断的二分,寻找方程的解。

步骤:1.取中点 mid=(x0+x1)/22若f(mid)=0,则mid为方程的根,否则比较与两端的符号,若与f(x0) 异号,则根在[x0,mid]之间,否则在[mid,x1]之间。

3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。

开始读入a,b,eyes输出mid结束2.2简单迭代法思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值, 使之逐步精确,最后得到精度要求的结果。

数值分析上机实验报告

数值分析上机实验报告

数值分析上机实验报告数值分析上机实验报告一、引言数值分析是一门研究利用计算机进行数值计算的学科。

通过数值分析,我们可以使用数学方法和算法来解决实际问题,例如求解方程、插值和逼近、数值积分等。

本次上机实验旨在通过编程实现数值计算方法,并应用于实际问题中。

二、实验目的本次实验的目的是掌握数值计算方法的基本原理和实现过程,加深对数值分析理论的理解,并通过实际应用提高编程能力。

三、实验内容1. 数值求解方程首先,我们使用二分法和牛顿迭代法分别求解非线性方程的根。

通过编写程序,输入方程的初始值和精度要求,计算得到方程的根,并与理论解进行对比。

2. 数值插值和逼近接下来,我们使用拉格朗日插值和最小二乘法进行数据的插值和逼近。

通过编写程序,输入给定的数据点,计算得到插值多项式和逼近多项式,并绘制出插值曲线和逼近曲线。

3. 数值积分然后,我们使用梯形法和辛普森法进行定积分的数值计算。

通过编写程序,输入被积函数和积分区间,计算得到定积分的近似值,并与解析解进行比较。

四、实验步骤1. 数值求解方程(1)使用二分法求解非线性方程的根。

根据二分法的原理,编写程序实现二分法求解方程的根。

(2)使用牛顿迭代法求解非线性方程的根。

根据牛顿迭代法的原理,编写程序实现牛顿迭代法求解方程的根。

2. 数值插值和逼近(1)使用拉格朗日插值法进行数据的插值。

根据拉格朗日插值法的原理,编写程序实现数据的插值。

(2)使用最小二乘法进行数据的逼近。

根据最小二乘法的原理,编写程序实现数据的逼近。

3. 数值积分(1)使用梯形法进行定积分的数值计算。

根据梯形法的原理,编写程序实现定积分的数值计算。

(2)使用辛普森法进行定积分的数值计算。

根据辛普森法的原理,编写程序实现定积分的数值计算。

五、实验结果与分析1. 数值求解方程通过二分法和牛顿迭代法,我们成功求解了给定非线性方程的根,并与理论解进行了对比。

结果表明,二分法和牛顿迭代法都能够较好地求解非线性方程的根,但在不同的问题中,二者的收敛速度和精度可能会有所差异。

matlab 牛顿迭代法求所有根

matlab 牛顿迭代法求所有根

在本文中,我们将探讨使用MATLAB编程语言中的牛顿迭代法来求解多项式方程的所有根。

我们将深入了解牛顿迭代法的原理和应用,以及如何在MATLAB中实现这一方法。

通过本文的阅读,读者将能够全面了解牛顿迭代法在求解多项式方程中的重要性和实用性。

牛顿迭代法是一种数值分析中常用的迭代方法,用于寻找实函数的零点,也就是方程的根。

它通过不断逼近函数的根来求解方程,是一种高效且广泛应用的数值计算方法。

在MATLAB中,我们可以借助内置的函数和工具来实现牛顿迭代法,从而求解多项式方程的所有根。

让我们来了解牛顿迭代法的基本原理。

对于一个实函数f(x)和一个初始值x0,牛顿迭代法通过不断迭代的方式来更新x的取值,使得f(x)不断逼近0。

具体的迭代公式为:\[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\]其中,x_{n+1}是迭代更新后的值,x_n是当前的值,f(x_n)是函数在x_n处的取值,f'(x_n)是函数在x_n处的导数。

通过不断迭代,当f(x)趋于0时,我们就可以得到方程的根。

在MATLAB中,我们可以利用内置的函数和工具来实现牛顿迭代法。

我们需要定义多项式方程的函数表达式,并计算其导数。

我们可以利用MATLAB中提供的循环结构和迭代计算的方法,来不断更新当前值,直到满足迭代终止条件。

下面,我们以一个具体的例子来说明在MATLAB中如何用牛顿迭代法求解多项式方程的所有根。

假设我们要求解方程f(x) = x^2 - 4x + 3的所有根。

我们可以在MATLAB中定义这个多项式函数,并计算其导数。

接下来,我们可以编写一个循环结构,不断利用牛顿迭代法来更新当前值,直到满足迭代终止条件。

我们就可以得到方程的所有根。

在实际应用中,牛顿迭代法在求解多项式方程的所有根时具有重要的实用价值。

通过不断迭代更新,我们可以高效地求解多项式方程的根,从而应用到科学计算、工程问题、金融建模等领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学与计算科学学院实验报告
实验项目名称牛顿迭代法求根
所属课程名称
实验类型
实验日期
班级
学号
姓名
成绩
附录1:源程序
附录2:实验报告填写说明
1.实验项目名称:要求与实验教学大纲一致。

2.实验目的:目的要明确,要抓住重点,符合实验教学大纲要求。

3.实验原理:简要说明本实验项目所涉及的理论知识。

4.实验环境:实验用的软、硬件环境。

5.实验方案(思路、步骤和方法等):这是实验报告极其重要的内容。

概括整个实验过程。

对于验证性实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。

对于设计性和综合性实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。

对于创新性实验,还应注明其创新点、特色。

6.实验过程(实验中涉及的记录、数据、分析):写明具体实验方案的具体实施步骤,包括实验过程中的记录、数据和相应的分析。

7.实验结论(结果):根据实验过程中得到的结果,做出结论。

8.实验小结:本次实验心得体会、思考和建议。

9.指导教师评语及成绩:指导教师依据学生的实际报告内容,给出本次实验报告的评价。

相关文档
最新文档