您好,欢迎访问三七文档
符号计算欧变玲oubianling@amss.ac.cn数值计算与符号计算间的最重要区别在于:数值计算一定存在截断误差,且在计算过程中不断传播,而产生累积误差;符号计算是在完全准确情况下进行的,不产生累积误差。符号计算的准确性以降低计算速度和增加内存需求为代价。借助符号数、符号表达式等的“任意精度符号数表达式”可把纯符号计算变为所谓的“变精度算法”。这既兼顾计算精度和速度,又使无法用“解析式”表达的计算结果以简洁的“任意精度符号数”表达。课程内容1.符号变量、符号表达式和符号方程的生成2.符号变量的基本操作3.符号表达式的操作4.符号矩阵及符号数组的生成和运算5.符号微积分6.符号积分变换7.符号代数方程的求解8.图示化符号函数计算器的使用方法本章重点符号表达式和符号矩阵的操作符号微积分符号线性方程符号微分方程2020/1/11第7章符号运算51.符号变量、符号表达式和符号方程的生成使用sym函数定义符号变量和符号表达式使用syms函数定义符号变量和符号表达式符号方程的生成定义符号数字和符号常数sym(‘Num’)sc=sym(‘Num’)备注:1、sym(‘Num’)创建一个符号数字Num,Num代表一个具体的数字,2、sc=sym(‘Num’)创建一个符号常数sc,该常数值准确等于Num【例1】sqrt(2)ans=1.4142a=sqrt(sym(2))a=2^(1/2)sym(2)/sym(5)ans=2/52/5+1/3ans=0.7333(1)使用sym函数定义符号变量和符号表达式sym(Num)%将双精度数字转换为符号数Sym(‘Num’)%将字符串数字转换为准确符号数【例2】a=sym('1/2+sqrt(2)')a=1/2+sqrt(2)b=sym(1/2+sqrt(2))b=8620851486211021*2^(-52)定义符号表达式sym(‘expression’)%定义符号表达式y=sym(‘expression’)%把符号表达式赋给变量y【例3】a=sym('a');b=sym('b');c=sym('c');x=sym('x');f=a*x^2+b*x+cf=a*x^2+b*x+c另一种表达方式:f=sym('a*x^2+b*x+c')f=a*x^2+b*x+c(2)使用syms函数定义符号变量和符号表达式【例4】symsabcxf=sym('a*x^2+b*x+c')f=a*x^2+b*x+cg=f^2+4*f-2g=(a*x^2+b*x+c)^2+4*a*x^2+4*b*x+4*c-2)syms和sym有什么区别?(3)使用sym函数生成符号方程【例5】equation1=sym('sin(x)+cos(x)=1')equation1=sin(x)+cos(x)=1表1sym和syms指令可作的限定性假设指令格式含义备注x=sym(‘x’)定义“复数”符号变量x复数域是默认设置的数域x=sym(‘x’,’real)定义“实数”符号变量xx=sym(‘x’,’positive’)定义“正数”符号变量xsymsxyz定义“复数”符号变量x,y,z复数域是默认设置的数域symsxyzreal定义“实数”符号变量x,y,zsymsxyzpositive定义“正数”符号变量x,y,z2.符号变量的基本操作寻找符号变量任意精确度的符号表达式数值型变量与符号型变量的转换形式(1)寻找符号变量findsym(expression)%找出符号表达式中的所有符号变量findsym(expression,n)%在符号表达式中找出n个与x接近的变量【例6】symsaalphabx1yfindsym(alpha+a+b)ans=a,alpha,bfindsym(cos(alpha)*b*x1+14*y,2)ans=x1,ysymvar(expression)%找出符号表达式中的所有符号变量symvar(expression,n)%在符号表达式中认定n个自由(符号)变量【例7】symsaalphabx1ysymvar(alpha+a+b)ans=[a,alpha,b]symvar(cos(alpha)*b*x1+14*y,10)ans=[y,b,a,alpha]symvar(cos(alpha)*b*x1+14*y)ans=[a,alpha,b,y]findsym与symvar函数的区别是什么?注意:检出符号变量的排列规则!(2)任意精确度的符号表达式控制符号数字或表达式数值精度的指令包括:digits显示当前环境下十进制符号数字的有效位数digits(n)把十进制符号数字有效位数设定为nxs=vpa(x)据表达式x得到digits指定精度下的符号数字xsXs=vpa(x,n)据表达式x得到n为有效数字的符号数字xs注意:1、vpa(x)的运算精度受它之前运行的digits(n)控制;2、Matlab对digits指令的默认精度设置时32位。3、vpa(x,n)仅在运行的当时起作用;digits(D)%设置数值的精度为D位D=digits%返回当前设定数值精度【例8】digitsDigits=32digits(50)%命令窗口没有任何反应%但是系统内部已将数值精度设定为50位d=digitsd=50【例9】使用vpa函数进行可控精度运算。r=vpa(pi)r=3.1415926535897932384626433832795vpa(hilb(2),10)ans=[1.0,0.5][0.5,0.3333333333]vpa(hilb(2),10)ans=[1.,.5000000000][.5000000000,.3333333333]Matlab2009a运行结果Matlab6.5运行结果(3)数值型变量与符号型变量的转换形式【例10】t=0.1;sym(t,'r')%有理数形式ans=1/10sym(t,'e')ans=1/10+eps/40%十进制近似表示有效数字位数sym(t,‘d’)ans=0.1000000000000000055511151231257827021181583404541%Matlab2009a显示结果sym(t,‘f’)%浮点数形式ans=(2^-4+2702159776422298*2^-56)%Matlab6.5显示结果sym(t,'f')%浮点数形式ans='1.999999999999a'*2^(-4)3.符号表达式(符号函数)的操作符号表达式的四则运算合并符号表达式的同类项符号多项式的因式分解符号表达式的简化subs函数用于替换求值反函数的运算复合函数的运算(1)符号表达式的四则运算【例11】symsxyabfun1=sin(x)+cos(y);fun2=a+b;fun1+fun2ans=sin(x)+cos(y)+a+bfun1*fun2ans=(sin(x)+cos(y))*(a+b)(2)合并符号表达式的同类项collect(S,v)%将符号矩阵S中所有同类型合并,并以v为符号变量输出collect(S)%使用findsym函数规定的默认变量代替上式中的v【例12】symsxycollect(x^2*y+y*x-x^2-2*x)ans=(y-1)*x^2+(y-2)*xcollect(x^2*y+y*x-x^2-2*x,x)ans=(y-1)*x^2+(y-2)*xcollect(x^2*y+y*x-x^2-2*x,y)ans=y*(x^2+x)-2*x-x^2(3)符号多项式的因式分解(horner)【例13】symsxfun1=2*x^3+2*x^2-32*x+40fun1=2*x^3+2*x^2-32*x+40horner(fun1)ans=40+(-32+(2+2*x)*x)*xfun2=x^3-6*x^2+11*x-6fun2=x^3-6*x^2+11*x-6horner(fun2)ans=-6+(11+(-6+x)*x)*x(4)符号表达式的简化(simplify)【例14】symsxfun1=(1/x+7/x^2+12/x+8)^(1/3)fun1=(13/x+7/x^2+8)^(1/3)sfy1=simplify(fun1)sfy1=((13*x+7+8*x^2)/x^2)^(1/3)sfy2=simplify(sfy1)sfy2=((13*x+7+8*x^2)/x^2)^(1/3)(5)subs函数用于替换求值【例15】symsxyf=x^2*y+5*x*sqrt(y)f=x^2*y+5*x*y^(1/2)subs(f,x,3)ans=9*y+15*y^(1/2)subs(f,y,3)ans=3*x^2+5*x*3^(1/2)(6)反函数的运算(finverse)【例16】symsxyf=x^2+yf=x^2+yfinverse(f,y)ans=-x^2+yg=x^2g=x^2finverse(g)Warning:finverse(x^2)isnotunique.Insym.finverseat46ans=x^(1/2)(7)复合函数的运算(compose)【例17】symsxyztuf=1/(1+x^2)g=sin(y)h=x^tp=exp(-y/u)compose(f,g)ans=1/(1+sin(y)^2)compose(f,g,t)ans=1/(1+sin(t)^2)4.符号矩阵的生成和运算符号矩阵的生成使用sym函数直接生成符号矩阵用生成子矩阵的方法生成符号矩阵由数值矩阵转换为符号矩阵符号矩阵及符号数组的运算符号矩阵和数组的四则运算矩阵和数组的逆运算矩阵和数组的幂运算符号矩阵的秩符号矩阵的逆和行列式运算(1)sym函数直接生成符号矩阵【例18】a1=sym('[1/32/35/7;9/1111/1313/17;17/1919/2323/29]')a1=[1/3,2/3,5/7][9/11,11/13,13/17][17/19,19/23,23/29]'[1/32/35/7;9/1111/1313/17;17/1919/2323/29]'ans=[1/32/35/7;9/1111/1313/17;17/1919/2323/29]注意:矩阵元素之间可以使用空格或逗号分隔,各符号表达式的长度可以不同,矩阵元素可以是任意的符号函数。(2)用生成子矩阵的方法生成符号矩阵【例19】a=['[100,cos(x)]';'[1/s,x]']a=[100,cos(x)][1/s,x]注意:a.不必调用sym函数,但同一列的元素长度要相同;b.当输入字符串长度不一致时,可在较短字符串前边或后边加空格补充。(3)由数值矩阵转换为符号矩阵【例20】矩阵元素为整数情况下,数值矩阵转换为符号矩阵M=[30111;6159;98254;3245620]M=301116159982543245620S=sym(M)S=[30,1,1,1][6,1,5,9][9,8,25,4][32,45,62,0]【例21】矩阵元素为分数或无理数时,数值矩阵转换为符号矩阵M1=[0.30.331/3;3.143.142pi;log(2)log(3)log(7);sin(1)cos(1)atan(1)]M1=0.30000.33000.33333.14003.14203.14160.69311.09861.94590.84150.54030.7854S1=sym(M1)S1=[3/10,33/100,1/3][157/50,1571/500,pi][62433
本文标题:ch04符号运算
链接地址:https://www.777doc.com/doc-2904674 .html