MATLAB求根的几种方法

合集下载

MATLAB求根的几种方法

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中求方程的近似根(解)教学目的学习matlab中求根命令

第七讲MATLAB中求方程的近似根(解)教学目的学习matlab中求根命令

第七讲MATLAB中求方程的近似根(解)教学目的:学习matlab中求根命令,了解代数方程求根求解的四种方法,即图解法、准解析法、数值方法以及迭代方法,掌握对分法、迭代法、牛顿切法线求方程近似根的基本过程;掌握求代数方程(组)的解的求解命令.教学重点:求方程近似解的几种迭代方法,代数方程(组)的解的求解命令的使用方法.利用所学的编程知识,结合具体的实例,编制程序进行近似求根.掌握相关的代数方程(组)的求解命令及使用技巧.教学难点:方程的近似求解和非线性方程(组)的求解.一、问题背景和实验目的求代数方程0xf的根是最常见的数学问题之一(这里称为代数方程,主要是想和(=)后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当)f为线性方程,否则称之为非线性方程.(x(=x)f是一次多项式时,称0当0(xf的多样性,尚无一般的解析解法可使用,但如f是非线性方程时,由于))x(=果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.同时对于多未知量非线性方程(组)而言,简单的迭代法也是可以做出来的,但在这里我们介绍相关的命令来求解,不用迭代方法求解.通过本实验,达到下面目的:1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程;2. 求代数方程(组)的解.首先,我们先介绍几种近似求根有关的方法:1.对分法对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.设)af⋅bf,即()0f a>,()0f a<,()0f b<或()0f b>.则),(<(x[bf在]a上连续,0()根据连续函数的介值定理,在)fξ=.a内至少存在一点ξ,使()0,(b下面的方法可以求出该根:(1) 令0()/2x a b =+,计算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 =;111()/2x a b =+.……,有k a 、k b 以及相应的()/2k k k x a b =+.(3) 若()k f x ε≤ (ε为预先给定的精度要求),退出计算,输出结果()/2k k k x a b =+; 反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列{[,]}k k a b ,在(,)k k a b 中含有方程的根. 当区间长k k b a -很小时,取其中点()/2k k k x a b =+为根的近似值,显然有2111()/2()/(2)()/2k k k k k k x b a b a b a ξ+---≤-=-==-以上公式可用于估计对分次数k .分析以上过程不难知道,对分法的收敛速度与公比为12的等比级数相同.由于1021024=,可知大约对分10次,近似根的精度可提高三位小数.对分法的收敛速度较慢,它常用来试探实根的分布区间,或求根的近似值. 2. 迭代法a) 松弛法:由方程()0f x =构造一个等价方程()x x φ=.则迭代方程是:1(1)()k k k k k x x x ωωφ+=-+,1/(1'())k k x ωφ=-,其中'()1x φ≠.松弛法的加速效果是明显的 (见附录4),甚至不收敛的迭代函数经加速后也能获得收敛.b) Altken 方法:松弛法要先计算'()k x φ,在使用中有时不方便,为此发展出以下的 Altken 公式:(1)()k k x x φ= ;(2)(1)()k k x x φ=;(2)(2)(1)2(2)(1)1()/(2)k k k k k k k x x x x x x x +=---+, ,2,1,0=k这就是Altken 公式,它的加速效果也是十分明显的,它同样可使不收敛的迭代格式获得收敛(见附录5).3. 牛顿(Newton)法(牛顿切线法)()0f x =是非线性方程其迭代公式为:1(()/'())k k k k x x f x f x +=- ,2,1,0=k即为牛顿法公式.牛顿法的缺点是:(1)对重根收敛很慢;(2)对初值0x 要求较严,要求0x 相当接近真值*x .因此,常用其他方法确定初值0x ,再用牛顿法提高精度. 以下是本实验中的几个具体的实验 具体实验1:对分法先作图观察方程:3310x x -+=的实根的分布区间,再利用对分法在这些区间上分别求出根的近似值.程序如下: function [y,p]=erfen()clc, x=[];a=[];b=[]; a(1)=1;b(1)=2; i=1;x(i)=(a(i)+b(i))/2; e=abs(f(x(i))); ezplot('x^3-3*x+1',[a(1),b(1)]);hold on, plot([a(i),b(i)],[0,0]) while e>10^(-5)plot([a(i),a(i)],[0,100],[x(i) x(i)],[0 100],[b(i) b(i)],[0 100]),pause(0.5) if f(a(i))*f(x(i))<0a(i+1)=a(i);b(i+1)=x(i);x(i+1)=(a(i+1)+b(i+1))/2; elsea(i+1)=x(i);b(i+1)=b(i);x(i+1)=(a(i+1)+b(i+1))/2; ende=abs(f(x(i)));i=i+1; endy=x(i);p=[a;x;b]' function u=f(x) u=x^3-3*x+1; end end图形如下:结果为:1.5321具体实验2:普通迭代法采用迭代过程:1()k k x x φ+=求方程3310x x -+=在 0.5 附近的根,精确到第 4 位小数.构造等价方程:3(1)/3x x =+用迭代公式: 31(1)/3k k x x +=+, ,2,1,0=k 具体实验3:迭代法的加速1——松弛迭代法3()(1)/3x x φ=+,2()'x x φ=,21/(1)k k x ω=-迭代公式为31(1)(1)/3k k k k k x x x ωω+=-++clc;x=[];w=[]; x(1)=1;w(1)=1/(1-x(1)); for i=1:10w(i)=1/(1- x(i)); x(i+1)=(1-w(i))*x(i)+ w(i)*(x(i)^3+1)/3; end x另外有程序可以参考,详见参见附录4. 具体实验4:迭代法的加速2——Altken 迭代法迭代公式为:(1)3(1)/3k k x x =+,(2)(1)3(1)/3k k x x =+(2)(2)(1)2(2)(1)1()/(2)k k k k k k k x x x x x x x +=---+, ,2,1,0=k%(符号计算)syms x fx gx;gx=(x^3+1)/3;fx=x^3-3*x+1; disp('k x x1 x2') x=0.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)]) %(数值计算)function [y,p]=althken() % 求方根的迭代程序 clc,format long e , x(1)=6; i=1;p=[];ezplot('x^3-3*x+1',[x(1)-9,x(1)+1]);hold on plot([x(1)-20,x(1)+2],[0,0]) while abs(f(x(i)))>=10^(-5) plot(x(i),0,'*')t1=phi(x(i));t2=phi(t1); x(i+1)=t2-(t2-t1)^2/(t2-2*t1+x(i)+eps); p=[p;[i, x(i),t1,t2]]; i=i+1; pause(0.1) endp,y=x(i), i, format function u=phi(x) u=(x^3+1)/3; endfunction u=f(x) u=x^3+1-3*x; end end具体实验5:牛顿法用牛顿法计算方程3310x x -+=在-2到2之间的三个根. 提示:3()31f x x x =-+,2'()33f x x =-迭代公式:2321(31)/(33)k k k k k x x x x x +=--+-function [y,p]=newton() % 求方根的迭代程序 clc,format long e , x(1)=6; i=1; p=[]; ezplot('x^3-3*x+1',[x(1)-9,x(1)+1]);hold on plot([x(1)-20,x(1)+2],[0,0]) while abs(f(x(i)))>=10^(-5)plot(x(i),0,'*'), x(i+1)=x(i)-f(x(i))/(df(x(i))+eps); p=[p;[i, x(i)]]; i=i+1; pause(0.1) endformat short , p,y=x(i), i, function u=df(x) u=3*x^2-3; endfunction u=f(x) u=x^3+1-3*x; end end 结果:结果为: 1.5321※进一步思考:用迭代法求3的平方根. 迭代公式为1(3/)/2n n n x x x +=+. 编写M 函数文件My_sqrt.m, 求3正的平方根x . 要求误差小于510-.仅要求写出源程序.试使用以上介绍的迭代法来相互比较 参考程序:function y=my_sqrt(a) % 求方根的迭代程序if nargin~=1|~isa(a,'double') , error('输入数字为一个正数!'),end if a<0, error('输入数字为正数!'), endif a>0format long e , x(1)=0; x(2)=1; i=1; while abs(x(i+1)-x(i))>=10^(-5)i=i+1;x(i+1)=1/2*(x(i)+a/(x(i)+eps));endy=x(i+1);i,format end现在我们简单介绍图解法如何来求解一元方程和二元方程的根: 例:exp(-3*t)*sin(4*t+2)+4*exp(-0.5*t)*cos(2*t)=0.5>>ezplot('exp(-3*t)*sin(4*t+2)+4*exp(-0.5*t)*cos(2*t)-0.5',[0 5]) >>hold on, line([0,5],[0,0])验证:t=3.5203 >>syms x; t=3.5203;vpa(exp(-3*t)*sin(4*t+2)+4*exp(-0.5*t)*cos(2*t)-0.5) ans =-.43167073997540938989914138801396e-4例::x^2*exp(-x*y^2/2)+exp(-x/2)*sin(x*y)=0y^2 *cos(y+x^2) +x^2*exp(x+y)=0>> ezplot('x^2*exp(-x*y^2/2)+exp(-x/2)*sin(x*y)')>> hold onezplot('y^2 *cos(y+x^2) +x^2*exp(x+y)')具体的结果请大家自己下来运行二、关于直接利用函数(命令)求解方程及简介(1) solve('f(x)'),f(x)为一个具体的表达式.(2) roots(A),A为某个多项式按x降幂排列的系数矩阵(3) fzero('f(x)', x0),f(x)为一个具体的表达式,x0为一个具体的数值(4) linsolve(A,b),A为一方程组的系数矩阵,b为方程组右端的常数矩阵.1.单变量的多项式方程求根:命令格式:roots(A)例:x^3-6*(x^2)-72*x-27=0;>>p=[1 -6 -72 -27]>>r=roots(p)r=12.1229-5.7345-0.38842. 多项式型方程的准解析解法命令格式:[x,…]=solve(eqn1,eqn2,…)例:x^2+y^2-1=00.75*x^3-y+0.9=0>>syms x y;>> [x,y]=solve('x^2+y^2-1=0', '75*x^3/100-y+9/10=0')检验:>>[eval('x.^2+y.^2-1'), eval('75*x.^3/100-y+9/10')]具体结果就请大家下来自己运行3. 线性方程组的求解例:求线性方程组b⋅的解,已知m=[1 2 3 4 5;2 3 4 5 6;3 4 5 6 7 8;4 5 6 7 8 ;5 6 7 8 0],m=xb=[1;2;3;4;5]for i=1:5for j=1:5m(i, j)=i+j-1;endendm(5, 5)=0;b=[1:5]'; linsolve(m, b)4. 非线性方程数值求解(1)单变量非线性方程求解在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根.该函数的调用格式为:z=fzero('fname',x0,tol,trace)其中fname是待求根的函数文件名,x0为搜索的起点.一个函数可能有多个根,但fzero 函数只给出离x0最近的那个根.tol控制结果的相对精度,缺省时取tol=eps,trace•指定迭代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0.例:求f(x)=x-10x+2=0在x0=0.5附近的根.步骤如下:(a) 建立函数文件funx.m.function fx=funx(x)fx=x-10.^x+2;(b)调用fzero函数求根.z=fzero('funx',0.5)z = 0.3758(2)非线性方程组的求解对于非线性方程组F(X)=0,用fsolve函数求其数值解.fsolve函数的调用格式为: X=fsolve('fun',X0,option)其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定.最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来.如果想改变其中某个选项,则可以调用optimset()函数来完成.例如,Display 选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果.optim set(‘Display’,‘off’)将设定Display 选项为‘off’. 例: 求下列非线性方程组在(0.5,0.5) 附近的数值解.(a) 建立函数文件myfun.m . function q=myfun(p) x=p(1);y=p(2);q(1)=x-0.6*sin(x)-0.3*cos(y);q(2)=y-0.6*cos(x)+0.3*sin(y); (b) 在给定的初值x0=0.5,y0=0.5下,调用fsolve 函数求方程的根. x=fsolve('myfun',[0.5,0.5]',optimset('Display','off')) x = 0.6354 0.3734将求得的解代回原方程,可以检验结果是否正确,命令如下: q=myfun(x) q = 1.0e-009 * 0.2375 0.2957 可见得到了较高精度的结果.精品案例:螺旋线与平面的交点问题:螺旋线与平面相交的情况多种多样, 根据螺旋线与平面方程的不同可以相交, 也可以不相交. 在相交的情况下, 可以交于一点, 也可以交于好多点. 对于各种相交的情况, 要求其交点的坐标并不是一件容易的事. 本次实验就以此为背景讨论下面的具体问题:已知螺旋线的参数方程为4cos ,4sin ,,08x y z θθθθπ===≤≤.平面的方程为:0.520x y z ++-=. 求该螺旋线与平面的交点. 要求:1)求出所有交点的坐标;2)在同一图形窗口画出螺旋线、平面和交点. 实验过程: 1.1 问题分析可以采用多种方法求螺旋线与平面的交点坐标, 包括fsolve 等. 先对方程化简,减少变量个数,使用图解方法求方程的根.再分别画出螺旋线,平面,及其交点. 1.2 算法描述与分析先对方程化简,减少变量个数,再利用fsolve, 选择适当的初值, 求其数值解;再分别会出图形;最后对图形作出必要的修饰. 1.3 源程序及注释将螺旋线的参数方程代入平面方程后可得: 等价变形得 : 建立下面M 文件intersect_point.m %使用图解法求交点,并且三维图 %画图确定解的个数和大概位置 theta=0:0.01:8*pi;y1=4*(cos(theta)+sin(theta)); y2=2-0.5*theta;plot(theta,y1,theta,y2) %画出两个函数的图形%画螺旋线%theta=0:pi/100:8*pi; x=4*cos(theta); y=4*sin(theta); z=theta;figure %新建图形窗口plot3(x,y,z) %画含有参数的空间曲线 hold on %透明的画平面%x1=-5:0.1:5; %取值和螺旋线的范围[-4,4]有关. y1=x1;[X1 Y1]=meshgrid(x1,y1);%网格化,画曲面 Z1=4-2*X1-2*Y1;surf(X1,Y1,Z1) %或者使用mesh(X1,Y1,Z1)25.0sin 4cos 4=-++θθθθθθ5.02sin 4cos 4-=+shading flatalpha(0.5) %设置透明度alpha('z') %设置透明度方向%求交点坐标,为避免变量混淆和覆盖,这里用t 代替theta%i=1for n=[2,5,9,11] %根据画图确定解的大概位置作为初值t(i)=fsolve(inline('4*cos(t)+4*sin(t)+0.5 *t-2'),n)%选择不同初值求交点 x0(i)=4*cos(t(i));y0(i)=4*sin(t(i));z0(i)=t(i);i=i+1;endplot3(x0,y0,z0,'ro')1.4 测试结果(写清输入输出情况)从图形可见在 内与三角曲线有4个交点.交点坐标为:theta 的数值解为:t=[2.1961 5.3759 9.1078 11.1023]四个交点的近似坐标为:x0 =[-2.3413 2.4635 -3.8007 0.4261]y0 =[3.2432 -3.1514 1.2468 -3.9772]z0 =[2.1961 5.3759 9.1078 11.1023]1.5 调试和运行程序过程中产生的问题及采取的措施求交点的时候会出现重根和漏根的情形,通过选择适当的初值避免了上述情况.1.6 对算法和程序的讨论、分析, 改进设想及其它经验教训solve 函数只能求解一个数值解,不能全部求出;用fsolve 函数好; 为了满足更好的视觉πθ80≤≤效果,可以对图形进行进一步的修饰.习题1.已知多项式323)(2345+++-=x x x x x f2.解方程组:sin()0x x y ye +-=(1)22x y -= (2)3.求解方程: ex x x =)cos( 4.求解多项式方程 0189=++x x5.求下列代数方程(组)的解:(1) 510x x -+=(2) 230x y += ①2431x y += ②6.选择适当的迭代过程,分别使用:(1)普通迭代法;(2)与之相应的松弛迭代法和 Altken 迭代法.求解方程0133=+-x x 在 1.4 附近的根,精确到4位小数,请注意迭代次数的变化.7.分别用对分法、普通迭代法、松弛迭代法、Altken 迭代法、牛顿切法线等5种方法,求方程 sin()t x x ⋅= 的正的近似根,10≤<t .(建议取 5.0=t .时间许可的话,可进一步考虑 25.0=t 的情况.)五、附录为供近似求根的算法附录1:对分法程序(fulu1.m )syms x fx; a=0;b=1;fx=x^3-3*x+1;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)])end注:实验时,可将第 2 行的 a、b 改为其它区间端点进行其它实验.附录2:普通迭代法(fulu2.m)syms x fx gx; gx=(x^3+1)/3;fx=x^3-3*x+1; disp('k x f(x)')x=0.5;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)])附录3:收敛/发散判断(fulu3.m)syms x g1 g2 g3 dg1 dg2 dg3;x1=0.347;x2=1.53;x3=-1.88;g1=(x^3+1)/3;dg1=diff(g1, 'x');g2=1/(3-x^2);dg2=diff(g2, 'x');g3=(3*x-1)^(1/3);dg3=diff(g3, 'x');disp(['1 ', num2str(abs(subs(dg1, 'x', x1))), ' ', ...num2str(abs(subs(dg1, 'x', x2))), ' ', num2str(abs(subs(dg1, 'x', x3)))]) disp(['2 ', num2str(abs(subs(dg2, 'x', x1))), ' ', ...num2str(abs(subs(dg2, 'x', x2))), ' ', num2str(abs(subs(dg2, 'x', x3)))]) disp(['3 ', num2str(abs(subs(dg3, 'x', x1))), ' ', ...num2str(abs(subs(dg3, 'x', x2))), ' ', num2str(abs(subs(dg3, 'x', x3)))])附录4:松弛迭代法(fulu4.m)syms fx gx x dgx;gx=(x^3+1)/3;fx=x^3-3*x+1;dgx=diff(gx, 'x');x=0.5;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)])附录5: Altken 迭代法(fulu5.m)syms x fx gx; gx=(x^3+1)/3;fx=x^3-3*x+1;disp('k x x1 x2') x=0.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)])附录6:牛顿法(fulu6.m)syms x fx gx;fx=x^3-3*x+1;gx=diff(fx, 'x');x1=-2;x2=0.5;x3=1.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)])。

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公式。

matlab求根的个数和区间

matlab求根的个数和区间

标题:深度解析MATLAB求根的个数和区间1. 引言MATLAB作为一种强大的数学工具,对于求解方程根的问题有着丰富的函数库和算法支持。

在实际应用中,我们常常需要对一个函数的根进行求解,而了解该函数根的个数和区间是十分重要的。

本文将深入探讨MATLAB中求根个数和区间的相关知识和方法,以便读者能够更全面、深刻地理解这一主题。

2. 求根个数的概念及相关函数我们需要了解什么是求根的个数以及MATLAB中相关的函数。

对于一个函数f(x),求根的个数即为其在特定区间内零点的个数。

在MATLAB中,常用的求根函数包括fzero()、roots()等,它们可以对各种类型的函数进行求解,如多项式、非线性方程等。

3. 求根个数的判定方法接下来,我们将介绍MATLAB中判定求根个数的方法。

对于一元函数,我们可以借助MATLAB中的绘图函数plot(),来观察函数的图像,并直观地判断其在特定区间内的根的个数。

另外,MATLAB还提供了一些数值方法,如牛顿法、二分法等,可以精确地计算函数在区间内的根。

4. 区间的选取和调整选取合适的区间对于求解根的个数至关重要。

在选取区间时,我们需要考虑函数的特性、间断点和拐点等因素,以确保所选区间内包含所有的根。

当计算结果不准确或求根个数与预期值不符时,我们需要对区间进行调整,以提高求解的精度和准确性。

5. 个人观点和理解在我看来,MATLAB求根的个数和区间问题是实际工程中最常见且关键的数学问题之一。

在实际应用中,需要根据具体的函数形式和求解需求来选择合适的求根方法和算法。

充分了解函数的特性和区间的选择对于求解的准确性和有效性具有重要意义。

6. 总结和回顾通过本文的深度解析,读者对MATLAB求根个数和区间这一主题应该有了更全面、深刻的理解。

在实际应用中,我们应该根据具体情况来选择合适的求根方法和区间,以确保求解的准确性和有效性。

在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之间。

第六章 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

简单迭代法求方程的根1. 引言简单迭代法是一种常用的求解非线性方程根的方法。

它基于方程的连续性和局部斜率连续的性质,通过迭代逼近方程的根。

在本文中,我们将详细介绍简单迭代法的原理和步骤,并使用MATLAB编写代码来解决方程求根问题。

2. 简单迭代法原理简单迭代法的基本思想是,将非线性方程转化为迭代形式,通过不断迭代逼近方程的根。

其原理基于不动点定理,即给定一个函数f(x),若存在一个不动点x∗,满足x∗=f(x∗),则迭代过程x k+1=f(x k)中的序列x k将收敛到x∗。

对于求解方程f(x)=0的问题,我们可以将其转化为x=g(x)的形式,其中g(x)= x−f(x),且f′(x)不等于0。

这样,我们可以通过迭代逼近x=g(x)的根,从而得f′(x)到原方程的解。

3. 简单迭代法步骤简单迭代法的步骤如下:3.1 选择初始点选择一个合适的初始点x0作为迭代的起点。

3.2 迭代计算根据迭代公式x k+1=g(x k),计算序列x k的下一个值。

3.3 判断终止条件根据预设的终止条件,判断是否满足终止条件。

常用的终止条件包括: - 迭代次数达到预设的最大值。

- 迭代过程中下一个值与当前值之差小于预设的精度。

3.4 输出结果当满足终止条件时,输出最终的逼近根的值。

4. 简单迭代法在MATLAB中的实现以下是简单迭代法在MATLAB中的实现代码:function root = simple_iter_method(f, g, x0, max_iter, precision) % f: 原方程% g: 迭代函数% x0: 初始点% max_iter: 最大迭代次数% precision: 精度x = x0;iter = 0;while iter < max_iterx_next = feval(g, x); % 使用feval函数计算迭代值if abs(x_next - x) < precisionroot = x_next;return;endx = x_next;iter = iter + 1;enderror('达到最大迭代次数,未找到合适的解');end5. 示例与应用5.1 示例:求解方程x2−3x+2=0。

matlab计算方程的根

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实现

第五讲非线性方程求根及其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的实现示例。

matlab牛顿迭代法求多项式方程的根

matlab牛顿迭代法求多项式方程的根

matlab牛顿迭代法求多项式方程的根【主题】matlab牛顿迭代法求多项式方程的根1. 引言在数学和工程领域中,求解多项式方程的根是一项常见且重要的任务。

牛顿迭代法是一种有效的数值方法,可以用来逼近多项式方程的根。

本文将详细介绍如何利用matlab实现牛顿迭代法,以及该方法的应用和局限性。

2. 牛顿迭代法简介牛顿迭代法是一种基于导数的数值逼近方法,用于求解方程 f(x)=0 的根。

该方法的基本思想是从一个初始近似值开始,通过逐步改进来逼近方程的根。

牛顿迭代法的迭代公式为:\[x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}\]其中,\(x_n\)是第n次迭代的近似根,f(x)是方程,\(f'(x)\)是f关于x的导数。

3. 在matlab中实现牛顿迭代法在matlab中,我们可以利用函数和循环结构来实现牛顿迭代法。

需要定义方程f(x)以及其导数f'(x)的函数表达式。

选择一个初始值作为近似根,通过迭代公式不断改进,直到满足预设的精度要求。

4. 应用实例我们将以一个具体的多项式方程为例,来演示如何利用matlab的牛顿迭代法来求解其根。

假设我们要求解方程\(x^2-2=0\)的根。

我们可以定义方程及其导数的matlab函数表达式,然后选择一个适当的初始值,进行迭代计算,最终得到方程的根。

5. 算法优化与局限性虽然牛顿迭代法在求解多项式方程的根上表现出色,但也存在一些局限性。

需要提前知道方程的导数表达式;初始值的选取可能影响迭代结果的精度等。

在实际应用中,需要根据具体情况灵活选择迭代算法,甚至进行一些优化来提高求解效率。

6. 结语通过matlab实现牛顿迭代法求解多项式方程的根,不仅可以帮助我们深入理解数值计算方法,也可以应用到实际工程问题中。

对于复杂的多项式方程,利用数值方法求解是一种有效的途径。

当然,在应用过程中需要注意算法的优化和局限性,以确保求解的准确性和稳定性。

不同方法求方程的根matlab代码

不同方法求方程的根matlab代码

不同方法求方程的根matlab代码1、%使用二分法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('二分法')a=0.2;b=0.26;tol=0.0001;n0=10;fa=600*(a.^4)-550*(a.^3)+200*(a.^2)-20*a-1;for i=1:n0p=(a+b)/2;fp=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;if fp==0||(abs((b-a)/2)<tol)< p="">disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;endif fa*fp>0a=p;else b=p;endendif i==n0&&~(fp==0||(abs((b-a)/2)<tol))< p="">disp(n0)disp('次二分迭代后没有求出方程的根')end2、%使用牛顿法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('牛顿法')p0=0.3;for i=1:n0p=p0-(600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1)./(2400*(p0.^3) -1650*p0.^2+400*p0-20);if(abs(p-p0)<tol)< p="">disp('用牛顿法求得方程的根p=')disp(p)disp('牛顿迭代次数为:')disp(i)break;endp0=p;endif i==n0&&~(abs(p-p0)<tol)< p="">disp(n0)disp('次牛顿迭代后没有求出方程的根')end3、%使用割线法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('割线法')p0=0.2;p1=0.25;q0=600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1;q1=600*(p1.^4)-550*(p1.^3)+200*(p1.^2)-20*p1-1;for i=2:n0p=p1-q1*(p1-p0)/(q1-q0);if abs(p-p1)<tol< p="">disp('用割线法求得方程的根p=')disp(p)disp('割线法迭代次数为:')disp(i)break;endp0=p1;q0=q1;pp=p1;p1=p;q1=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;endif i==n0&&~(abs(p-pp)<tol)< p="">disp(n0)disp('次割线法迭代后没有求出方程的根')end4、%使用试位法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('试位法')p0=0.2;p1=0.25;q0=600*(p0.^4)-550*(p0.^3)+200*(p0.^2)-20*p0-1;q1=600*(p1.^4)-550*(p1.^3)+200*(p1.^2)-20*p1-1;for i=2:n0p=p1-q1*(p1-p0)/(q1-q0);if abs(p-p1)<tol< p="">disp('用试位法求得方程的根p=')disp(p)disp('试位法迭代次数为:')disp(i)break;endq=600*(p.^4)-550*(p.^3)+200*(p.^2)-20*p-1;if q*q1<0p0=p1;q0=q1;endpp=p1;p1=p;q1=q;endif i==n0&&~(abs(p-pp)<tol)< p="">disp(n0)disp('次试位法迭代后没有求出方程的根')end5、%使用muller方法找到方程 600 x^4 -550 x^3 +200 x^2 -20 x -1 =0 在区间[0.1,1]上的根,%误差限为 e=10^-4disp('muller法')x0=0.1;x1=0.2;x2=0.25;h1=x1-x0;h2=x2-x1;d1=((600*(x1.^4)-550*(x1.^3)+200*(x1.^2)-20*x1-1)-(600*(x0.^4)-55 0*(x0.^3)+200*(x0.^2)-20*x0-1))/h1;d2=((600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)-(600*(x1.^4)-55 0*(x1.^3)+200*(x1.^2)-20*x1-1))/h2;d=(d2-d1)/(h2+h1);for i=3:n0b=d2+h2*d;D=(b*b-4*(600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)*d)^0.5;if(abs(d-D)<abs(d+d))< p="">E=b+D;else E=b-D;endh=-2*(600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)/E;p=x2+h;if abs(h)<tol< p="">disp('用muller方法求得方程的根p=')disp(p)disp('muller方法迭代次数为:')disp(i)break;endx0=x1;x1=x2;x2=p;h1=x1-x0;h2=x2-x1;d1=((600*(x1.^4)-550*(x1.^3)+200*(x1.^2)-20*x1-1)-(600*(x0.^4)-55 0*(x0.^3)+200*(x0.^2)-20*x0-1))/h1;d2=((600*(x2.^4)-550*(x2.^3)+200*(x2.^2)-20*x2-1)-(600*(x1.^4)-55 0*(x1.^3)+200*(x1.^2)-20*x1-1))/h2;d=(d2-d1)/(h2+h1);endif i==n0%条件有待商榷?!disp(n0)disp('次muller方法迭代后没有求出方程的根') end</tol<></abs(d+d))<></tol)<></tol<></tol)<></tol<></tol)<></tol)<></tol))<></tol)<>。

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之间。

