MATLAB符号计算.docx

上传人:b****3 文档编号:10516023 上传时间:2023-05-26 格式:DOCX 页数:43 大小:238.76KB
下载 相关 举报
MATLAB符号计算.docx_第1页
第1页 / 共43页
MATLAB符号计算.docx_第2页
第2页 / 共43页
MATLAB符号计算.docx_第3页
第3页 / 共43页
MATLAB符号计算.docx_第4页
第4页 / 共43页
MATLAB符号计算.docx_第5页
第5页 / 共43页
MATLAB符号计算.docx_第6页
第6页 / 共43页
MATLAB符号计算.docx_第7页
第7页 / 共43页
MATLAB符号计算.docx_第8页
第8页 / 共43页
MATLAB符号计算.docx_第9页
第9页 / 共43页
MATLAB符号计算.docx_第10页
第10页 / 共43页
MATLAB符号计算.docx_第11页
第11页 / 共43页
MATLAB符号计算.docx_第12页
第12页 / 共43页
MATLAB符号计算.docx_第13页
第13页 / 共43页
MATLAB符号计算.docx_第14页
第14页 / 共43页
MATLAB符号计算.docx_第15页
第15页 / 共43页
MATLAB符号计算.docx_第16页
第16页 / 共43页
MATLAB符号计算.docx_第17页
第17页 / 共43页
MATLAB符号计算.docx_第18页
第18页 / 共43页
MATLAB符号计算.docx_第19页
第19页 / 共43页
MATLAB符号计算.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MATLAB符号计算.docx

《MATLAB符号计算.docx》由会员分享,可在线阅读,更多相关《MATLAB符号计算.docx(43页珍藏版)》请在冰点文库上搜索。

MATLAB符号计算.docx

MATLAB符号计算

第3章MATLAB符号计算

符号计算则是可以对未赋值的符号对象(可以是常数、变量、表达式)进行运算和处理。

MATLAB具有符号数学工具箱(SymbolicMathToolbox),将符号运算结合到MATLAB的数值运算环境。

符号数学工具箱是建立在Maple软件基础上的。

3.1符号表达式的建立

SymbolicMathToolbox2.1版规定在进行符号计算时,首先要定义基本的符号对象然后才能进行符号运算。

3.1.1创建符号常量

符号常量是不含变量的符号表达式,用sym命令来创建符号常量。

语法:

sym(‘常量’)%创建符号常量

例如,创建符号常量,这种方式是绝对准确的符号数值表示:

