精华内容
下载资源
问答
  • MATLAB 符号运算

    2020-07-18 16:37:09
    MATLAB符号运算正好可用于求解方程(组)。此外,它还有许多其他功能。例如,展开和简化、因式分解以及微积分运算等。MATLAB符号运算虽然是数值运算的补充,但是它仍然是科学计算研究中不可替代的重要内容。与数值...

    前言

    有时候,你可能会遇到较复杂的方程(组),希望用MATLAB来求解。MATLAB的符号运算正好可用于求解方程(组)。此外,它还有许多其他功能。例如,展开和简化、因式分解以及微积分运算等。MATLAB的符号运算虽然是数值运算的补充,但是它仍然是科学计算研究中不可替代的重要内容。与数值运算相比,符号运算不需要预先对变量赋值,其运算结果以标准的符号形式表达。比如说计算sin(π),数值运算的结果是1.2246e-16,符号运算的结果是0。前者是近似的,后者是精确的。

    正文

    MATLAB符号运算功能非常强大,本文只介绍大部分常用的符号运算功能。注:本文代码的运行环境是MATLAB R2016b。

    1. 创建符号数、符号变量和符号矩阵

     这一步骤是符号运算的第一步,后面的步骤都是在此基础上进行的。

    %创建符号数 (只能用sym函数)
    s0 = 1 / sym(7)              %符号数,不适合大型符号数
    s1 = sym('1/7')              %符号数
    s2 = sym('3 + 4i')           %符号复数
    
    %创建符号变量 (sym函数和syms函数都行)
    %--sym函数
    s3 = sym('x')               %符号变量
    
    %--syms函数
    syms a b c                  %创建多个符号变量,值为本身
    syms(sym('[d e; e d]'))      %用已存在的符号变量矩阵创建多个符号变量
    
    %创建符号矩阵 (sym函数和syms函数都行)
    s4 = sym('[2 5 6; 9 8 6]')    %符号数矩阵
    s5 = sym('x', [2 3])          %符号变量矩阵,矩阵内的元素不会被创建为符号变量
    A = [a b c; c b a]            %用已存在的符号变量创建符号变量矩阵
    % syms A B [2 3]              %仅2017及以上版本支持,同时创建多个符号矩阵

     代码运行结果如下。可以看到s5是一个2x3的符号变量矩阵,但矩阵内元素不会被创建成符号变量。

    2. 创建符号表达式、符号函数

    要表达一个数学函数可以用符号函数或符号表达式。

    %创建符号表达式
    syms x y
    f = x^2 + 5*x + 4                      %符号表达式
    subs(f, x, [2 1])                       %分别将f中的x换成2和1
    f2 = sym('x^2 + 2*x + 1 = 0')               %创建方程
    k = piecewise(x <= 0, x + y, x > 0, x - y);    %分段符号表达式
    %更多分段符号表达式/函数的介绍详见:https://ww2.mathworks.cn/help/symbolic/piecewise.html#responsive_offcanvas
    
    %创建符号函数
    %--用syms函数
    syms G(x, y) F(z)    %创建多个符号函数,变量名为括号前字母, 值为本身,其自变量也创建对应的符号变量
    F(z) = z^2 + 5*z + 4                        %符号函数
    F([2 1])                                        %分别计算F(2)和F(1)
    G(x, y) = piecewise(x <= 0, x + y, x > 0, x - y); %分段符号函数,有多个条件用&&连接
    
    %--用symfun函数
    syms x y
    g = symfun(x^2 + y^2, [x y])   %因变量 = symfun(公式,[自变量1 自变量2])
    g([2 3], [1 2])                %分别计算g(2, 1)和g(3, 2)

    代码运行结果如下。从图中可以看出符号表达式与符号函数之间的区别,它们的类型不同,且计算函数值的方式的也不同。

     

    3. 符号运算中的基本运算

    符号运算是精确计算,不会产生截断误差。并且可以根据需要,给出完全的封闭解或任意精度的数值解。本节讨论符号运算中的基本运算,可分为算术运算和关系运算。

    3.1. 算术运算

    数值运算中的一些运算符,例如‘+’、‘-’、‘*’、‘/’、’.*‘、’./‘、‘^’等,在符号运算中也可以使用。由于比较简单,且和数值运算相同,这里不做展示。

    3.2 关系运算

    关系运算符在符号运算中也可以使用,包括’>‘、’>=‘、’<‘、’<=‘、’==‘、’~=‘等。但是,在符号运算中这些运算并不是用来做关系比较,而是通过这些关系运算符构建关系式,作为后续操作(例如,解方程)的限制条件。若要对两个符号式做关系比较,可以使用函数isAlways、isequal或isequaln。

    %关系运算
    syms x
    assume(x > 2);                                      %假设x是大于2的
    solve((x + 1)*(x - 1)*(x - 2)*(x - 4)*(x - 6) == 0) %在设定的条件下,解方程
    
    %函数isAlways、isequal以及isequaln
    %--isAlways:判断两个符号式构成的关系比较式的真假
    A1 = [x, sym(9); 2*x^2, tan(x)];
    B1 = [2*x, sym(6); x^2, sin(x)/cos(x)];
    res1 = isAlways(A1  > B1)                    %对于数组情况,分别比较相应元素,结果为同等大小的logical数组
    
    %--isequal和isequaln:都是判断输入的两个符号式是否相等。但前者将NAN视为不相等,后者将NAN视为相等
    A2 = [x+1, nan]
    B2 = [x+1, nan]
    res2 = isequal(A2, B2)
    res3 = isequaln(A2, B2)                   %对于数组情况,相应元素全部相等,返回1;反之,返回0

    代码运行结果如下。

    4. 符号运算的主要功能

    MATLAB符号运算提供了许多数学操作,例如解方程、微积分、线性代数运算、简化、变换等。本节将简单介绍微积分、解方程以及变换,更多详细功能介绍请看官方帮助文档

    4.1 微积分

    微积分是数学中非常重要的分析工具。MATALB提供了许多微积分的相关操作,这里简单介绍求极限、微分以及积分。详细功能见微积分帮助文档

    %求极限
    syms x
    f1 = limit((exp(x) - 1) / x, x, 0)        %计算x逼近0时,f的双向极限值
    
    %微分
    syms x y
    f2 = diff(sin(x*y), x, y)                 %f先对x求导,再对y求导
    
    %积分
    syms x y
    f3 = x / (y^2 + 1);
    res1 = int(f3, x)            %f关于x的不定积分
    res2 = int(f3, x, 1, 3)      %f关于x在[1, 3]上的定积分
    %changeIntegrationVariable函数:换元积分法
    %integrateByParts函数:分部积分法

    代码运行结果如下。

    4.2 解方程

    利用MATALB可以求解多种方程(组),例如线性方程、非线性方程、微分方程等。详见方程求解帮助文档

    %线性方程:所有未知数都是一次的。可用矩阵形式表示。(用linsolve)
    syms x y z
    eqns = [x+y-2*z == 0, x+y+z == 1, 2*y-z == -5];
    [A, b] = equationsToMatrix(eqns)             %将线性方程转为矩阵形式
    X = linsolve(A, b)                               %linsolve函数大的对象是矩阵形式的线性方程
    
    %非线性方程:(用solve函数或vpasolve函数)
    %--求解析解
    syms x y
    eqns = [2*x^2 + y^2 == 0, 2*x - y == 4];
    [solx soly] = solve(eqns, [x y])
    
    %--求数值解
    syms x
    eqn = x^6 - x^2 == 2;
    s1 = vpasolve(eqn, x)                %不指定求解范围
    s2 = vpasolve(eqn, x, [-3, 3])       %指定求解范围
    
    %常微分方程:未知函数是一元函数的微分方程称作常微分方程
    syms y(t) a b
    eqn = diff(y, t, 2) == 2 * a^2 * y;  %二阶常微分方程
    diffY = diff(y, t);
    cond = [y(0)==b, diffY(0)==1];       %初始条件
    ySol(t) = dsolve(eqn, cond)

    代码运行结果如下。

    4.3 变换

    傅里叶变换、拉普拉斯变换以及Z变换是数学中的常用变换,也是对于工科学生很重要的变换。MATLBA为上述变换都提供了相应的函数来实现。下面开始介绍这些函数的简单使用,每个变换的定义不进行说明,详细说明见变换函数的帮助文档

    %傅里叶变换
    syms t
    f = cos(2 * t);
    f_FT = fourier(f)         %傅里叶变换
    f_IFT = ifourier(f_FT)    %傅里叶逆变换
    % fourier(f, y)           %指定变换变量,默认是w
    % fourier(f, t, y)        %指定自变量和变换变量,默认自变量可以用symvar查看
    
    %拉普拉斯变换
    syms t
    f = 2 * t;
    f_LT = laplace(f)         %拉普拉斯变换
    f_ILT = ilaplace(f_LFT)   %拉普拉斯逆变换
    % laplace(f, y)           %指定变换变量,默认是s
    % laplace(f, t, y)        %指定自变量和变换变量
    
    %Z变换
    syms n z
    f = sin(n);
    f_ZT = ztrans(f)          %Z变换
    f_IZT = iztrans(f_ZT)     %逆Z变换
    % ztrans(f, y)            %指定变换变量,默认是z
    % ztrans(f, t, y)         %指定自变量和变换变量

    代码运行结果如下。

    5. 绘图

    对于前面提到的符号表达式、符号方程、符号函数等,MATLBA提供了丰富的绘图函数来绘制它们。这些图可以是2D或3D形式的直线、轮廓线、曲面或网格。甚至,还可以创建动画图。下面展示2D和3D形式的曲线图,更详细说明见绘图帮助文档

    syms x
    fplot(tan(x) * sin(x));      %2D曲线  
    
    syms t
    xt = exp(-t/10).*sin(5*t);    %参数方程
    yt = exp(-t/10).*cos(5*t);
    zt = t;
    figure
    fplot3(xt, yt, zt)            %3D曲线

    代码运行结果如下。

    博主:虔诚~似锦(主博客)

    个性签名:如果你愿意努力,人生最坏的结果也不过是大器晚成。

    ------------------------------------------------------------------------------------

    如果这篇文章对你帮助的话,记得在下方点赞哦,博主在此感谢!🎉🎉🎉

    如果对这篇文章有疑问,请在评论区指出,欢迎探讨,共同进步。😄😄😄

    展开全文
  • matlab符号及其运算(2)

    千次阅读 2018-11-17 11:19:06
    1.嵌套符号表达式 horner函数实现对符号表达式进行嵌套 R = horner(P):P为待嵌套的符号表达式,R为嵌套后的符号表达式 &gt;&gt; syms x y &gt;&gt; horner(x^3 - 6*x^2 + 11*x - 6) ans = x...

    1.嵌套符号表达式

    horner函数实现对符号表达式进行嵌套

    • R = horner(P):P为待嵌套的符号表达式,R为嵌套后的符号表达式
    >> syms x y
    >> horner(x^3 - 6*x^2 + 11*x - 6)
     
    ans =
     
    x*(x*(x - 6) + 11) - 6
     
    >> horner([x^2 + x;y^3 - 2*y])
     
    ans =
     
       x*(x + 1)
     y*(y^2 - 2)

    2.分解符号表达式

    factor函数用于实现符号表达式的分解

    • factor(X):X为多项式或多项式矩阵,系数是有理数,X最后表示成有理数低阶多项式相乘的形式,如果不能有理数范围内因式分解,则会返回X本身。
    >> syms x y
    >> factor(x^3 - y^3)
     
    ans =
     
    (x - y)*(x^2 + x*y + y^2)
     
    >> factor(sym('12345678901234567890'))
     
    ans =
     
    2*3^2*5*101*3541*3607*3803*27961

    3.化简符号表达式

    根据一定的规则对符号表达式进行化简,函数为simplify

    • simplify(S):输入参数S为符号表达式或符号矩阵
    • simplify(S,Name,Value):指定一个符号表达式的属性名及对应的属性值,并对矩阵或表达式进行化简
    >> % 对符号表达式进行化简
    >> syms x a b c
    >> simplify(sin(x)^2 + cos(x)^2)
     
    ans =
     
    1
     
    >> % 对符号矩阵进行化简
    >> simplify([(x^2 + 5*x + 6)/(x + 2),sin(x)*sin(2*x) + cos(x) * cos(2*x);(exp(-x*i)*i)/2 - (exp(x*i)*i)/2,sqrt(16)])
     
    ans =
     
    [  x + 3, cos(x)]
    [ sin(x),      4]
     
    >> % 使用IgnoreAnalyticConstraints规则对符号表达式进行化简
    >> s = (log(x^2 + 2*x + 1) - log(x + 1)) * sqrt(x^2);
    >> simplify(s)
     
    ans =
     
    -(log(x + 1) - log((x + 1)^2))*(x^2)^(1/2)

    4.替换符号表达式

    当表达式结构复杂、变量较多的时候,引入一些新的变量进行代换,变化结果,从而达到解决问题的目的,这种方法称为变量代换法。matlab提供了subs函数和subexpr函数进行变量代换或者叫做符号表达式的替换。

    subs函数利用符号变量或符号表达式替换目标符号表达式中的符号变量

    subexpr函数利用符号变量替换目标符号表达式的某个子符号表达式

    subs函数:

    subs函数可以用指定符合替换符号表达式中的某一特定符号

    • R = subs(S):用函数中的值或matlab工作区间的值替代符号表达式S中的所有变量,如果没有指定符号变量的值,则返回值中的该符号变量不被替换
    • R = subs(S,new):用新的符号变量new代替原来的符号表达式S中的默认变量
    • R = subs(S,old,new):用新的符号变量new替换原来符号表达式S中的变量old,当new是数值形式的符号时,实际上用数值替换原来的符号计算表达式的值,结果仍为字符串形式
    >> syms a b
    >> subs(a + b, a, 4)
     
    ans =
     
    b + 4
    
    >> syms a b;
    >> subs(cos(a) + sin(b),{a, b}, {sym('alpha'), 2})
     
    ans =
     
    sin(2) + cos(alpha)

    subexpr函数:

    subexpr函数将表达式中重复出现的字符串用变量代换。

    • [Y,SIGMA] = subexpr(X, SIGMA):指定用变量SIGMA的值,来代替符号表达式中重复出现的字符串。进行替换后,函数的返回值Y,被替换的符号变量由SIGMA返回
    • [Y,SIGMA] = subexpr(X,'SIGMA'):函数中输入参数SIGMA为字符或字符串,用来替换符号表达式中重复出现的字符串。进行符号替换返回值为Y,被替换的符号变量由SIGMA返回 
    >> syms a b c d x
    >> solutions = solve(a * x ^ 3 + b * x ^ 2 + c * x + d == 0,...
    x,'MaxDegree',3);
    >> [r,sigma] = subexpr(solutions)
     
    r =
     
                                                                                 sigma^(1/3) - b/(3*a) - (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3)
     (- b^2/(9*a^2) + c/(3*a))/(2*sigma^(1/3)) - sigma^(1/3)/2 + (3^(1/2)*(sigma^(1/3) + (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3))*i)/2 - b/(3*a)
     (- b^2/(9*a^2) + c/(3*a))/(2*sigma^(1/3)) - sigma^(1/3)/2 - (3^(1/2)*(sigma^(1/3) + (- b^2/(9*a^2) + c/(3*a))/sigma^(1/3))*i)/2 - b/(3*a)
     
     
    sigma =
     
    ((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (- b^2/(9*a^2) + c/(3*a))^3)^(1/2) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2)
     

    5.符号函数的操作

    matlab提供了把两个符号函数符合成一个符号函数的功能函数,同时也提供了对符号函数表达式的逆功能函数

    compose函数:函数表达式的符合运算

    • compose(f,g):返回函数当f=f(x)和g=g(y)时的符合函数f(g(y)).x为由函数findsym确定的f的符号变量,y有函数findsym确定的g的符号变量
    • compose(f,g,z):返回f = f(x) 和 g = g(y) 时的符号函数f(g(z)),返回的函数以z为自变量。
    • compose(f,g,x,z):返回符合函数f(g(z)),x为函数f的独立变量。
    • compose(f,g,x,y,z):返回复合函数f(g(z)),并且x为函数f的独立变量,y为函数g的独立变量
    >> syms x y z t u
    >> f = 1/(1 + x^2);
    >> g = sin(y);
    >> h = x^t;
    >> p = exp(-y/u);
    >> a = compose(f,g)
     
    a =
     
    1/(sin(y)^2 + 1)
     
    >> c = compose(h,g,x,z)
     
    c =
     
    sin(z)^t

    finverse函数:实现符号表达式的反函数操作

    • g = finverse(f):计算输入参数的反函数,f为符号表达式,返回值g也是一个符号表达式
    • g = finverse(f,var):输入参数var为一个符号变量,是函数f中的变量,且该函数的返回值g是var为自变量。

     

    >> syms t x
    >> f1 = finverse(log(t))
     
    f1 =
     
    exp(t)
     
    >> f2 = finverse(cos(2 * t) + 1)
     
    f2 =
     
    acos(t - 1)/2

    6.符号微积分

    符号表达式的极限:

    求微分的基本思想是当自变量趋近某个值时,求函数值的变化。“无穷逼近”是为基本的一个基本思想。

    matlab中用limit函数求表达式的极限

    • limit(expr, x, a):求符号函数expr(x)的极限值。即计算当变量x趋近于常量a时,expr(x)的极限值
    • limit(expr,a):求符号函数expr(x)的极限值。变量为函数findsym(expr)确定的默认变量
    • limit(expr):求符号函数expr(x)的极限值。默认趋近于0
    • limit(expr, x, a, 'left'):求符号函数expr的极限值。left表示变量x从左边趋近于a,换成‘right',就是从右边趋近去a
    >> syms x;
    >> f1 = sym((cos(x) + sin(x) - x)/x)
     
    f1 =
     
    (cos(x) - x + sin(x))/x
     
    >> limit(f1,x,inf)
     
    ans =
     
    -1
     
    >> limit(f1,x,0)
     
    ans =
     
    NaN

    符号表达式的微分:

    diff可以完成一元或多元函数的任意阶数的微分,对于自变量的个数多余一个的符号矩阵,微分为Jocabian矩阵,采用jacobian函数实现微分

    (1) diff函数

    • diff(expr):没有指定变量和导数阶数,则系统按findsym函数指示的默认变量对符号表达式expr求一阶导数
    • diff(expr,v):指定符号表达式的变量v
    • diff(expr,sym('v')):计算符号表达式expr的一阶导数,以符号变量v为自变量
    • diff(expr,n):对符号表达式expr求n阶导数
    • diff(expr,v,n):计算符号表达式expr的n阶导数,以符号变量v为自变量
    >> syms x
    >> f = exp(-2*x) * cos(2*x^0.5)
     
    f =
     
    exp(-2*x)*cos(2*x^(1/2))
     
    >> g = diff(f,4)
     
    g =
     
    16*exp(-2*x)*cos(2*x^(1/2)) - (24*exp(-2*x)*cos(2*x^(1/2)))/x - (11*exp(-2*x)*cos(2*x^(1/2)))/x^2 - (15*exp(-2*x)*cos(2*x^(1/2)))/(4*x^3) + (32*exp(-2*x)*sin(2*x^(1/2)))/x^(1/2) + (4*exp(-2*x)*sin(2*x^(1/2)))/x^(3/2) + (3*exp(-2*x)*sin(2*x^(1/2)))/x^(5/2) + (15*exp(-2*x)*sin(2*x^(1/2)))/(8*x^(7/2))
     
    >> pretty(g)
                      exp(-2 x) #2 24   exp(-2 x) #2 11
    exp(-2 x) #2 16 - --------------- - ---------------
                             x                  2
                                               x
    
         exp(-2 x) #2 15   exp(-2 x) #1 32   exp(-2 x) #1 4
       - --------------- + --------------- + --------------
                  3            sqrt(x)             3/2
               4 x                                x
    
         exp(-2 x) #1 3   exp(-2 x) #1 15
       + -------------- + ---------------
               5/2                7/2
              x                8 x
    
    where
    
       #1 == sin(2 sqrt(x))
    
       #2 == cos(2 sqrt(x))
    

    (2) jacobian函数

    matlab中,提供了jacobian函数用于求多元函数的导数。

    • jacobian(f,v):计算数量或向量f对于向量v的jacobian矩阵。函数的返回值第i行第j列的数位df(i)/dv(j).当f为数量时,该函数返回f的梯度。参数v可以是数量,jacobian(f,v)等价于diff(f,v).
    >> syms x y z
    >> f = [x*y*z; y; x+z];
    >> v = [x, y, z];
    >> R = jacobian(f,v)
     
    R =
     
    [ y*z, x*z, x*y]
    [   0,   1,   0]
    [   1,   0,   1]
     
    >> b = jacobian(x+z,v)
     
    b =
     
    [ 1, 0, 1]

    符号表达式的积分:

    int函数求符号表达式的积分

    • int(f):没有指定变量和阶数,按默认的变量求不定积分
    • int(f,v):以v为自变量,对被积分函数或符号表达式f求不定积分
    • int(f,a,b):符号表达式采用默认变量,该函数求默认变量从a到b时符号表达式f的定积分数值,如果f为符号矩阵,则积分对各个元素分别进行积分
    • int(f,v,a,b):求变量v在区间a到b之间的定积分
    >> syms a x t z
    >> int(-2 * x/(1 + x^2)^2)
     
    ans =
     
    1/(x^2 + 1)
     
    >> int(x/(1 + z^2), x)
     
    ans =
     
    x^2/(2*(z^2 + 1))

    级数求和:

    在matlab中提供了symsum函数用于求符号表达式的和。其调用格式为:

    • F = symsum(f,k,a,b):求符号表达式f中变量k从a到b时的有限和
    • F = symsum(f,k):计算符号表达式f中指定变量为k的有限项和
    >> syms k x
    >> S1 = symsum(k^2,k,0,10)
     
    S1 =
     
    385
     
    >> S2 = symsum(1/k^2,k,1,Inf)
     
    S2 =
     
    pi^2/6

    泰勒级数:

    taylor函数用于求符号表达式的泰勒级数展开式

    • taylor(f,var):指定符号变量为var,求Maclaurin多项式
    • taylor(f,var,a):返回符号多项式f中的指定符号自变量var的n-1阶的Maclaurin多项式近似式,其中var可以是字符串或符号变量
    • taylor(_,Name,Value):指定一个或多个属性名及其属性值,实现对符号表达式进行泰勒级数
    >> syms x
    >> tayor(exp(x))
    >> taylor(exp(x))
     
    ans =
     
    x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1
     
    >> taylor(sin(x))
     
    ans =
     
    x^5/120 - x^3/6 + x

    7.符号积分变换

    傅里叶变换及其反变换:

    F(\omega ) = \int_{-\infty }^{\infty }f(t)e^{-jwt}dt

    f(t) = \frac{1}{2\pi }\int_{-\infty }^{\infty }F(\omega )e^{jwt}d\omega

    • Fw = fourier(f, t, w):求时域上函数f的傅里叶变换Fw
    • f = ifourier(Fw,w,t):求频域上函数Fw的傅里叶反变换f
    >> syms w x y z a b c d t
    >> f = exp(-x^2);
    >> fourier(f,x,y)
     
    ans =
     
    pi^(1/2)*exp(-y^2/4)
     
    >> F = sqrt(sym(pi)) * exp(-y^2/4);
    >> ifourier(F,y,z)
     
    ans =
     
    exp(-z^2)

    拉普拉斯变换及其反变换:

    F(s ) = \int_{0 }^{\infty }f(t)e^{-st}dt

    f(t) = \frac{1}{j2\pi }\int_{c-\infty }^{c+\infty }F(s)e^{st}ds

    • Fs = laplace(f,trans_var,eval_point):求时域上函数f的拉普拉斯变换Fs
    • f = ilaplace(Fs,trains_var,eval_point):求频域上函数f的拉普拉斯反变换f
    >> syms a b c d w x y z t s
    >> f = 1/sqrt(x);
    >> laplace(f,x,y)
     
    ans =
     
    pi^(1/2)/y^(1/2)
     
    >> F = 1/y^2;
    >> ilaplace(F,y,x)
     
    ans =
     
    x
     

    z变换及其反变换:

    F(z) = \sum_{n=0 }^{\infty}f(n)z^{-n}

    f(n) = Z^{-1}\left \{ F(z) \right \}

    • Fz = ztrans(f, trans_index,eval_point):求时域函数f的Z变换Fz
    • f = iztrans(Fz, trans_index,eval_point):求频域函数Fz的Z逆变换f
    >> syms a b c d w x y z k t n
    >> f = sin(k);
    >> ztrans(f, k, x)
     
    ans =
     
    (x*sin(1))/(x^2 - 2*cos(1)*x + 1)
     
    >> F = 2*x/(x-2)^2;
    >> iztrans(F,x,k)
     
    ans =
     
    2^k + 2^k*(k - 1)

     

    展开全文
  • 第十一章:MATLAB符号运算11.1. 符号与数值11.1.1. 符号与数值间的转换实例-数值与符号转换11.1.2. 符号表达式与数值表达式的精度设置实例-魔方矩阵的数值解实例-稀疏矩阵的数值解实例-伴随矩阵的数值解实例-托普...


    在数学,物理学,力学等各种学科和工程应用中,经常会遇到符号运算的问题

    11.1. 符号与数值

    符号运算是matlab数值运算的扩展,在运算过程中以符号表达式或者符号矩阵作为运算对象,实现了符号计算和数值计算的相互结合,应用更加灵活

    11.1.1. 符号与数值间的转换

    符号表达式和数值表达式的相互转换是通过函数eval和sym实现的
    (1)eval函数:将符号表达式转换成为数值表达式
    (2)sym函数:将数值表达式转换成为符号表达式

    在这里插入图片描述

    实例-数值与符号转换

    在这里插入图片描述

    11.1.2. 符号表达式与数值表达式的精度设置

    符号表达式和数值表达式分别使用函数digits和vpa来进行精度设置
    在这里插入图片描述

    实例-魔方矩阵的数值解

    在这里插入图片描述

    实例-稀疏矩阵的数值解

    在这里插入图片描述

    实例-伴随矩阵的数值解

    在这里插入图片描述

    实例-托普利兹矩阵的数值解

    在这里插入图片描述

    11.2. 符号矩阵

    符号矩阵和符号向量中的元素都是符号表达式,符号表达式是由符号变量和数值组成的

    11.2.1. 符号矩阵的创建

    符号表达式的元素是任何不带等号的符号表达式,各符号表达式的长度也是可以不同
    生成符号矩阵的方法有三种:

    1. 直接输入
    在这里插入图片描述
    (2)用sym函数创建符号矩阵
    在这里插入图片描述

    实例-创建符号矩阵

    在这里插入图片描述
    创建符号表达式,首先创造符号变量,然后使用变量进行操作
    在这里插入图片描述

    实例-显示精度

    在这里插入图片描述

    实例-函数符号矩阵

    在这里插入图片描述

    实例-符号矩阵赋值

    在matlab中,数值矩阵不能直接参与符号运算,必须先转化为符号矩阵
    在这里插入图片描述

    11.2.2. 符号矩阵的其他运算

    与数值矩阵一样,符号矩阵也可以进行转置,求逆等运算,但是符号矩阵与数值矩阵的函数不同

    实例-符号矩阵的转置

    在这里插入图片描述
    在这里插入图片描述

    实例-符号矩阵的行列式

    在这里插入图片描述
    在这里插入图片描述

    实例-符号矩阵的逆运算

    在这里插入图片描述
    在这里插入图片描述

    实例-符号矩阵的求秩在这里插入图片描述

    在这里插入图片描述

    符号函数的常用函数运算

    在这里插入图片描述

    11.2.3. 符号多项式的简化

    符号工具箱中提供了符号矩阵因式分解,展开,合并,简化及通分等符号操作函数

    实例-表达式因式分解

    在这里插入图片描述

    实例-符号矩阵因式分解

    在这里插入图片描述

    实例-幂函数的展开

    在这里插入图片描述

    符号简化&分式通分

    在这里插入图片描述
    在这里插入图片描述

    实例-提取表达式的分子和分母

    在这里插入图片描述

    实例-秦九韶型

    在这里插入图片描述

    11.3. 综合实例–符号矩阵

    矩阵的应用不单单是数值的运算,还包括转换成为符号矩阵,进行符号运算
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • matlab符号及其运算(1)

    万次阅读 2018-11-16 08:31:48
    matlab中提供了强大的符号运算功能,可以按照推理解析的方法进行运算 1.字符型数据变量的创建 var = 'expression' 字符型变量是以矩阵的形式存在MATLAB的工作空间中的 &gt;&gt; C = 'china' C = china ...

    matlab中提供了强大的符号运算功能,可以按照推理解析的方法进行运算

    1.字符型数据变量的创建

    var = 'expression'

    字符型变量是以矩阵的形式存在MATLAB的工作空间中的

    >> C = 'china'
    C =
    china
    >> A = '1 + sin(2) / 3'
    A =
    1 + sin(2) / 3
    >> size(C)
    ans =
         1     5
    >> size(A)
    ans =
         1    14

    2.符号型数据变量的创建

    符号对象中的符号常量、变量、函数和表达式,可以用sym和syms函数创建。使用class函数测试建立的操作对象为何种操作对象类型及是否为符号对象类型

    sym函数:可以生成单个的符号变量

    • var = sym('var', set):创建一个符号变量,并设置符号对象的格式,set可以不选
      • 'position':限定var表示正的实型符号变量
      • 'real':限定var为实型符号变量
      • 'unreal':限定var为非实行符号变量
    • sym('var','clear'):清除先前设置的符号变量var
    • Num = sym(Num,flag):将一个数值转换为符号形式,输入参数flag为转换的符合对象应该符合的格式类型
      • 'r':最接近有理表示,为系数默认设置
      • 'e':带估计误差的有理表示
      • 'f':十六进制浮点表示
      • 'd':最接近的十进制浮点精确表示
    • A = sym('A',dim):创建一个矢量或矩阵的符号变量
    • A = sym('A',set):创建一个符号矩阵,set用于设置矩阵的维数
    • sym(A,'clear'):清除前面已创建的符号矩阵A
    • f(arg1,...,argN) = sym('f(arg1,...,argN'):根据f指定的输入参数arg1,...,argN创建符号变量f(arg1,...,argN)
    % 利用sym函数创建符号对象
    >> sqrt(3)
    
    ans =
    
        1.7321
    
    >> a = sqrt(sym(3))
     
    a =
     
    3^(1/2)
     

    syms函数:可以创建任意多个符号变量

    • syms var...varN:创建符号变量var...varN
    • syms var...varN set:set指定符号对象的格式
      • 'position':限定var表示正的实型符号变量
      • 'real':限定var为实型符号变量
    • syms var...varN clear:清除前面已经定义好的符号对象
    • syms f(arg1,...,argN):创建符号函数f,函数中包含多个符号变量

    利用syms函数创建符号表达式

    >> syms s(t) f(x,y)
    >> f(x,y) = x + 2 * y
     
    f(x, y) =
     
    x + 2*y
     
    >> f(1,3)
     
    ans =
     
    7

    利用sym和syms也可生成符号矩阵

    >> m1 = [1,2+x,1;3-x,1,4+y;1,2+y,0]
     
    m1 =
     
    [     1, x + 2,     1]
    [ 3 - x,     1, y + 4]
    [     1, y + 2,     0]
     
    >> m2 = sym('[[1,2+x,1;3-x,1,4+y;1,2+y,0]]')
    m2 =
     
    [ [1, x + 2, 1], [3 - x, 1, y + 4], [1, y + 2, 0]]

    3.符号计算的运算符与函数

    MATLAB采用了全新的数据结构、面向对象编程和重载技术,使得符号计算和数值计算在形式上和风格上浑然统一。

    算术运算符号:

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

    >> A = sym('[x^2 3;4 * xcos(x)]');
    >> B = sym('[1/x^2 2*x;3 x^2+x]')
    
    >> C = A + B
     
    C =
     
    [   1/x^2 + x^2, 2*x + 3]
    [ 4*xcos(x) + 3, x^2 + x]
     
    >> J = A / B
     
    J =
     
    [     (x*(x^4 + x^3 - 9))/(- 6*x^2 + x + 1),   -(2*x^5 - 3)/(- 6*x^3 + x^2 + x)]
    [ (4*x^2*xcos(x)*(x + 1))/(- 6*x^2 + x + 1), -(8*x^2*xcos(x))/(- 6*x^2 + x + 1)]

    (2)运算符号“.*”,“./”,“.\”,“/^”分别实现“元素对元素”的乘法、左除、右除和求幂运算

    >> syms a b c d e f g h;
    >> A = sym('[a,b;c,d]')
    A =
     
    [ a, b]
    [ c, d]
     
    >> B = sym('[e,f;g,h]')
    B =
     
    [ e, f]
    [ g, h]
     
    >> R = A * B
     
    R =
     
    [ a*e + b*g, a*f + b*h]
    [ c*e + d*g, c*f + d*h]
     
    >> R1 = A .* B
     
    R1 =
     
    [ a*e, b*f]
    [ c*g, d*h]

    (3)运算符号“ ' ”," .' "分别试下符号矩阵的共轭和非共轭转置

    >> syms a b c d;
    >> A = sym('[a b;c d]');
    >> R = A'
     
    R =
     
    [ conj(a), conj(c)]
    [ conj(b), conj(d)]
     
    >> R2 = A.'
     
    R2 =
     
    [ a, c]
    [ b, d]

    关系运算符号:

    与数值计算中关系运算符号相区别的是,符号计算中的关系运算符还有以下两种

    • 运算符号“==”表示对运算符两边的符号对象进行“相等”的比较,返回值“1”表示相等,“0”表示不等
    • 运算符号“~=”表示对运算符号两边的符号对象进行不相等的标记。“1”表示不相等,“0”表示相等

    复数函数:

    复数函数包括复数的共轭、实部、虚部和模函数,与数值计算中是一致的

    矩阵代数函数:

    符号计算中,常用的矩阵代数函数有:diag函数,triu函数,tril函数,inv函数,det函数,rank函数,rref函数,null函数,colspace函数,ploy函数、expm函数,eig函数和svd函数。

    >> f = sym('[1 2 1; 2 3 5;1 7 9]')
    f =
     
    [ 1, 2, 1]
    [ 2, 3, 5]
    [ 1, 7, 9]
     
    >> [U,S,V] = svd(f)
     
    U =
     
    [ 0.16282766200529790566464473003047, 0.36344034057570734984922459430431,  0.91727764135407896387284636832453]
    [ 0.46068074153566191523968894576701, 0.79411905473576600135312190977843, -0.39641919893431769076779069408513]
    [ 0.87250238215379167379020797827246, -0.4871201553495680712962919278634, 0.038125416563908403817930647866644]

    注意:符号工具箱仅支持元素为符号常量的符号矩阵的SVD分解

    4.寻找符号变量

    matlab中的符号对象可以是符号常量也可以是符号变量,findsym函数可以找到符号表达式中的符号变量

    • findsym(s):寻找符号表达式s中所有的符号变量
    • findsym(s,n):寻找符号表达式n个在字母表中与x最接近的变量
    >> syms s b x y;
    >> f = a ^ 2 + 6 * b + cos(x - 2) + log(5 + y) + 4 - 5i
     
    f =
     
    a^2 + 6*b + cos(x - 2) + log(y + 5) + (4 - 5i)
    >> findsym(f)
    ans =
    
    a,b,x,y
    
    >> findsym(f,2)
    ans =
    
    x,y

    5.符号精度计算

    符号计算的一个显著特点是:由于计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。因此,如果想要使得计算结果精确,就可以牺牲计算时间和存储空间,用符号计算来获得计算精度。

    在符号运算工具箱中,有三种不同类型的算术运算。

    • 数值类型:MATLAB的浮点算术运算,最快的运算,需要的计算机内存很小,但是结果不精确
    • 有理数类型:Maple的精度符号计算
    • VPA类型:Maple的任意精度算术运算。

    digits函数:digits函数用于设定所用数值的精度

    • digits(d):符号对象的近似解的精度为d位有效数字,参数d的默认值为32位
    • d = digits:得到当前采用的数值计算的精度
    >> digits
     
    Digits = 32
     
    >> a1 = sym(1.6,'d')
     
    a1 =
     
    1.6000000000000000888178419700125
     
    >> digits(42)
    >> digits
     
    Digits = 42
     
    >> a2 = sym(1.6,'d')
     
    a2 =
     
    1.60000000000000008881784197001252323389053

    vpa函数:用于进行可控精度运算

    • R = vpa(A):计算符号矩阵A的近似解,精度为函数digits(d)指定的有效位数
    • R = vpa(A,d):计算符号矩阵A的近似解,有效位数由参数d指定 
    >> a = vpa(hilb(2))
     
    a =
     
    [ 1.0,                                          0.5]
    [ 0.5, 0.333333333333333333333333333333333333333333]
     
    >> b = vpa(hilb(3),6)
     
    b =
     
    [      1.0,      0.5, 0.333333]
    [      0.5, 0.333333,     0.25]
    [ 0.333333,     0.25,      0.2]
     
    >> c = vpa(pi)
     
    c =
     
    3.14159265358979323846264338327950288419717

    6.显示符号表达式

    符号表达式的显示过程中,默认采用MATLAB形式的显示,除了默认的显示方式外,还可以使用pretty函数,允许用户将符号表达式显示为符合一般数学表达习惯的数学表达式。

    • pretty(X):将符号表达式用书写方式显示出来,使用默认的宽
    >> syms x
    >> s = solve(x^4 + 2*x + 1,x,'MaxDegree',3);
    >> pretty(s)
    /         -1         \
    |                    |
    |           2    1   |
    |    #2 - ---- + -   |
    |         9 #2   3   |
    |                    |
    |   1         #2   1 |
    | ---- - #1 - -- + - |
    | 9 #2         2   3 |
    |                    |
    |        1    #2   1 |
    | #1 + ---- - -- + - |
    \      9 #2    2   3 /
    
    where
    
                     /   2       \
             sqrt(3) | ---- + #2 | 1i
                     \ 9 #2      /
       #1 == ------------------------
                         2
    
             / sqrt(11) sqrt(27)   17 \1/3
       #2 == | ----------------- - -- |
             \         27          27 /

    7.合并符号表达式

    collect函数用于实现将符号表达式中的同类项进行合并

    • R = collect(S):将表达式S中相同次幂的项合并,系统默认为按照x的相同次幂项进行合并
    • R = collect(S,v):将表达式S按照v的次幂项进行合并,输入参数S可以是表达式,也可以是一个符号矩阵
    >> syms x y
    >> collect((exp(x) + x) * (x + 2))
     
    ans =
     
    x^2 + (exp(x) + 2)*x + 2*exp(x)
     
    >> collect(x^2*y + y*x - x^2 - 2*x,x)
     
    ans =
     
    (y - 1)*x^2 + (y - 2)*x

    8.展开符号表达式

    expand函数用于实现将符号表达式展开。

    • expand(S):表达式S中如果包含函数,matlab会利用恒等式变型将其写成相应的形式。
    • expand(S,Name,Value):设置展开式的参数名Name及其对应的参数值Value
    >> syms x y a b c t
    >> expand((x - 2) * (x - 4))
     
    ans =
     
    x^2 - 6*x + 8
     
    >> expand(cos(x + y))
     
    ans =
     
    cos(x)*cos(y) - sin(x)*sin(y)

     

    展开全文
  • MATLAB符号运算和数值运算的区别

    千次阅读 2020-10-10 22:41:29
    Matlab有符号工具箱 Symbolic Math Tooibox , 而且可以借助数学软件 Maple, 所以 Matlab 也具有强大的符号运算功能。一、 字符串的定义 MATLAB 用单引号来定义字符串。例如在指令窗口输入:A= ’hello, ...
  • https://blog.csdn.net/kaka20080622/article/details/24155767
  • 使用MATLAB进行符号运算:多项式的展开与合并等
  • 本质区别 两者的根本区别是 : 数值计算的表达式、矩阵变量中不允许有未定义的自由变量 ,...而 Matlab有符号工具箱 Symbolic Math Tooibox , 而且可以借助数学软件 Maple, 所以 Matlab 也具有强大的符号运算功能...
  • ~Show Time~符号矩阵符号矩阵的生成符号矩阵的生成和数值矩阵的相关操作类似,创建方法有以下的几种:1、直接创建符号矩阵2、用类似创建数值矩阵的方法创建符号矩阵3、直接将数值矩阵转换成符号矩阵根据以上的三种...
  • 使用符号运算时,使用A'对矩阵A进行转置时,经常会出现conj(a)的变量,本来解决方案是定义符号变量a时在后面加上real,变成: syms a real 但这样变量a为a(t)时,这样的方法就不起作用,后来才发现原来matlab的矩阵...
  • 符号对象的运算 符号矩阵 符号对象的建立 sym函数 sym函数用于建立单个符号对象,其常用调用格式为: 符号对象名=sym(A) 将由A来建立符号对象,其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),...
  • 实验一 MATLAB基本操作及运算 一 实验目的 1 理解Matlab数据对象的特点 2 掌握基本Matlab运算规则 3 掌握Matlab帮助的使用方法 二 实验的设备及条件 计算机一台MATLAB7.0以上的软件环境 三 实验内容 要求建立一...
  • 学习matlab(七)——符号计算

    千次阅读 2020-02-16 23:48:01
    MATLAB中,提供了强大的符号运算功能,并且有专门的符号数学工具箱Symbolic Math Toolbox。此外,在MATLAB中,还可以通过maple. m和map. m两个接口和Maple相连。MATLAB的符号计算功能非常强大。在MATLAB中,符号...
  • 常见信号的MATLAB表示及运算实验一:信号发生器一.实验目的1.熟悉常见信号的意义、特性及波形2.学会使用MATLAB表示信号的方法并绘制信号波形3. 掌握使用MATLAB进行信号基本运算的指令4. 熟悉用MATLAB实现卷积积分...
  • https://jingyan.baidu.com/article/a378c9600dc1ffb32828300d.html https://jingyan.baidu.com/article/676629976b1ba054d51b8416.html
  • matlab符号运算函数laplace的返回值

    千次阅读 2014-12-14 18:37:07
    matlab中的拉氏变换与反变换的函数 laplace(符号表达式,t,s);ilaplace(符号表达式,s,t) 的返回值是 符号表达式; 例 F = laplace(sin(a*t),t,s); 执行后的结果 F是一个符号表达式 char(F)把表达式转换成了...
  • MATLAB学习之符号运算

    万次阅读 2016-03-11 15:41:58
    本文介绍MATLAB中的符号运算; 1. 创建符号变量符号变量是不含变量的符号表达式,用 sym 命令来创建符号常量。 sym(‘常量’):创建符号常量。 a=sym('sin(2)')sym 命令也可以把数值转换成某种格式的符号...
  • 符号变量及其运算绪:什么是符号计算?1.字符型数据变量的创建2.符号型数据变量的创建3.符号计算的运算符与函数4.寻找符号变量5.符号精度计算6.显示符号表达式7.合并符号表达式8.展开符号表达式 绪:什么是符号计算...
  • Matlab符号计算与数值计算对比

    千次阅读 2020-09-18 13:29:54
    Matlab符号计算,需要用到一些常用符号工具箱函数,例如画出 f(x)=x2f(x)=x^2f(x)=x2 在 [0,3][0,3][0,3] 上的微分值: \qquad(1) 首先构造符号变量x,符号表达式f(x)=x^2,再利用工具箱函数 df=diff(f) 直接求出...
  • 带符号的矩阵进行运算时,出现conj

    千次阅读 2018-09-13 10:30:13
    只需要将syms定义变量的后面,加上real,即可解决该问题
  • %% 解方程 % x1=1;y1=0; %x2=0;y2=1; %r=1; %syms x0 y0 %eq1=(x1-x0)^2+(y1-y0)^2==r^2; %eq2=(x2-y0)^2+(y2-y0)^2==r^2; %[x0,y0]=solve(eq1,eq2,x0,y0) %% 化简方程 %syms x y %s=(x^2+y^2)^2+(x^2-y^2)^2 ...
  • S5-MATLAB符号运算

    2020-08-25 16:13:27
    MATLAB符号运算4 MATLAB符号运算 【学习目标】 MATLAB中的符号计算 MATLAB中的符号变量和符号表达式的创建方法 符号函数、包括符号的初等运算、复合函数与反函数、极限、泰勒展开、级数求和、微分、积分、线性代数...
  • 利用matlab符号变量进行矩阵乘法公式推导
  • 在搭建乘法器,验证波形时,多比特二进制数手算比较麻烦,所以导入matlab计算正确的输出结果。 此时要注意乘法器的特性,举个例子吧 5 × 5 = 25 也就是4‘b0101(+5) * 4’b0101(+5) = 0011001(+25) 那 -5 × 5 = -...
  • MATLAB08:符号运算

    千次阅读 多人点赞 2019-11-23 17:42:24
    文章目录MATLAB08:符号运算符号变量及其运算创建符号变量创建符号数字创建符号变量符号微积分求极限求微分求积分求级数泰勒展开 MATLAB08:符号运算 符号变量及其运算 创建符号变量 创建符号数字 使用sym函数可以创建...
  • matlab符号表达式的化简

    千次阅读 2020-12-31 01:46:53
    simplify(f) 对符号表达式进行化简,它利用各种类型的代数恒等式,包括求和、 积分、三角函数、指数函数以及 Bessel 函数等来化简符号表达式 simple(f) 对符号表达式尝试多种不同的算法进行化简,以显示长度...
  • 文章目录说明1、Matlab当中的符号函数2、创建符号函数3、符号与数值之间的转换4、符号函数的运算4.1 复合函数运算compose4.2 反函数的运算5、符号函数的化简5.1 因式分解5.2 符号矩阵的展开5.3 同类式合并5.4 求符号...
  • 在直接数字域设计中,我们常常需要用到PID算法,而PID算法投入单片机使用时,往往需要硬件的支持,在调试时非常麻烦。本文通过Matlab仿真的手段实现PID,方便了开发者对系统的设计和实时调试。
  • matlab中的符号运算

    2019-09-10 19:11:05
    在数值运算中,包括输入输出以及中间变量都是数值变量。而在符号变量中,变量都以字符形式保留 ,数字也是当成字符,符号表达式包括符号函数和符号方程,两者的区别在与前者不包括等号, 而后者必须等号,但他们...
  • 符号运算功能符号表达式的创建 :一、用符号串二、使用 sym ()函数创建符号函数的运算一、复合函数的运算二、反函数的运算三、因式分解 factor ()四、 函数展开 expand五、符号微积分六、 符号微分方程求解 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,369
精华内容 1,747
关键字:

matlab带符号运算

matlab 订阅