Advertisement

Matlab学习笔记——基础知识(3)

阅读量:

3.符号运算的基本内容

3.1符号变量代换及其函数

复制代码
    >> %符号变量代换及其函数
    >> %subs(S, old, new)   把S中的old变量替换为new,old一定是符号表达式S中的符号变量,而new可以是符号变量,符号常量,数组,数值等
    >> %subs(S, new)  用new替换为S中的自变量
    >> syms a b c d k n x y w t;
    >> f = a * x ^ n + b * y + k;
    >> f1 = subs(f, [a b], [sin(t) log(w)])
    f1 =
    k + x^n*sin(t) + y*log(w)
    >> f2 = subs(f,[a b k],[sin(t) log(w) c * exp(-d * t)])
    f2 =
    c*exp(-d*t) + x^n*sin(t) + y*log(w)
    >> f3 = subs(f,[n k],[5 pi])
    f3 =
    a*x^5 + pi + b*y
    >> f4 = subs(f1,k,1:4)
    f4 =
    [ x^n*sin(t) + y*log(w) + 1, x^n*sin(t) + y*log(w) + 2, x^n*sin(t) + y*log(w) + 3, x^n*sin(t) + y*log(w) + 4]
    >> %在对符号表达式进行两个变量的数值数组替换,可以通过循环程序来实现
    >> syms a k;
    f = a * sin(x) + k;
    for a = 1:2
    for x = 0:pi/6:pi/3
    f1 = a * sin(x) + k
    end
    end
     
    f1 = 
    k
    f1 =
    k + 1/2
    f1 =
    k + 3^(1/2)/2
     
     
    f1 =
    k
    f1 =
    k + 1
    f1 =
    k + 3^(1/2)

3.2符号对象转换为数值对象的函数

复制代码
    >> %符号对象转化为数值对象的函数
    >> %double() 可以把符号表达式的解析解转换为数值解,得到双精度数值解
    >> %为获得指定精度的数值解,可以联合使用digits()和vpa()两个函数
    >> c1 = str2sym('sqrt(2)*log(7)');
    >> c2 = str2sym('pi*sin(pi/5)*exp(1.3)');
    >> c3 = str2sym('exp(pi*sqrt(8))');
    >> a1 = double(c1)
    a1 =
    2.7519
    >> a2 = double(c2)
    a2 =
    6.7757
    >> a3 = double(c3)
    a3 =
       7.2283e+03
    >> class(a1)
    ans =
    'double'
    >> class(a2)
    ans =
    'double'
    >> class(a3)
    ans =
    'double'
    %使用vpa 和 digits来进行数值转换后,所得仍是符号表达式
    >> c4 = str2sym('exp(pi*sqrt(79))');
    >> a4 = double(c4)
    a4 =
       1.3392e+12
    >> class(a4)
    ans =
    'double'
    >> a5 = vpa(a4,8)
    a5 =
    1.3391903e+12
    >> class(a5)
    ans =
    'sym'
    
    >> digits 18
    >> a6 = vpa(a4)
    a6 =
    1339190288739.15527
    >> class(a6)
    ans =
    'sym'

3.3符号表达式的化简

matlab提供了很多用于化简的函数,如因式分解,同类项合并,符号表达式的展开,符号表达式的化简和通分等。

