实验5 非线性方程求根及其MATLAB实现

合集下载

数值分析实验五 非线性方程的求根1

数值分析实验五     非线性方程的求根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  非线性方程(组)求根

实用数值方法(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非线性方程求根

第六章 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实验七: 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实现讲解

非线性方程组求解及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实现一、引言在数学和工程领域中,非线性方程的求解是一项基本任务。

非线性方程通常不具备直接求解的方法,因此需要采用迭代方法来逼近其解。

本讲将介绍几种常用的非线性方程求根方法,并给出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是不收敛的。

数值分析实验报告 实验五 非线性方程求根

数值分析实验报告 实验五 非线性方程求根

实验类别:数值分析专业:信息与计算科学班级:学号:姓名:中北大学理学院实验五 非线性方程求根【实验内容】设方程013)(3=--=x x x f 有三个实根8793.1*1=x ,*20.34729x =-, *3 1.532088x =-现采用下面四种不同计算格式,求0)(=x f 的根。

【实验方法与步骤】1、 213x x x +=用于求*3x 。

#include "math.h"#include "stdio.h"double f ( double x ){return((3*x+1) /x/x );}main(){double eps = 1e-10;double x1, x2 =-3;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf \n", x2 ); }while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2);}2、 313-=x x 用于求*2x 。

#include "math.h"#include "stdio.h"double f ( double x ){return(( x*x*x-1) /3 );}main(){double eps = 1e-10;double x1, x2 =1.3;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf\n", x2 );}while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2); }3、 313+=x x ,用于求*1x ,*3x 。

#include "math.h"#include "stdio.h"double f ( double x ){return(pow((3*x+1),1.0/3.0) ); }main(){double eps = 1e-10; double x1,x2 =1;do{x1 = x2;x2 = f( x1 );printf( "\nx=%20.16lf\n", x2 ); }while( fabs( x2 - x1 ) >= eps ); scanf("%f",&x2);}4、 x x 13+=用于求*1x 。

实验5 非线性方程求根及其MATLAB实现

实验5  非线性方程求根及其MATLAB实现

等价于 f (a) = 0
a就是方程f (x) = 0的根。
.
收敛的迭代: y=x
f(x0)
x0x2= f(x1) x
f(x1)
x1= f(x0)
.
y=f(x)
发散的迭代:
x0
.
2.不动点迭代
例2 求方程 x2x14 0
在 x = 3附近的近似实根。
解:可将方程写成下三种形式: x = 14 – x 2 ,
a+ b
ac2
b
x
f(a)
f((a+b)/2) 程序:fastbisect.m
.
2.不动点迭代
称满足方程 f(x)=x的点x为函数f的不动点.
求函数f的不动点。可以从一个初始点x0出发, 以格式 xn+1=f(xn)进行迭代;
x1 =f(x0),x2 =f(x1),…,xk+1 =f(xk),… 得到x0,x1,x2,……,xn,….. 如果该数列是收敛的,则
0 0
y=x M
0.2
0.4
0.6
0.8
1
高级例子iterexample2.m 请同学们自己消化 .
3.牛顿迭代法
记[a, b]为方程 f (x) = 0的根的存在区间, f (a)与f (b)异号,且对于每个x∈[a, b], f '(x)≠0,f "(x)保持符号不变。
取x0∈[a, b],对f (x)用微分中值定理,近似地,
1首先观测图形作fxezplot函数表达式plotlinewidty1zerossizeplotlinewidtbisectm关于此程序的解释见方程求根的代码解释一文2按两分法的思想进行迭代求根

数值分析实验五 非线性方程的求根6

数值分析实验五     非线性方程的求根6

数值分析实验五 非线性方程的求根组号 班级 学号 姓名 分数一:实验目的1、 掌握用MA TLAB 软件求解非线性方程的基本用法。

2、 熟练运用不动点迭代法和牛顿法求解非线性方程的根。

二:实验内容及基本知识介绍不动点迭代法基本思路:首先给定一个粗糙的初始值,然而用一个迭代公式,反复校对这个初值,将已有近似值逐步精确化,一直到满足精度为止。

具体的,把方程()0f x =改写成x 的表达式()x x ϕ= ⑴ ,若()**x x ϕ=称*x 为()*x ϕ的一个不动点,求()f x 的零点等价于求()x ϕ的不动点。

在[],a b 上任取一点0x 代入()x ϕ求得()10x x ϕ=,又将1x 代入()x ϕ求得()21x x ϕ=,如此反复下去,一般地得()10,1,2,k k x x k ϕ+== ⑵。

()x ϕ称为迭代函数,()x x ϕ=为迭代公式。

牛顿法基本思想:将非线性方程()0f x =逐步转化为某种线性方程来求解。

设()0f x =的一个近似根0x ,则函数()f x 在点0x 附近可以用一阶泰勒公式()()()()0000f x f x f x x x '≈+-=来近似。

若()00f x '≠,解得()()000f x x x f x =-',将此根为原方程的近似根1x ,然后按上式迭代计算,使形成一种新的迭代公式()()10,1,2,k k k k f x x x k f x +=-=' 称为牛顿法。

三:实验问题及方法、步骤1.用MATLAB 函数求解方程3()310f x x x =--=在02x =附近的根。

首先建立如下的函数文件,Function y=f(x)y=x*x*x-3*x-1;然后在命令窗口中键入:fzero(@f,2),ans =1.87942.用不动点迭代法求()32410f x x x =+-在[1,1.5]上的一个根。

信息与计算科学系Matlab软件实习(论文)——非线性方程求根

信息与计算科学系Matlab软件实习(论文)——非线性方程求根

Matlab软件实习论文非线性方程求根系别信息与计算科学专业信息与计算科学学号姓名指导教师2008年8 月10 日非线性方程求根摘要随着科学技术,生产力经济的发展,在科学与工程计算中存在着大量方程求根问题,例如贷款购房问题,工厂的最佳订货问题等都需要求解一类非线性方程的根,而本文就针对这些求根问题提出了解决方案,本文利用牛顿迭代法来结决方程的求根问题.首先根据实际问题列出数学模型,确定变量,给出各个条件及相关函数;然后对建立的模型进行具体分析和研究,选择合适的求解方法;编写函数的程序,用计算机求出方程的解,通过所求解分析具体情况.关键词:非线性方程,牛顿迭代法,Matlab目录摘要 (I)1 绪论 (1)1.1非线性方程求根的背景 (1)1.2非线性方程求根的目的: (1)1.3非线性方程求根的内容: (1)2 牛顿迭代法的实现及应用 (3)2.1N EWTON迭代法具体例子的实现 (3)2.2应用牛顿法解决购房贷款利率问题 (4)2.3应用牛顿迭代法计算最佳订货量 (6)结论 (8)参考文献 (9)1 绪 论1.1 非线性方程求根的背景随着社会的进步,科学技术的快速发展,各种工程等也如雨后春笋一般破土而出,对我们的日常生活产生了巨大的影响如天气预报、石油的勘探、地质灾害的预报等.牛顿迭代法是牛顿在17世纪提出的一种求解方程()0f x =.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.而在各种科学和工程计算中往往要用到非线性方程组的求解,而牛顿法又是最基础的迭代法,在各种计算力学、控制工程等领域中发挥了不可代替的作用.而在数值计算中,非线性方程组的求解同样具有重要意义.随着计算机技术的成熟和高速发展,对于非线性方程求根问题出现了大量的数学软件(如MATLAB,Matheamatica,Maple,SAS,SPSSD 等),计算机已经成为工程师应用数学解决工程问题的主要运算工具.同时,工程专业的学生对数学教育的需求重点正在从手工演绎和运算能力的培养转变到结合计算机软件进行建模、求解和论证能力的培养[]1.本文采用Matlab 作为软件平台,介绍了非线性方程求根的内容.1.2 非线性方程求根的目的为了推动科学的进步,能够很简便的完成各种工程计算,非线性方程组的求解方法以其独有的方法解决了各种计算,为今天以及将来的应用打下了坚实的基础.非线性方程组的求解正是为了这个目的才广泛被人们应用,此文也将给出非线性方程组求解的实际应用.1.3 非线性方程求根的内容解非线性方程()0f x =的主要算法是迭代法,如fsolve 、二分法、牛顿迭代法等.迭代法是从已知的解的初始近似值0 x (简称初值)开始,利用某种迭代格式( )x g x =求得一近似值序列121,,,,,k k x x x x +逐步逼近于所求的解α(称为不动点).这一方法是否成功取决于三个因素,首先 ( )x g x =应与()0f x =同解,其次初值0 x 的选取是否合适,一般要与真解靠近,最后也是最关键的是迭代序列是否收敛,为了保证收敛性,在真解附近应有'| ()|1g x <否则迭代序列可能发散.最基本的迭代法是Newton 迭代法,其迭代格式为1'()()k k k k f x x x f x +=-. 从几何上说1k x +为用 ()f x 在 k x 出切线代替 ()f x 求得的解,所以也称为切线法,当初值0 x 与真值α足够靠近,Newton 迭代法收敛.对于单根,Newton 法收敛速度很快;对于重根,收敛较慢.牛顿迭代法的大概算法为:给定初始值0x ,ε为根的容许误差,η为()f x 的容许误差,N 为迭代次数的容许值.① 如果'0()0f x =或迭代次数大于N ,则算法失败,结束;否则执行② ② 计算010'0()()f x x x f x =-③ 若10x x ε-<或1()f x η<,则输出1x ,程序结束;否则执行④ ④ 令01x x =,转向①下面给出了Newton 迭代法的计算程序. function x=newton(fname,dfname,x0,e) %用途:Newton 迭代法解非线性方程f(x)=0%格式:x=nanewton( fname,dfname,x0,e) x 返回数值解, %fname 和dfname 分别表示f(x)及其导函数 %f'(x),x0为迭代初值,e 精度要求(默认为1e-4) if nargin<4,e=1e-4; %精度默认为1e-4 endx=x0;x0=x+2*e; %使while 成立,进入while 后x0得到赋值 while abs(x0-x)>e x0=x;x=x0-feval(fname,x0)/feval(dfname,x0); end2 牛顿迭代法的实现及应用2.1 Newton 迭代法具体例子的实现用Newton 迭代法解方程 32() -3-30 f x x x x =+= 在1.5附近的根.解:当2x >时,()0, ()0f x f x >>,即()f x 恒正,所以根在[0,2].我们先用图解法找初值,在用Newton 法程序newton.m 求解.fun= inline('x^3+x^2-3*x-3'); fplot(fun,[0,2]); grid on;图 2.1 ()f x 的函数图像由图可知方程有唯一正根在[1.6,1.8]之间,我们取初值1.5代入Newton 程序中. dfun=inline('3*x^2+2*x-3'); format long;newton(fun,dfun,1.5,1e-4); format short; ans =1.73205080756888而用Matlab 本身的函数fzero 求出来的结果为: format long;fzero(inline('x^3+x^2-3*x-3'),1.5); format short ans =1.73205080756888下面用牛顿迭代法解决一些实际问题 2.2 应用牛顿法解决购房贷款利率问题住房是居民消费的一个主要部分,大部分人选择银行按揭贷款,然后在若干年内逐月分期还款.如果你借了10万,还款额一定超过10万.设贷款总额为0x ,贷款期限为N 个月,采取逐月等额方式偿还本息.若k x 为第k 个月的欠款数,a 为月还款,r 为月利率.我们得到些列迭代关系式1 (1) - ,k k x r x a +=+那么1(1)k k x r x a -=+-22(1)(1)k r x r a a -=+-+-= 210(1)[1(1)(1)]k r x a r r -=+-+++++0(1)[(1)1]/k k r x a r r =+-+-, 由此可以得到月还款计算公式(1)(1)1N Nr x a r +=+-下面是《新民晚报》2000年3月30日第七版上的一则房产广告:不难算出,你向银行总共借了25.2万,30年内共要还51.96万,约为当初借款的两倍.这个案例中的贷款年利率是多少呢?我们根据a =0.1436, 0x =25.2, 360N =,由以上a 的求解公式得到:360360++=.25.2(1)-0.1436[(1)-1]0r r r我们令360360=++,( ) 25.2(1)-0.1436[(1)-1]f r r r r则次问题就转化成非线性方程求根的问题,令( )0,f r=求出r.我们先用Newton函数求解.在Matlab中输入如下程序:常识上,r应比当时活期存款月利率略高一些.我们用当时的活期存款月利率0.0198/2作为迭代初值,为了剔除0r=这个没有意义的根,我们对( )f r稍作变形:clear;fun=inline('25.2*(1+r)^360/0.1436-((1+r)^360-1)/r','r')fun =Inline function:fun(r) = 25.2*(1+r)^360/0.1436-((1+r)^360-1)/rdfun=inline('25.2*360*(1+r)^359/0.1436-(360*(1+r)^359*r-((1+r)^360-1))/(r^2)');r=newton(fun,dfun,0.0198/2,1e-4);R=12*r然后求得结果:R =0.0553于是得出年利率为 5.53%.下面我们用Matlab中的fzero函数检验一下:clear;fun=inline('25.2*(1+r)^360-((1+r)^360-1)/r*0.1436','r')fun =Inline function:fun(r) = 25.2*(1+r)^360-((1+r)^360-1)/r*0.1436r=fzero(fun,0.0198/2);R=12*rR =0.0553结果相同,可见牛顿迭代法的正确性. 2.3 应用牛顿迭代法计算最佳订货量汽车工厂为了保证生产的正常运作,配件供应一定要由保障.这些配件并不是在市场上随时可以买到的,所以往往要预先从配件供应商那里定货.由于配件供应商并不是生产单一产品,为你的定货必须要在流水线上作出调整,所以每次定货需要收取一定量的生产准备费.配件供应商的生产能力很大,开工后很快可以生产许多配件,但是你的汽车工厂并不是立即需要这么多,往往要在仓库里储存一段时间,为此你要付出储存费.如果订货量很小,必然需要频繁定货,造成生产准备费的增加;反之,若订货量很大,定货周期必然延长,生产准备费下降,但这样会造成储存费的增加.如何确定合适的订货量?实践中,这是一个相当复杂的问题,因为市场波动的影响是多方面的.我们先作一些必要的假设将问题简化.1) 汽车工厂对配件的日需量是恒定的,每日为r 件; 2) 所订配件按时一次性交货,生产准备费每次1 k 元; 3) 储存费按当日实际储存量计算,储存费每日每件2k 元; 4) 你的工厂不许缺货.设一次定货x 件,由于工厂不允许缺货,而为了节省存储费,交货日期应定为恰好用完时,所以定货日期/.T x r = (1)由于日需求量是恒定的,可以计算出第t 天的存储量为( )-, 0.q t x rt t T =<< (2)由于第t 天的储存费为2k q( t ),一个周期的总储存费为2201()()TTt t k q t k q t d -≈∑⎰. (3)根据(1),(2),(3)得到一个周期总费用212() 2x C x k k r=+,优化目标是使单位产品费用12()()2k k xC x f x x x r==+, 达到最小.由'()0f x =即122-02k k x r+=, 可直接解得x =这就是著名的经济批量定货公式. 当我们给出具体值时,非线性方程就可以求解了,由于具体的值不定,在此就不给出具体程序了.结论通过以上的论述我们可以知道计算机在现代生活中的应用已经如此普及,尤其是在数学计算当中,Matlab软件更是发挥了不可替代的作用.Matlab以其强大的功能,方便了当今数值计算,数学教程,及工程计算等众多领域.本文在以Matlab软件为平台的基础上,给出了非线性方程的一般解法,非线性方程的求解有二分法,牛顿迭代法,简单牛顿法,牛顿下山法,弦截法,抛物线法等.二分法的优点是算法简单,且总是收敛的,但由于二分法的收敛速度太慢,故一般不单独将其用于求根,只用其为根求得一个较好的近似[]2值.其他的求根方法各有优缺点,这里就不一一赘述.本文主要介绍了牛顿迭代法及其在现实生活中的应用.牛顿迭代法为平方收敛,故其收敛速度较快,但对初值的选取需要谨慎,如果初值选取错误,则可能导致方程迭代发散,最终不能求解出正确解.在计算一些对精度要求特别苛刻时,最好给出较高的精度输入及输出,防止因为精度问题导致误差过大,最终影响结果.牛顿迭代法可以应用于分形理论.分形理论是近二、三十年才发展起来的一门新的学科,其主要描述自然界和非线性系统中不光滑和不规则的几何形体.在地质、材料科学、物理学、计算机科学、艺术设计等方面有着十分广阔的应用前景. 利用牛顿迭代的数学原理和方法,实现牛顿迭代法的分形图形生成算法,将分形理论应用于计算机图形设计中,形.利用VC++6.0开发工具,实现了生成绚丽多彩的分形图[]3非线性方程的求根问题在计算机发展的基础上,被广泛应用于各种工程计算,大大方便了工程师们的计算过程,在现代的工业发展中发挥了重要作用.牛顿迭代法简便易学,为今后的学子们提供了更多的学习内容.参考文献[1] 胡良剑,孙晓君.Matlab数学实验[M]. 高等教育出版社,2006.[2] 李庆扬,王能超,易大义.数值分析(第4版)[M].清华大学出版社.施普林格出版社.2001.[3] 吴运兵,李勇.《西安科技大学学报》2005年03期.。

Matlab非线性方程求根

Matlab非线性方程求根
x 2 = 3 x1 + 1 = 3 1 .35721 + 1 = 1 .33086
x3 = 3 x 2 + 1 = 3 1.33086 + 1 = 1.32588
如此下去,这种逐步校正的过程称为迭代过程。 如此下去,这种逐步校正的过程称为迭代过程。这里用的 公式称为迭代公式, 公式称为迭代公式,即 k=0,1,2,…… 迭代结果见下表。仅取六位数字, 相同,即认为x 迭代结果见下表。仅取六位数字,x7与x8相同,即认为 8 是方程的根。 是方程的根。 xk xk x*≈x8=1.32472 k k 0 1.5 5 1.32476 1 1.35721 6 1.32473 2 1.33086 7 1.32472 3 1.32588 8 1.32472 4 1.32494
1 bk − a k = k (b − a ) 2
趋于无穷时趋于0。即若二分过程无限继续下去, 当k趋于无穷时趋于 。即若二分过程无限继续下去,这 趋于无穷时趋于 些区间最后必收敛于一点x*,即方程的根。 些区间最后必收敛于一点 ,即方程的根。
每次二分后,取有根区间的中点 每次二分后,取有根区间的中点xk= (ak+bk) /2作 作 为根的近似值,则可得一近似根序列: 为根的近似值,则可得一近似根序列: x0, x1, x2, … 该序列必以根x*为极限 为极限。 该序列必以根 为极限。 实际计算中,若给定充分小的正数ε 实际计算中,若给定充分小的正数ε0和允许误差 均可取x*≈ 限ε1,当|f(xn)|< ε0或bn- an< ε1时,均可取 ≈ xn。
x k +1 = 3 x k + 1
输入
x1, ε , N0
k =1,2,L, N0

求解非线性方程根的Matlab函数

求解非线性方程根的Matlab函数

Solve函数可以得到方程根的解析或数值解, 其命令格式为
Solve(‘eqn1’, ‘eqn2’, …,‘eqnN’) Solve(‘eqn1’, ‘eqn2’, …,‘eqnN’, ‘var1,var2,…,varN’) ‘eqn1’, ‘eqn2’, …,‘eqnN’是方程的表达式; ‘var1,var2,…,varN’是相应的变量.

例3:求解非线性方程组 x2+xy+y=3 X2-4x+3=0 解:输入 [x,y]=solve(‘x^2+x*y+y=3’,’x^2-4*x+3=0) 得到 X= [ 1] [ 3] Y= [ 1] [-3/2]
1.3求出多项式方程的全部根


Solve()函数的另一种功能是求多项式的全部根.
1.1求出方程根的解析表达式

例1:分别求一元二次方程ax2+bx+c=0和三角方程psin(x)=r的根. 解: 输入 x=solve(‘a*x^2+b*x+c’) 得到 X=[1/2/a*(-b+(b^2-4*a*c)^(1/2)] X=[1/2/a*(-b-(b^2-4*a*c)^(1/2)] 再输入 x=solve(‘p*sin(x)=r’) 得到 x=asin(r/p) 即 x=arcsin(r/p).
2.Fzero函数

2.1 fzero()函数
fzero()函数是求一维变量的零点,其计算格式为: x= fzero(fun,x0) x= fzero(fun,x0,options) [x,fval]= fzero(…) 其中,x为方程的零点,fval为计算终止时的函数值, fun为方程的函数,x0为初始点,options为选择项, 它包括Display和TolX。

matlab中方程根的近似计算

matlab中方程根的近似计算

matlab中方程根的近似计算实验一方程根的近似计算一、问题求非线性方程的根二、实验目的1、学会使用matlab中内部函数roots、solve、fsolve、fzero求解方程,并用之解决实际问题。

4、熟悉Matlab的编程思路,尤其是函数式M文件的编写方法。

三、预备知识方程求根是初等数学的重要内容之一,也是科学和工程中经常碰到的数值计算问题。

它的一般形式是求方程f(x)=0的根。

如果有x*使得f(x*)=0,则称x*为f(x)=0的根,或函数f(x)的零点。

并非所有的方程都能求出精确解或解析解。

理论上已经证明,用代数方法可以求出不超过3次的代数方程的解析解,但对于次数大于等于5的代数方程,没有代数求根方法,即它的根不能用方程系数的解析式表示。

至于超越方程,通常很难求出其解析解。

不存在解析解的方程就需要结合具体方程(函数)的性质,使用作图法或数值法求出近似解。

而计算机的发展和普及又为这些方法提供了广阔的发展前景,使之成为科学和工程中最实用的方法之一。

下面介绍几种常见的求近似根的方法。

1. 求方程近似解的简单方法1.1 图形方法—放大法求根图形的方法是分析方程根的性态最简洁的方法。

不过,不要总是想得到根的精确值。

这些值虽然粗糙但直观,多少个根,在何范围,一目了然。

并且还可以借助图形局部放大功能,将根定位得更加准确一些。

例1.1 求方程x5+2x2+4=0的所有根及其大致分布范围。

解(1)画出函数f(x)=x5+2x2+4的图形,确定方程的实数根的大致范围。

为此,在matlab命令窗中输入clfezplot x-x,grid onhold onezplot('x^5+2*x^2+4',[-2*pi,2*pi])1-1 函数f(x)=x5+2x2+4的图形clfx=-2*pi:0.1:2*pi;y1=zeros(size(x));y2= x.^5+2*x.^2+4;plot(x,y1,x,y2)grid onaxis tighttitle('x^5+2x^2+4')xlabel('x')从图1-1可见,它有一个实数根,大致分布在-2与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总结。

matlab非线性方程实验报告

matlab非线性方程实验报告

一、课题名称非线性方程二、目的和意义1、通过实验进一步了解方程求根的算法;2、认识选择计算格式的重要性;3、掌握迭代算法和精度控制;4、明确迭代收敛性与初值选取的关系。

三、实验要求1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;2、用事后误差估计来控制迭代次数,并且打印出迭代的次数;3、初始值的选取对迭代收敛有何影响;4、分析迭代收敛和发散的原因。

四、计算公式Newton法二、结构程序设计Newton迭代法Matlab程序function [c,err,count]=diedai(f,x0,delta,max)for k=1:maxx1=x0;x0=f(x0);if abs(x0-x1)<deltaendendc=x0;err=abs(x0-x1);count=k六、结果讨论和分析在命令窗口输入实参调用diedai函数文件进行计算>> f=inline('(3*x+1)/x.^2');>> x0=-2;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max) err =5.5997e-005c =-1.5321err =5.5997e-005count =30>> f=inline('(x.^3-1)/3');>> x0=-1;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max) err =c =-0.3473err =count =30>> f=inline('(3*x+1)^(1/3)'); >> x0=2;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max) err =c =1.8794err =count =30>> f=inline('1/(x.^2-3)');>> x0=-2;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max)err =c =-0.3473err =count =30>> f=inline('(3+1/x)^0.5');>> x0=-2;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max)err =2.2204e-016c =1.8794err =2.2204e-016count =30>> f=inline('x-1/3*((x.^3-3*x-1)/(x.^2-1))'); >> x0=-2;>> delta=0.0005;>> max=30;>> [c,err]=diedai(f,x0,delta,max)err =c =-1.5321err =count =30X}收敛,才能求出方程的解。

