web-dev-qa-db-fra.com

Comment déclarer une matrice symbolique dans Octave?

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?

24
TwentyMiles

Est-ce que ceci aiderait?

Il semblerait que vous ayez besoin du paquet symbolic toolbox , référence here .

10
George Profenza

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(θ)    ⎦
14
Dave Goldsmith

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.

6
Salvador Dali

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

1
bartux

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⎟
#    ⎝-λ - μ    ⎠
1
philcolbourn

Tableau de poignées

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

Tableau de symboles

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:

  1. https://www.gnu.org/software/octave/doc/v4.0.0/Structure-Arrays.html
  2. http://mattpap.github.io/scipy-2011-tutorial/html/installing.html
  3. https://github.com/cbm755/octsympy
  4. https://askubuntu.com/questions/737746/installing-symbolic-package-in-octave
  5. https://github.com/sympy/sympy
0
user