記号数学MATLABで係数を抽出する方法。
たとえば、私は次のような伝達関数を持っています
H(S) = (a*S^2 + b*S^ + a*c*S + d*a) / (S^3 + b*c*S^2 + d*S^1 + a*d)
H(s)の「S」項の係数を次のようなベクトル配列として取得したい
num = [a b a*c d*a]
den = [1 b*c d a*d]
記号数学MATLABで係数を抽出する方法。
たとえば、私は次のような伝達関数を持っています
H(S) = (a*S^2 + b*S^ + a*c*S + d*a) / (S^3 + b*c*S^2 + d*S^1 + a*d)
H(s)の「S」項の係数を次のようなベクトル配列として取得したい
num = [a b a*c d*a]
den = [1 b*c d a*d]
numden
分子と分母のポリノミック式を抽出するために適用できます。
[numexpr, denexpr] = numden(sym(H)) %// 'sym' makes sure that H is symbolic
S
次に、コマンドを使用しての記号係数を抽出できます(最初に各式に適用して、多項式形式を取得することをcoeffs
忘れないでください)。expand
ただし、はcoeffs
ゼロ以外の係数のみを返すことに注意してください。この問題を克服するために、私は次のことを提案します:
%// Extract numerator coefficients
[numcoef, numpow] = coeffs(expand(numexpr), S);
num = rot90(sym(sym2poly(sum(numpow))), 2);
num(num ~= 0) = coeffs(expand(numexpr), S);
%// Extract denominator coefficients
[dencoef, denpow] = coeffs(expand(denexpr), S);
den = rot90(sym(sym2poly(sum(denpow))), 2);
den(den ~= 0) = coeffs(expand(denexpr), S);
PS:代わりにMATLABExchangeからツールsym2polys
を適用することもできます。numexpr
denexpr
また、係数ベクトルの最後の要素がの最大の累乗に関連付けられることがより一般的であるS
ため、このソリューションの結果は、質問で説明したものと逆の順序になることに注意してください。
%// Create symbolic function
syms a b S
H = b * S / (a + S^2)
[numexpr, denexpr] = numden(sym(H));
%// Extract numerator coefficients
[numcoef, numpow] = coeffs(expand(numexpr), S);
num = rot90(sym(sym2poly(sum(numpow))), 2);
num(num ~= 0) = coeffs(expand(numexpr), S);
%// Extract denominator coefficients
[dencoef, denpow] = coeffs(expand(denexpr), S);
den = rot90(sym(sym2poly(sum(denpow))), 2);
den(den ~= 0) = coeffs(expand(denexpr), S);
結果は次のとおりです。
num =
[0, b]
den =
[a, 0, 1]