文档库 最新最全的文档下载
当前位置:文档库 › 第七讲 MATLAB中求方程的近似根(解)

第七讲 MATLAB中求方程的近似根(解)

第七讲 MATLAB中求方程的近似根(解)
第七讲 MATLAB中求方程的近似根(解)

第七讲MATLAB中求方程的近似根(解)

教学目的:学习matlab中求根命令,了解代数方程求根求解的四种方法,即图解法、准解析法、数值方法以及迭代方法,掌握对分法、迭代法、牛顿切法线求方程近似根的基本过程;掌握求代数方程(组)的解的求解命令.

教学重点:求方程近似解的几种迭代方法,代数方程(组)的解的求解命令的使用方法.利用所学的编程知识,结合具体的实例,编制程序进行近似求根.掌握相关的代数方程(组)的求解命令及使用技巧.

教学难点:方程的近似求解和非线性方程(组)的求解.

一、问题背景和实验目的

求代数方程0

x

f的根是最常见的数学问题之一(这里称为代数方程,主要是想和

(=

)

后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当)

f为线性方程,否则称之为非线性方程.(x

(=

x

)

f是一次多项式时,称0

当0

(x

f的多样性,尚无一般的解析解法可使用,但如f是非线性方程时,由于)

)

x

(=

果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.同时对于多未知量非线性方程(组)而言,简单的迭代法也是可以做出来的,但在这里我们介绍相关的命令来求解,不用迭代方法求解.

通过本实验,达到下面目的:

1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程;

2. 求代数方程(组)的解.

首先,我们先介绍几种近似求根有关的方法:

1.对分法

对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根.

设)

a

f

?b

f,即()0

f a>,()0

f a<,()0

f b<或()0

f b>.则

)

,

(<

(x

[b

f在]

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 .

分析以上过程不难知道,对分法的收敛速度与公比为

1

2

的等比级数相同.由于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))<0

a(i+1)=a(i);b(i+1)=x(i);x(i+1)=(a(i+1)+b(i+1))/2; else

a(i+1)=x(i);b(i+1)=b(i);x(i+1)=(a(i+1)+b(i+1))/2; end

e=abs(f(x(i)));i=i+1; end

y=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 φ=,2

1/(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:10

w(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); end

disp([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) end

p,y=x(i), i, format function u=phi(x) u=(x^3+1)/3; end

function 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 =-迭代公式:

232

1(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) end

format short , p,y=x(i), i, function u=df(x) u=3*x^2-3; end

function 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('输入数字为正数!'), end

if a>0

format 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));end

y=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)=0

y^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 on

ezplot('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.3884

2. 多项式型方程的准解析解法

命令格式:

[x,…]=solve(eqn1,eqn2,…)

例:x^2+y^2-1=0

0.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=

x

b=[1;2;3;4;5]

for i=1:5

for j=1:5

m(i, j)=i+j-1;

end

end

m(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 flat

alpha(0.5) %设置透明度 alpha('z') %设置透明度方向

%求交点坐标,为避免变量混淆和覆盖,这里用t 代替theta% i=1

for 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; end

plot3(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 f

2.解方程组:sin()0x x y ye +-=(1)

22x y -= (2)

3.求解方程: e

x

x x =)cos(

4.求解多项式方程 018

9

=++x x 5.求下列代数方程(组)的解: (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≤

五、附录为供近似求根的算法

附录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

k=k+1;x=(a+b)/2; end

disp([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;

end

disp([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);

end

disp([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);

end

disp([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);

end

disp([num2str(k), ' ', num2str(x1), ' ', num2str(x2), ' ', num2str(x3)])

matlab解方程组

matlab解方程组 lnx表示成log(x) 而lgx表示成log10(x) 1-exp(((log(y))/x^0.5)/(x-1)) 1、解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB 中有两种方法: (1)x=inv(A)*b —采用求逆运算解方程组; (2)x=A\B —采用左除运算解方程组 PS:使用左除的运算效率要比求逆矩阵的效率高很多~ 例: x1+2x2=8 2x1+3x2=13 >>A=[1,2;2,3];b=[8;13]; >>x=inv(A)*b x = 2.00 3.00 >>x=A\B x = 2.00 3.00; 即二元一次方程组的解x1和x2分别是2和3。 对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下: 第一步:定义变量syms x y z ...; 第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN'); 第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。 如:解二(多)元二(高)次方程组: x^2+3*y+1=0 y^2+4*x+1=0 解法如下: >>syms x y; >>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0'); >>x=vpa(x,4); >>y=vpa(y,4); 结果是:

第七讲 MATLAB中求方程的近似根(解)

第七讲MATLAB中求方程的近似根(解) 教学目的:学习matlab中求根命令,了解代数方程求根求解的四种方法,即图解法、准解析法、数值方法以及迭代方法,掌握对分法、迭代法、牛顿切法线求方程近似根的基本过程;掌握求代数方程(组)的解的求解命令. 教学重点:求方程近似解的几种迭代方法,代数方程(组)的解的求解命令的使用方法.利用所学的编程知识,结合具体的实例,编制程序进行近似求根.掌握相关的代数方程(组)的求解命令及使用技巧. 教学难点:方程的近似求解和非线性方程(组)的求解. 一、问题背景和实验目的 求代数方程0 x f的根是最常见的数学问题之一(这里称为代数方程,主要是想和 (= ) 后面的微分方程区别开.为简明起见,在本实验的以下叙述中,把代数方程简称为方程),当) f为线性方程,否则称之为非线性方程.(x (= x ) f是一次多项式时,称0 当0 (x f的多样性,尚无一般的解析解法可使用,但如f是非线性方程时,由于) ) x (= 果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求.同时对于多未知量非线性方程(组)而言,简单的迭代法也是可以做出来的,但在这里我们介绍相关的命令来求解,不用迭代方法求解. 通过本实验,达到下面目的: 1. 了解对分法、迭代法、牛顿切线法求方程近似根的基本过程; 2. 求代数方程(组)的解. 首先,我们先介绍几种近似求根有关的方法: 1.对分法 对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根. 设) a f ?b f,即()0 f a>,()0 f a<,()0 f b<或()0 f b>.则 ) , (< (x [b f在] a上连续,0 ( ) 根据连续函数的介值定理,在) fξ=. a内至少存在一点ξ,使()0 , (b 下面的方法可以求出该根:

MATLAB 微分代数方程解法Microsoft Word 文档

微分代数方程(DAE)的Matlab解法 所谓微分代数方程,是指在微分方程中,某些变量满足某些代数方程的约束。假设微分方程的更一般形式 可以写成 前面所介绍的ODEs数值解法主要针对能够转换为一阶常微分方程组的类型,故DAE就无法使用前面介绍的常微分方程解法直接求解,必须借助DAE的特殊解法。 其实对于我们使用Matlab求解DAE时,却没有太大的改变只需增加一个Mass参数即可。描述f(t,x)的方 法和普通微分方程完全一致。 注意:ode15i没法设置Mass属性,换句话说除了ode15i外其他ode计算器都可以求解DAEs问题1.当M(t,y)非奇异的时候,我们可以将微分方程等效的转换为y'=inv(M)*f(t,y),此时就是一个普通的ODE(当 然我们可以将它当成DAEs处理),对任意一个给定的初值条件都有唯一的解 2.当m(t,y)奇异时,我们叫它为DAEs(微分代数方程),DAEs问题只有在同时提供状态变量初值y0和状态变量一阶导数初值py0,且满足M(t0,y0)*yp0=f(t0,y0)时才有唯一解,假如不满足上面的方程,DAEs解算器会将提供的y0和py0作为猜测初始值,并重新计算与提供初值最近的封闭初值 3.质量矩阵可是一个常数矩阵(稀疏矩阵),也可以是一个自定义函数的输出。但是ode23s只能求解Mass 是常数的DAEs 4.对于Mass奇异的DAEs问题,特别是设置MassSingular为yes时,只能ode15s和ode23t解算器 5.对于DAE我们还有几个参数需要介绍 a.Mass:质量矩阵,不说了,这个是DAE的关键,后面看例子就明白了 b.MStateDependence:质量矩阵M(t,y)是否是y的函数,可以选择none|{weak}|strong,none表示M与 y无关,weak和strong都表示与y相关 c.MvPattern:注意这个必须是稀疏矩阵,S(i,j)=1表示M(t,y)的第i行中任意元素都与第j个状态变量yi有 关,否则为0 d.MassSingular:设置Mass矩阵是否奇异,当设置为yes时,只能使用ode15s和ode23t e.InitialSlope:状态变量的一阶导数初值yp0,和y0具有相同的size,当使用ode15s和ode23t时,该属 性默认为0 下面我们以实例说明,看下面的例子,求解该方程的数值解 【解】 真是万幸,选取状态变量和求状态变量的一阶导数等,微分方程转换工作,题目已经帮我们完成。 可是细心的网友会发现,最后一个方程不是微分方程而是一个代数方程(这就是为什叫DAE的原因),其实 我们可以将它视为对三个状态变量的约束。 (1)用矩阵形式表示出该DAEs

matlab-解方程

1、解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MA TLAB中有两种方法: (1)x=inv(A)*b —采用求逆运算解方程组; (2)x=A —采用左除运算解方程组。 例: x1+2x2=8 2x1+3x2=13 >>A=[1,2;2,3];b=[8;13]; >>x=inv(A)*b x = 2.00 3.00 >>x=A x = 2.00 3.00; 即二元一次方程组的解x1和x2分别是2和3。 对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n 位有效数字的数值解.具体步骤如下: 第一步:定义变量syms x y z ...; 第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN'); 第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。 如:解二(多)元二(高)次方程组: x^2+3*y+1=0 y^2+4*x+1=0 解法如下: >>syms x y; >>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0'); >>x=vpa(x,4); >>y=vpa(y,4); 结果是: x = 1.635+3.029*i 1.635-3.029*i -.283 -2.987 y = 1.834-3.301*i 1.834+3.301*i -.3600 -3.307。 二元二次方程组,共4个实数根;

matlab实验报告--求代数方程的近似根

数学实验报告 实验序号: 第二次 日期:2012 年 5月10日 班级 0920861 小组成员姓名 徐易斌;王勇 王康 学号 30 12 33 实验名称:求代数方程的近似根 问题背景描述: 求代数方程0)(=x f 的根是最常见的数学问题之一,当)(x f 是一次多项式时,称0)(=x f 为线性方程,否则称之为非线性方程. 当0)(=x f 是非线性方程时,由于)(x f 的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求. 本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间],[b a ,或给出某根的近似值0x .

实验目的: 1. 了解代数方程求根求解的四种方法:对分法、迭代法、牛顿切线法 2. 掌握对分法、迭代法、牛顿切线法求方程近似根的基本过程。 实验原理与数学模型: 1.对分法 对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根. 设)(x f 在],[b a 上连续,0)()(,()0f b <或()0f a <,()0f b >.则根据连续函数的介值定理,在),(b a 内至少存在一点 ξ,使()0f ξ=. 下面的方法可以求出该根: (1) 令02 a b x +=,计算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 =;11 12 a b x +=. ……,有k a 、k b 以及相应的2 k k k a b x += . (3) 若()k f x ε≤ (ε为预先给定的精度要求),退出计算,输出结果2 k k k a b x +=; 反之,返回(1),重复(1),(2),(3). 以上方法可得到每次缩小一半的区间序列{[,]}k k a b ,在(,)k k a b 中含有方程的根. 当区间长k k b a -很小时,取其中点2 k k k a b x += 为根的近似值,显然有 1111111 ()()()2222 k k k k k k x b a b a b a ξ--+-≤-=??-==- 以上公式可用于估计对分次数k . 2. 迭代法 1) 迭代法的基本思想: 由方程()0f x =构造一个等价方程

用Matlab解代数方程

一般的代数方程 函数solve用于求解一般代数方程的根,假定S为符号表达式,命令solve (S)求解表达式等于0的根,也可以再输入一个参数指定未知数。例: syms a b c x S=a*x^2+b*x+c; solve(S) ans= [ 1/2/a*(-b+(b^2-4*a*c)^(1/2))] [ 1/2/a*(-b-(b^2-4*a*c)^(1/2))] b=solve(S,b) b = -(a*x^2+c)/x

线性方程组 线性方程组的求解问题可以表述为:给定两个矩阵A和B,求解满足方程AX=B或XA=B的矩阵X。方程AX=B的解用X=A\B或X=inv (A)*B表示;方程XA=B 的解用X=B/A或X=B*inv (A)表示。不过斜杠和反斜杠运算符计算更准确,占用内存更小,算得更快。

线性微分方程 函数dsolve用于线性常微分方程(组)的符号求解。在方程中用大写字母D表示一次微分,D2,D3分别表示二阶、三阶微分,符号D2y相当于y关于t的二阶导数。 函数dsolve的输出方式 格式说明 y=dsolve(‘Dyt=y0*y’) 一个方程,一个输出参数[u,v]=dsolve(‘Du=v’,’Dv=u’) 两个方程,两个输出 参数 S=dsolve(‘Df=g’,’Dg=h’,’Dh=-2*f ‘)方程组的解以S.f S.g S.h结构数组的形式输出

例1 求 2 1u dt du += 的通解. 解 输入命令:dsolve('Du=1+u^2','t') 结 果:u = tg(t-c) 例2 求微分方程的特解. ???íì===++15 )0(',0)0(029422 y y y dx dy dx y d 解输入命令: y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x') 结果为: y =3e -2x sin (5x )

MATLAB Jacobi法解线方程组

Jacobi 法解线性代数方程组 Jacobi 法解线性代数方程组算法: Step 1取初始点)0(x ,精度要求eps Step 2若ε>-∞+) ()1(k k x x 转到Step 3 否则转到Step 4 Step 3用下式计算:b D x U L D x k k 1)(1)1()(--+++=转到Step 2 Step 4停止计算()1(+k x 作为线性方程组的解) Step 5 )22(6 43211k k k k h y y n n ++++ =+ Jacobi 法解线性代数方程组程序: function Jacobi(A,b,x0,eps) %A----线性方程组系数矩阵 %b----线性方程组的解(列向量) %x0---初始迭代点 %D----A 对角阵 %e----取误差(计算范数) D=diag(diag(A)); D=inv(D);%D 取自己的逆矩阵 L=tril(A,-1);%取下三角阵 U=triu(A,1);%取上三角阵 B=-D*(L+U); f=D*b; e=1000; while e>=eps x=B*x0+f; e=norm(x-x0); x0=x; end x

例:用Jacobi 迭代法解下列线性方程组 ???? ??????=????????????????????-1166122111221321x x x 输入:A=[1 2 -2;1 1 1;2 2 1]; b=[6;6;11]; x0=[0;0;0]; eps=1e-3; Jacobi(A,b,x0,eps) 得到: x = 2 3 1 指导教师: 年 月 日

matlab求解代数方程组解析

第三讲 Matlab 求解代数方程组 理论介绍:直接法+迭代法,简单介绍相关知识和应用条件及注意事项 软件求解:各种求解程序 讨论如下表示含有n 个未知数、由n 个方程构成的线性方程组: 1111221121122222 1122n n n n n n nn n n a x a x a x b a x a x a x b a x a x a x b +++=??+++=??? ?+++=? (1) 一、直接法 1.高斯消元法: 高斯消元法的基本原理: 在(1)中设110,a ≠将第一行乘以1 11 ,k a a - 加到第(2,3,,),k k n = 得: (1)(1)(1)(1)11112211(2)(1)(2) 22112 (2)(2)(2)22n n n n n nn n n a x a x a x b a x a x b a x a x b ?+++=?++=??? ?++=? (2) 其中(1) (1)1111,.k k a a b b ==再设(2)22 0,a ≠将(2)式的第二行乘以(2)2 (2)22 ,(3,,)k a k n a -= 加到第k 行,如此进行下去最终得到: (1)(1)(1)(1)11112211(2)(1)(2) 22112(1)(1)(1) 1,111,1()() n n n n n n n n n n n n n n n n nn n n a x a x a x b a x a x b a x a x b a x b --------?+++=?++=? ? ??+=? ?=? (3) 从(3)式最后一个方程解出n x ,代入它上面的一个方程解出1n x -,并如此进行 下去,即可依次将121,,,,n n x x x x - 全部解出,这样在() 0(1,2,,)k kk a k n ≠= 的假设 下,由上而下的消元由下而上的回代,构成了方程组的高斯消元法. 高斯消元法的矩阵表示: 若记11(),(,,),(,,)T T ij n n n n A a x x x b b b ?=== ,则(1)式可表为.Ax b =于是高斯

matlab实验报告--求代数方程近似根1

数学实验报告 实验序号:第二次 日期:2012年5月10日班级0920861小组成员姓名徐易斌;王勇王康 学号 301233实验名称:求代数方程的近似根 问题背景描述: 求代数方程0)(=x f 的根是最常见的数学问题之一,当)(x f 是一次多项式时,称0)(=x f 为线性方程,否则称之为非线性方程. 当0)(=x f 是非线性方程时,由于)(x f 的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似根,则可以认为求根的计算问题已经解决,至少能满足实际要求. 本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间],[b a ,或给出某根的近似值0x .

实验目的: 1.了解代数方程求根求解的四种方法:对分法、迭代法、牛顿切线法 2.掌握对分法、迭代法、牛顿切线法求方程近似根的基本过程。 实验原理与数学模型: 1.对分法 对分法思想:将区域不断对分,判断根在某个分段内,再对该段对分,依此类推,直到满足精度为止.对分法适用于求有根区间内的单实根或奇重实根. 设)(x f 在],[b a 上连续,0)()(,()0f b <或()0f a <,()0f b >.则根据连续函数的介值定理,在),(b a 内至少存在一点ξ,使()0f ξ=. 下面的方法可以求出该根: (1)令02 a b x +=,计算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 =;1112 a b x += .……,有k a 、k b 以及相应的2k k k a b x +=.(3)若()k f x ε≤(ε为预先给定的精度要求),退出计算,输出结果2 k k k a b x += ;反之,返回(1),重复(1),(2),(3).以上方法可得到每次缩小一半的区间序列{[,]}k k a b ,在(,)k k a b 中含有方程的根. 当区间长k k b a -很小时,取其中点2k k k a b x += 为根的近似值,显然有1111111()()()2222 k k k k k k x b a b a b a ξ--+-≤-=??-==- 以上公式可用于估计对分次数k .2.迭代法 1)迭代法的基本思想:

线性代数方程组数值解法及MATLAB实现综述汇总

线性代数方程组数值解法及MATLAB 实现综述 廖淑芳 20122090 数计学院 12计算机科学与技术1班(职教本科) 一、分析课题 随着科学技术的发展,提出了大量复杂的数值计算问题,在建立电子计算机成为数值计算的主要工具以后,它以数字计算机求解数学问题的理论和方法为研究对象。其数值计算中线性代数方程的求解问题就广泛应用于各种工程技术方面。因此在各种数据处理中,线性代数方程组的求解是最常见的问题之一。关于线性代数方程组的数值解法一般分为两大类:直接法和迭代法。 直接法就是经过有限步算术运算,可求的线性方程组精确解的方法(若计算过程没有舍入误差),但实际犹如舍入误差的存在和影响,这种方法也只能求得近似解,这类方法是解低阶稠密矩阵方程组级某些大型稀疏矩阵方程组的有效方法。直接法包括高斯消元法,矩阵三角分解法、追赶法、平方根法。 迭代法就是利用某种极限过程去逐步逼近线性方程组精确解的方法。迭代法具有需要计算机的存储单元少,程序设计简单,原始系数矩阵在计算过程始终不变等优点,但存在收敛性级收敛速度问题。迭代法是解大型稀疏矩阵方程组(尤其是微分方程离散后得到的大型方程组)的重要方法。迭代法包括Jacobi 法SOR 法、SSOR 法等多种方法。 二、研究课题-线性代数方程组数值解法 一、 直接法 1、 Gauss 消元法 通过一系列的加减消元运算,也就是代数中的加减消去法,以使A 对角线以下的元素化为零,将方程组化为上三角矩阵;然后,再逐一回代求解出x 向量。 1.1消元过程 1. 高斯消元法(加减消元):首先将A 化为上三角阵,再回代求解。 1112112122 2212n n n n nn n a a a b a a a b a a a b ?? ? ? ? ??? (1)(1)(1) (1)111213 11(2)(2)(2)(2 ) 222322(3)(3)(3) 3333()()000000n n n n n nn n a a a a b a a a b a a b a b ?? ? ? ? ? ? ??? 步骤如下:

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命令窗中输入 clf ezplot x-x, grid on hold on ezplot('x^5+2*x^2+4',[-2*pi,2*pi]) 1-1 函数f(x)=x5+2x2+4的图形

相关文档
相关文档 最新文档