实验5 非线性方程求根及其MATLAB实现
数值分析实验五 非线性方程的求根1

数值分析实验五 非线性方程的求根组号 班级 学号 姓名 分数一:实验目的1、掌握用二分法解非线性方程的方法。
2、掌握用迭代法解非线性方程的方法。
3、掌握用牛顿法解非线性方程的方法。
4、学会运用Matlab 语言解决提供的函数求解实际问题。
二:实验内容所需的基本知识二分法的原理:设)(x f 在],[b a 上连续,且0)()(<⋅b f a f 。
则],[b a 为方程区间(设只有唯一根)。
取中点)(210b a x +=,检查)(a f 与)(0x f 是否同号,若同号,说明根*x 与b 之间,此时b b x a ==101,;若异号,说明根*x 在a 与0x 之间,此时011,x b a a ==,得新区间],[11b a 为原区间的一半。
对],[11b a 进行上述过程,取中点)(21111b a x +=,检查)(1a f 与)(1x f 是否同号,如此反复二分下去,即可得出一系列有根区间⊃⊃⊃],[],[],[2211b a b a b a …⊃⊃],[k k b a …,其中每个区间都是前一个区间的一半,因此],[k k b a 的长度k k k a b a b 2)(-=-,当∞→k 时趋于零,就是说,如果二分过程无限地继续下去,这些区间最终必收缩于一点*x ,该点显然就是所求的根。
迭代法原理:首先给定一个粗糙的初始值,然而用一个迭代公式反复校正这个初值,将已有近似根逐步精确化,一直到满足精度要求为止。
具体地,把方程0)(=x f 改写成x 的等价表达式)(x x ϕ=,若)(**x x ϕ=,称*x 为)(x ϕ的一个不动点,求)(x f 的零点就等价于求)(x ϕ的不动点。
任取一点0x 代入)(x ϕ求得 )(01x x ϕ= 又将1x 代入)(x ϕ求得)(12x x ϕ= 如此反复迭代下去一般地 )(1k k x x ϕ=+ k=0,1,2,………)(x ϕ称为迭代函数,)(x x ϕ=称为迭代公式。
MATLAB 非线性方程(组)求根

实用数值方法(Matlab) 综述报告题目:非线性方程(组)求根问题小组成员许多数学和物理问题归结为解函数方程f(x)=0。
方程f(x)=0的解称为方程的根。
对于非线性方程,在某个范围内往往不止一个根,而且根的分布情况可能很复杂,面对这种情况,通常先将考察的范围花费为若干个子段,然后判断哪些子段内有根,然后再在有根子段内找出满足精度要求的近似根。
为此适当选取有根子段内某一点作为根的初始值近似,然后运用迭代方法使之足部精确化。
这就是方程求根的迭代法。
下面介绍书上的几种方法:1、二分法(1)方法概要:假定函数f(x)在[a,b]上连续,且f(a)f(b)=0,则方程f(x)=0在[a,b]内一定有实根。
取其中将其二分,判断所求的根在的左侧还是右侧,得到一个新的有根区间点[],长度为[a,b]的一半。
对新的有根区间继续实行上述二分手段,直至二分k次后有根区间[]长度可见,如果二分过程无限继续下去,这些有限根区间最终必收敛于一点,该点就是所求的根。
在实际计算过程中不可能完成这个无限过程,允许有一定的误差,则二分k+1次后只要有根区间[]的长度小于,那么结果关于允许误差就能“准确”地满足方程f(x)=0。
(2)计算框图:2、开方法对于给定,求开方值为此,可以运用校正技术设计从预报值生成校正值的迭代公式。
自然希望校正值能更好满足所给方程:这是个关于校正量的近似关系式,如果从中删去二次项,即可化归为一次方程解之有从而关于校正值有如下开方公式上述演绎过程表明,开方法的设计思想是逐步线性化,即将二次方程的求解画归为一次方程求解过程的重复。
开方公式规定了预报值与校正值之间的一种函数关系,这里为开方法的迭代函数。
3、Newton法(1)方法概要考察一般形式的函数方程首先运用校正技术建立迭代公式。
设已知它的根近似值,则自然要求校正值能更好地满足所给方程将其左端用其线性主部替代,而令据此定出从而关于校正值有如下计算公式这就是著名的Newton公式。
第二次实验报告(非线性方程求根)

数学实验报告实验五学院:数学与统计学院班级:数学与统计学院(2)班姓名:石紫雲学号:0234非线性方程的数值解法实验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=;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)原函数function fc1=fc1(x) fc1=x*exp(x)-1;end导函数function fc2=fc2(x)fc2=1*exp(x)+x*exp(x);end3)原函数function fc1=fc1(x)fc1=x^2-5;end导函数function fc2=fc2(x)fc2=2*x;end6实验结果及分析注:牛顿迭代法由于设置delta=1e-6,所以算出的误差e<*10^-6;割线法由于设置delta=5e-8,所以误差e<*10^-8.7总结。
第六章 MATLAB非线性方程求根

