Mudanças entre as edições de "Uso do calculo simbólico na Matlab"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 83: Linha 83:
 
  zk = roots(sym2poly(N))
 
  zk = roots(sym2poly(N))
  
=Exemplo aplicado a geração de uma função de transferência=
+
=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.
 
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.
Linha 119: Linha 119:
  
 
<math> H(s) = \frac{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} </math>
 
<math> H(s) = \frac{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} </math>
 +
 +
=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 um valor=
 +
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*i
 +
w = [0 1 2 4 10 100];
 +
H(j*w)
 +
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(j*w),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(j*w))
 +
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

Edição das 21h56min de 27 de setembro de 2016

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

syms x y
f = sin(x)^2 + cos(y)^2;
diff(f)
ans =
2*cos(x)*sin(x)

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 um valor

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*i

w = [0 1 2 4 10 100];
H(j*w)
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(j*w),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(j*w))
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