Uso do calculo simbólico na Matlab
Funções importantes para o uso do cálculo simbólico
- vpa(x) Variable-precision arithmetic: evaluate each element of the symbolic input x to at least d significant digits, where d is the value of the digits function. The default value of digits is 32.
- digits(d) Change variable precision used: sets the precision used by vpa to d significant decimal digits. The default is 32 digits.
- double(s) Convert symbolic values to MATLAB double precision: converts the symbolic value s to double precision. Converting symbolic values to double precision is useful when a MATLAB® function does not accept symbolic values.
- x = sym('x') creates symbolic variable x
- syms x Create symbolic variables and functions: Create symbolic variable x.
- p = poly2sym(c) Create symbolic polynomial from vector of coefficients: creates the symbolic polynomial expression p from the vector of coefficients c.
- S = solve(eqn,var) Equations and systems solver.
- subs(s,new) Symbolic substitution.
- g = matlabFunction(f) Convert symbolic expression to function handle or file.
- simplify(S) Algebraic simplification
- expand(S) Symbolic expansion of polynomials and elementary functions
- collect(P) Collects coefficients in P of the powers
- F = factor(x) Factorization
- numden(A) Extract numerator and denominator
- partfrac(expr,var) Partial fraction decomposition
- latex(S) LaTeX form of symbolic expression
Algumas dicas sobre o cálculo simbólico
- Choose Symbolic or Numeric Arithmetic
- Perform Symbolic Computations
- Create Symbolic Numbers, Variables, and Expressions
- Create Symbolic Functions
syms x y
f = sin(x)^2 + cos(y)^2;
diff(f)
ans = 2*cos(x)*sin(x)
- Extract Numerators and Denominators of Rational Expressions
- Generate MATLAB Functions from Symbolic Expressions
- Use subs to Evaluate Expressions and Functions
- Formula Rearrangement and Rewriting
- Text with Mathematical Expression Using LaTeX
Exemplo aplicado a substituição de variáveis
Definindo uma função de transferência como uma função simbólica
syms s H(s) = (s^2 + 1)/(3*s^2 + 4*s + 6)
H(s) = (s^2 + 1)/(3*s^2 + 4*s + 6)
Imprimindo H(s) em formato LaTeX.
latex(H(s))
ans = \frac{s^2 + 1}{3\, s^2 + 4\, s + 6}
Substituindo a variável s pela f(z) = 2*(z-1)/(z+1);
syms z Hz(z) = subs(H,2*(z-1)/(z+1))
Hz(z) = ((2*z - 2)^2/(z + 1)^2 + 1)/((3*(2*z - 2)^2)/(z + 1)^2 + (4*(2*z - 2))/(z + 1) + 6)
Obtem-se a expressão:
Agrupando os termos comuns em potências de z
Hz2 = collect(Hz)
Hz2 = (5*z^2 - 6*z + 5)/(26*z^2 - 12*z + 10)
Obtem-se a expressão:
O numerador e denominador de H(z) podem ser obtidos por:
[N,D] = numden(Hz2)
N = 5*z^2 - 6*z + 5 D = 26*z^2 - 12*z + 10
Por sua vez os pólos de H(z) são obtidos por
pk = roots(sym2poly(D))
e os zeros por:
zk = roots(sym2poly(N))
Exemplo: Geração de uma função de transferência a partir dos pólos e zeros
Considerando que são conhecidos os pólos (pk) e zeros (zk) de uma função de transferência H(s), deseja-se obter a sua expressão simbólica.
Para obter os coeficientes do numerador
zk = [ -1 2 0 +1] cN = poly(zk)
Obtendo o polinômio do numerador
syms s; N(s) = poly2sym(cN,s) vpa(N(s),4)
Para obter os coeficientes do denumerador
pk = [ -1 -2 -0.3+1j -0.3-1j ] cD = poly(pk)
Obtendo o polinômio do numerador
syms s; D(s) = poly2sym(cD,s) vpa(D(s),4)
Resultando na função de transferência desejada
digits(4) H(s) = vpa(N(s))/vpa(D(s)); pretty(H(s))
4 3 2 s - 2.0 s - 1.0 s + 2.0 s ------------------------------------- 4 3 2 s + 3.6 s + 4.89 s + 4.47 s + 2.18
Exemplo: Expansão de uma função de transferência e frações parciais
Considerando o exemplo anterior de H(s).
syms s; H(s) = (s^4 - 2.0*s^3 - 1.0*s^2 + 2.0*s)/(s^4 + 3.6*s^3 + 4.89*s^2 + 4.47*s + 2.18); H_fr(s) = partfrac(H(s)) digits(4); pretty(vpa(H_fr(s)))
Exemplo: Substituindo a variável s por valores
Para fazer a substituição, basta definir os valores que devem ser substituídos. Seguem alguns exemplos:
Substituindo s por 0
H(0) H_fr(0)
substituindo s pelos valor
w = [0 1 2 4 10 100]; H(w*1j) ans = [ 0, 20/1227 - 2860i/1227, - 11800/11009 + 30800i/33027, 196480/760227 + 268880i/253409, 366755000/425498151 + 227414000i/425498151, 832325926000000/833514949238127 + 46654792030000i/833514949238127]
ou obtendo os valores aritméticos com precisão variável
vpa(H(w*1j),8) ans = [ 0, 0.0163 - 2.3309i, - 1.0719 + 0.93257i, 0.25845 + 1.0611i, 0.86194 + 0.53447i, 0.99857 + 0.055974i]
ou ainda convertendo os valores simbólicos para valores de dupla precisão do MATLAB
H_w = double(H(w*1j)) format long H_w = Column 1 0.000000000000000 + 0.000000000000000i Column 2 0.016300000000000 - 2.331000000000000i Column 3 -1.072000000000000 + 0.932600000000000i Column 4 0.258400000000000 + 1.061000000000000i Column 5 0.861900000000000 + 0.534500000000000i Column 6 0.998600000000000 + 0.055970000000000i