if ( abs(c-a)<=tolerance )
fprintf( ' Tolerance is satisfied. \n' );break
end
if ( it>it_limit )
fprintf( 'Iteration limit exceeded.\n' ); break
end
if( Ya*Yb <= 0 ) c = b; Yc = Yb;
分别画出 f (x), g(x) 1
的图形,两条曲线 0.8
0.6
的交点即为原方程 0.4
y
的根,从图中观
0.2
察,根大约为0.38。 0
-0.2
y=xsin(1/x) y=0.2exp(-x)
-0.4 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 x
二、二分法
对于求解给定区间的根,二分法是一种既简单 又稳健的方法,可以与图解法结合使用。
E1=sym('x^x-4=0');E2=sym('2*x*y+x=1');
[x,y]=solve( E1,E2)
x1=double(x),y1=double(y) 出来的结果为:
x=
log(4)/lambertw(log(4))
y=
-1/2*(log(4)-lambertw(log(4)))/log(4)
f (xn1)
或
其中 h 取得很小
fn1
f (xn1) f (xn1 h) h
上两式分别为向前和向后差分近似。差分近似 中的误差很小,对于牛顿迭代法的收敛性没有很明 显的影响,然而当根的附近有奇点时使用差分近似 要小心。
MATLAB非线性方程求根

实验报告MATLAB实验七: MATLAB数值计算(3)实验目的:熟悉MATLAB数值计算。
实验要求:⑴熟悉MATLAB数值计算步长对计算精度的影响⑵尝试MATLAB基本操作。
实验内容:1、列表显示不同步长时前向欧拉和中心欧拉计算数值导数的相对误差,得出结论并对结果进行讨论。
% program numdiff% tabulates the numerical derivatives of sin(x) at x=1% as a function of the step-size%help numdiffh = 10.^(-[1:16]); % step-sizesx = 1;dex = cos(1); % exact valued1 = (sin(x+h)-sin(x))./h; % asym. formula / One Order Relative Error d2 = (sin(x+h)-sin(x-h))./(h+h); % sym. formula / Two Order Relative Error y = [ h ; (d1-dex)/dex ; (d2-dex)/dex ];%fprintf(' h asymm rel. err. symm. rel. err. \n\n')h asymm rel. err. symm. rel. err.fprintf(' %5.0e %10.1e %10.1e \n',y)1e-01 -7.9e-02 -1.7e-031e-02 -7.8e-03 -1.7e-051e-03 -7.8e-04 -1.7e-071e-04 -7.8e-05 -1.7e-091e-05 -7.8e-06 -2.1e-111e-06 -7.8e-07 5.1e-111e-07 -7.7e-08 -3.6e-101e-08 -5.5e-09 4.8e-091e-09 9.7e-08 -5.5e-091e-10 -1.1e-07 -1.1e-071e-11 -2.2e-06 -2.2e-061e-12 8.0e-05 -2.3e-051e-13 -1.4e-03 -3.3e-041e-14 6.9e-03 6.9e-031e-15 2.7e-02 2.7e-021e-16 -1.0e+00 2.7e-022、尝试课件中降落伞问题的二分法求根和牛顿法求根,看看收敛速度如何。
非线性方程组求解及matlab实现讲解

x0
X
例:牛顿法计算x^2-25=0的解
f(x)=x2-25,则f’(x)=2x 可构造迭代公式如下:
xi2 25 xi 1 xi 2 xi
取x0=2代入上式,得x1=7.25,继续递推, 依次得5.35、5.0114、5.000001、5.0000000001 …
牛顿法注意事项
逐步扫描法计算示例-方程x2-2=0的正数解
计算方程 x 2 2 0 的正数解
二分法
若函数f(x)在区间[a,b]内单调连续,且f(a)f(b)<0, 则在闭区间[a,b]内必然存在方程f(x)=0的根x*
二分法的图形解释 二分法的MATLAB程序
k=0; while abs(b-a)>eps x=(a+b)/2; if sign(f(x))==sign(f(b)) b=x; else a=x; end k=k+1; end
f '( x) 0, f "( x) 连续且不变号,则只 在有根区间[a,b]上, 要选取的初始近似根x0满足 f ( x0 ) f "( x0 ) 0 ,切线法 必定收敛。 在单根附近,牛顿公式恒收敛,而且收敛速度很快。 但是需要注意如果初始值不在根的附近,牛顿公式 不一定收敛 在实际使用中,牛顿法最好与逐步扫描法结合起来, 先通过逐步扫描法求出根的近似值,然后用牛顿公 式求其精确值,以发挥牛顿法收敛速度快的优点
c x
不动点迭代法
从给定的初值x0,按上式可以得到一个数列: { x0, x1, x2, …, xk, … }
如果这个数列有极限,则迭代格式是收敛的。 * x xk 就是方程的根 这时数列{xk}的极限 lim k 上述求非线性代数方程式数值解的方法称为直 接迭代法(或称为不动点迭代法)。这个方法 虽然简单,但根本问题在于当k->∞时,xk是否 收敛于x*,也就是必须找出收敛的充分条件
第五讲非线性方程求根及其MATLAB实现