复制代码
    >> %因式分解--factor() 
    >> syms x;
    >> f = x^3+x^2-x-1;
    >> f1 = factor(f)
    f1 =
    [ x - 1, x + 1, x + 1]
     
    >> factor(5)
    ans =
     5
    
    >> factor(84)
    ans =
     2     2     3     7
    
    >> %符号表达式展开--expand()
    >> syms x y;
    >> f = (x+y)^3;
    >> expand(f)
    ans =
    x^3 + 3*x^2*y + 3*x*y^2 + y^3
     
    >> %合并同类项--collect()
    >> syms a b c x;
    >> f = -a*x*exp(-c*x)+b*exp(-c*x);
    >> f1 = collect(f,exp(-c*x)) 
    f1 =
    (b - a*x)*exp(-c*x)
    >> f2 = collect(f)
    f2 =
    (-a*exp(-c*x))*x + b*exp(-c*x)
    >> f3 = 3*a+a^2+b*a+b^8*x;
    >> collect(f3,a) 
    ans =
    a^2 + (b + 3)*a + b^8*x
    
    >> f4 = 5*a+7*a+5*b+7*b;
    >> collect(f4)
    ans =
    12*b + 12*a
    >> collect(f4,[a b])
    ans =
    12*a + 12*b
     
    >> %符号表达式化简--simplify()和simple()
    >> %simplify为运用多种恒等式进行综合化简
    >> %simple为尝试多种不同的简化算法,以取得长度最短的简化形式
    >> %[R,HOW] = simple(E) 为尝试多种不同的简化算法,返回参数R为表达式的简化形式,HOW为简化过程中采用的简化方法。
    >> syms x n c alph beta;
    >> e10 = sin(x)^2+cos(x)^2;
    >> simplify(e10)
    ans =
    1
    >> e20 = exp(c*log(alph + beta));
    >> simplify(e20)
    ans =
    (alph + beta)^c
     
    >> %符号表达式通分--numden()
    >> %[N,D] = numden(E)N,D分别为通分后的分子和分母,返回N,D后再进行相除,即为所求,在无左边的返回值时,只返回分子
    >> syms k p x y;
    >> f = x/(k*y)+y/(p*x);
    >> [N,D] = numden(f) 
    N =
    p*x^2 + k*y^2
    D =
    k*p*x*y
    >> f1 = N/D
    f1 =
    (p*x^2 + k*y^2)/(k*p*x*y)
    >> numden(f)
    ans = 
    p*x^2 + k*y^2
     
    >> %对符号表达式进行嵌套型分解的函数--Horner
    >> syms a b c d x;
    >> f = -a*x^4+b*x^3-c*x^2+x+d;
    >> f1 = horner(f)
    f1 =
    d - x*(x*(c - x*(b - a*x)) - 1)

3.4符号运算的其他函数

复制代码
    >> %符号运算的其他函数
    >> %将数值对象、符号对象转换为字符对象的函数--char
    >> syms a b c x y;
    >> c = 123456;
    >> class(c)
    ans =
    'double'
    
    >> c1 = char(sym(c))
    c1 =
    '123456'
     
    >> f = str2sym('x+y+z') 
    f =
    x + y + z 
    >> f1 = char(f)
    f1 =
    'x + y + z'
    >> class(f1)
    ans =
    'char'
    
    >> %以习惯的方式显示符号表达式--pretty()
    >> syms a b c d x y;
    >> f = a*x/b+c/(d+y);
    >> f1 = sqrt(b^2-4*a*c);
    >> pretty(f)
      c     a x
    ----- + ---
    d + y    b
    
    >> pretty(f1)
      2
    sqrt(b  - 4 a c)

3.5两种特定的符号运算函数

复制代码
    >> %两种特定的符号运算函数
    >> %复合函数的运算与函数命令compose()
    >> %compose(f,g) compose(f,g,z)==compose(f,g,x,z)==compose(f,g,x,y,z)  compose(f,g,t,z)  compose(f,g,t,u,z)
    >> syms f g t u x y z;
    >> f = log(x/t);
    >> g = u*cos(y);
    >> cfg = compose(f,g)
    cfg = 
    log((u*cos(y))/t)
     
    >> cfgz = compose(f,g,z) 
    cfgz =
    log((u*cos(z))/t)
     
    >> cfgxz = compose(f,g,x,z)
    cfgxz =
    log((u*cos(z))/t)
     
    >> cfgxyz = compose(f,g,x,y,z)
    cfgxyz =
    log((u*cos(z))/t)
     
    >> cfgtz = compose(f,g,t,z) 
    cfgtz =
    log(x/(u*cos(z)))
     
    >> cfgtuz = compose(f,g,t,u,z)
    cfgtuz =
    log(x/(z*cos(y)))
     
    >> %反函数的运算与函数命令finverse()
    >> %finverse(f,v) finverse(f)
    >> syms a b x y;
    >> y = a*x+b;
    >> g = finverse(y)
    g = 
    -(b - x)/a
    
    >> compose(y,g)
    ans =
    x

本章结束!

全部评论 (0)

还没有任何评论哟~