实验5非线性方程求根及其MATLAB实现

实验5非线性方程求根及其MATLAB实现

实验5非线性方程求根及其MATLAB实现实验要求:1.掌握二分法、牛顿迭代法和二次迭代法等求根方法;2.能够通过MATLAB实现非线性方程求根算法。

实验背景:非线性方程求根是数值计算中的一个重要问题。

对于一般的非线性方程,往往无法用解析的方法得到根的精确值。

因此,需要采用数值计算的方法来逼近方程的根。

本实验将介绍三种常用的非线性方程求根算法:二分法、牛顿迭代法和二次迭代法,并通过MATLAB实现这些算法。

一、二分法二分法是一种简单直观的求根方法。

它的基本思想是:通过对函数值的符号变化情况进行判断,将方程的根所在的区间逐渐减小,直至满足精度要求。

具体实现过程如下:1.选择一个区间[a,b],使得f(a)和f(b)异号,即f(a)f(b)<0;2.确定区间的中点c=(a+b)/2,并计算f(c);3.如果f(c)为0,说明c就是方程的根。

如果不为0,再判断f(c)和f(a)的符号,如果异号,则根位于[a,c]区间;如果同号,则根位于[c,b]区间;4.根据上一步的判断,缩小区间,重复2和3步骤,直至满足精度要求。

二、牛顿迭代法牛顿迭代法利用导数与函数近似线性关系的思想,通过迭代不断逼近方程的根。

具体实现过程如下:1.选择一个初始值x0,计算f(x0)和f'(x0);2.根据一阶泰勒展开公式,得到下一个近似值x1=x0-f(x0)/f'(x0);3.计算f(x1)的绝对值,如果小于给定的精度要求,则x1是方程的近似根;否则,x1成为新的初始值,重复2和3步骤,直至满足精度要求。

三、二次迭代法二次迭代法也是一种常用的求根方法。

它通过构建二次复合函数并对其进行迭代,逐步逼近方程的根。

具体实现过程如下:1.选择一个初始点x0,计算f(x0)和f'(x0);2.利用初始点和导数构建二次复合函数g(x)=x-f(x)/f'(x),即g(x)=x0-f(x0)/f'(x0)+f''(x0)(x-x0)^2/2;3.将g(x)视为新的非线性方程,利用牛顿迭代法计算出下一个近似值y1;4.利用y1和x0计算原方程的下一个近似值x1=y1+f(x0)/f'(x0);5.计算f(x1)的绝对值,如果小于给定的精度要求,则x1是方程的近似根;否则,x1成为新的初始值,重复3到5步骤,直至满足精度要求。