matlab二分法求解方程的根

matlab二分法求解方程的根

matlab二分法求解方程的根二分法是求解数值计算中常用的一种方法,也被广泛地应用于求解方程的根。

在MATLAB中,我们可以使用二分法来求解方程的根。

具体步骤如下:1.首先,我们需要定义我们要求解的方程。

可以使用MATLAB中的符号计算工具箱或者直接定义一个匿名函数。

例如,我们要求解的方程是 f(x) = x^3 - 2x - 5,我们可以这样定义一个匿名函数:f = @(x) x^3 - 2*x - 5。

2.接下来,我们需要确定求解的区间。

这个区间应该包含方程的一个根。

通常,我们可以通过简单的图形绘制来确定这个区间。

例如,我们可以绘制 f(x) 的图像,然后找到其中一个跨越 x 轴的点,就可以确定我们要求解的区间了。

假设我们已经确定了区间[2,3]。

3.然后,我们可以编写一个二分法求解方程根的函数。

这个函数需要接受三个参数:被求解的方程 f,求解区间 a 和 b。

函数的基本思路是每次将区间缩小一半,直到找到方程的一个根。

具体实现方式可以参考下面的代码示例:function [x] = bisection(f, a, b, tol)% f: 要求解的方程% a: 求解区间左端点% b: 求解区间右端点% tol: 误差容限% x: 方程的一个根% 初始化fa = f(a);fb = f(b);if fa*fb > 0error('区间内不存在根'); end% 迭代求解while abs(b-a) > tolx = (a+b)/2;fx = f(x);if fx == 0break;elseif fx*fa < 0b = x;fb = fx;elsea = x;fa = fx;endendend4.最后,我们可以调用这个函数来求解方程的根。

