chap222精通matlab综合辅导与指南例程.docx
- 文档编号:7662585
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:19
- 大小:53.38KB
chap222精通matlab综合辅导与指南例程.docx
《chap222精通matlab综合辅导与指南例程.docx》由会员分享,可在线阅读,更多相关《chap222精通matlab综合辅导与指南例程.docx(19页珍藏版)》请在冰豆网上搜索。
chap222精通matlab综合辅导与指南例程
>>simple(ans)%onemoretime
convert(exp):
exp(i*x)
convert(tan):
(1-tan(1/2*x)^2)/(1+tan(1/2*x)^2)+2*i*tan(1/2*x)/(1+tan(1/2*x)^2)
ans=
exp(i*x)
22.7可变精度算术运算
因为数值的精度受每次操作所保留的数位的限制,所以数值的任何运算都会引入舍入误差,重复的多次数值运算会造成累积误差。
而对符号表达式的运算是非常准确的,因为它们不需要进行数值运算,所以无舍入误差。
对符号运算结果用函数eval或numeric,仅在结果转换时会引入舍入误差。
MATLAB对数的处理完全依靠计算机的浮点算术运算,显然在内存中进行运算,又快又好,只是浮点运算受到所支持字长的限制,每次操作会引入舍入误差,所以不能产生精确的结果。
MATLAB中各个算术运算的相对精度大约是16位。
相反,Maple的符号处理能力可以实现任何数位的运算。
当缺省的数位增加时,每次计算就需要附加时间和计算机内存。
Maple缺省为16位的精度。
函数digits返回全局Digits参数的当前值。
Maple缺省准确度可以由digits(n)来改变,其中n是所期望的准确度数位。
用这种方法增加准确度的副作用是,每个Maple函数随后进行的计算都以新的准确度为准,增加了计算时间。
结果的显示不会改变,只有所用的Maple函数的缺省准确度受到影响。
另外有一个函数,它可以任何精度实行单个计算,而使全局的Digits参数不变。
即:
可变精度的算术或函数vpa,它以缺省的精度或任何指定的精度对单个符号表达式进行计算,并以同样的精度来显示结果。
>>formatlong%let'sseealltheusualdigits
>>pi%howabout
tonumericaccuracy
ans=
3.14159265358979
>>digits%displaythedefault'Digits'value
Digits=16
>>vpa('pi')%howabout
to'Digits'value
ans=
3.141592653589793
>>digits(18)%changethedefaultto18digits
>>vpa('pi')%howabout
to'Digits'accuracy
ans=
3.14159265358979324
>>vpa('pi',20)%howabout
to20digits
ans=
3.1415926535897932385
>>vpa('pi',50)%howabout
to50digits
ans=
3.1415926535897932384626433832795028841971693993751
>>vpa('2^(1/3)',200)%thecuberootof2to200digits
ans=
1.2599210498948731647672106072782283505702514647015079800819751121552996765
139********39656243625509415431025603561566525939900240406137372284591103042
693552469606426166250009774745265654803068671854055
将函数vpa作用于符号矩阵,对它的每一个元素进行计算也同样达到所指定的位数。
>>A=sym('[1/4,log(sqrt
(2));exp
(1),3/7]')
A=
[1/4,log(sqrt
(2))]
[exp
(1),3/7)]
>>vpa(A,20)%evaluateto20digits
ans=
[.2500000000000000000,.34657359027997265471]
[2.7182818284590452354,.42857142857142857143]
22.8方程求解
用MATLAB所具有的符号工具可以求解符号方程。
有一些工具已经在前面介绍过,更多将在本节予以检验。
求解单个代数方程
我们在前面已经看到,MATLAB具有求解符号表达式的工具。
如果表达式不是一个方程式(不含等号),则在求解之前函数solve将表达式置成等于0。
>>solve('a*x^2+b*x+c')%solvefortherootsofthequadraticeqution
ans=
[1/2/a*(-b+(b^2-4*a*c)^1/2)]
[1/2/a*(-b-(b^2-4*a*c)^1/2)]
结果是符号向量,其元素是方程的2个解。
如果想对非缺省x变量求解,solve必须指定变量。
>>solve('a*x^2+b*x+c','b')%solveforb
ans=
-(a*x^2+c)/x
带有等号的符号方程也可以求解。
>>f=solve('cos(x)=sin(x)')%solveforx
f=
1/4*pi
>>t=solve('tan(2*x)=sin(x)')
t=
[0]
[acos(1/2+1/2*3^(1/2))]
[acos(1/2=1/2*3^(1/2))]
并得到数值解。
>>numeric(f)
ans=
0.7854
>>numeric(t)
ans=
0
0+0.8314i
1.9455
注意在求解周期函数方程时,有无穷多的解。
在这种情况下,solve对解的搜索范围限制在接近于零的有限范围,并返回非唯一的解的子集。
如果不能求得符号解,就计算可变精度解。
>>x=solve('exp(x)=tan(x)')
x=
1.306326940423079
代数方程组求解
可以同时求解若干代数方程,语句solve(s1,s2,.....,sn)对缺省变量求解n个方程,语句solve(s1,s2,...,sn,'v1,v2,...,vn')对n个'v1,v2,...vn'的未知数求解n个方程。
如何处理中小学典型的代数问题?
黛安娜(Diane)想去看电影,她从小猪存钱罐倒出硬币并清点,她发现:
10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。
1美分的硬币数比5美分、10美分以及25美分的硬币总数多10。
25美分和10美分的硬币总数等于1美分的硬币数加上1/4的5美分的硬币数
25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。
如果电影票价为3.00美元,爆米花为1.00美元,糖棒为50美分,她有足够的钱去买这三样东西?
首先,根据以上给出的信息列出一组线性方程,假如p,n,d和q分别表示1美分,5美分,10美分,和25美分的硬币数
然后,建立MATLAB符号方程并对变量求解。
>>eq1='d+(n+p)/2=q';
>>eq2='p=n+d+q-10';
>>eq3='q+d=p+n/4';
>>eq4='q+p=n+8*d-1';
>>[pennies,nickles,dimes,quarters]=solve(equ1,equ2,equ3,equ4,'p,n,d,q')
pennies=
16
nickles=
8
dimes=
3
quarters=
15
所以,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬币,这就意味着
>>money=.01*16+.05*8+.10*3+.25*15
money=
4.6100
她就有足够的钱去买电影票,爆米花和糖棒并剩余11美分。
单个微分方程
常微分方程有时很难求解,MATLAB提供了功能强大的工具,可以帮助求解微分方程。
函数dsovle计算常微分方程的符号解。
因为我们要求解微分方程,就需要用一种方法将微分包含在表达式中。
所以,dsovle句法与大多数其它函数有一些不同,用字母D来表示求微分,D2,D3等等表示重复求微分,并以此来设定方程。
任何D后所跟的字母为因变量。
方程
=0用符号表达式D2y=0来表示。
独立变量可以指定或由symvar规则选定为缺省。
例如,一阶方程dy/dx=1+y2的通解为:
>>dsolve('Dy=1+y^2')%findthegeneralsolution
ans=
-tan(-x+C1)
其中,C1是积分常数。
求解初值y(0)=1的同一个方程就可产生:
>>dsolve('Dy=1+y^2','y(0)=1')%addaninitialcondition
y=
tan(x+1/4*pi)
独立变量可用如下形式指定:
>>dsolve('Dy=1+y^2','y(0)=1','v')%findsolutiontody/dv
ans=
tan(v+1/4*pi)
让我们举一个二阶微分方程的例子,该方程有两个初始条件:
=cos(2x)-y
(0)=0y(0)=1
>>y=dsolve('D2y=cos(2*x)-y','Dy(0)=0','y(0)=1')
y=
-2/3*cos(x)^2+1/3+4/3*cos(x)
>>y=simple(y)%ylookslikeitcanbesimplified
y=
-1/3*cos(2*x)+4/3*cos(x)
通常,要求解的微分方程含有一阶以上的项,并以下述的形式表示:
-2
-3y=0
通解为:
>>y=solve('D2y-2Dy-3*y=0')
y=
C1*exp(-x)+C2*exp(3*x)
加上初始条件:
y(0)=0和y
(1)=1可得到:
>>y=solve('D2y-2Dy-3*y=0','y(0)=0,y
(1)=1')
y=
1/(exp(-1)-exp(3))*exp(-x)-1/(exp(-1)-exp(3))*exp(3*x)
>>y=simple(y)%thislookslikeacandidateforsimplification
y=
-(exp(-x)-exp(3*x))/(exp(3)-exp(-1))
>>pretty(y)%prettyitup
exp(-x)-exp(3x)
----------------------
exp(3)-exp(-1)
现在来绘制感兴趣的区域内的结果。
>>ezplot(y,[-62])
图22.3符号函数y=-(exp(-x)-exp(3*x))/(exp(3)-exp(-1))(-6≤x≤2)
微分方程组
函数dsolve也可同时处理若干个微分方程式,下面有两个线性一阶方程。
=3f+4g
=-4f+3g
通解为:
>>[f,g]=dsolve('Df=3*f+4*g','Dg=-4*f+3*g')
f=
C1*exp(3*x)*sin(4*x)+C2*exp(3*x)*cos(4*x)
g=
-C2*exp(3*x)*sin(4*x)+C1*exp(3*x)*cos(4*x)
加上初始条件:
f(0)=0和g(0)=1,我们可以得到:
>>[f,g]=dsolve('Df=3*f+4*g','Dg=-4*f+3*g','f(0)=0,g(0)=1')
f=
exp(3*x)*sin(4*x)
g=
exp(3*x)*cos(4*x)
22.9线性代数和矩阵
在本节中,我们将介绍符号矩阵和MATLAB提供的工具,它用线性代数求解问题。
符号矩阵
符号矩阵和向量是数组,其元素为符号表达式,可用函数sym来产生。
>>A=sym('[a,b,c;b,c,a;c,a,b]')
A=
[a,b,c]
[b,c,a]
[c,a,b]
>>G=sym('[cos(t),sin(t);-sin(t),cos(t)]')
G=
[cos(t),sin(t)]
[-sin(t),cos(t)]
函数sym也可以扩展成定义各元素的公式。
注意,只有在这种情况下,i,j分别表示行列的位置;且不影响i,j的缺省值(它代表
)。
下面的例子建立了3×3的矩阵,其元素依赖于行和列的位置。
>>S=sym(3,3,'(i+j)+(i-j+s)')%createamatrixusingaformula
S=
[2/s,3/(-1+s),4/(-2+s)]
[1/(1+s),4/s,s/(-1+s)]
[4/(2+s),5/(1+s),6/s]
>>S=sym(3,3,'m','n','(m-n)/(m-n-t)')%usemandninanotherformula
S=
[0,-1/(-1-t),-2/(-2-t)]
[1/(1-t),0,-1/(-1-t)]
[2/(2-t),1/(1-t),0]
函数sym也可以把数值矩阵转换成符号形式
>>M=[1.1,1.2,1.3;2.1,2.2,2.3;3.1,3.2,3.3]%anumericmatrix
M=
1.10001.20001.3000
2.10002.20002.3000
3.10003.20003.3000
>>S=sym(M)%converttosymbolicform
S=
[11/10,6/5,13/10]
[21/10,11/5,23/10]
[31/10,16/5,33/10]
如果数值矩阵的元素可以指定为小的整数之比,则函数sym将采用有理分式表示。
如果元素是无理数,则在符号形式中sym将用符号浮点数表示元素。
>>E=[exp
(1)sqrt
(2)]
E=
2.71831.4142
>>sym(E)
ans=
[3060513257434036*2^(-50),3184525836262886*2^(-51)]
用函数symsize可以得到符号矩阵的大小(行,列数)。
函数返回数值或向量,而不是符号表达式。
symsize的四种形式说明如下:
>>S=sym('[a,b,c;d,e,f]')%createasymbolicmatrix
S=
[a,b,c]
[d,e,f]
>>d=symsize(S)%returnthesizeofSasthe2-elementvectord
d=
23
>>[m,n]=symsize(S)%returnthenumberofrowsinm,andcolumninn
m=
2
n=
3
>>m=symsize(S,1)%returnthenumberofrows
m=
2
>>n=symsize(S,2)%returnthenumberofcolumns
n=
3
数值数组用N(m,n)形式来访问单个元素,但符号数组元素必须用函数如sym(S,m,n)来获取。
若能用相同的句法当然好,但MATLAB符号表达式的表示不方便。
在内部,符号数组表示成一个字符串数组;而S(m,n)返回单个字母。
所以,符号数组的各个元素,必须由符号函数,如sym,来指定,而不是直接指定。
>>G=sym('[ab,cd;ef,gh]')%createa2-by-2symbolicmatrix
G=
[ab,cd]
[ef,gh]
>>G(1,2)%thisisthesecondcharacterofthefirstrowofG
ans=
a
>>r=sym(G,1,2)%thisisthesecondexpressinoninthefirstrowofG
r=
cd
记住,在上例中的符号矩阵G,实际是以2×7字符数组存储在计算机中。
第一行为'[ab,cd]',所以第二个元素是'a'。
最后,sym可以用于改变符号数组的一个元素。
>>sym(G,2,2,'pq')%changethe(2,2)elementinGfrom'gh'to'pq'
ans=
[ab,cd]
[ef,pq]
代数运算
用函数symadd,symsub,symmul和symdiv,对符号矩阵可以执行许多通用的代数运算,用sympow可计算乘幂,用transpose计算符号矩阵的转置。
>>G=sym('[cos(t),sin(t0;-sin(t0,cos(t)]')%createasymbolicmatrix
G=
[cos(t),sin(t)]
[-sin(t),cos(t)]
>>symadd(G,'t')%add't'toeachelement
ans=
[cos(t)+t,sin(t)+t]
[-sin(t)+t,cos(t)+t]
>>symmul(G,G)%multiplyGbyG;Synpow(G,2)doesthesamething
ans=
[cos(t)^2-sint(t)^2,2*cos(t)*sin(t)]
[-2*cos(t)*sin(t),cos(t)^2-sin(t)^2]
>>simple(G)%trytosimplify
ans=
[cos(2*t),sin(2*t)]
[-sin(2*t),cos(2*t)]
下面通过证明G的转置是它的逆来证明G是正交阵。
>>I=symmul(G,transpose(G))%multiplyGbyitstranspose
I=
[cos(t)^2+sin(t)^2,0]
[0,cos(t)^2+sin(t)^2]
>>simplify(I)%thereappearstobeatrigidentityhere
ans=
[1,0]
[0,1]
正如所期望的那样,这是单位阵。
线性代数运算
用函数inverse和determ,可计算符号矩阵的逆阵以及行列式。
>>H=sym(hilb(3))%thesymbolicformofthenumeric3-by-3Hilbertmatrix
H=
[1,1/2,1/3]
[1/2,1/3,1/4]
[1/3,1/4,1/5]
>>determ(H)%dindthedeterminantofH
ans=
1/2160
>>J=inverse(H)%findtheinverseofH
J=
[9,-36,30]
[-36,192,-180]
[30,-180,180]
>>determ(J)%findthedeterminantoftheinverse
ans=
2160
用函数linsolve求解齐次线性方程;这是等价于基本的MATLAB的逆斜杠\算子的符号,linsolve(A,B)对X方阵求解矩阵方程A*X=B。
回到以前的硬币问题:
黛安娜想去看电影,她从小猪存钱罐倒出硬币并清点,她发现:
10美分的硬币数加上5美分的硬币总数的一半等于25美分的硬币数。
1美分的硬币数比5美分、10美分以及25美分的硬币总数多10。
25美分和10美分的硬币总数等于1美分的硬币数加上1/4的5美分的硬币数
25美分的硬币数和1美分的硬币数比5美分的硬币数加上8倍的10美分的硬币数多1。
。
象上次所做的那样,列出线性方程组,令p,n,d和q分别为1美分,5美分,10美分,和25美分的硬币数
重新以p,n,d,q的顺序排列表达式
p/2+n/2+d-q=0p-n-d-q=-10-p-n/4+d+q=0
p-n-8d+q=1
接下来,列出方程系数的符号数组。
>>A=sym('[1/2,1/2,1,-1;1,-1,-1,-1;-1,-1/4,1,1;1,-1,-8,1]')
A=
[1/2,1/2,1,-1]
[1,-1,-1,-1]
[-1,-1/4,1,1]
[1,-1,-8,1]
>>B=sym('[0;-10;0;-1]')%CreatethesymbolicvectorB
B=
[0]
[-10]
[0]
[-1]
>>X=linsolve(A,B)%solvethesymbolicsystemA'X=Bforx
x=
[16]
[8]
[3]
[15]
结果是相同的,黛安娜有16枚1美分的硬币,8枚5美分的硬币,3枚10美分的硬币,15枚25美分的硬币。
其他特性
symop将其参量串接起来,并计算所得到的表达式。
>>f='cos(x)'%createanexpression
f=
cos(x)
>>symop('atan(',f,'+',a,')','^2')
ans=
atan(cos(x)+a)^2
在用函数symop时,若将数组和标量混合应慎重。
例如:
>>M=sym('[ab;cd]')
M=
[a,b]
[c,d]
>>symop(M,'+','t')
ans=
[a+t,b]
[c,d+t]
是把t加到M的对角线上。
函数charpoly求解矩阵的特征多项式。
>>G=sym('[1,1/2;1/3,1/4]')%createasymbolicmatrix
G=
[1,1/2]
[1/3,1/4]
>>charpoly(G)%findthecharacteristicpolynomialofG
ans=
x'2-5/4*x+1/12
用函数eigensys可以求得符号矩阵的特征根和特征向量
>>F=sym('[1/2,1/4;1/4,1/2]')%createasymbolicmatrix
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chap222 精通 matlab 综合 辅导 指南 例程