>>a=sym('sin

(2)')

a=

sin

(2)

sym命令也可以把数值转换成某种格式的符号常量。

语法:

sym(常量,参数)%把常量按某种格式转换为符号常量

说明:

参数可以选择为’d’、’f’、’e’或’r’四种格式,也可省略,其作用如表3.1所示。

表3.1参数设置

参数

作用

d

返回最接近的十进制数值(默认位数为32位)

f

返回该符号值最接近的浮点表示

r

返回该符号值最接近的有理数型(为系统默认方式),可表示为p/q、p*q、10^q、pi/q、2^q和sqrt(p)形式之一

e

返回最接近的带有机器浮点误差的有理值

例如,创建符号常量,这种方式是绝对准确的符号数值表示:

a=sym('sin

(2)')

a=

sin

(2)

例如,把常量转换为符号常量,按系统默认格式转换:

a=sym(sin

(2))

a=

8190223105242182*2^(-53)

【例3.1】创建数值常量和符号常量。

a1=2*sqrt(5)+pi%创建数值常量

a1=

7.6137

a2=sym('2*sqrt(5)+pi')%创建符号表达式

a2=

2*sqrt(5)+pi

a3=sym(2*sqrt(5)+pi)%按最接近的有理数型表示符号常量

a3=

8572296331135796*2^(-50)

a4=sym(2*sqrt(5)+pi,'d')%按最接近的十进制浮点数表示符号常量

a4=

7.6137286085893727261009189533070

a31=a3-a1%数值常量和符号常量的计算

a31=

0

a5='2*sqrt(5)+pi'%字符串常量

a5=

2*sqrt(5)+pi

可以通过查看工作空间来查看各变量的数据类型和存储空间,工作空间如图3.1所示。

3.1.2创建符号变量和表达式

创建符号变量和符号表达式可以使用sym和syms命令。

1.使用sym命令创建符号变量和表达式

语法:

sym(‘变量’,参数)%把变量定义为符号对象

说明:

参数用来设置限定符号变量的数学特性,可以选择为’positive’、’real’和’unreal’,’positive’表示为“正、实”符号变量,’real’表示为“实”符号变量,’unreal’表示为“非实”符号变量。

如果不限定则参数可省略。

【例3.2】创建符号变量,用参数设置其特性。

symsxyreal%创建实数符号变量

z=x+i*y;%创建z为复数符号变量

real(z)%复数z的实部是实数x

ans=

x

sym('x','unreal');%清除符号变量的实数特性

real(z)%复数z的实部

ans=

1/2*x+1/2*conj(x)

程序分析:

设置x、y为实数型变量,可以确定z的实部和虚部。

语法:

sym(‘表达式’)%创建符号表达式

【例3.2续】创建符号表达式。

f1=sym('a*x^2+b*x+c')

f1=

a*x^2+b*x+c

2.使用syms命令创建符号变量和符号表达式

语法:

syms(‘arg1’,‘arg2’,…,参数)%把字符变量定义为符号变量

symsarg1arg2…,参数 %把字符变量定义为符号变量的简洁形式

说明:

syms用来创建多个符号变量,这两种方式创建的符号对象是相同的。

参数设置和前面的sym命令相同,省略时符号表达式直接由各符号变量组成。

【例3.2续】使用syms命令创建符号变量和符号表达式。

symsabcx%创建多个符号变量

f2=a*x^2+b*x+c%创建符号表达式

f2=

a*x^2+b*x+c

syms('a','b','c','x')

f3=a*x^2+b*x+c;%创建符号表达式

程序分析:

既创建了符号变量a、b、c、x,又创建了符号表达式,f2、f3和f1符号表达式相同。

3.1.3符号矩阵

用sym和syms命令也可以创建符号矩阵。

A=sym('[a,b;c,d]')

A=

[a,b]

[c,d]

例如,使用syms命令创建相同的符号矩阵:

symsabcd

A=[ab;cd]

A=

[a,b]

[c,d]

【例3.3】比较符号矩阵与字符串矩阵的不同。

A=sym('[a,b;c,d]')%创建符号矩阵

A=

[a,b]

[c,d]

B='[a,b;c,d]'%创建字符串矩阵

B=

[a,b;c,d]

C=[a,b;c,d]%创建数值矩阵

?

?

?

Undefinedfunctionorvariable'a'.

程序分析:

由于数值变量a、b、c、d未事先赋值,MATLAB给出错误信息。

C=sym(B)%转换为符号矩阵

C=

[a,b]

[c,d]

whos

NameSizeBytesClass

A2x2312symobject

B1x918chararray

C2x2312symobject

Grandtotalis25elementsusing642bytes

程序分析:

查看符号矩阵A,可以看到为2×2的符号矩阵,占用较多的字节。

3.2符号表达式的代数运算

符号运算与数值运算的区别主要有以下几点:

▪传统的数值型运算因为要受到计算机所保留的有效位数的限制,它的内部表示法总是采用计算机硬件提供的8位浮点表示法,因此每一次运算都会有一定的截断误差,重复的多次数值运算就可能会造成很大的累积误差。

符号运算不需要进行数值运算,不会出现截断误差,因此符号运算是非常准确的。

▪符号运算可以得出完全的封闭解或任意精度的数值解。

▪符号运算的时间较长,而数值型运算速度快。

3.2.1符号表达式的代数运算

符号表达式的运算符和基本函数都与数值计算中的几乎完全相同。

1.符号运算中的运算符

(1)基本运算符

▪运算符“+”,“-”,“*”,“\”,“/”,“^”分别实现符号矩阵的加、减、乘、左除、右除、求幂运算。

▪运算符“.*”,“./”,“.\”,“.^”分别实现符号数组的乘、除、求幂,即数组间元素与元素的运算。

▪运算符“′”,“.′”分别实现符号矩阵的共轭转置、非共轭转置。

(2)关系运算符

▪在符号对象的比较中,没有“大于”、“大于等于”、“小于”、“小于等于”的概念,而只有是否“等于”的概念。

▪运算符“==”、“~=”分别对运算符两边的符号对象进行“相等”、“不等”的比较。

当为“真”时,比较结果用1表示;当为“假”时,比较结果则用0表示。

2.函数运算

(1)三角函数和双曲函数

三角函数包括sin、cos、tan;双曲函数包括sinh、cosh、tanh;三角反函数除了atan2函数仅能用于数值计算外,其余的asin、acos、atan函数在符号运算中与数值计算的使用方法相同。

(2)指数和对数函数

指数函数sqrt、exp、expm的使用方法与数值计算的完全相同;对数函数在符号计算中只有自然对数log(表示ln),而没有数值计算中的log2和log10。

(3)复数函数

复数的共轭conj、求实部real、求虚部imag和求模abs函数与数值计算中的使用方法相同。

但注意,在符号计算中,MATLAB没有提供求相角的命令。

(4)矩阵代数命令

MATLAB提供的常用矩阵代数命令有diag,triu,tril,inv,det,rank,poly,expm,eig等,它们的用法几乎与数值计算中的情况完全一样。

【例3.4】求矩阵

的行列式值、非共轭转置和特征值。

symsa11a12a21a22

A=[a11a12;a21a22]%创建符号矩阵

A=

[a11,a12]

[a21,a22]

det(A)%计算行列式

ans=

a11*a22-a12*a21

A.'%计算非共轭转置

ans=

[a11,a21]

[a12,a22]

eig(A)%计算特征值

ans=

[1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]

[1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]

【例3.5】符号表达式f=2x2+3x+4与g=5x+6的代数运算。

f=sym('2*x^2+3*x+4')

f=

2*x^2+3*x+4

g=sym('5*x+6')

g=

5*x+6

f+g%符号表达式相加

ans=

2*x^2+8*x+10

f*g%符号表达式相乘

ans=

(2*x^2+3*x+4)*(5*x+6)

3.2.2符号数值任意精度控制和运算

1.SymbolicMathToolbox中的算术运算方式

在SymbolicMathToolbox中有三种不同的算术运算:

▪数值型:

MATLAB的浮点运算。

▪有理数型:

Maple的精确符号运算。

▪VPA型:

Maple的任意精度运算。

2.任意精度控制

任意精度的VPA型运算可以使用digits和vpa命令来实现。

语法:

digits(n)%设定默认的精度

说明:

n为所期望的有效位数。

digits函数可以改变默认的有效位数来改变精度,随后的每个进行Maple函数的计算都以新精度为准。

当有效位数增加时,计算时间和占用的内存也增加。

命令“digits”用来显示默认的有效位数,默认为32位。

语法:

S=vpa(s,n)%将s表示为n位有效位数的符号对象

说明:

s可以是数值对象或符号对象,但计算的结果S一定是符号对象;当参数n省略时则以给定的digits指定精度。

vpa命令只对指定的符号对象s按新精度进行计算,并以同样的精度显示计算结果,但并不改变全局的digits参数。

【例3.6】对表达式

进行任意精度控制的比较。

a=sym('2*sqrt(5)+pi')

a=

2*sqrt(5)+pi

digits%显示默认的有效位数

Digits=32

vpa(a)%用默认的位数计算并显示

ans=

7.6137286085893726312809907207421

vpa(a,20)%按指定的精度计算并显示

ans=

7.6137286085893726313

digits(15)%改变默认的有效位数

vpa(a)%按digits指定的精度计算并显示

ans=

7.61372860858937

3.SymbolicMathToolbox中的三种运算方式的比较

【例3.6续】用三种运算方式表达式比较2/3的结果。

a1=2/3%数值型

a1=

0.6667

a2=sym(2/3)%有理数型

a2=

2/3

a3=vpa('2/3',32)%VPA型

a3=

.66666666666666666666666666666667

程序分析:

▪三种运算方式中数值型运算的速度最快。

▪有理数型符号运算的计算时间和占用内存是最大的,产生的结果是非常准确的。

▪VPA型的任意精度符号运算比较灵活,可以设置任意有效精度,当保留的有效位数增加时,每次运算的时间和使用的内存也会增加。

▪数值型变量a1结果显示的有效位数并不是存储的有效位数,在第一章中介绍显示的有效位数由“format”命令控制。

如下面修改“format”命令就改变了显示的有效位数:

formatlong

a1

a1=

0.66666666666667

3.2.3符号对象与数值对象的转换

1.将数值对象转换为符号对象

sym命令可以把数值型对象转换成有理数型符号对象,vpa命令可以将数值型对象转换为任意精度的VPA型符号对象。

2.将符号对象转换为数值对象

使用double、numeric函数可以将有理数型和VPA型符号对象转换成数值对象。

语法:

N=double(S)%将符号变量S转换为数值变量N

N=numeric(S)%将符号变量S转换为数值变量N

【例3.7】将符号变量

与数值变量进行转换。

clear

a1=sym('2*sqrt(5)+pi')

a1=

2*sqrt(5)+pi

b1=double(a1)%转换为数值变量

b1=

7.6137

a2=vpa(sym('2*sqrt(5)+pi'),32)

a2=

7.6137286085893726312809907207421

b2=numeric(a2)%转换为数值变量

b2=

7.6137

【例3.7续】由符号变量得出数值结果。

b3=eval(a1)

b3=

7.6137

用“whos”命令查看变量的类型,可以看到b1、b2、b3都转换为双精度型:

whos

NameSizeBytesClass

a11x1148symobject

a21x1190symobject

b11x18doublearray

b21x18doublearray

b31x18doublearray

Grandtotalis50elementsusing362bytes

3.3符号表达式的操作和转换

3.3.1符号表达式中自由变量的确定

1.自由变量的确定原则

,MATLAB将基于以下原则选择一个自由变量:

▪小写字母i和j不能作为自由变量。

▪符号表达式中如果有多个字符变量,则按照以下顺序选择自由变量:

首先选择x作为自由变量;如果没有x,则选择在字母顺序中最接近x的字符变量;如果与x相同距离,则在x后面的优先。

▪大写字母比所有的小写字母都靠后。

2.findsym函数

如果不确定符号表达式中的自由符号变量,可以用findsym函数来自动确定。

语法:

findsym(EXPR,n)%确定自由符号变量

说明:

EXPR可以是符号表达式或符号矩阵;n为按顺序得出符号变量的个数,当n省略时,则不按顺序得出EXPR中所有的符号变量。

【例3.8】得出符号表达式中的符号变量。

f=sym('a*x^2+b*x+c')

f=

a*x^2+b*x+c

findsym(f)%得出所有的符号变量

ans=

a,b,c,x

g=sym('sin(z)+cos(v)')

g=

sin(z)+cos(v)

findsym(g,1)%得出第一个符号变量

ans=

z

程序说明:

符号变量z和v距离x相同,以在x后面的z为自由符号变量。

3.3.2符号表达式的化简

同一个数学函数的符号表达式的可以表示成三种形式,例如以下的f(x)就可以分别表示为:

▪多项式形式的表达方式:

f(x)=x3+6x2+11x-6

▪因式形式的表达方式:

f(x)=(x-1)(x-2)(x-3)

▪嵌套形式的表达方式:

f(x)=x(x(x-6)+11)-6

【例3.9】三种形式的符号表达式的表示。

f=sym('x^3-6*x^2+11*x-6')%多项式形式

f=

x^3-6*x^2+11*x-6

g=sym('(x-1)*(x-2)*(x-3)')%因式形式

g=

(x-1)*(x-2)*(x-3)

h=sym('x*(x*(x-6)+11)-6')%嵌套形式

h=

x*(x*(x-6)+11)-6

1.pretty函数

【例3.9续】给出相应的符号表达式形式。

pretty(f)

32

x-6x+11x-6

2.collect函数

【例3.9续】给出相应的符号表达式形式。

collect(g)

ans=

x^3-6*x^2+11*x-6

当有多个符号变量,可以指定按某个符号变量来合并同类项。

下面有x、y符号变量的表达式:

f1=sym('x^3+2*x^2*y+4*x*y+6')

f1=

x^3+2*x^2*y+4*x*y+6

collect(f1,'y')%按y来合并同类项

ans=

(2*x^2+4*x)*y+x^3+6

3.expand函数

【例3.9续】给出相应的符号表达式形式。

expand(g)

ans=

x^3-6*x^2+11*x-6

4.horner函数

【例3.9续】给出符号表达式的嵌套形式。

horner(f)

ans=

x*(x*(x-6)+11)-6

5.factor函数

【例3.9续】给出符号表达式的因式形式。

factor(f)

ans=

(x-1)*(x-2)*(x-3)

6.simplify函数

【例3.9续】利用三角函数来简化符号表达式cos2x-sin2x。

y=sym('cos(x)^2-sin(x)^2')

y=

cos(x)^2-sin(x)^2

simplify(y)

ans=

2*cos(x)^2-1

7.simple函数

simple函数给出多种简化形式,给出除了pretty、collect、expand、factor、simplify简化形式之外的radsimp、combine、combine(trig)、convert形式,并寻求包含最少数目字符的表达式简化形式。

【例3.9续】利用simple简化符号表达式cos2x-sin2x。

simple(y)

simplify:

2*cos(x)^2-1

radsimp:

cos(x)^2-sin(x)^2

combine(trig):

cos(2*x)

factor:

(cos(x)-sin(x))*(cos(x)+sin(x))

expand:

cos(x)^2-sin(x)^2

combine:

cos(2*x)

convert(exp):

(1/2*exp(i*x)+1/2/exp(i*x))^2+1/4*(exp(i*x)-1/exp(i*x))^2

convert(sincos):

cos(x)^2-sin(x)^2

convert(tan):

(1-tan(1/2*x)^2)^2/(1+tan(1/2*x)^2)^2-4*tan(1/2*x)^2/(1+tan(1/2*x)^2)^2

collect(x):

cos(x)^2-sin(x)^2

ans=

cos(2*x)

程序分析:

得出最简化的符号表达式为“cos(2*x)”。

3.3.3符号表达式的替换

1.subexpr函数

语法:

subexpr(s,s1)%用符号变量s1来置换s中的子表达式

subexpr函数对子表达式是自动寻找的,只有比较长的子表达式才被置换,比较短的子表达式,即使重复出现多次,也不被置换。

【例3.10】用subexpr函数使

的特征值表达式简洁。

symsabcdx

s=eig([ab;cd])%计算特征值

s=

[1/2*a+1/2*d+1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]

[1/2*a+1/2*d-1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]

subexpr(s,x)%用x替换子表达式

ans=

[1/2*a+1/2*d+1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]

[1/2*a+1/2*d-1/2*(a^2-2*a*d+d^2+4*b*c)^(1/2)]

2.subs函数

subs函数可用来进行对符号表达式中符号变量的替换。

语法:

subs(s)%用给定值替换符号表达式s中的所有变量

subs(s,new)%用new替换符号表达式s中的自由变量

subs(s,old,new)%用new替换符号表达式s中的old变量

【例3.10续】用subs函数对符号表达式(x+y)2+3(x+y)+5进行替换。

f=sym('(x+y)^2+3*(x+y)+5')%创建符号表达式

f=

(x+y)^2+3*(x+y)+5

x=5;

f1=subs(f)%用工作空间的给定值替换x

f1=

(5+y)^2+20+3*y

f2=subs(f,'x+y','s')%用s替换x+y

f2=

((s))^2+3*((s))+5

f3=subs(f,'x+y',5)%用常数5替换x+y

f3=

45

f4=subs(f,'x','z')%用z替换x

f4=

((z)+y)^2+3*((z)+y)+5

3.3.4求反函数和复合函数

在MATLAB中finverse函数可以求得符号函数的反函数。

语法:

finverse(f,v)%对指定自变量v的函数f(v)求反函数

说明:

当v省略,则对默认的自由符号变量求反函数。

1.求反函数

【例3

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2