matlab第5章 符号计算
目录:
一、符号计算介绍
二、建立符号表达式
三、符号表达式的代数运算
四、符号表达式的计算
五、符号表达式的操作
六、求符号极限
七、求符号微积分
八、符号级数求和
九、符号方程(组)求解
一、符号计算介绍
1、概念
-
符号对象:一种数据结构,用于存储由各种基本符号及其运算式组成的字符串
–基本符号:各种常量与变量
–运算式:可用各种运算符、常用函数等 -
符号类:所有符号对象的集合
2、符号计算 vs. 数值计算
符号计算:
- 精确: 可以精确到小数点后任意多个位
- 中间计算可以不给变量赋值: 自由变量 ,类似于代数x-x=0
- 解方程:解析解/任意精度的数值解
- 运算时间长
- 调用maple软件实现
举例
>> a=sym('x-x')
a =
x-x
>> double(a)
ans =0
sym: 定义符号对象
double: 用double类型计算符号对象的值
数值计算
- 实数最多精确到小数点后15位
- 每步计算变量必须先给值: x无值不能算x-x
- 解方程:有限精度的数值解
- 运算速度快
举例
>> y=x-x
??? Undefined function or variable 'x'.
>> x=5 % 赋值
x =5
>> y=x-x
y =0
3、符号计算常用于:
微积分、线性代数、表达式化简、方程求根、可变精度数值计算、积分变换、符号定义、符号到数值转换、算术与代数运算、逻辑运算、三角函数、特殊函数、简易绘图、字符串处理、访问maple功能、简单示例等…….
二、建立符号表达式
sym+字符串
- 变量=sym(‘符号对象字符串’);
- 变量=sym(‘自由变量’, ‘real’);
- 变量=sym(‘自由变量’, ‘unreal’);
- 变量=sym(‘自由变量’, ‘positive’);
- 定义符号对象或自由变量
– 符号对象里可含自由变量
>> x=sym('x','real');
>> z=sym('x+y');
sym+数值表达式
- 变量=sym(数值表达式);
- 变量=sym(数值表达式, ‘d’);
- 变量=sym(数值表达式, ‘f’);
- 变量=sym(数值表达式, ‘e’);
- 变量=sym(数值表达式, ‘r’);
基于数值定义符号表达式 (标量/向量/矩阵)
- d:十进制(默认32位小数)
- f:'1.F’2^(e)或’-1.F’ 2^(e):F/e为16/10进制
- e:有理数+误差
- r:默认有理数:p/q、p*q、10^q、pi/q、 2^q 和 sqrt (p):p、q为整数
>> x=sym(1/10,'d') % 先计算,再放符号变量x = % 少用,除非数据多或本来就精确!.10000000000000000555111512312578
>> x=sym(1/10,'f')
x =
'1.999999999999a'*2^(-4)
>> x=sym(sqrt(2),'r')x =sqrt(2)
>> x=sym(sqrt(2),'e')x =sqrt(2)+64*eps/147
精确度:符号计算 vs. 数值计算
>> x=3*sqrt(5)+pi;
>> fprintf('%.19f\n',x);
9.8497965860891625000
>> y=sym('3*sqrt(5)+pi');
>> vpa(y,19)
ans =9.849796586089162326
>> disp(class(x))
double
>> disp(class(y))
sym
>> whos
Name Size Bytes Class
x 1x1 8 double array
y 1x1 148 sym object
Grand total is 14 elements using 156 bytes
13=(串长度)12+1
syms的好处
-可明确定义自由变量的参数
-用自由变量定义表达式无需再用字符串
-自由变量可反复使用
>> syms x y real
>> z=x+i*y
z =
x+i*y
>> ff=sym('sin(x)+cos(x)');
>> ff=sin(x)+cos(x);
>> syms a b c d
>> A=[a b;c d]
A =
[ a, b]
[ c, d]
四、符号表达式的计算
三种计算方式
1、数值型:浮点运算(matlab)
double:速度快,精度15
2、有理数型:精确符号运算(maple)
没有误差!占用内存大,运算时间长
3、vpa型:任意精度运算(maple)
可以任意指定精确有效数字的个数
可灵活掌握。当有效数字增加时,消耗也增大:试试计算pi到10000/1000000位
vpa(A,n):任意精度运算(maple)
- R = vpa(A,n)
– 计算符号表达式A的值,保留n位精确的有效数字
– A:经过化简,没有多余的自由变量。且给每个自由变量已经赋值了 - R= vpa(A)
– 按默认精度计算A的值
–改变默认精度可用digits函数/命令
–digits(n):设置默认精度为n。n默认=32
–digits:获取默认精度
>> a=sym('3*sqrt(5)+pi')
a =
3*sqrt(5)+pi
>> vpa(a) %默认精度计算
ans =
9.8497965860891623276901643894734>> digits(10) % 改默认精度
>> vpa(a) %默认精度计算
ans =
9.849796585
>> vpa(a,40) % 指定精度
ans =
9.849796586089162327690164389473331590520
五、符号表达式的操作
find:查找自由变量
-
find(符号表达式)
-
功能:查找符号表达式中的(自由)变量
-
find(符号表达式, n)
-
功能:查找符号表达式中前n个自变量
—若把符号表达式理解为一个函数的话,通常把x或与x相近(字典序,后优先,小写优先,不用i/j)的自由变量当做自变量,其它的当做系数变量
—如:ax^2+bx+c中x是自变量,a,b,c是系数
>> f=sym('a*x^2+b*x+c');
>> findsym(f) % 按字典序列出所有变量名
ans =
a, b, c, x>> findsym(f,1)
ans = x
>> findsym(f,2)
ans = x,c
numden:提取分子与分母
-
[分子, 分母]= numden(符号表达式)
–功能:将符号表达式的每项转换成有理形式,进行通分,返回通分后的分子与分母。
>> syms x
>> [n,d]=numden(1/(x^2+3*x+1))
n = 1
d = x^2+3*x+1
>> [n,d]=numden(1/x^2+2*x+2)
n = 1+2*x^3+2*x^2
d = x^2
符号表达式的化简
化简成三种范式:
- 多项式:f(x)=x3+6x2+11x-6
- 因式分解:f(x)=(x-1)(x-2)(x-3)
- 多重嵌套:f(x)=x(x(x-6)+11)-6
collect:合并同类项
- 合并同类项后,得到范式1:多项式
- 变量=collect(符号表达式)
– 功能:将符号表达式按默认自变量合并成多项式范式 - 变量=collect(符号表达式, 自由变量)
– 用指定变量作自变量合并同类项
>> syms x
>> f=x^3-6*x^2+11*x-6;
>> g=(x-1)*(x-2)*(x-3);
>> h=x*(x*(x-6)+11)-6;>> collect(g)
ans = x^3-6*x^2+11*x-6
>> collect(h)
ans = x^3-6*x^2+11*x-6>> 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)
ans = x^3+2*x^2*y+4*x*y+6
>> collect(f1,'y')
ans = (2*x^2+4*x)*y+x^3+6
factor:因式分解
- 符号变量=factor(符号表达式)
- 功能:对符号表达式进行因式分解:得到范式2
>> syms x
>> f=x^3-6*x^2+11*x-6;
>> factor(f)ans = (x-1)*(x-2)*(x-3)%有未知数:因式分解
- 向量=factor(整数)
- 功能:对整数进行因子分解,返回所有质因子
>> factor(123456)
ans = 2 2 2 2 2 2 3 643
>> 2*2*2*2*2*2*3*643
ans = 123456
%整数:无未知数:因子分解
horner:嵌套化
- 符号变量= horner(符号表达式)
- 功能:对符号表达式进行嵌套化:得到范式3
>> horner(f)
ans =
x*(x*(x-6)+11)-6
>> horner(g)
ans =
(x-1)*(x-2)*(x-3)
expand:展开
- 符号变量= expand(符号表达式)
- 功能:对符号表达式进行展开:多个乘积之和
>> syms x y a b t
>> expand(sin(x+y))
ans = sin(x)*cos(y)+cos(x)*sin(y)>> expand([sin(2*t), cos(2*t)])
ans = [ 2*sin(t)*cos(t), 2*cos(t)^2-1]
>> expand(exp((a+b)^3))
ans =
exp(a^3)*exp(a^2*b)^3*exp(a*b^2)^3*exp(b^3)
多项式:符号/向量表示的转换:sym2poly 、 poly2sym
-
向量=sym2poly(符号多项式)
– 符号多项式 => 向量多项式 -
符号变量=poly2sym(多项式向量)
– 向量多项式 => 符号多项式
>> syms x
>> p=sym2poly(x^3-6*x^2+11*x-6)
p = 1 -6 11 -6
>> poly2sym(p)
ans = x^3-6*x^2+11*x-6
- 符号变量=poly2sym(多项式向量, 符号变量)
– 向量多项式 => 符号多项式,使用指定的自变量
>> syms x y
>>p=sym2poly(x^3-6*x^2+11*x-6)
p = 1 -6 11 -6
>> poly2sym(p,y)
ans =y^3-6*y^2+11*y-6
六、求符号极限 limit
一元函数极限
>> syms x
>> f=sin(x)/x;
>> limit(f)
ans = 1
>> limit(f, x, 0)
ans = 1
>> limit(f, x, 0, 'left')
ans = 1
>> limit(f, x, 0, 'right')
ans = 1
>> syms a x
>> limit((1+a/x)^x, x, inf)
ans =exp(a)
>> limit(x*cos(1/x)+1, x, 0, 'right')
ans =1
- 求sin(x)的导数
>> syms x t
>> limit((sin(x+t)-sin(x))/t, t, 0)
ans =
cos(x)
多元函数的极限
- 假设以上极限存在,则可以先求x的极限,再求y的极限。反之亦可
- limit(limit(f, x, x0 ), y, y0)
- limit(limit(f, y, y0 ), x, x0)
>> syms x y a
>> f=exp(-1/(x^2+y^2))*(sin(x))^2/x^2*(1+1/y^2)^(x+a^2*y^2)
f = exp(-1/(x^2+y^2))* sin(x)^2/x^2*(1+1/y^2)^(x+a^2*y^2)
>> limit(limit(f, x, 1/sqrt(y)), y, inf)
ans = exp(a^2)
七、求符号微积分
diff:求符号微分
- diff(f) %求f对默认自变量的一阶微分
- diff(f,t) %求f对符号变量t的一阶微分
- diff(f,n) %求f对默认自变量的n阶微分
- diff(f,t,n) %求f对符号变量t的n阶微分
>> syms x a b c t
>> f=a*x^2+b*x+c;
>> diff(f)
ans =
2*a*x+b
>> limit((a*(x+t)^2+b*(x+t)+c-a*x^2-b*x-c)/t,t,0)
ans =
2*a*x+b>> diff(f, 2) % 对默认自变量x求二阶微分
ans = 2*a
>> diff(f, 3) % 对默认自变量x求三阶微分
ans = 0
>> diff(f, 'a') % 对指定变量a求一阶微分
ans = x^2
>> diff(f, 'a', 2) %对指定变量a求二阶微分ans = 0
对矩阵求微分
>> syms x t
>> A=[2*x t^2;t*cos(x) exp(x)]
A =
[ 2*x, t^2]
[ t*cos(x), exp(x)]
>> diff(A) % 对x求一阶微分
ans =
[ 2, 0]
[ -t*sin(x), exp(x)]
>> diff(A,2) % 对x求二阶微分
ans =
[ 0, 0]
[ -t*cos(x), exp(x)]
>> diff(A,t) % 对t求一阶微分
ans =
[ 0, 2*t]
[ cos(x), 0]
- diff(diff(f,x,m),y,n)
- 先对x求m阶微分, 再对y求n阶微分
- diff(diff(f,y,n),x,m)
- 先对y求n阶微分, 再对x求m阶微分
>> syms x y
>> f=(x^2-2*x)*exp(-x^2-y^2-x*y);
>> fx=diff(f,x)
fx = (2*x-2)*exp(-x^2-y^2-x*y)+(x^2-2*x)*(-2*x-y)*exp(-x^2-y^2-x*y)
>> fy=diff(f,y)
fy = (x^2-2*x)*(-2*y-x)*exp(-x^2-y^2-x*y)
>> fxy=diff(diff(f,x),y)
fxy = (2*x-2)*(-2*y-x)*exp(-x^2-y^2-x*y)-(x^2-2*x)*exp(-x^2-y^2-x*y)+(x^2-2*x)*(-2*x-y)*(-2*y-x)*exp(-x^2-y^2-x*y)
int:求符号积分
-
int(f)
% 求默认自变量的不定积分 -
int(f,a,b)
% 求默认自变量的定积分(a/b/结果为值) -
int(f,m,n)
%求默认自变量的定积分(m/n/结果为符号表达式 -
int(f,t)
% 求t的不定积分 -
int(f,t,a,b)
% 求t的定积分(a/b/结果为值) -
int(f,t,m,n)
% 求t的定积分(m/n/结果为符号表达式) 积分可能不存在!
>> syms x
>> f=cos(x)
f = cos(x)
>> int(f)
ans = sin(x) % 省略了常量
>> int(int(f))
ans = -cos(x)
>> syms x
>> f=exp(x)*sin(x^2+1)+2*x*exp(x)*cos(x^2+1);
>> int(f)
ans =
2*exp(x)*tan(1/2*x^2+1/2)/(1+tan(1/2*x^2+1/2)^2)
>> int(f, 1, 2)
ans =
exp(2)*sin(5) - exp(1)*sin(2)
>> 111111syms x t
>> A=[2*x t^2;t*cos(x) exp(x)];
>> int(A)
[ x^2, t^2*x]
[ t*sin(x), exp(x)]
>> int(A, t)
[ 2*x*t, 1/3*t^3]
[ 1/2*t^2*cos(x), exp(x)*t]
>> int(A, sym('a'), sym('b'))
[ b^2-a^2, t^2*(b-a)]
[ t*sin(b)-t*sin(a), exp(b)-exp(a)]
八、符号级数求和 symsum
- symsum(s,n,a,b)
对通项为s的符号级数求和, n通常为下标, 求从n=第a~b项的部分和 - symsum(s,n)
对通项为s的级数, 求第n=0~n-1项的部分和 - symsum(s,a,b)
对通项为s的级数, 求第k=a~b项的部分和(k为默认变量) - symsum(s)
对通项为s的级数, 求第k=0~k-1项的部分和(k为默认变量)
求级数1+1/22+1/32+…+1/k2的和
>> syms k
>> symsum(1/k^2,1,10)
ans =
1968329/1270080
>> symsum(1/k^2,1,inf)
ans =
1/6*pi^2
求级数1/2+2/3+…+n/(n+1)的和
>> syms n
>> sum=symsum(n/(n+1),1,15)
sum =
9094961/720720
>> format long
>> double(sum) % eval(sum)
ans =12.61927100677101
泰勒展开式
- 上式为函数f(x)在x=x0处的泰勒展开式
- 其中:Rn(x)为截断误差
- taylor(f, x, n):函数f在x=0的泰勒展开式的前n项
- taylor(f, x, n, a):函数f在x=a的泰勒展开式的前n项
ex的泰勒展开式
>> syms x
>> taylor(exp(x)) % x=0, 5次多项式
ans = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5
>> taylor(exp(x), 10) % x=0, 10项
ans = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5+ 1/720*x^6+1/5040*x^7+1/40320*x^8+1/362880*x^9
>> taylor(exp(x), 5, 2) % x=2, 5项
ans = exp(2)+exp(2)*(x-2)+1/2*exp(2)*(x-2)^2+1/6*exp(2)*(x-2)^3+1/24*exp(2)*(x-2)^4
九、符号方程(组)求解
solve:求解符号方程(组)
- solve(表达式)
- solve(表达式, 变量)
- solve(表达式1,…,表达式n)
- solve(表达式1,…,表达式n,变量1,…,变量n)
—功能:求解符号方程(组)
—表达式与变量可用符号表达式或字符串
—方程即是:表达式=0,也可把=放到表达式里
—结果为: 符号表达式标量 / 向量 / 矩阵
解方程:ax2+bx+c=0
>> syms a b c x;
>> f=a*x.^2+b*x+c;
>> sol=solve(f)
sol =1/2/a*(-b+(b^2-4*a*c)^(1/2))1/2/a*(-b-(b^2-4*a*c)^(1/2))
>> solve(f, a)
ans = -(b*x+c)/x^2>> solve('sin(x)=0')
ans = 0
只显示0附近的一个解!
>> syms x y z
>> eq1 = x^2+2*x+1;
>> eq2 = x+3*z-4;
>> eq3 = y*z+1;
>> [x,y,z]=solve(eq1, eq2, eq3)
x = -1
y = -3/5
z = 5/3
dsolve:求解符号常微分方程(组)
-
dsolve(表达式, 初始条件, 自变量)
-
dsolve(表达式1,…, 初始条件1,…, 自变量1,…)
–功能:求解符号常微分方程(组)
–表达式与变量用字符串表示
–方程即是:表达式=0,也可把=放到表达式里
–导数表示:Dy=dy/dx,Dny=dny/dxn
–初始条件形如:y(a)=b, Dy©=d
–结果为结构体数组
xd2y/dx2-3dy/dx=x2, y(1)=0, y(5)=0
>> y=dsolve('x*D2y-3*Dy=x^2', 'x')
y =
1/4*C1*x^4-1/3*x^3+C2
>> y=dsolve('x*D2y-3*Dy=x^2', 'y(1)=0,y(5)=0', 'x')
y =
31/468*x^4-1/3*x^3+125/468
dx/dt=y, dy/dt=-x
>> [x,y]=dsolve('Dx=y,Dy=-x')
x =
-C1*cos(t)+C2*sin(t)
y =
C1*sin(t)+C2*cos(t)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!