Dans MatLab, vous pouvez déclarer des symboles assez facilement:
syms a,b
mat = [a,b]
Je reçois cependant une erreur lorsque j'essaie de le reproduire dans Octave. C'est le code que j'utilise:
> symbols
> a = sym("a")
a =
a
> b = sym("b")
b =
b
> mat = [a,b]
error: octave_base_value::resize (): wrong type argument `ex'
error: octave_base_value::resize (): wrong type argument `<unknown type>'
octave-3.2.3.exe:4:C:\Octave\3.2.3_gcc-4.4.0\bin
Comment déclarez-vous une matrice symbolique en octave?
Est-ce que ceci aiderait?
Il semblerait que vous ayez besoin du paquet symbolic toolbox , référence here .
Si vous n'avez pas déjà le paquet symbolique, téléchargez-le. En ligne de commande Octave ou en ligne de commande. par exemple.
octave> pkg install -forge symbolic
Si vous avez installé python et sympy, cela installera le paquet pour vous depuis Octave Forge. J'ai utilisé google pour savoir comment installer sympy, relevez-moi si vous avez besoin d'aide.
Avec le paquet symbolique installé, utilisez "pkg load" pour importer les fonctions du paquet, puis utilisez la fonction syms pour déclarer les symboles.
octave> pkg load symbolic
octave> syms a b
Ceci a défini les symboles a et b.
octave> syms
Symbolic variables in current scope:
a
b
"syms" par lui-même imprimera tous les symboles que vous avez définis.
octave> mat = [a,b]
mat = (sym) [a b] (1×2 matrix)
octave:34> mat * 2
ans = (sym) [2⋅a 2⋅b] (1×2 matrix)
J'ai trouvé ce paquet très utile pour calculer les matrices de rotation de ma classe de manipulateurs robotiques. J'espère que cela t'aides.
Voici une partie de mon script pour plus d'exemples:
pkg load symbolic
syms psi phi theta psidot phidot thetadot
RzPsi = [[cos(psi), -sin(psi), 0]; [sin(psi), cos(psi), 0]; [0,0,1]]
RyTheta = [[cos(theta), 0, sin(theta)];[0,1,0];[-sin(theta), 0, cos(theta)]]
RzPhi = [[cos(phi), -sin(phi), 0]; [sin(phi), cos(phi), 0]; [0,0,1]]
RzPsi = (sym 3×3 matrix)
⎡cos(ψ) -sin(ψ) 0⎤
⎢ ⎥
⎢sin(ψ) cos(ψ) 0⎥
⎢ ⎥
⎣ 0 0 1⎦
RyTheta = (sym 3×3 matrix)
⎡cos(θ) 0 sin(θ)⎤
⎢ ⎥
⎢ 0 1 0 ⎥
⎢ ⎥
⎣-sin(θ) 0 cos(θ)⎦
RzPhi = (sym 3×3 matrix)
⎡cos(φ) -sin(φ) 0⎤
⎢ ⎥
⎢sin(φ) cos(φ) 0⎥
⎢ ⎥
⎣ 0 0 1⎦
octave> RzPhi * RyTheta
ans = (sym 3×3 matrix)
⎡cos(φ)⋅cos(θ) -sin(φ) sin(θ)⋅cos(φ)⎤
⎢ ⎥
⎢sin(φ)⋅cos(θ) cos(φ) sin(φ)⋅sin(θ)⎥
⎢ ⎥
⎣ -sin(θ) 0 cos(θ) ⎦
Après avoir installé la boîte à outils symbolique (vous pouvez le faire sur certains environnements en émettant Sudo apt-get install octave-symbolic
), vous devez procéder comme suit:
symbols
x = sym('x')
mais sachez que les fonctions de manipulation des expressions symboliques d'Octave sont bien pires que celles de MATLAB.
Symbolic Toolbox for Octave est plus ou moins inutile. Vous ne pouvez pas redimensionner une matrice car dans votre cas, vous ne pouvez pas utiliser l'opérateur "-". Par exemple, vous pouvez différencier une opération symbolique simple:
octave:1> symbols
octave:2> q1 = sym("q1");
octave:3> differentiate(Sin(q1)*Cos(q1),q1)
ans =
-sin(q1)^2+cos(q1)^2
mais si vous essayez de faire ceci:
octave:6> -Sin(q1)
error: unary operator `-' not implemented for `ex' operands
octave:6> -q1
error: unary operator `-' not implemented for `ex' operands
Il en va de même dans votre cas, c’est-à-dire redimensionner une matrice contenant des valeurs symboliques
Un autre exemple pour la postérité.
J'ai utilisé http://octave-online.net/ pour développer et exécuter ce script d'octave.
NB: j'ai inclus la sortie sous forme de commentaires pour montrer les résultats.
disp("2-state markov chain symbolic analysis");
syms lambda mu
L = [lambda,0]
# L = (sym) [λ 0] (1×2 matrix)
U = [1;0]
#U =
# 1
# 0
C = [ [1,1]; [lambda,-mu]]
#C = (sym 2×2 matrix)
# ⎡1 1 ⎤
# ⎢ ⎥
# ⎣λ -μ⎦
C^-1
#ans = (sym 2×2 matrix)
# ⎡ λ -1 ⎤
# ⎢────── + 1 ──────⎥
# ⎢-λ - μ -λ - μ⎥
# ⎢ ⎥
# ⎢ -λ 1 ⎥
# ⎢ ────── ──────⎥
# ⎣ -λ - μ -λ - μ⎦
P = C^-1 * U
#P = (sym 2×1 matrix)
#
# ⎡ λ ⎤
# ⎢────── + 1⎥
# ⎢-λ - μ ⎥
# ⎢ ⎥
# ⎢ -λ ⎥
# ⎢ ────── ⎥
# ⎣ -λ - μ ⎦
lambda_sys = L * C^-1 * U
#lambda_sys = (sym)
#
# ⎛ λ ⎞
# λ⋅⎜────── + 1⎟
# ⎝-λ - μ ⎠
Vous pouvez utiliser le Octave Struct Array pour créer une matrice symbolique comme celle-ci:
b(1,1).vector = @sin;
b(1,2).vector = @cos;
b(2,1).vector = @sec;
b(2,2).vector = @csc;
b
b.vector
printf( "\n\nCalling each element:\n" )
b(1,1).vector
b(1,2).vector
b(2,1).vector
b(2,2).vector
printf( "\nCalculatin the sin of 1:\n" )
b(1,1).vector(1)
L'exécution de ce qui précède renvoie:
b =
2x2 struct array containing the fields:
vector
ans = @sin
ans = @sec
ans = @cos
ans = @csc
Calling each element:
ans = @sin
ans = @cos
ans = @sec
ans = @csc
Calculatin the sin of 1:
ans = 0.841470984807897
Vous pouvez remplacer le @sin
, @cos
, etc. par sym("a")
, sym("b")
, sym("c")
, etc.
pkg load symbolic;
b(1,1).vector = sym("a");
b(1,2).vector = sym("b");
b(2,1).vector = sym("c");
b(2,2).vector = sym("d");
b
b.vector
printf( "\n\nCalling each element:\n" )
b(1,1).vector
b(1,2).vector
b(2,1).vector
b(2,2).vector
L'exécution de ce qui précède renvoie:
b =
2x2 struct array containing the fields:
vector
ans = (sym) a
ans = (sym) c
ans = (sym) b
ans = (sym) d
Calling each element:
ans = (sym) a
ans = (sym) b
ans = (sym) c
ans = (sym) d
Références: