matlab实验报告--求代数方程的近似根
matlab用二分法求方程近似根

matlab用二分法求方程近似根在MATLAB中,可以使用以下代码使用二分法求解方程的近似根:```matlabfunction root = bisection_method(func, a, b, tol, max_iter)% 输入参数:% func: 待求解方程的函数句柄% a, b: 取值范围% tol: 容差% max_iter: 最大迭代次数fa = func(a);fb = func(b);if fa * fb > 0error('在该区间内没有根存在');endfor k = 1:max_iterc = (a + b) / 2;fc = func(c);if abs(fc) < tolroot = c;return;endif fa * fc < 0b = c;fb = fc;elsea = c;fa = fc;endenderror('未达到收敛条件');end```使用该函数时,首先需要定义待求解方程的函数句柄。
例如,若要求解方程x^2 - 4 = 0的近似根,则可以定义如下函数:```matlabfunction f = equation(x)f = x^2 - 4;end```然后,可以通过调用`bisection_method`函数求解方程的近似根:```matlaba = 1; % 取值范围的下界b = 3; % 取值范围的上界tol = 1e-6; % 容差max_iter = 100; % 最大迭代次数root = bisection_method(@equation, a, b, tol, max_iter);disp(root);```在上述代码中,设置了取值范围的下界为1,上界为3,容差为1e-6,最大迭代次数为100。
运行代码后,MATLAB将输出方程的一个近似根。
Matlab数值实验求代数方程的近似根(解)教程

