MATLAB求代数方程的近似根(解)
- 格式:ppt
- 大小:221.00 KB
- 文档页数:13
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将输出方程的一个近似根。
1.roots求解多项式的根r=roots(c)注意:c为一维向量,者返回指定多项式的所有根(包括复根),poly和roots是互为反运算,还有就是roots只能求解多项式的解还有下面几个函数poly2sym、sym2poly、eig>>syms x>>y=x^5+3*x^3+3;>>c=sym2poly(y);%求解多项式系数>>r=roots(c);>>poly(r)2.residue求留数[r, p, k] = residue(b,a)>>b = [ 5 3 -2 7]>>a = [-4 0 8 3]>>[r, p, k] = residue(b,a)3.solve符号解方程(组)——使用最多的g = solve(eq1,eq2,...,eqn,var1,var2,...,varn)注意:eqn和varn可以是符号表达式,也可以是字符串表达式,但是使用符号表达式时不能有“=”号,假如说varn没有给出,使用findsym函数找出默认的求解变量。
返回的g是一个结构体,以varn为字段。
由于符号求解的局限性,好多情况下可能得到空矩阵,此时只能用数值解法解方程A=solve('a*x^2 + b*x + c')解方程组B=solve('a*u^2 + v^2', 'u - v = 1', 'a^2 - 5*a + 6')4.fzero数值求零点[x,fval,exitflag,output]=fzero(fun,x0,options,p1,p2...)fun是目标函数,可以是句柄(@)、inline函数或M文件名x0是初值,可以是标量也可以是长度为2的向量,前者给定一个位置,后者是给定一个范围options是优化参数,通过optimset设置,optimget获取,一般使用默认的就可以了,具体参照帮助p1,p2...为需要传递的其它参数假如说(x/1446)^2+p/504.1+(t/330.9)*(log(1-x/1446)+(1-1/5.3)*x/1446)=0的根,其中p,t是已知参数,但是每次都改变那么目标函数如下三种书写格式,效果完全等效。
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种方法,求方程的正的近似根,.(建议取.时间许可的话,可进一步考虑的情况.)。
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程序迭代法是一种求解方程根的常用方法,它通过不断逼近根的方法来求解方程的解。
在matlab中,我们可以通过编写程序来实现迭代法求解方程的根。
我们需要确定迭代公式。
对于一般的方程f(x)=0,我们可以通过将其转化为x=g(x)的形式,然后通过不断迭代g(x)来逼近方程的根。
具体来说,我们可以选择一个初始值x0,然后通过迭代公式x(i+1)=g(x(i))来不断逼近方程的根。
当x(i+1)与x(i)的差值小于一定的精度要求时,我们就认为已经找到了方程的根。
下面是一个简单的matlab程序,用于求解方程x^2-2=0的根:function [x] = iteration_method()% 迭代法求解方程x^2-2=0的根% 初始值x0=1.5,精度要求为1e-6x0 = 1.5; % 初始值eps = 1e-6; % 精度要求% 迭代公式g = @(x) (x + 2/x)/2;x = x0;while abs(x - g(x)) > epsx = g(x);endend在这个程序中,我们首先定义了初始值x0和精度要求eps。
然后,我们定义了迭代公式g(x),即x(i+1)=(x(i)+2/x(i))/2。
最后,我们通过while循环来不断迭代x,直到满足精度要求为止。
当我们运行这个程序时,就可以得到方程x^2-2=0的根,即x=1.414213。
这个结果与方程的实际根非常接近,说明迭代法是一种有效的求解方程根的方法。
迭代法是一种常用的求解方程根的方法,它通过不断逼近根的方法来求解方程的解。
在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中,我们可以利用不动点迭代法来求解方程的根,下面我将详细介绍该方法的原理和使用步骤。
1. 不动点迭代法的原理不动点迭代法的基本思想是将原方程化为不动点方程,即将方程f(x)=0 转化成g(x)=x 的形式,其中g(x) 是一个满足一定条件的函数。
然后通过迭代计算不动点序列 {x_k},当序列收敛时,即可得到方程的根。
2. 使用不动点迭代法求解方程的步骤我们需要将原方程 f(x)=0 转化成 g(x)=x 的形式,确定函数 g(x)。
然后选择一个初始值 x_0,并进行迭代计算,直到满足精度要求或者迭代次数达到上限为止。
3. MATLAB中的实现在MATLAB中,可以使用函数形式来表示不动点迭代法。
定义一个函数 f(x) 和一个不动点迭代函数 g(x),然后通过循环迭代计算来逼近方程的根。
在迭代过程中,可以设置一个收敛判据,当满足条件时即可停止迭代。
4. 个人观点和理解不动点迭代法是一种简单而有效的求解非线性方程的方法,其原理清晰、实现简单。
在MATLAB中,通过编写相应的函数和循环来实现该方法,可以更快速地求解方程的根。
不过需要注意的是,不动点迭代法的收敛性和收敛速度受到选择的初始值和迭代函数的影响,需要谨慎选择才能得到准确的结果。
利用不动点迭代法在MATLAB中求解方程的根是一种实用而重要的技能,可以帮助我们更好地解决实际问题。
希望我的文章能够帮助你更深入地理解这一方法,并在实践中灵活运用。
不动点迭代法是一种常用的求解非线性方程的方法,其原理和使用步骤在上文中已经有了详细介绍。
在本节中,我们将进一步探讨不动点迭代法的收敛性、迭代函数的选择和初始值的影响,以及在实际使用中需要注意的问题。
我们来讨论不动点迭代法的收敛性。
在使用不动点迭代法求解方程的过程中,我们需要考虑迭代函数 g(x) 是否满足一定的条件使得不动点序列 {x_k} 收敛到方程的根。
运用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)对比可得,牛顿迭代的收敛速度比较快。