例如,我们可以这样调用:f = @(x) x^3 - 2*x - 5;a = 2;b = 3;tol = 1e-6;x = bisection(f, a, b, tol);这个函数将返回方程 f 在区间 [a,b] 内的一个根,误差容限为 tol。

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二分法求方程根的程序

matlab二分法求方程根的程序

matlab二分法求方程根的程序
二分法,又称分半法,是一种方程式根的近似值求法。

对于区间[a,b]上连续不断且f(a) ·f(b)\uc0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法(bisection)。

1如果要求已知函数 f(x) = 0 的根 (x 的解),那么
2先要找到一个区间 [a, b],使f(a)与f(b)异号。

根据介值定理,这个区间内一定包含着方程式的根。

3求该区间的中点m=(a+b)/2,并找到 f(m) 的值。

4若 f(m) 与 f(a) 正负号相同,则取 [m, b] 为新的区间, 否则取 [a, m]。

5重复第3步和第4步,直至获得理想的精确度年才。

MATLAB计算方法迭代法牛顿法二分法实验报告

MATLAB计算方法迭代法牛顿法二分法实验报告

完美WORD格式姓名实验报告成绩评语:指导教师(签名)年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

实验一 方程求根一、 实验目的用各种方法求任意实函数方程0)(=x f 在自变量区间[a ,b]上,或某一点附近的实根。

并比较方法的优劣。

二、 实验原理 (1)、二分法对方程0)(=x f 在[a ,b]内求根。

将所给区间二分,在分点2a b x -=判断是否0)(=x f ;若是,则有根2a b x -=。

否则,继续判断是否0)()(<∙x f a f ,若是,则令x b =,否则令x a =。

否则令x a =。

重复此过程直至求出方程0)(=x f 在[a,b]中的近似根为止。

(2)、迭代法将方程0)(=x f 等价变换为x =ψ(x )形式,并建立相应的迭代公式=+1k x ψ(x )。

(3)、牛顿法若已知方程 的一个近似根0x ,则函数在点0x 附近可用一阶泰勒多项式))((')()(0001x x x f x f x p -+=来近似,因此方程0)(=x f 可近似表示为+)(0x f 0))(('0=-x x x f 设0)('0≠x f ,则=x -0x )(')(00x f x f 。

取x 作为原方程新的近似根1x ,然后将1x 作为0x 代入上式。

迭代公式为:=+1k x -0x )(')(k k x f x f 。

三、 实验设备:MATLAB 7.0软件四、 结果预测(1)11x =0.09033 (2)5x =0.09052 (3)2x =0,09052 五、 实验内容(1)、在区间[0,1]上用二分法求方程0210=-+x e x 的近似根,要求误差不超过3105.0-⨯。

(2)、取初值00=x ,用迭代公式=+1k x -0x )(')(k k x f x f ,求方程0210=-+x e x的近似根。

要求误差不超过3105.0-⨯。

matlab牛顿迭代法求根

matlab牛顿迭代法求根

matlab牛顿迭代法求根下面是使用matlab编写的牛顿迭代法求根的示例代码:```matlabfunction root = newtonMethod(f, df, x0, tolerance, maxIterations) % f: 目标函数% df: 目标函数的导数% x0: 初始估计解% tolerance: 迭代终止的容差% maxIterations: 最大迭代次数root = x0;for i=1:maxIterations% 计算函数值和导数值fx = feval(f, root);dfx = feval(df, root);% 更新解x1 = root - fx / dfx;% 判断是否达到终止条件if abs(x1 - root) < toleranceroot = x1;return;endroot = x1; % 更新根值endend```这个函数接受目标函数(f)、目标函数的导数(df)、初始估计解(x0)、迭代终止的容差(tolerance)和最大迭代次数(maxIterations)作为输入参数。

函数使用牛顿迭代法来求解函数f的根,并返回根的近似值。

需要注意的是,目标函数f和其导数df都要按照matlab的函数定义方式来定义,并在调用该函数时作为函数句柄传递给newtonMethod函数。

此外,需要提供一个合适的初始估计解(x0)、迭代终止的容差(tolerance)和最大迭代次数(maxIterations)来控制迭代的终止条件。

以下是一个使用示例:```matlabf = @(x) x^2 - 4;df = @(x) 2*x;x0 = 2; % 初始估计解tolerance = 1e-6; % 迭代终止的容差maxIterations = 100; % 最大迭代次数root = newtonMethod(f, df, x0, tolerance, maxIterations);disp(root);```在这个示例中,我们使用牛顿迭代法来求解函数f(x) = x^2 - 4的根。

matlab二分法求根编程

matlab二分法求根编程

MATLAB二分法求根编程介绍MATLAB是一种强大的数值计算工具,广泛应用于工程、科学和数学领域。

其中,二分法是一种用于求解方程根的常用算法。

通过将区间不断二分,并逐步缩小根的范围,最终找到方程的解。

本文将详细介绍如何使用MATLAB编程实现二分法求根算法。

二分法求根原理二分法求根基于区间不断缩小的原理。

假设我们要求解一个方程f(x)=0的根。

首先,我们需要确定一个包含根的初始区间[a,b]。

通过计算f(a)和f(b)的符号,我们可以判断根是否在该区间内。

如果f(a)和f(b)的符号相同,表示a和b两点的函数值同号,根据零点定理,根不在该区间内。

在这种情况下,我们需要重新选择一个新的区间。

通过将区间划分为两部分,我们可以确定新的区间。

假设区间的中点为c,那么我们可以计算f(c)的符号。

如果f(c)为零,则c即为方程的根。

否则,我们可以判断f(c)和f(a)的符号,如果它们的符号相同,则根位于区间[c,b]内。

反之,如果f(c)和f(a)的符号不同,则根位于区间[a,c]内。

通过不断缩小区间的范围,最终可以找到方程的根。

编程实现为了使用MATLAB实现二分法求根算法,我们可以按照以下步骤进行编程:步骤1:定义函数首先,我们需要定义方程的函数。

假设我们要求解方程x2−4=0的根。

我们可以在MATLAB中定义一个函数,例如:function y = f(x)y = x^2 - 4;end步骤2:确定初始区间接下来,我们需要确定一个初始的区间[a,b]。

我们可以简单地选择两个数,使得f(a)和f(b)的符号不同。

例如,我们可以选择a=1和b=3。

步骤3:实现二分法求根算法我们可以使用一个循环来实现二分法求根算法。

在每一次循环中,我们计算区间的中点c,并判断f(c)的符号。

根据符号的不同,我们更新区间[a,b]的左端点或右端点。

循环终止的条件可以是区间长度小于某个特定的阈值,或者我们达到了最大迭代次数。

matlab一元二次方程求解,根的三种情况

matlab一元二次方程求解,根的三种情况

matlab一元二次方程求解,根的三种情况
一元二次方程是数学中最常见的一种方程类型,也是大家经常调查的研究对象之一。

一元二次方程可以用matlab求解,可以得到根、根对和无解三种不同的情况。

首先,一元二次方程如果有根,matlab就可以得到根。

在matlab中,可以用“函数求根”的方式求解方程,可以找到其实的解,从而得到根。

根的大小取决于方程中的系数,得到的根具有实数和虚数两种类型。

其次,如果一元二次方程有两个实根,matlab也可以表示出来。

也是通过“函数求根”的方法,得到的结果就是两个实数,可以看到它们具有一定的大小,并且是一对组成。

最后,如果一元二次方程无解,matlab也可以显示出来。

此时,matlab求解的结果就是虚数,也就说,当一元二次方程无解时,matlab计算的结果是实数组成的复数。

综上所述,matlab求解一元二次方程可以得到根、根对和无解三种不同的情况。

每种情况都可以用计算机求出,所以可以大大提高求解一元二次方程的效率。

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

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是已知参数,但是每次都改变
那么目标函数如下三种书写格式,效果完全等效。

注意参数列表中,未知数一定放第一位,其他参数放后面
(1)objfun=@(x,p,t)(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446);
(2)objfun=inline('(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446)','x','p','t')
此时的调用格式如下
fzero(objfun,x0,options,p,t)%如果options使用的默认的话,那直接使用[],p和t就是我们需要传递的参数
fzero(@(x)objfun(x,p,t),x0,options)%这种格式与上面的等效
区别就是前者,将参数p和t作为fzero的参数进行传递,而后者是将p和t作为objfun的参数进行传递,没有本质区别
(3)function f=objfun(x,p,t)%以M文件格式书写目标函数
f=(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446);
此时有三种调用格式
fzero(@objfun,x0,options,p,t)
fzero('objfun',x0,options,p,t)
fzero(@(x)objfun(x,p,t),x0,options)
注意:fzero只能求解单变量的方程,没法求解复数、多变量以及方程组等。

在搜索过程中出现inf,nan,复数将会终止计算,也就是说不能求解复数解,并且每次子返回一个解
5.fsolve数值解方程(组)——使用最多的数值解法
[x,fval,exitflag,output,jacobian]=fsolve(fun,x0,options,p1,p2...)
fsolve的参数意义大部分与fzero相同,只是优化参数更多了,使用更灵活另外一定注意x0的长度必须与变量的个数相等。

它与fzero的区别是,首先当然算法不同,另外fsolve的功能强大多很多,它可以直接方便的求解多变量方程组,线性和非线性,超静定和静不定方程,还可求解复数方程
fun同样可以是句柄、inline函数或M文件,但是一般M文件比较多,这是由于fsolve是解方程组的,目标函数一般比较烦,直接写比较困难
比如解方程组x1+x2=8 x1-2*x2-2*p=0(当然可以求解非线性的)
目标函数同样有三种书写格式
(1)objfun=@(x,p)[x(1)+x(2)-8;x(1)-3*x(2)+2*p];
(2)objfun=inline('[x(1)+x(2)-8;x(1)-3*x(2)+2*p]','x','p')
此时的调用格式有
fsolve(objfun,x0,options,p)
fsolve(@(x)objfun(x,p),x0,options)
(3)function f=objfun(x,p)
f(1)=x(1)+x(2)-8;
f(2)=x(1)-3*x(2)+2*p;
当然你也可以直接写成,两者的效果是一样的
f=[x(1)+x(2)-8;
x(1)-3*x(2)+2*p];
此时的调用格式有
fsolve(@objfun,x0,options,p)
fsolve('objfun',x0,options,p)
fsolve(@(x)fun(x,p),x0,options)。

相关文档
最新文档