计算方法非线性方程求根实验报告

计算方法非线性方程求根实验报告

实验报告一.MATLAB程序代码(1)function x=agui_bisect(fname,a,b,e)fa=feval(fname,a);fb=feval(fname,b);if fa*fb>0 error('两端函数值为同号');endk=0x=(a+b)/2while(b-a)>(2*e)fx=feval(fname,x);if fa*fx<0b=x;fb=fx;elsea=x;fa=fx;endk=k+1x=(a+b)/2end(2)function x=agui_diedai(fname,x0,e)N=100;x=x0;x0=x+2*e;k=0;while abs(x0-x)>e&k<Nk=k+1x0=x;x=feval(fname,x0);disp(x)endif k==N warning('已达到最大迭代次数');end(3)function x=agui_newton(fname,dfname,x0,e)N=100;x=x0;x0=x+2*e;k=0;while abs(x0-x)>e&k<Nk=k+1x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);disp(x)endif k==N warning('已达最大迭代次数');end二. 实验结果及分析实验结果(1)x11=0.0903 (2)x5=0.0903 (3)x2=0.0903实验分析由三个结果对比可知,牛顿迭代法的迭代次数较少,且比较简单可靠。

可见牛顿迭代法要比二分法和迭代法的收敛速度快的多。

但是对函数有一定的要求。