Matlab数值实验求代数方程的近似根(解)教程一、问题背景和实验目的二、相关函数(命令)及简介三、实验内容四、自己动手一、问题背景和实验目的求代数方程的根是最常见的数学问题之一(这里称为代数方程,主要是想和后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当是一次多项式时,称为线性方程,否则称之为非线性方程.当是非线性方程时,由于的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间,或给出某根的近似值.在实际问题抽象出的数学模型中,可以根据物理背景确定;也可根据的草图等方法确定,还可用对分法、迭代法以及牛顿切线法大致确定根的分布情况.通过本实验希望你能:1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程;2. 求代数方程(组)的解.二、相关函数(命令)及简介1.abs( ):求绝对值函数.2.diff(f):对独立变量求微分,f 为符号表达式.diff(f, 'a'):对变量a求微分,f 为符号表达式.diff(f, 'a', n):对变量 a 求 n 次微分,f 为符号表达式.例如:syms x tdiff(sin(x^2)*t^6, 't', 6)ans=720*sin(x^2)3.roots([c(1), c(2), …, c(n+1)]):求解多项式的所有根.例如:求解:.p = [1 -6 -72 -27];r = roots(p)r =12.1229-5.7345-0.38844.solve('表达式'):求表达式的解.solve('2*sin(x)=1')ans =1/6*pi5.linsolve(A, b):求线性方程组 A*x=b 的解.例如:A= [9 0; -1 8]; b=[1; 2];linsolve(A, b)ans=[ 1/9][19/72]6.fzero(fun, x0):在x0附近求fun 的解.其中fun为一个定义的函数,用“@函数名”方式进行调用.例如:fzero(@sin, 3)ans=3.14167.subs(f, 'x ', a):将 a 的值赋给符号表达式 f 中的 x,并计算出值.例如:subs('x^2 ', 'x ', 2)ans = 4三、实验内容首先,我们介绍几种与求根有关的方法:1.对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.设在上连续,,即,或,.则根据连续函数的介值定理,在内至少存在一点,使.下面的方法可以求出该根:(1) 令,计算;(2) 若,则是的根,停止计算,输出结果.若,则令,,若,则令,;.……,有、以及相应的.(3) 若 (为预先给定的精度要求),退出计算,输出结果;反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列,在中含有方程的根.当区间长很小时,取其中点为根的近似值,显然有以上公式可用于估计对分次数.分析以上过程不难知道,对分法的收敛速度与公比为的等比级数相同.由于,可知大约对分10次,近似根的精度可提高三位小数.对分法的收敛速度较慢,它常用来试探实根的分布区间,或求根的近似值.2. 迭代法1) 迭代法的基本思想:由方程构造一个等价方程从某个近似根出发,令,可得序列,这种方法称为迭代法.若收敛,即,只要连续,有即可知,的极限是的根,也就是的根.当然,若发散,迭代法就失败.以下给出迭代过程收敛的一些判别方法:定义:如果根的某个邻域中,使对任意的,迭代过程,收敛,则称迭代过程在附近局部收敛.定理1:设,在的某个邻域内连续,并且,,则对任何,由迭代决定的序列收敛于.定理2:条件同定理 1,则定理3:已知方程,且(1) 对任意的,有.(2) 对任意的,有,则对任意的,迭代生成的序列收敛于的根,且.以上给出的收敛定理中的条件要严格验证都较困难,实用时常用以下不严格的标准:当根区间较小,且对某一,明显小于1时,则迭代收敛 (参见附录3).2) 迭代法的加速:a) 松弛法:若与同是的近似值,则是两个近似值的加权平均,其中称为权重,现通过确定看能否得到加速.迭代方程是:其中,令,试确定:当时,有,即当,时,可望获得较好的加速效果,于是有松弛法:,松弛法的加速效果是明显的 (见附录4),甚至不收敛的迭代函数经加速后也能获得收敛.b) Altken方法:松弛法要先计算,在使用中有时不方便,为此发展出以下的 Altken 公式:,是它的根,是其近似根.设,,因为,用差商近似代替,有,解出,得由此得出公式;;,这就是Altken 公式,它的加速效果也是十分明显的,它同样可使不收敛的迭代格式获得收敛(见附录5).3. 牛顿(Newton)法(牛顿切线法)1) 牛顿法的基本思想:是非线性方程,一般较难解决,多采用线性化方法.记:是一次多项式,用作为的近似方程.的解为记为,一般地,记即为牛顿法公式.2) 牛顿法的收敛速度:对牛顿法,迭代形式为:注意分子上的,所以当时,,牛顿法至少是二阶收敛的,而在重根附近,牛顿法是线性收敛的.牛顿法的缺点是:(1)对重根收敛很慢;(2)对初值要求较严,要求相当接近真值.因此,常用其他方法确定初值,再用牛顿法提高精度.4. 求方程根(解)的其它方法(1) solve('x^3-3*x+1=0')(2) roots([1 0 -3 1])(3) fzero('x^3-3*x+1', -2)(4) fzero('x^3-3*x+1', 0.5)(5) fzero('x^3-3*x+1', 1.4)(6) linsolve([1, 2, 3; 4, 5, 6; 7, 8, 0], [1, 2, 3]')体会一下,(2)(5) 用了上述 1 3 中的哪一种方法?以下是本实验中的几个具体的实验,详细的程序清单参见附录.具体实验1:对分法先作图观察方程:的实根的分布区间,再利用对分法在这些区间上分别求出根的近似值.输入以下命令,可得的图象:f='x^3-3*x+1';g='0';ezplot(f, [-4, 4]);hold on;ezplot(g, [-4, 4]); %目的是画出直线 y=0,即 x 轴grid on;axis([-4 4 -5 5]);hold off请填写下表:在某区间上求根的近似值的对分法程序参见附录1.具体实验2:普通迭代法采用迭代过程:求方程在 0.5 附近的根,精确到第 4 位小数.构造等价方程:用迭代公式:,用 Matlab 编写的程序参见附录2.请利用上述程序填写下表:分析:将附录2第4行中的分别改为以及,问运行的结果是什么?你能分析得到其中的原因吗?看看下面的“具体实验3”是想向你表达一个什么意思.用 Matlab 编写的程序参见附录3.具体实验3:收敛/发散判断设方程的三个根近似地取,和,这些近似值可以用上面的对分法求得.迭代形式一:收敛 (很可能收敛,下同)不收敛 (很可能不收敛,下同)不收敛迭代形式二:收敛不收敛不收敛迭代形式三:不收敛收敛收敛具体实验4:迭代法的加速1——松弛迭代法,,迭代公式为程序参见附录4.具体实验5:迭代法的加速2——Altken迭代法迭代公式为:,,程序参见附录5.具体实验6:牛顿法用牛顿法计算方程在-2到2之间的三个根.提示:,迭代公式:程序参见附录6 (牛顿法程序).具体实验7:其他方法求下列代数方程(组)的解:(1)命令:solve('x^5-x+1=0')(2)命令:[x, y]=solve('2*x+3*y=0', '4*x^2+3*y=1')(3) 求线性方程组的解,已知,命令:for i=1:5for j=1:5m(i, j)=i+j-1;endendm(5, 5)=0;b=[1:5]'linsolve(m, b)思考:若,或是类似的但阶数更大的稀疏方阵,则应如何得到?四、自己动手1.对分法可以用来求偶重根附近的近似解吗? 为什么?2.对照具体实验2、4、5,你可以得出什么结论?3.选择适当的迭代过程,分别使用:(1)普通迭代法;(2)与之相应的松弛迭代法和Altken 迭代法.求解方程在 1.4 附近的根,精确到4位小数,请注意迭代次数的变化.4.分别用对分法、普通迭代法、松弛迭代法、Altken 迭代法、牛顿切法线等5种方法,求方程的正的近似根,.(建议取.时间许可的话,可进一步考虑的情况.)。
求代数方程的近似根(解).

主要内容
本实验讨论的数值算法
对分法 不动点迭代法
不动ห้องสมุดไป่ตู้迭代一般形式 松弛加速迭代法
牛顿迭代法
8
不动点迭代法
基本思想 构造 f (x) = 0 的一个等价方程:x 从某个近似根 x0 出发,计算
( x)
xk 1 ( xk )
得到一个迭代序列
k = 0, 1, 2, ... ...
11
k
迭代法收敛性判断
q 越小,迭代收敛越快
’(x*) 越小,迭代收敛越快
以上所给出的收敛性定理中的条件的验证都比较 困难,在实际应用中,我们常用下面不严格的判别 方法:
当有根区间 [a, b] 较小,且对某一 x0[a, b] ,
|’(x0)| 明显小于 1 时,则我们就认为迭代收敛 例:用不动点迭代法求 x3 - 3x + 1 = 0 在 [0, 1] 中的解。
例:用对分法求 x3 - 3x + 1 = 0 在 [0, 1] 中的解。(fuluA.m)
6
对分法收敛性
收敛性分析
根据上面的算法,我们可以得到一个每次缩小一半的 区间序列 {[ak , bk ]} ,在 (ak , bk ) 中含有方程的根。 设方程的根为 x* (ak , bk ) ,又 xk
基本思想
将有根区间进行对分,判断出解在某个分段内,然后 再对该段对分,依次类推,直到满足给定的精度为止
数学原理:介值定理
设 f(x) 在 [a, b] 上连续,且 f(a) f(b)<0,则由介值定 理可得,在 (a, b) 内至少存在一点 使得 f()=0
适用范围
求有根区间内的 单重实根 或 奇重实根
MATLAB数值计算-第4章-方程求根

MATLAB数值计算(读书日记及程序编写)第四章方程求根 (2)第四章 方程求根#二分法 求2的值转化成方程02-2=x最慢的方法是取初值1001=x 02-21>x ,取502=x这样得到也可以x0=a, x1=x0+h, 进行扫描,若f(x0)*f(x1)<0, 则扫描成功,有根区间为[x0,x1],否则继续扫描,如果出现x1>b ,表面扫描失败,再缩小步长h, 再次扫描。
>> format long %让显示的值为M=2,a=1,b=2,k=0;while b-a>epsx=(a+b)/2;if x^2>Mb=xelsea=xendk=k+1end执行后得到的值为:k =50b =1.414213562373095k =51b =1.414213562373095k =52最后得到的值就是Matlab 能表达的最接近的值。
#牛顿法求解f(x)=0的牛顿法是在f(x)画一条切线,确定切线与x 轴的焦点,通过迭代 )(x f )f(x -n n 1'=+n n x x 对于平方根的问题,牛顿法简洁有效,换成f(x)=x^2-M, )(x f n '=2x 这样⎪⎪⎭⎫ ⎝⎛+==+n n n n x M x M x x 212x -x -n 2n 1 该算法就是反复求x 和M/x 的平均值,Matlab 的程序为:format long %让显示的值为xprev=2; %取的不等于初值x 的一个值,让判断能继续x=100; %取的初值为3while abs(x-xprev)>eps*abs(x)xprev=x;x=0.5*(x+2/x)endx = 1.833333333333333x = 1.462121212121212x = 1.414998429894803x = 1.414213780047198x = 1.414213562373112x = 1.414213562373095x = 1.414213562373095可见6步很快就收敛然而,若f(x)不具有连续的、有界的一阶、二阶导数,牛顿法的收敛将变得很慢。
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之间。
实验三:matlab求代数方程的近似根(解)

相关概念
线性方程 与 非线性方程
f ( x) 0
如果 f(x) 是一次多项式,称上面的方程为线性方 程;否则称之为非线性方程。
对分法
基本思想
将有根区间进行对分,判断出解在某个分段内,然后 再对该段对分,依次类推,直到满足给定的精度为止。
适用范围
求有根区间内的 单根 或 奇重实根。
(1) 令 x0 (a b) / 2,计算 f ( x0 ); ( 2) 若 | f ( x0 ) | ,则 x0 就是我们所要的近似根,
停止计算, 输出结果 x x0;
(3) 若 f (a ) f ( x0 ) 0,令 a1 a, b1 x0 ; 否则令 a1 x0 , b1 b;
上机作业
作业(要求写实验报告)
教材:P69, 4
( x ) (1 w) x w ( x )
加权系数 wk 的确定:令 ’(x)=0 得
w 1 1 '( x )
wk
1 1 '( xk )
松弛迭代法
松弛法迭代公式:
xk 1 (1 wk ) xk wk ( xk )
1 wk , 1 '( xk )
根据上面的算法,我们可以得到一个每次缩小一半的 区间序列 {[ak , bk ]} ,在 (ak , bk ) 中含有方程的根。 设方程的根为 x* (ak , bk ) ,又 xk
1 1 1 1 | xk | ( bk ak ) ( bk 1 ak 1 )= = k 1 ( b a) 2 2 2 2
令: P ( x ) 0
ቤተ መጻሕፍቲ ባይዱ
f ( x0 ) x x0 f '( x0 )
matlab计算方程的根

MATLAB计算方程的根一、引言在数学中,方程的根指的是方程中使得等式成立的未知数的值。
解方程是数学中的一项基本操作,它在各个领域都有广泛的应用。
M A TL AB是一种强大的数值计算工具,它提供了多种方法来求解方程的根。
本文将介绍如何使用MA TL AB计算方程的根,包括求解一元方程和多元方程的方法。
二、求解一元方程的方法1.代数方法代数方法是求解一元方程的常用方法之一,它通过移项、合并同类项等代数运算,将方程转化为更简单的形式,从而求解方程的根。
在M A TL AB中,我们可以使用符号计算工具箱(Sy mb ol ic Ma thT o ol bo x)来进行代数运算。
以下是一个求解一元方程的示例代码:s y ms xe q n=x^2-3*x+2==0;s o l=so lv e(eq n,x);2.迭代法迭代法是数值计算中常用的一种方法,它通过逐步逼近方程的根,最终得到一个满足精度要求的解。
M AT LA B提供了多种迭代法求解方程根的函数,如牛顿迭代法(`fz er o`函数)、二分法(`f ze ro`函数)、割线法(`f ze ro`函数)等。
以下是一个使用二分法求解一元方程根的示例代码:f=@(x)x^2-3*x+2;x0=0;%初始猜测值x=fz er o(f,x0);三、求解多元方程的方法1.数值解法对于多元方程组,数值解法是一种常见且有效的求解方法。
MA T LA B提供了多种数值解法的函数,如牛顿法(`f s ol ve`函数)、最小二乘法(`ls qn on li n`函数)等。
这些函数可以根据方程组的特点选择合适的算法进行求解。
以下是一个使用牛顿法求解多元方程组的示例代码:f=@(x)[x(1)^2+x(2)^2-4;x(1)^2-x(2)^2-1];x0=[1;1];%初始猜测值x=fs ol ve(f,x0);2.符号解法在某些情况下,我们可以使用符号计算工具箱来求解多元方程组的精确解。
实验四 方程求根Matlab实验报告

北京理工大学珠海学院实验报告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY班级2012电气2班学号xxxxxxxxxx姓名陈冲指导教师张凯成绩实验题目(实验四)方程求根实验地点及时间JB501 2013/12/31(3-4节)一、实验目的1.掌握用程序语言来编辑函数。
2.学会用MATLAB编写resecm.m以及Newtoniter.m函数分别实现二分法、牛顿迭代法求解。
二、实验环境Matlab软件三、实验内容1、以书中第11页题目1和第154页题目16为例编辑程序来实现计算结果。
2、使用MATLAB进行编写:第一步:编写resecm.m函数,代码如下第二步:编写Newtoniter.m函数,代码如下第三步:利用上述函数编辑命令:(可见实验结果中的截图)1.在此之前先建立一个名为f.m的M文件,代码如下function y=f(x);y=x^3-x-1;再编代码:clear all;resecm(‘f’,1,2,0.01)得到结果:ans=1.32472.再建文件名为li6_4fun.m的M文件,代码如下function y=li6_4fun(x);y=x^3+2*x^2+10*x-20;和dili6_4fun.m的M文件,代码如下function y=dili6_4fun(x);y=3*x^2+4*x+10;再编代码:得到结果:x=1.3688若在语句中添加format long;语句,且精确到14位,则结果为x=1.36880810782137四、实验题目1、用二分法求方程310x x --=在[]1,2内的近似值,要求误差不超过310-。
16、早在1225年,有人曾求解方程32210200x x x ++-=(见前述题1)并给了高精度的实根* 1.368808107x =,试用牛顿法求得这个结果。
前述题:1、试取01x =,用迭代公式1220210k k k x x x +=++,0,1,2,...k = 求方程32210200x x x ++-=的根,要求准确到310-。
在matlab用二分法求方程近似解的实验分析与讨论以及实验总

在matlab用二分法求方程近似解的实验分析与讨论以及实验总二分法也称为折半法,是一种求解非线性方程近似解的常用方法。
其基本思路是:利用函数在某个区间上的符号变化来找到方程的根,每次减半区间长度直到满足精度要求为止。
在Matlab中,我们可以利用循环结构和if语句来实现二分法求解非线性方程的近似解。
具体步骤如下:1. 定义函数f,并确定区间[a,b]和精度要求tol。
2. 利用while循环,当区间长度小于精度要求tol时停止循环,否则继续。
3. 每次循环先计算区间中点c=(a+b)/2,并计算函数值fc=f(c)。
4. 判断fc的符号和f(a)的符号是否相同,如果相同,则将区间左端点a赋值为c,否则将区间右端点b赋值为c。
5. 循环结束后,输出近似解x=(a+b)/2。
接下来我们以求解方程x^3-3x+1=0在区间[0,1]上的近似解为例,进行实验分析。
代码如下:```matlabfunction [x] = bisection_method()f = @(x) x^3-3*x+1; % 定义函数fa = 0; % 区间左端点b = 1; % 区间右端点tol = 1e-6; % 精度要求while (b-a)/2 > tol % 判断区间长度是否小于精度要求c = (a+b)/2; % 计算区间中点fc = f(c); % 计算函数值if f(a)*fc > 0 % 判断符号是否相同a = c; % 更新区间左端点elseb = c; % 更新区间右端点endendx = (a+b)/2; % 输出近似解end```我们运行该代码,可以得到方程的近似解为:```matlab>> bisection_method()ans =0.3473```实验分析:1. 二分法求解非线性方程的收敛性是保证的,即对于满足某些条件的方程和初始估计,二分法可以保证收敛到方程的根。
2. 在确定初始区间时,需要考虑到方程根的数量和分布。
MATLAB求方程根

运用MATLAB;实验:方程求根求方程f(x)=x^3-sinx-12x+1的全部根, ε=1e -6 (1) 用一般迭代法; (2) 用牛顿迭代法;并比较两种迭代的收敛速度。
解:由题可知, (1)①=-)4(f -15.7568<0,=-)3(f 10.1411>0,所以当x ∈[-4,-3]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.30-=x ,因为ε=1e -6,使用matlab ,得即运行结果:x_star =-3.410 ,1iter =14②1)0(=f >0,=)1(f -10.8415<0,所以当x ∈[0,1]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.00=x ,因为ε=1e -6,使用matlab ,得 代码:即运行结果:x_star = 0.0770 iter =6③=)3(f -8.1411<0,=)4(f 17.7568>0,所以当x ∈[3,4]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.30=x ,因为ε=1e -6,使用matlab ,得 代码:即运行结果:x_star = 3.4101 iter =10(2)对函数求导可得12cos 3)(2'--=x x x f ,由(1)可知,当x ∈[-4,-3]时,5.30-=x ,用牛顿迭代格式5.3)(/)(0'1{-=-=+x x f x f x x n n代码:即运行结果:x_star = -3.4912 iter =2②当x ∈[0,1]时,5.00=x ,用牛顿迭代格式5.0)(/)(0'1{=-=+x x f x f x x n n代码:运行结果:即 x_star = 0.0770 iter = 3③当x ∈[3,4]时,5.30=x ,用牛顿迭代格式5.3)(/)(0'1{=-=+x x f x f x x n n代码:即运行结果:x_star =3.4101iter =3由(1),(2)对比可得,牛顿迭代的收敛速度比较快。
MATLAB求代数方程的近似根(解)

y = polyval(p,x) Y = polyvalm(p,X)
多项式运算中, 使用的是多项式
系数向量,
不涉及符号计算!
x = roots(p)
线性方程组求解
线性方程组求解
linsolve(A,b):解线性方程组 Ax b
p2 2x 1 p1 p2 2x3 x2 2x 4
[2, 1, 0, 3] [ 0, 0[,2,1] [2, 1, 2, 4]
多项式四则运算
多项式乘法运算: k = conv(p,q)
例:计算多项式 2x3 x2 3 和 2x 1 的乘积 >> p=[2,-1,0,3]; >> q=[2,1]; >> k=conv(p,q);
多项式除法运算: [k,r] = deconv(p,q) 其中 k 返回的是多项式 p 除以 q 的商,r 是余式。 [k,r]=deconv(p,q) <==> p=conv(q,k)+r
多项式的求导
polyder
k=polyder(p) : 多项式 p 的导数; k=polyder(p,q): p*q 的导数; [k,d]=polyder(p,q): p/q 的导数,k 是分子,d 是分母
fsolve [x,fval,flag,out]=fsolve(fun,x0,options): 参数大部分与fzero相同,优化参数更多,更灵活。 注意x0的长度必须与变量的个数相等。
它与fzero的区别是,算法不同,fsolve的功能强大多很多,它可 以直接方便的求解多变量方程组,线性和非线性,超静定和静不 定方程,还可求解复数方程。 fun同样可以是句柄、inline函数或M文件,但是一般M文件比较 多,这是由于fsolve是解方程组的,目标函数一般比较烦,直接 写比较困难
matlab实验报告--求代数方程的近似根

数学实验报告实验序号: 日期: 年 月 日班级姓名学号实验名称:求代数方程的近似根 问题背景描述:求代数方程0)(=x f 的根是最常见的数学问题之一,当)(x f 是一次多项式时,称0)(=x f 为线性方程,否则称之为非线性方程.当0)(=x f 是非线性方程时,由于)(x f 的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间],[b a ,或给出某根的近似值0x .实验目的:1. 了解代数方程求根求解的四种方法:对分法、迭代法、牛顿切线法2. 掌握对分法、迭代法、牛顿切线法求方程近似根的基本过程。
实验原理与数学模型:1.对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.设)(x f 在],[b a 上连续,0)()(<⋅b f a f ,即 ()0f a >,()0f b <或()0f a <,()0f b >.则根据连续函数的介值定理,在),(b a 内至少存在一点 ξ,使()0f ξ=.下面的方法可以求出该根:(1) 令02a bx +=,计算0()f x ;(2) 若0()0f x =,则0x 是()0f x =的根,停止计算,输出结果0x x =.若 0()()0f a f x ⋅<,则令1a a =,10b x =,若0()()0f a f x ⋅>,则令10a x =,1b b =;1112a b x +=. ……,有k a 、k b 以及相应的2k kk a b x +=. (3) 若()k f x ε≤ (ε为预先给定的精度要求),退出计算,输出结果2k kk a b x +=; 反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列{[,]}k k a b ,在(,)k k a b 中含有方程的根.当区间长k k b a -很小时,取其中点2k kk a b x +=为根的近似值,显然有 1111111()()()2222k k k k k k x b a b a b a ξ--+-≤-=⨯⨯-==-以上公式可用于估计对分次数k .2. 迭代法1) 迭代法的基本思想:由方程()0f x =构造一个等价方程()x x φ=从某个近似根0x 出发,令1()k k x x φ+=, ,2,1,0=k可得序列{}k x ,这种方法称为迭代法.若 {}k x 收敛,即*lim k k x x →∞=,只要()x φ连续,有1lim lim ()(lim )k k k k k k x x x φφ+→∞→∞→∞==即可知,{}k x 的极限*x 是()x x φ=的根,也就是()0f x =的根.当然,若k x 发散,迭代法就失败. 迭代过程1()k k x x φ+=收敛的常用判别标准:当根区间[,]a b 较小,且对某一0[,]x a b ∈,()'x φ明显小于1时,则迭代收敛2) 迭代法的加速:a) 松弛法:若()x φ与k x 同是*x 的近似值,则1(1)()k k k k k x x x ωωφ+=-+是两个近似值的加权平均,其中k ω称为权重,现通过确定k ω看能否得到加速.迭代方程是:()x x ψ←其中()(1)()x x x ψωωφ=-+,令'()1'()0x x ψωωφ=-+=,试确定ω:当'()1x φ≠时,有11'()x ωφ=-,即当11'()k k x ωφ=-,'()11'()k k k x x φωφ--=-时,可望获得较好的加速效果,于是有松弛法:1(1)()k k k k k x x x ωωφ+=-+,11'()k k x ωφ=-b) Altken 方法:**()x x φ=,*x 是它的根,0x 是其近似根. 设10()x x φ=,21()x x φ=,因为****222121[][()()]()()x x x x x x x x 'x x φφφξ=+-=+-=+-, 用差商10211010()()x x x x x x x x φφ--=--近似代替()'φξ,有 **212110()x x x x x x x x -≈+-- , 解出*x ,得**()x x φ=2*212210()2x x x x x x x -≈--+ 由此得出公式(1)()k k x x φ= ; (2)(1)()k k x x φ=;(2)(1)2(2)1(2)(1)()2k k k kk k kx x x xx x x +-==-+, ,2,1,0=k 这就是Altken 公式。
西安交通大学数学实验报告(MATLAB求解开普勒方程和方程求根)

实验报告(五)完成人:L.W.Yohann注:本次实验主要学习了用MATLAB求解开普勒方程和方程求根的问题,了解学习了用fzero命令、二分法、Newton迭代法、一般迭代法求解方程,以及学习了非线性方程组的求解问题,完成后,小组对第90页的上级练习题进行了程序编辑和运行。
1.绘图并观察函数零点的分布.解:在编辑窗口输入:f=inline('x-0.5*sin(x)-1');fplot(f,[0,1])grid存盘后运行得2. 利用fzero 命令求解方程.解:在编辑窗口输入:f=inline('x-0.5*sin(x)-1');c=fzero(f,[1,2])存盘后运行得c =1.49873. 用二分法求解方程.求解(1)方程x^2-2=0在(0,2)内的近似根;(2)圆x^2+y^2=2与曲线y=e^-x 的两个交点;(3)方程∫t 21+t 2x 0dt =12的近似根. (1)解:在编辑窗口输入:00.10.20.30.40.50.60.70.80.91-1-0.9-0.8-0.7-0.6-0.5-0.4-0.3f=inline('x^2-2');x1=0;x2=2;while abs(x1-x2)>10^(-5)x3=(x1+x2)/2;if f(x3)==0break;elseif f(x1)*f(x3)>0x1=x3;else f(x2)*f(x3)>0;x2=x3;endendx0=x3存盘后运行得x0 =1.4142(2)解:在编辑窗口输入:f=inline('(x^2)*exp(2*x)+1-2*exp(2*x)');x1=0;x2=2;x5=-2;x6=0;while abs(x1-x2)>10^(-5)x3=(x1+x2)/2;if f(x3)==0break;elseif f(x1)*f(x3)>0x1=x3;else f(x2)*f(x3)>0;x2=x3;endendwhile abs(x5-x6)>10^(-5)x7=(x5+x6)/2;if f(x7)==0break;elseif f(x5)*f(x7)>0x5=x7;else f(x6)*f(x7)>0;x6=x7;endendx0=x3x4=x7存盘后运行得x0 =1.3922x4 =-0.3203(3)解:在编辑窗口输入:clear;clc;syms t xf1=(t^2)/(1+t^2);f2=int(f1,t,0,x);%¼ÆËã²»¶¨»ý·Öf=inline('x - atan(x)-0.5');x1=-5;x2=5;while abs(x1-x2)>10^(-5)x3=(x1+x2)/2;if f(x3)==0break;elseif f(x1)*f(x3)>0x1=x3;else f(x2)*f(x3)>0;x2=x3;endendx0=x3存盘后运行得x0 =1.47504.用Newton迭代法求解方程求解:x=0.5sinx+1的近似根;解:在编辑窗口输入:f=inline('x-0.5*sin(x)-1');df=inline('1-0.5*cos(x)');d2f=inline('0.5*sin(x)');a=1;b=2;dlt=1.0e-5;if f(a)*d2f(a)>0x0=a;elsex0=b;endm=min(abs(df(a)),abs(df(b)));k=0;while abs(f(x0))>m*dltk=k+1;x1=x0-f(x0)/df(x0);x0=x1;fprintf('k=%d x=%.5f\n',k,x0); end存盘后运行得k=1 x=1.54858k=2 x=1.49933k=3 x=1.498705.求解非线性方程组.试求非线性方程组{2x12−x1x2−5x1+1=0x1+3lgx1−x22=0的解,初值如下:(1)x0=[1.4,−1.5](2)x0=[3.7,2.7]解:在编辑窗口输入:function f=group5(x)f=[2*x(1)^2-x(1)*x(2)-5*x(1)+1;x(1)+3*log10(x(1))-x(2)^2];(1):输入:[f,fval]=fsolve('group2',[1.4,-1.5]) 运行得f =1.4589 -1.3968fval =1.0e-011 *0.0759-0.6178(2):输入:[f,fval]=fsolve('group2',[3.7,2.7])运行得f =3.4874 2.2616fval =1.0e-006 *0.0059-0.20126.解决实际问题.为了在海岛I与某城市C之间铺设一条地下光缆,每千米光缆铺设成本在水下部分使C1万元,在地下部分使C2万元,为使得该光缆的总成本最低,光缆的转折点P(海岸线上)应该取在何处?如果实际测得海岛I与城市C之间的水平距离l=30km,海岛距海岸线垂直距离h1=15km,城市距海岸线垂直距离h=10km,C1=3000万元/km,C2=1500万元/km,求P点的坐标(误差<10−3km).解:在编辑窗口输入:f=inline('(3000*x)/(x^2 + 225)^(1/2) + (750*(2*x - 60))/((x - 30)^2 + 100)^(1/2)'); x1=5;x2=10;while abs(x1-x2)>10^(-3)x3=(x1+x2)/2;if f(x3)==0break;elseif f(x1)*f(x3)>0x1=x3;else f(x2)*f(x3)>0;x2=x3;endendfprintf('x=%.5f',x3) 存盘后运行得x=7.69104>>。
Matlab 求代数方程的近似解

x*
即 x* ( x*)
( x*)
f ( x*) 0
注:若得到的点列发散,则迭代法失效!
迭代法收敛性判断
如果存在 x* 的某个 邻域 =(x*- , x* + ), 使 定义: 得对 x0 开始的迭代 xk+1 = (xk) 都收敛, 则称该迭代法在 x* 附近局部收敛。 设 x* =(x*),的某个邻域 内连续,且对 定理 1: x 都有 |’(x)|q< 1, 则对 x0 ,由迭 代 xk+1 = (xk) 得到的点列都收敛。
f 是符号表达式,也可以是字符串 默认变量由 findsym(f,1) 确定
>> syms x >> f=sin(x)+3*x^2; >> g=diff(f,x) >> g=diff('sin(x)+3*x^2','x')
Matlab 解方程函数
roots(p):多项式的所有零点,p 是多项式系数向量。 fzero(f,x0):求 f=0 在 x0 附近的根,f 可以使用
inline、字符串、或 @,但不能是方程或符号表达式!
linsolve(A,b):解线性方程组。 solve(f,v):求方程关于指定自变量的解,f 可以是用
得到一个迭代序列
k = 0, 1, 2, ... ...
xk k 0
f (x) = 0 f (x) 的零点
等价变换
x = (x)
(x) 的不动点
迭代法的收敛性
收敛性分析
若 ,假设 (x) 连续,则 xk x * xk 收敛,即lim k
matlab代数方程近似解

linsolve(A,b):解线性方程组。 solve(f,v):求方程关于指定自变量的解,f 可以是用
字符串表示的方程、符号表达式; solve 也可解方程组(包含非线性); 得不到解析解时,给出数值解。
上机作业
1.根据二分法的步骤编写程序bisec.m求
相关概念
线性方程 与 非线性方程
f ( x) 0
如果 f(x) 是一次多项式,称上面的方程为线性方 程;否则称之为非线性方程。
本节主要讨论非线性方程的数值求解
对分法
基本思想
将有根区间进行对分,判断出解在某个分段内,然后 再对该段对分,依次类推,直到满足给定的精度为止。
适用范围
(4) 令 x1 (a1 b1 ) / 2, 若 | f ( x1 ) | ,则停止计算, 输出结果 x x1; 若 f (a1 ) f ( x1 ) 0,令 a2 a1, b2 x1; 否则令 a2 x1, b2 b1;
... ...
Matlab程序见 bisec.m
f ( x ) f ( x0 ) f '( x0 )( x x0 ) 2! ( x x0 )
f ( x0 ) f '( x0 )( x x0 )
令: P ( x ) 0
P( x)
( f '( x0 ) 0)
f ( x0 ) x x0 f '( x0 )
(1) 令 x0 (a b) / 2,计算 f ( x0 ); (2) 若 | f ( x0 ) | ,则 x0 就是我们所要的近似根,
停止计算, 输出结果 x x0;
MATLAB求方程根

运用MATLAB;实验:方程求根求方程f(x)=x^3-sinx-12x+1的全部根, ε=1e -6 (1) 用一般迭代法; (2) 用牛顿迭代法;并比较两种迭代的收敛速度。
解:由题可知, (1)①=-)4(f -15.7568<0,=-)3(f 10.1411>0,所以当x ∈[-4,-3]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.30-=x ,因为ε=1e -6,使用matlab ,得即运行结果:x_star =-3.410 ,1iter =14②1)0(=f >0,=)1(f -10.8415<0,所以当x ∈[0,1]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.00=x ,因为ε=1e -6,使用matlab ,得 代码:即运行结果:x_star = 0.0770 iter =6③=)3(f -8.1411<0,=)4(f 17.7568>0,所以当x ∈[3,4]时,)(x f 有解,将原方程化为等价方程3112sin -+=x x x ,迭代函数和迭代序列分别为31112sin )(-+=x x x g ,31112sin -+=+x x g n ,n=0,1,2,....取初值5.30=x ,因为ε=1e -6,使用matlab ,得 代码:即运行结果:x_star = 3.4101 iter =10(2)对函数求导可得12cos 3)(2'--=x x x f ,由(1)可知,当x ∈[-4,-3]时,5.30-=x ,用牛顿迭代格式5.3)(/)(0'1{-=-=+x x f x f x x n n代码:即运行结果:x_star = -3.4912 iter =2②当x ∈[0,1]时,5.00=x ,用牛顿迭代格式5.0)(/)(0'1{=-=+x x f x f x x n n代码:运行结果:即 x_star = 0.0770 iter = 3③当x ∈[3,4]时,5.30=x ,用牛顿迭代格式5.3)(/)(0'1{=-=+x x f x f x x n n代码:即运行结果:x_star =3.4101iter =3由(1),(2)对比可得,牛顿迭代的收敛速度比较快。
matlab计算方法实验报告1(方程求根)

计算方法实验报告(1)学生姓名杨贤邦学号指导教师吴明芬实验时间2014.3.26地点综合实验楼大楼203实验题目非线性方程求根实验目的●掌握Matlab编程方法;●掌握非线性方程的数值求根方法及Matlab或C实现;实验内容●Matlab常用命令;●二分求根法及其Matlab实现●Newton求根法或割线法及其Matlab实现●题目由同学从学习材料中任意选两题算法分析与二分法:function x=method2(fname,a,b,e)fa=feval(fname,a);fb=feval(fname,b);if fa*fb>0error('两个函数值同号');endk=0x=(a+b)/2while(b-a)>eif k>3000error('已运行3000次,请检查是否为死循环(e太小或e为负数)');end fx=feval(fname,(b+a)/2);if fx*fa>0a=(b+a)/2;fa=fx;elseb=(b+a)/2;endk=k+1x=(b+a)/2end割线法:function x=gexianfa(fname,x0,x1,e)k=0;x=x1;while abs(x-x0)>eif k>3000error('已迭代3000次,请检查是否收敛或e太小');end源程序fx0=feval(fname,x0);fx1=feval(fname,x1);cache=x1;k=k+1x=x1-fx1/(fx1-fx0)*(x1-x0)x0=x1;x1=x;end实验结果与分析分别用二分法和割线法计算x3-15x2+42x+8=0在区间[3,5]的一个根,且误差不超过10-8割线法:k=1x=3.89655172413793k=2x=3.99315350368514k=3x=4.00007427733589k=4x=3.99999994899663k=5x=3.99999999999962k=6x=4.00000000000000ans=4.00000000000000二分法:k=1x=3.50000000000000k=2x=3.75000000000000k=3x=3.87500000000000k=4x=3.93750000000000k=5x=3.96875000000000k=6x=3.98437500000000k=7x=3.99218750000000k=8x=3.99609375000000k=9x=3.99804687500000k=10x=3.99902343750000k=11x=3.99951171875000k=12x=3.99975585937500k=13x=3.99987792968750k=14x=3.99993896484375k=15x=3.99996948242188k=16x=3.99998474121094k=17x=3.99999237060547k=18x=3.99999618530273k=19x=3.99999809265137k=20x=3.99999904632568k=21x=3.99999952316284k=22x=3.99999976158142k=23x=3.99999988079071k=24x=3.99999994039536k=25x=3.99999997019768k=26x=3.99999998509884k=27x=3.99999999254942k=28x=3.99999999627471ans=3.99999999627471从上面的计算结果很直观的体现了二分法的的效率真的很低,割线法只需要迭代6次就可以得出结果,而二分法却需要运行28次其它Matlab遇到死循环就出现程序假死的情况,想关都关不掉,真的很烦。
matlab实例教程_比较实用

实验一特殊函数与图形一、问题背景与实验目的二、相关函数(命令)及简介三、实验内容四、自己动手一、问题背景与实验目的著名的Riemann函数大家都很熟悉了,但是关于它的图像你是否清楚呢?除了最上面那几点,其他都很难画吧?你想不想看看下面那些“挤在一起”的点是怎样分布的呢?还有几何中的马鞍面、单叶双曲面等是怎样由直线生成的,是不是也想目睹一下呢?这些,都离不开绘图.实际上绘图一直是数学中的一种重要手段,借助图形,往往可以化繁为简,使抽象的对象得到明白直观的体现.比如函数的基本性质,一个图形常可以使之一目了然,非常有效.它虽不能代替严格的分析与证明,但在问题的研究过程中,可以帮助研究人员节约相当一部分精力.此外,它还可以使计算、证明、建模等的结果得到更明白易懂的表现,有时,这比科学论证更有说服力.同时,数学的教学与学习过程也离不开绘图.借助直观的图形,常可以使初学者更容易接受新知识.如数学分析中有不少函数,其解析式着实让人望而生畏,即使对其性质作了详尽的分析,还是感到难明就里;但如果能看到它的图形,再配合理论分析,则问题可以迎刃而解.又如在几何的学习中,会遇到大量的曲线与曲面,也离不开图形的配合.传统的手工作图,往往费力耗时,效果也不尽理想.计算机恰恰弥补了这个不足,使你可以方便地指定各种视角、比例、明暗,从各个角度进行观察.本实验通过对函数的图形表示和几个曲面(线)图形的介绍,一方面展示它们的特点,另一方面,也将就Matlab软件的作图功能作一个简单介绍.大家将会看到,Matlab 的作图功能非常强大.二、相关函数(命令)及简介1.平面作图函数:plot,其基本调用形式:plot(x,y,s)以x作为横坐标,y作为纵坐标.s是图形显示属性的设置选项.例如:x=-pi:pi/10:pi;y=sin(x);plot(x,y,'--rh','linewidth',2,'markeredgecolor','b','markerfacecolor','g')图1在使用函数plot时,应当注意到当两个输入量同为向量时,向量x与y必须维数相同,而且必须同是行向量或者同是列向量.绘图时,可以制定标记的颜色和大小,也可以用图形属性制定其他线条特征,这些属性包括:linewidth 指定线条的粗细.markeredgecolor 指定标记的边缘色markerfacecolor 指定标记表面的颜色.markersize 指定标记的大小.若在一个坐标系中画几个函数,则plot的调用格式如下:plot(x1,y1,s1,x2,y2,s2,……)2.空间曲线作图函数:plot3,它与plot相比,只是多了一个维数而已.其调用格式如下:plot3(x,y,z,s).例如:x=0:pi/30:20*pi;y=sin(x);z=cos(x);plot3(x,y,z)得到三维螺旋线:图23.空间曲面作图函数:(1)mesh函数.绘制彩色网格面图形.调用格式:mesh(z),mesh(x,y,z)和mesh(x,y,z,c).其中,mesh(x,y,z,c)画出颜色由c指定的三维网格图.若x、y均为向量,则length(x)=n,length(y)=m,[m,n]=size(z).(2)surf在矩形区域内显示三维带阴影曲面图.调用格式与mesh类似.(3)ezmesh用符号函数作三维曲面网格图.调用格式:ezmesh(x,y,z)其中x = x(s,t), y = y(s,t),z = z(s,t).画图区域默认为:-2*pi < s < 2*pi 且-2*pi < t < 2*pi.或者用格式:ezmesh(x,y,z,[smin,smax,tmin,tmax])(4)ezsurf用符号函数作三维曲面图.调用格式与ezmesh类似.(5)sphere画球体命令.4.meshgrid,调用格式:[x,y]=meshgrid(m,n),这里的m,n为给定的向量,可以定义网格划分区域和划分方法.矩阵x和矩阵y是网格划分后的数据矩阵.5.图像的修饰与其他函数:(1)axis equal 控制各个坐标轴的分度,使其相等;(2)colormap设置绘图颜色.调用格式:colormap([r g b])其中r,g,b都是0-1之间的数.或者用格式:colormap(s)s(3(4)find找出符合条件的元素在数组中的位置.调用格式:y=find(条件)例如:输入:a=[4 5 78 121 4 665 225 4 1];b=find(a>7)输出:b =3 4 6 7三、实验内容数学分析中,特别是积分部分,我们接触了不少有趣的函数,由于其中有的不是一一对应的,用上面的方法无法画出它们的图像,这时就只能用参数了.此外还有些图形只能用参数来画,比如空间曲线,在计算机上不接受“两个曲面的交线”这种表示,所以也只能用参数来实现.用参数方式作图的关键在于找出合适的参数表示,尤其是不能有奇点,最好也不要用到开方.所以要找的参数最好是有几何意义的.当然这也不可一概而论,需要多积累经验.1.利用函数plot在一个坐标系中画以下几个函数图像,要求采用不同颜色、不同线形、不同的符号标记.函数为:.程序如下:t=0:pi/20:2*pi;x=sin(t);y=cos(t);z=sin(2*t);plot(t, x, '--k*', t, y, '-rs', t, z, ':bo')图像如下:图32.绘制类似田螺线的一条三维螺线(方程自己设计).程序如下:t=0:.1:30;x=2*(cos(t)+t.*sin(t));y=2*(sin(t)-t.*cos(t));z=1.5*t;plot3(x,y,-z) %取–z 主要是为了画图看起来更清楚axis equal图像如下:图43.利用函数,绘制一个墨西哥帽子的图形.程序如下:[a,b]=meshgrid(-8:.5:8); %先生成一个网格c=sqrt(a.^2+b.^2)+eps;z=sin(c)./c;mesh(a,b,z)axis square图像如下:图5思考:这里的eps 是什么?其作用是什么?4.利用surf绘制马鞍面图形(函数为:).程序如下:[x,y]=meshgrid(-25:1:25,-25:1:25);z=x.^2/9-y.^2/4;surf(x,y,z)title('马鞍面')grid off图像如下:5.分别用ezmesh和ezsurf各绘制一个圆环面,尝试将两个圆环面放在一个图形界面内,观察它们有什么不同之处.提示:圆环面的方程为:,而圆环面的参数方程为:程序参见附录1.图像如下:图76.绘制黎曼函数图形,加深对黎曼函数的理解.说明:黎曼函数的定义为程序参见附录2.图像如下:四、自己动手1.作出下图所示的三维图形:图9提示:图形为圆环面和球面的组合.2.作出下图所示的墨西哥帽子及其剪裁图形:图103.画出球面、椭球面、双叶双曲面、单叶双曲面.4.若要求田螺线的一条轴截面的曲边是一条抛物线:时.试重新设计田螺线的参数方程,并画出该田螺线.5.作出下图所示的马鞍面(颜色为灰色,并有一个标题:“马鞍面”):图116.绘制图8所示的黎曼函数图形,要求分母的最大值的数值由键盘输入(提示:使用input语句).回目录下一页实验二定积分的近似计算一、问题背景与实验目的二、相关函数(命令)及简介三、实验内容1.矩形法2.梯形法3.抛物线法4. 直接应用Matlab命令计算结果四、自己动手一、问题背景与实验目的利用牛顿—莱布尼兹公式虽然可以精确地计算定积分的值,但它仅适用于被积函数的原函数能用初等函数表达出来的情形.如果这点办不到或者不容易办到,这就有必要考虑近似计算的方法.在定积分的很多应用问题中,被积函数甚至没有解析表达式,可能只是一条实验记录曲线,或者是一组离散的采样值,这时只能应用近似方法去计算相应的定积分.本实验将主要研究定积分的三种近似计算算法:矩形法、梯形法、抛物线法.对于定积分的近似数值计算,Matlab有专门函数可用.二、相关函数(命令)及简介1.sum(a):求数组a的和.2.format long:长格式,即屏幕显示15位有效数字.(注:由于本实验要比较近似解法和精确求解间的误差,需要更高的精度).3.double():若输入的是字符则转化为相应的ASCII码;若输入的是整型数值则转化为相应的实型数值.4.quad():抛物线法求数值积分.格式:quad(fun,a,b) ,注意此处的fun是函数,并且为数值形式的,所以使用*、/、^等运算时要在其前加上小数点,即.*、./、.^等.例:Q = quad('1./(x.^3-2*x-5)',0,2);5.trapz():梯形法求数值积分.格式:trapz(x,y)其中x为带有步长的积分区间;y为数值形式的运算(相当于上面介绍的函数fun)例:计算x=0:pi/100:pi;y=sin(x);trapz(x,y)6.dblquad():抛物线法求二重数值积分.格式:dblquad(fun,xmin,xmax,ymin,ymax),fun可以用inline定义,也可以通过某个函数文件的句柄传递.例1:Q1 = dblquad(inline('y*sin(x)'), pi, 2*pi, 0, pi)顺便计算下面的Q2,通过计算,比较Q1 与Q2结果(或加上手工验算),找出积分变量x、y的上下限的函数代入方法.Q2 = dblquad(inline('y*sin(x)'), 0, pi, pi, 2*pi)例2:Q3 = dblquad(@integrnd, pi, 2*pi, 0, pi)这时必须存在一个函数文件integrnd.m:function z = integrnd(x, y)z = y*sin(x);7.fprintf(文件地址,格式,写入的变量):把数据写入指定文件.例:x = 0:.1:1;y = [x; exp(x)];fid = fopen('exp.txt','w'); %打开文件fprintf(fid,'%6.2f %12.8f\n',y); %写入fclose(fid) %关闭文件8.syms 变量1 变量2 …:定义变量为符号.9.sym('表达式'):将表达式定义为符号.解释:Matlab中的符号运算事实上是借用了Maple的软件包,所以当在Matlab 中要对符号进行运算时,必须先把要用到的变量定义为符号.10.int(f,v,a,b):求f关于v积分,积分区间由a到b.11.subs(f,'x',a):将a 的值赋给符号表达式f 中的x,并计算出值.若简单地使用subs(f),则将f的所有符号变量用可能的数值代入,并计算出值.三、实验内容1.矩形法根据定积分的定义,每一个积分和都可以看作是定积分的一个近似值,即在几何意义上,这是用一系列小矩形面积近似小曲边梯形的结果,所以把这个近似计算方法称为矩形法.不过,只有当积分区间被分割得很细时,矩形法才有一定的精确度.针对不同的取法,计算结果会有不同,我们以为例(取),(1)左点法:对等分区间,在区间上取左端点,即取,0.78789399673078,理论值,此时计算的相对误差(2)右点法:同(1)中划分区间,在区间上取右端点,即取,0.78289399673078,理论值,此时计算的相对误差(3)中点法:同(1)中划分区间,在区间上取中点,即取,0.78540024673078,理论值,此时计算的相对误差如果在分割的每个小区间上采用一次或二次多项式来近似代替被积函数,那么可以期望得到比矩形法效果好得多的近似计算公式.下面介绍的梯形法和抛物线法就是这一指导思想的产物.2.梯形法等分区间,相应函数值为().曲线上相应的点为()将曲线的每一段弧用过点,的弦(线性函数)来代替,这使得每个上的曲边梯形成为真正的梯形,其面积为,.于是各个小梯形面积之和就是曲边梯形面积的近似值,,即,称此式为梯形公式.仍用的近似计算为例,取,0.78539399673078,理论值,此时计算的相对误差很显然,这个误差要比简单的矩形左点法和右点法的计算误差小得多.3.抛物线法由梯形法求近似值,当为凹曲线时,它就偏小;当为凸曲线时,它就偏大.若每段改用与它凸性相接近的抛物线来近似时,就可减少上述缺点,这就是抛物线法.将积分区间作等分,分点依次为,,对应函数值为(),曲线上相应点为().现把区间上的曲线段用通过三点,,的抛物线来近似代替,然后求函数从到的定积分:由于,代入上式整理后得同样也有……将这个积分相加即得原来所要计算的定积分的近似值:,即这就是抛物线法公式,也称为辛卜生(Simpson)公式.仍用的近似计算为例,取,=0.78539816339745,理论值,此时计算的相对误差4. 直接应用Matlab命令计算结果(1)数值计算方法1:int('1/(1+x^2)','x',0,1) (符号求积分)方法2:quad('1./(1+x.^2)',0,1) (抛物线法求数值积分)方法3:x=0:0.001:1;y=1./(1+x.^2);trapz(x,y) (梯形法求数值积分)(2)数值计算方法1:int(int('x+y^2','y',-1,1),'x',0,2) (符号求积分)方法2:dblquad(inline('x+y^2'),0,2,-1,1) (抛物线法二重数值积分)四、自己动手1.实现实验内容中的例子,即分别采用矩形法、梯形法、抛物线法计算,取,并比较三种方法的精确程度.2.分别用梯形法与抛物线法,计算,取.并尝试直接使用函数trapz()、quad()进行计算求解,比较结果的差异.3.试计算定积分.(注意:可以运用trapz()、quad()或附录程序求解吗?为什么?)4.将的近似计算结果与Matlab中各命令的计算结果相比较,试猜测Matlab中的数值积分命令最可能采用了哪一种近似计算方法?并找出其他例子支持你的观点.5.通过整个实验内容及练习,你能否作出一些理论上的小结,即针对什么类型的函数(具有某种单调特性或凹凸特性),用某种近似计算方法所得结果更接近于实际值?6.学习fulu2sum.m的程序设计方法,尝试用函数sum 改写附录1和附录3的程序,避免for 循环.上一页回目录下一页实验三求代数方程的近似根(解)一、问题背景和实验目的二、相关函数(命令)及简介三、实验内容四、自己动手一、问题背景和实验目的求代数方程的根是最常见的数学问题之一(这里称为代数方程,主要是想和后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当是一次多项式时,称为线性方程,否则称之为非线性方程.当是非线性方程时,由于的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间,或给出某根的近似值.在实际问题抽象出的数学模型中,可以根据物理背景确定;也可根据的草图等方法确定,还可用对分法、迭代法以及牛顿切线法大致确定根的分布情况.通过本实验希望你能:1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程;2. 求代数方程(组)的解.二、相关函数(命令)及简介1.abs( ):求绝对值函数.2.diff(f):对独立变量求微分,f 为符号表达式.diff(f, 'a'):对变量a求微分,f 为符号表达式.diff(f, 'a', n):对变量a 求n 次微分,f 为符号表达式.例如:syms x tdiff(sin(x^2)*t^6, 't', 6)ans=720*sin(x^2)3.roots([c(1), c(2), …, c(n+1)]):求解多项式的所有根.例如:求解:.p = [1 -6 -72 -27];r = roots(p)r =12.1229-5.7345-0.38844.solve('表达式'):求表达式的解.solve('2*sin(x)=1')ans =1/6*pi5.linsolve(A, b):求线性方程组A*x=b 的解.例如:A= [9 0; -1 8]; b=[1; 2];linsolve(A, b)ans=[ 1/9][19/72]6.fzero(fun, x0):在x0附近求fun 的解.其中fun为一个定义的函数,用“@函数名”方式进行调用.例如:fzero(@sin, 3)ans=3.14167.subs(f, 'x ', a):将a 的值赋给符号表达式f 中的x,并计算出值.例如:subs('x^2 ', 'x ', 2)ans = 4三、实验内容首先,我们介绍几种与求根有关的方法:1.对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.设在上连续,,即,或,.则根据连续函数的介值定理,在内至少存在一点,使.下面的方法可以求出该根:(1)令,计算;(2)若,则是的根,停止计算,输出结果.若,则令,,若,则令,;.……,有、以及相应的.(3) 若(为预先给定的精度要求),退出计算,输出结果;反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列,在中含有方程的根.当区间长很小时,取其中点为根的近似值,显然有以上公式可用于估计对分次数.分析以上过程不难知道,对分法的收敛速度与公比为的等比级数相同.由于,可知大约对分10次,近似根的精度可提高三位小数.对分法的收敛速度较慢,它常用来试探实根的分布区间,或求根的近似值.2. 迭代法1)迭代法的基本思想:由方程构造一个等价方程从某个近似根出发,令,可得序列,这种方法称为迭代法.若收敛,即,只要连续,有即可知,的极限是的根,也就是的根.当然,若发散,迭代法就失败.以下给出迭代过程收敛的一些判别方法:定义:如果根的某个邻域中,使对任意的,迭代过程,收敛,则称迭代过程在附近局部收敛.定理1:设,在的某个邻域内连续,并且,,则对任何,由迭代决定的序列收敛于.定理2:条件同定理1,则定理3:已知方程,且(1) 对任意的,有.(2) 对任意的,有,则对任意的,迭代生成的序列收敛于的根,且.以上给出的收敛定理中的条件要严格验证都较困难,实用时常用以下不严格的标准:当根区间较小,且对某一,明显小于1时,则迭代收敛(参见附录3).2) 迭代法的加速:a) 松弛法:若与同是的近似值,则是两个近似值的加权平均,其中称为权重,现通过确定看能否得到加速.迭代方程是:其中,令,试确定:当时,有,即当,时,可望获得较好的加速效果,于是有松弛法:,松弛法的加速效果是明显的(见附录4),甚至不收敛的迭代函数经加速后也能获得收敛.b) Altken方法:松弛法要先计算,在使用中有时不方便,为此发展出以下的Altken 公式:,是它的根,是其近似根.设,,因为,用差商近似代替,有,解出,得由此得出公式;;,这就是Altken 公式,它的加速效果也是十分明显的,它同样可使不收敛的迭代格式获得收敛(见附录5).3. 牛顿(Newton)法(牛顿切线法)1) 牛顿法的基本思想:是非线性方程,一般较难解决,多采用线性化方法.记:是一次多项式,用作为的近似方程.的解为记为,一般地,记即为牛顿法公式.2) 牛顿法的收敛速度:对牛顿法,迭代形式为:注意分子上的,所以当时,,牛顿法至少是二阶收敛的,而在重根附近,牛顿法是线性收敛的.牛顿法的缺点是:(1)对重根收敛很慢;(2)对初值要求较严,要求相当接近真值.因此,常用其他方法确定初值,再用牛顿法提高精度.4. 求方程根(解)的其它方法(1) solve('x^3-3*x+1=0')(2) roots([1 0 -3 1])(3) fzero('x^3-3*x+1', -2)(4) fzero('x^3-3*x+1', 0.5)(5) fzero('x^3-3*x+1', 1.4)(6) linsolve([1, 2, 3; 4, 5, 6; 7, 8, 0], [1, 2, 3]')体会一下,(2)(5) 用了上述1 3 中的哪一种方法?以下是本实验中的几个具体的实验,详细的程序清单参见附录.具体实验1:对分法先作图观察方程:的实根的分布区间,再利用对分法在这些区间上分别求出根的近似值.输入以下命令,可得的图象:f='x^3-3*x+1';g='0';ezplot(f, [-4, 4]);hold on;ezplot(g, [-4, 4]); %目的是画出直线y=0,即x 轴grid on;axis([-4 4 -5 5]);hold off具体实验2:普通迭代法采用迭代过程:求方程在0.5 附近的根,精确到第4 位小数.构造等价方程:用迭代公式:,用Matlab 编写的程序参见附录2.请利用上述程序填写下表:分析:将附录2第4行中的分别改为以及,问运行的结果是什么?你能分析得到其中的原因吗?看看下面的“具体实验3”是想向你表达一个什么意思.用Matlab 编写的程序参见附录3.具体实验3:收敛/发散判断设方程的三个根近似地取,和,这些近似值可以用上面的对分法求得.迭代形式一:收敛(很可能收敛,下同)不收敛(很可能不收敛,下同)不收敛迭代形式二:收敛不收敛不收敛迭代形式三:不收敛收敛收敛具体实验4:迭代法的加速1——松弛迭代法,,迭代公式为程序参见附录4.具体实验5:迭代法的加速2——Altken迭代法迭代公式为:,,程序参见附录5.具体实验6:牛顿法用牛顿法计算方程在-2到2之间的三个根.提示:,迭代公式:程序参见附录6 (牛顿法程序).具体实验7:其他方法求下列代数方程(组)的解:(1)命令:solve('x^5-x+1=0')(2)命令:[x, y]=solve('2*x+3*y=0', '4*x^2+3*y=1')(3) 求线性方程组的解,已知,命令:for i=1:5for j=1:5m(i, j)=i+j-1;endendm(5, 5)=0;b=[1:5]'linsolve(m, b)思考:若,或是类似的但阶数更大的稀疏方阵,则应如何得到?四、自己动手1.对分法可以用来求偶重根附近的近似解吗? 为什么?2.对照具体实验2、4、5,你可以得出什么结论?3.选择适当的迭代过程,分别使用:(1)普通迭代法;(2)与之相应的松弛迭代法和Altken 迭代法.求解方程在 1.4 附近的根,精确到4位小数,请注意迭代次数的变化.4.分别用对分法、普通迭代法、松弛迭代法、Altken 迭代法、牛顿切法线等5种方法,求方程的正的近似根,.(建议取.时间许可的话,可进一步考虑的情况.)上一页回目录下一页。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学实验报告实验序号: 日期: 年 月 日班级姓名学号实验名称:求代数方程的近似根 问题背景描述:求代数方程0)(=x f 的根是最常见的数学问题之一,当)(x f 是一次多项式时,称0)(=x f 为线性方程,否则称之为非线性方程.当0)(=x f 是非线性方程时,由于)(x f 的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间],[b a ,或给出某根的近似值0x .实验目的:1. 了解代数方程求根求解的四种方法:对分法、迭代法、牛顿切线法2. 掌握对分法、迭代法、牛顿切线法求方程近似根的基本过程。
实验原理与数学模型:1.对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.设)(x f 在],[b a 上连续,0)()(<⋅b f a f ,即 ()0f a >,()0f b <或()0f a <,()0f b >.则根据连续函数的介值定理,在),(b a 内至少存在一点 ξ,使()0f ξ=.下面的方法可以求出该根:(1) 令02a bx +=,计算0()f x ;(2) 若0()0f x =,则0x 是()0f x =的根,停止计算,输出结果0x x =.若 0()()0f a f x ⋅<,则令1a a =,10b x =,若0()()0f a f x ⋅>,则令10a x =,1b b =;1112a b x +=. ……,有k a 、k b 以及相应的2k kk a b x +=. (3) 若()k f x ε≤ (ε为预先给定的精度要求),退出计算,输出结果2k kk a b x +=; 反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列{[,]}k k a b ,在(,)k k a b 中含有方程的根.当区间长k k b a -很小时,取其中点2k kk a b x +=为根的近似值,显然有 1111111()()()2222k k k k k k x b a b a b a ξ--+-≤-=⨯⨯-==-以上公式可用于估计对分次数k .2. 迭代法1) 迭代法的基本思想:由方程()0f x =构造一个等价方程()x x φ=从某个近似根0x 出发,令1()k k x x φ+=, ,2,1,0=k可得序列{}k x ,这种方法称为迭代法.若 {}k x 收敛,即*lim k k x x →∞=,只要()x φ连续,有1lim lim ()(lim )k k k k k k x x x φφ+→∞→∞→∞==即可知,{}k x 的极限*x 是()x x φ=的根,也就是()0f x =的根.当然,若k x 发散,迭代法就失败. 迭代过程1()k k x x φ+=收敛的常用判别标准:当根区间[,]a b 较小,且对某一0[,]x a b ∈,()'x φ明显小于1时,则迭代收敛2) 迭代法的加速:a) 松弛法:若()x φ与k x 同是*x 的近似值,则1(1)()k k k k k x x x ωωφ+=-+是两个近似值的加权平均,其中k ω称为权重,现通过确定k ω看能否得到加速.迭代方程是:()x x ψ←其中()(1)()x x x ψωωφ=-+,令'()1'()0x x ψωωφ=-+=,试确定ω:当'()1x φ≠时,有11'()x ωφ=-,即当11'()k k x ωφ=-,'()11'()k k k x x φωφ--=-时,可望获得较好的加速效果,于是有松弛法:1(1)()k k k k k x x x ωωφ+=-+,11'()k k x ωφ=-b) Altken 方法:**()x x φ=,*x 是它的根,0x 是其近似根. 设10()x x φ=,21()x x φ=,因为****222121[][()()]()()x x x x x x x x 'x x φφφξ=+-=+-=+-, 用差商10211010()()x x x x x x x x φφ--=--近似代替()'φξ,有 **212110()x x x x x x x x -≈+-- , 解出*x ,得**()x x φ=2*212210()2x x x x x x x -≈--+ 由此得出公式(1)()k k x x φ= ; (2)(1)()k k x x φ=;(2)(1)2(2)1(2)(1)()2k k k kk k kx x x xx x x +-==-+, ,2,1,0=k 这就是Altken 公式。
3. 牛顿(Newton)法(牛顿切线法) 1) 牛顿法的基本思想:()0f x =是非线性方程,一般较难解决,多采用线性化方法.20000''()()()'()()()2!f f x f x f x x x x x ξ=+-+- 记:000()()'()()P x f x f x x x =+-()P x 是一次多项式,用()0P x =作为()0f x =的近似方程.000()()'()()0P x f x f x x x =+-=的解为000()'()f x x x f x =-0('()0)f x ≠ 记为1x ,一般地,记1()'()k k k k f x x x f x +=-,2,1,0=k 即为牛顿法公式。
实验所用软件及版本:Matlab 7.0主要内容(要点):具体实验1:对分法先作图观察方程:的实根的分布区间,再利用对分法在这些区间上分别求出根的近似值.输入以下命令,可得的图象:f='x^3-3*x+1';g='0';ezplot(f, [-4, 4]);hold on;ezplot(g, [-4, 4]); %目的是画出直线 y=0,即 x 轴grid on;axis([-4 4 -5 5]);hold off请填写下表:实根的分布区间该区间上根的近似值在某区间上求根的近似值的对分法程序参见附录1.具体实验2:普通迭代法采用迭代过程:求方程在 0.5 附近的根,精确到第 4 位小数.构造等价方程:用迭代公式:,用 Matlab 编写的程序参见附录2.请利用上述程序填写下表:分析:将附录2第4行中的分别改为以及,问运行的结果是什么?你能分析得到其中的原因吗?看看下面的“具体实验3”是想向你表达一个什么意思.用 Matlab 编写的程序参见附录3.具体实验3:收敛/发散判断设方程的三个根近似地取,和,这些近似值可以用上面的对分法求得.迭代形式一:收敛 (很可能收敛,下同)不收敛 (很可能不收敛,下同)不收敛迭代形式二:收敛不收敛不收敛迭代形式三:不收敛收敛收敛具体实验4:迭代法的加速1——松弛迭代法,,迭代公式为程序参见附录4.具体实验5:迭代法的加速2——Altken迭代法迭代公式为:,,程序参见附录5.具体实验6:牛顿法用牛顿法计算方程在-2到2之间的三个根.提示:,迭代公式:程序参见附录6 (牛顿法程序).具体实验7:其他方法求下列代数方程(组)的解:(1)命令:solve('x^5-x+1=0')(2)命令:[x, y]=solve('2*x+3*y=0', '4*x^2+3*y=1')(3) 求线性方程组的解,已知,命令:for i=1:5for j=1:5m(i, j)=i+j-1;endendm(5, 5)=0;b=[1:5]'linsolve(m, b)思考:若,或是类似的但阶数更大的稀疏方阵,则应如何得到?四、自己动手1.对分法可以用来求偶重根附近的近似解吗? 为什么?2.对照具体实验2、4、5,你可以得出什么结论?3.选择适当的迭代过程,分别使用:(1)普通迭代法;(2)与之相应的松弛迭代法和 Altken 迭代法.求解方程在 1.4 附近的根,精确到4位小数,请注意迭代次数的变化.4.分别用对分法、普通迭代法、松弛迭代法、Altken 迭代法、牛顿切法线等5种方法,求方程的正的近似根,.(建议取.时间许可的话,可进一步考虑的情况.)实验过程记录(含基本步骤、主要程序清单及异常情况记录等):1.对分法syms x fx;a=0.001;b=3;fx=0.5*x-sin(x);x=(a+b)/2;k=0;ffx=subs(fx,'x',x);if ffx==0;disp(['the root is:',num2str(x)])else disp('k ak bk f(xk)')while abs(ffx)>0.0001&a<b;disp([num2str(k),' ',num2str(a),' ',num2str(b),' ',num2str(ffx)])fa=subs(fx,'x',a);ffx=subs(fx,'x',x);if fa*ffx<0b=x;elsea=x;endk=k+1;x=(a+b)/2;enddisp([num2str(k),' ',num2str(a),' ',num2str(b),' ',num2str(ffx)])endfprintf('所求的解是:x=%f,迭代步数是:%d/n',x,k)【调试结果】0 0.001 3 -0.247281 1.5005 3 -0.247282 1.5005 2.2502 0.347213 1.8754 2.2502 -0.0162864 1.8754 2.0628 0.150025 1.8754 1.9691 0.0628246 1.8754 1.9222 0.0222397 1.8754 1.8988 0.00271658 1.8871 1.8988 -0.00684999 1.8929 1.8988 -0.00208310 1.8929 1.8959 0.000312711 1.8944 1.8959 -0.0008861612 1.8951 1.8959 -0.0002869813 1.8951 1.8955 1.2794e-005所求的解是:x=1.895327,迭代步数是:132.普通迭代法syms x fx gx;gx=sin(x)/0.5;fx=0.5*x-sin(x);disp('k x f(x)')x=1.1;k=0;ffx=subs(fx,'x',x);while abs(ffx)>0.0001;disp([num2str(k),' ',num2str(x),' ',num2str(ffx)]);x=subs(gx,'x',x);ffx=subs(fx,'x',x);k=k+1;enddisp([num2str(k),' ',num2str(x),' ',num2str(ffx)]) fprintf('所求的解是:x=%f,迭代步数是:%d/n',x,k)【调试结果】0 1.1 -0.341211 1.7824 -0.0864852 1.9554 0.0507393 1.8539 -0.0332384 1.9204 0.0206775 1.879 -0.0133576 1.9057 0.00844337 1.8889 -0.0054168 1.8997 0.00344319 1.8928 -0.002201710 1.8972 0.001402811 1.8944 -0.0008958412 1.8962 0.0005712513 1.895 -0.0003646214 1.8958 0.0002325915 1.8953 -0.0001484216 1.8956 9.4692e-005所求的解是:x=1.895610,迭代步数是:163.松弛迭代法syms fx gx x dgx;gx=sin(x)*2;fx=0.5*x-sin(x);dgx=diff(gx,'x');x=1.8;k=0;ggx=subs(gx,'x',x);ffx=subs(fx,'x',x);dgxx=subs(dgx,'x',x);disp('k x w')while abs(ffx)>0.0001;w=1/(1-dgxx);disp([num2str(k),' ',num2str(x),' ',num2str(w)])x=(1-w)*x+w*ggx;k=k+1;ggx=subs(gx,'x',x);ffx=subs(fx,'x',x);dgxx=subs(dgx,'x',x); enddisp([num2str(k),' ',num2str(x),' ',num2str(w)])fprintf('所求的解是:x=%f,迭代步数是:%d\n',x,k)【调试结果】k x w0 1.8 0.687571 1.9016 0.606242 1.8955 0.60624所求的解是:x=1.895515,迭代步数是:24.altken法syms fx gx x ;gx=sin(x)*2;fx=0.5*x-sin(x);disp('k x x1 x2')x=1.5;k=0;ffx=subs(fx,'x',x);while abs(ffx)>0.0001;u=subs(gx,'x',x);v=subs(gx,'x',u);disp([num2str(k),' ',num2str(x),' ',num2str(u),' ',num2str(v)]) x=v-(v-u)^2/(v-2*u+x);k=k+1;ffx=subs(fx,'x',x);enddisp([num2str(k),' ',num2str(x),' ',num2str(u),' ',num2str(v)]) fprintf('所求的解是:x=%f,迭代步数是:%d\n',x,k)【调试结果】k x x1 x20 1.5 1.995 1.82271 1.8672 1.9128 1.88422 1.8952 1.8957 1.89543 1.8955 1.8957 1.8954所求的解是:x=1.895494,迭代步数是:35.牛顿法syms x fx gx;fx=0.5*x-sin(x);gx=diff(fx,'x');x1=0.8;x2=1.5;x3=4;k=0;disp('k x1 x2 x3')fx1=subs(fx,'x',x1);fx2=subs(fx,'x',x2);fx3=subs(fx,'x',x3);gx1=subs(gx,'x',x1);gx2=subs(gx,'x',x2);gx3=subs(gx,'x',x3);while abs(fx1)>0.0001|abs(fx2)>0.0001|abs(fx3)>0.0001;disp([num2str(k),' ',num2str(x1),' ',num2str(x2),' ',num2str(x3)])x1=x1-fx1/gx1;x2=x2-fx2/gx2;x3=x3-fx3/gx3;k=k+1;fx1=subs(fx,'x',x1);fx2=subs(fx,'x',x2);fx3=subs(fx,'x',x3);gx1=subs(gx,'x',x1);gx2=subs(gx,'x',x2);gx3=subs(gx,'x',x3);enddisp([num2str(k),' ',num2str(x1),' ',num2str(x2),' ',num2str(x3)]) fprintf('所求的解是:x1=%f,x2=%f,x3=%f,迭代步数:%d\n',x1,x2,x3,k)【调试结果】k x1 x2 x30 0.8 1.5 41 -0.81335 2.0766 1.61042 0.89679 1.9105 1.973 -1.7856 1.8956 1.89844 -1.9037 1.8955 1.89555 -1.8955 1.8955 1.8955所求的解是:x1=-1.895533,x2=1.895494,x3=1.895494,迭代步数:5【情况记录】1.对分法简单,然而,若在是有几个零点时,只能算出其中一个零点,它不能求重根,也不能求虚根.另一方面,即使在上有零点,也未必有。