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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值