第五讲非线性方程求根及其MATLAB实现一、引言在数学和工程领域中,非线性方程的求解是一项基本任务。
非线性方程通常不具备直接求解的方法,因此需要采用迭代方法来逼近其解。
本讲将介绍几种常用的非线性方程求根方法,并给出MATLAB实现的示例。
二、二分法二分法是一种简单但有效的求根方法。
其基本思想是将方程的根所在的区间进行逐步划分,并选择其中点作为迭代的点,直到满足精度要求。
具体实现如下:```matlabfunction x = bisection(f, a, b, tol)if f(a) * f(b) >= 0error('f(a)和f(b)符号相同');endwhile (b - a) / 2 > tolx=(a+b)/2;if f(x) == 0break;elseif f(a) * f(x) < 0b=x;elsea=x;endendend```三、牛顿法牛顿法是一种基于方程导数的迭代方法,其基本思想是使用方程的切线来逼近其根。
具体实现如下:```matlabfunction x = newton(f, df, x0, tol)while abs(f(x0)) > tolx0 = x0 - f(x0) / df(x0);endx=x0;end```四、割线法割线法是一种类似于牛顿法的迭代方法,其基本思想是用两个迭代点的连线来逼近方程的根。
具体实现如下:```matlabfunction x = secant(f, x0, x1, tol)while abs(f(x1)) > tolx=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));x0=x1;x1=x;endend```五、MATLAB实现示例下面是一些使用上述非线性方程求根方法的MATLAB示例:```matlab% 示例1:求方程sin(x) = 0的根a=0;b = 2 * pi;tol = 1e-6;x = bisection(f, a, b, tol);disp(['二分法求解的根为:', num2str(x)]);disp(['牛顿法求解的根为:', num2str(x)]);x = secant(f, a, b, tol);disp(['割线法求解的根为:', num2str(x)]);%示例2:求方程x^2-2=0的根x0=1;tol = 1e-6;x = newton(f, df, x0, tol);disp(['牛顿法求解的根为:', num2str(x)]);```六、总结本讲介绍了几种常用的非线性方程求根方法,并给出了MATLAB的实现示例。
数值分析非线性方程求根实验