牛顿迭代要求函数能求导。

基于matlab的数值分析( 非线性方程求根)上机实验报告1

基于matlab的数值分析( 非线性方程求根)上机实验报告1

数值分析试验报告非线性方程求根二分法解方程1. 题目:用二分法求方程0133=--x x 的所有根 2. 方法:二分法 3. 程序function x=erfenfa(a,b)if (a*a*a-3*a-1)*(b*b*b-3*b-1)>0 disp('区间错误,请重新调试!'); break else x=(a+b)/2.0; k=0;while (k<=100&abs(x*x*x-3*x-1)>0.0001&b-a>0.0001) if (x*x*x-3*x-1)*(a*a*a-3*a-1)<0 b=x; else a=x; end x=(a+b)/2.0; k=k+1; k,x if k==100display('计算方法错误,请重新调试!'); end end enddisp(['k=',num2str(k)])4. 结果>> format compact >> erfenfa(1,2) k = 1 x = 1.000000 k = 2x = 1.000000 k = 3 x = 1.000000 k = 4x =1.000000k =5x =1.000000k =6x =1.000000k =7x =1.000000k =8x =1.500000k =9x =1.250000k =10x =1.125000k=10ans =1.125000 >> erfenfa(-1,1) k =1x =-0.000000k =2x =-0.000000k =3x =-0.000000k =4 x =-0.000000k =5x =-0.000000k =6x =-0.000000k =7x =-0.000000k =8x =-0.000000k =9x =-0.500000k =10x =-0.750000k =11x =-0.347k =12x =-0.937500k =13x =-0.906250k=13ans =-0.906250 >> erfenfa(-2,-1) k =1x = -1.000000 k = 2 x = -1.000000 k = 3 x = -1.000000 k = 4 x = -1.000000 k = 5 x = -1.000000 k = 6 x = -1.000000 k = 7 x = -1.535k = 8 x = -1.500000 k = 9 x = -1.250000 k = 10 x = -1.125000 k = 11 x = -1.187500 k = 12 x = -1.532 k=12 ans = -1.5325,拓展:在程序编写完成调试过程中发现如果给出错误区间程序仍能给出一个错误答案,于是找同学讨教,讨论得出了正确的方法不动点解方程1. 题目: 解方程02010423=-++x x x 的根2.方法:不动点迭代法3.程序function x=budongdian(x0)p=x0;for k=1:10x0=p;p=20/(x0*x0+4*x0+10);if abs(p-x0)<0.0001break;endkpif k==10disp('计算错误')endend4.结果>> format compact>> budongdian(1)k =1p =For personal use only in study and research; not for commercial use1.3333k =2p =1.1688k =3p =1.2468k =4p =1.2091k =5p =1.2271k =6p =1.2184 k = 7 p = 1.2226 k = 8 p = 1.2206 k = 9 p = 1.2216 k = 10 p = 1.2211 k = 11 p = 1.2213 k = 12 p = 1.2212 p =1.2213Newton 迭代法求方程的根1. 题目:求方程0105233=++x x 的根 2. 方法:newton 迭代法 3. 程序:function x=newton(a) p=a;for k=1:100 a=p;p=a-(3*a*a*a+5*a*a+10)/(9*a*a+10*a); if abs(p-a)<0.00001 break; endif k==100display('计算错误'); endkpendp4.结果>> format long>> newton(-2)k =1p =-2.000000k =2p =-2.094853k =3p =-2.142995p =-2.582976>>对于不同的函数只需将文中x*x*x-3*x-1你所需求解的函数就ok 了仅供个人用于学习、研究;不得用于商业用途。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的矢量
相关文档
最新文档