实验报告一、实验目的1.迭代函数对收敛性的影响。
2.初值的选择对收敛性的影响。
二、实验题目1.用简单迭代法求方程01)(3=--=x x x f 的根。
分别化方程为如下等价方程: 31+=x x ;13-=x x ;x x 11+=;213-+=x x x 取初值5.10=x ,精度为410-,最大迭代次数为500,观察其计算结果并加以分析。
2.①用牛顿法求方程01)(3=-+=x x x f 在0.5附近的根,分别取初值1000,100,2,1,5.0,5.0,1,2,100,10000-----=x观察并比较计算结果,并加以分析。
②用牛顿法求方程0)(3=-=x x x f 所有根。
三、实验原理简单迭代法程序,牛顿迭代法程序。
四、实验内容及结果fun=inline('x^3-x-1');dfun=inline('3*x^2-1');-1000,x1=manewton(fun,dfun,-1000,1e-4) -100,x2=manewton(fun,dfun,-100,1e-4)-2,x3=manewton(fun,dfun,-2,1e-4)-1,x4=manewton(fun,dfun,-1,1e-4)-0.5,x5=manewton(fun,dfun,-0.5,1e-4) 0.5,x6=manewton(fun,dfun,0.5,1e-4)1,x7=manewton(fun,dfun,1,1e-4)2,x8=manewton(fun,dfun,2,1e-4)100,x9=manewton(fun,dfun,100,1e-4) 1000,x10=manewton(fun,dfun,1000,1e-4)3)在MA TLAB的主程序窗口输出以下结果:ans =-1000k=21x1 =0.682327804075895ans =-100k=16x2 =0.682327803903413ans =-2k=6x3 =0.682327803828020ans =-1k=5x4 =0.682327803828020ans =-0.500000000000000k=4x5 =0.682327803903932ans =0.500000000000000k=3x6 =0.682327803828347五、实验结果分析(1)实验1中用简单迭代法求方程01)(3=--=x x x f 的根:取初始值5.10=x 的时候,等价方程2和4是不收敛的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x1 x0
f ( x0 ) f ( x0 )
x0,f(x0)
x1,f(x1)
x*
x2
x1
x0
例3 求方程
x3 3 x 1 0
在 x0 = 2附近的近似实根。 准确到小数点后4位数字 解: f ( x ) x 3 3 x 1
f '( x ) 3 x 2 3
f ( x0 ) 记为x1= x x0 f ( x 0 )
为改善根的精确程度,反复实施这一过程,得到牛顿 迭代公式: f (x )
xk 1 xk f ( xk )
k
xk+1就是从线性方程 f (xk) + f '(xk)(x – xk) = 0 中解得的根x.
(1)
以点(xk , f (xk))为切点,曲线y = f (x)的切线方程恰为: y = f (xk) + f '(xk)(x – xk) (2) 方程(2)与 y=0相联立,得到与x轴的交点,该交点 即xk+1
1.两分法迭代(理论基础:零点定理)
取[a, b]的中点x0=(a+b)/2,若f (x0)=0,则x0即是根; 否则,f (a)· f (x0) <0,令a1 = a,b1 = x0(取[a, b]的左半部); f (x0)· f (b) <0,令a1 = x0,b1 = b(取[a, b]的右半部)。
第二部分:高射炮的控制区域问题
问题描述:
高射炮发射的炮弹在空中呼啸而过划出一条抛射线, 设坐标原点为发射点,抛射的弹道曲线的参数方程为:
其中v0为炮弹出膛时的初速度,α为高射炮发射角度, g是重力加速度。
问题: (1)当炮弹出膛速度v0确定时,它的最远射程? (2)当炮击目标确定后,如何调整发射角度, 使炮弹能准确地落在目标位置处爆炸?
x* lim xn 1;
n
f ( x*) lim f ( xn 1 )
n
将方程 f (x) = 0 ⑴ 化为等价方程 x =φ(x) ( 2) 取某个定数x0,做数列{xn},其中, x1 =φ(x0),x2 =φ(x1),…,xk+1 =φ(xk),… 设φ(x)连续,且
x0Leabharlann 2.不动点迭代例2 求方程
x x 14 0
2
在 x = 3附近的近似实 根。
解:可将方程写成下三种形式: x = 14 – x 2 ,
14 x x 1
x x 14 x x 2x 1
2
(1)将三种迭代形式写成函数存起来:
function f=iterfun(x) % f=14-x.^2; % f=14./(x+1); f=x-(x.^2+x-14)./(2*x+1);
(3)一门高射炮可以控制什么样的空间区域?
(1)模型建立与分析
x(0) 0, 初值条件: y (0) 0, dx 0 cos dt dy 0 sin gt dt
即可导出弹道曲线的参数方程为 (1)
消去参数t,可以得到弹道曲线的直角坐标的表达式:
x=-1:0.01:1; y=x.^3+1.1.*x.^2+0.9.*x-1.4; %函数表达式 figure; plot(x,y,'LineWidth',2) %画出图形 hold on; y1=zeros(size(x)); %y1=0 plot(x,y1,'r','LineWidth',4);
由以上图形可以看出,序列
xk 的收敛速度,取决于曲线 y ( x) 在根附近的斜率
xk 1 xk ( xk ) ( xk 1 ) ' ( k ) xk xk 1 xk xk 1
所以在根x*附近,’(x) 恒小于1 则此迭代序列收敛, 若’(x) 1,则此序列发散。
当n足够大时即可达到满意的精度σ。 需要的迭代次数为:N= ln(b-a)-ln ln2
1.两分法迭代
先绘制其图形观察一下:
ezplot('x^3 + 1.1*x^2 + 0.9*x- 1.4') 例1 求方程 x 3 + 1.1x 2 + 0.9x – 1.4 = 0 的一个实根。使误差不超过10-3 解:(1)首先观测图形,作f(x)的图像:
xk 3 3 xk 1 迭代公式为:xk 1 xk 3 xk 2 3
计算步骤如下:
(1)选x0=2,按照迭代公式计算x1; (2)若|x1-x0|<=0.00001,终止迭代;否则,x0=x1;转(1); (3)输出迭代次数和近似根
编程步骤如下: (1)写函数: function [fun,dfun]=fun0(x) fun=x^3-3*x-1;%求原函数的值 (2)写牛顿迭代法的程序: dfun=3*x^2-3;% 求一阶导数的值; newtuniter.m x0=2;
第二部分:高射炮的控制区域问题
问题描述: 高射炮发射的炮弹在空中呼啸而过划出一条抛射线。 设坐标原点为发射点,x(t)和y(t)分别是高射炮在t时 刻的空间坐标。用v0为炮弹出膛时的初速度,α为高 射炮发射角度,g是重力加速度。问: (1)试推高射炮抛射的弹道曲线的参数方程; (2)当炮弹出膛速度v0确定时,它的最远射程? (3)当炮击目标确定后,如何调整发射角度, 使炮弹能准确地落在目标位置处爆炸? (4)一门高射炮可以控制什么样的空间区域?
[fun,dfun]=fun0(x0); x1=x0-fun/dfun;i=1; while abs(x1-x0)>0.00001 x0=x1; [fun,dfun]=fun0(x0); x1=x0-fun/dfun; i=i+1; end disp('the solution is x1=') x1 disp('the iter time is ') i
分类数学实验之
方程求近似实根问题、 高射炮的控制区域问题
对应书本的第二章 数值计算问题的2.1 及2.4
方程求根数值算法的基本思想 考虑方程 f (x) = 0 ⑴ 求根分为两步: (1)先确定某个根的近似值; (2)再将初始近似值加工成满足精度要求的结果。 设f (x)∈C[a, b],f (a)· f (b) <0。区间(a, b)就是方程⑴ 根的存在区间,再用下面的方法改善根的精度。
gx 2 sec2 y (tan ) x 2 20
(2)
这是我们十分熟悉的抛物线。
(2)控制区与包络线
当发射角变化时,取 0 90 ,相应的弹道曲线 就形成一族抛物线段.所以,(1)或(2)可以看作是 带有参数α的平面曲线族。
(额外知识:)
包络曲线:如果一条曲线的每一点都与曲线簇中的某 一曲线相切,则称这条曲线为该曲线簇的包络。 对曲线簇F(x,y,c)=0中,对参数c求导,与它自己联立 得到方程组:
x0=-1; x1=2;%初始值 根始终在x0和x1之间 i=0; delt=10e-5;%精度 N=ceil((log(x1-x0)-log(delt))/log(2));%理论迭代次数 while abs(x1-x0)>delt %达不到我们需要的精度 y0=myequation(x0); y1=myequation(x1);%求两个初始点处的y值 x2=(x0+x1)./2; %二分 y2=myequation(x2); %求在中点处的值 if y2==0 %恰好是方程的根 x0=x2; x1=x2; elseif y0*y2<0 % 方程的根落在x0和x2之间 x1=x2; %新的两个端点为:x0=x0;x1=x2。 else % 方程的根落在y1和y2之间 x0=x2; %新的两个端点为:x0=x2;x1=x1。 end i=i+1; end disp(‘方程的根为:x=’);x0 disp(‘实际迭代次数为:i=');i disp('理论迭代次数为:N=');N
供学有余力的、感兴趣的同学们好好体会学习,体会 Matlab绘图的精妙。
3.牛顿迭代法
记[a, b]为方程 f (x) = 0的根的存在区间, f (a)与f (b)异号,且对于每个x∈[a, b], f '(x)≠0,f "(x)保持符号不变。
取x0∈[a, b],对f (x)用微分中值定理,近似地, 有 f (x)≈p (x) = f (x0) + f '(x0)(x - x0) 令p (x) = 0,得到f (x) = 0的近似根
y
f(b)
f(x)
a
a+b 2
b x
f(a) f((a+b)/2)
1.两分法迭代
经过一次这样对原区间[a, b]的处理,得到了一个新 的有根区间[a1 ,b1],且 b1-a1 = (b-a)/2, [a, b] [a1 ,b1]。 将上述做法重复n次,得到n个小区间,且 bn-an = (b-a)/2n , … [an ,bn]。 [a, b] [a1 ,b1]
0.1 1
y=x
0.9 0.8
y=x M
M
0.7 0.6 0.5 0.4 0.3 0.2
0.1
0
0
0
0.2
0.4
0.6
0.8
1
0
0.2
0.4
0.6
0.8
1
同时我们还提供一个高级程序:zhuwang.m,绘制出 迭代格式为
4 x 1 x
的蛛网图。
此处用到一个函数:quiver,画出矢量方向。
quiver(x,y,u,v):画出在(x,y)处,方向为u,v的矢量