2010-03-18 34 views
24

en MATLAB, se puede declarar símbolos con bastante facilidad:¿Cómo declaro una matriz simbólica en Octave?

syms a,b 
mat = [a,b] 

estoy recibiendo un error, sin embargo, cuando intento de replicar esto en Octave. Este es el código que estoy usando:

> 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 

¿Cómo se declara una matriz simbólica en la octava?

Respuesta

10

¿Lo ayudaría this?

Parece que es posible que necesite el symbolic toolbox package, referencia here.

+1

No. Ya tengo el paquete de simbología, pero el problema persiste. –

+1

@Gryllida Desafortunadamente no he usado Octave desde hace tiempo y no soy tan rápido para descifrar cosas. También recomiendo encarecidamente que pregunten en la [lista de correo de Octave] (https://mailman.cae.wisc.edu/listinfo/help-octave): mucha gente servicial y conocedora de allí. –

+0

La página en "este" enlace ya no existe. –

6

Después de instalar la caja de herramientas simbólica (se puede hacer esto en algunos entornos mediante la emisión de sudo apt-get install octave-symbolic), lo que tiene que hacer lo siguiente:

symbols 
x = sym('x') 

pero ten en cuenta que las funciones de octava para la manipulación de expresiones simbólicas son mucho peores que MATLAB .

1

Symbolic Toolbox for Octave es más o menos inútil. No puede cambiar el tamaño de una matriz como en su caso, no puede usar el operador "-". Por ejemplo, se puede diferenciar una simple operación simbólica:

octave:1> symbols 
octave:2> q1 = sym("q1"); 
octave:3> differentiate(Sin(q1)*Cos(q1),q1) 
ans = 

-sin(q1)^2+cos(q1)^2 

pero si intenta hacer esto:

octave:6> -Sin(q1) 
error: unary operator `-' not implemented for `ex' operands 
octave:6> -q1 
error: unary operator `-' not implemented for `ex' operands 

mismo sucede en su caso, es decir, cambiar el tamaño de una matriz que contiene los valores simbólicos

11

Si aún no tiene el paquete simbólico, descárguelo. Desde la línea de comandos de Octave o la línea de comandos de GUI. p.ej.

octave> pkg install -forge symbolic 

Si tiene instalado Python y sympy, que instalará el paquete para usted de forja octava. Utilicé Google para descubrir cómo instalar Sympy, acéptame si necesitas ayuda.

Con el paquete simbólico instalado, use "pkg load" para importar las funciones del paquete, y luego use la función syms para declarar los símbolos.

octave> pkg load symbolic 

octave> syms a b 

Esto define los símbolos a y b.

octave> syms 
Symbolic variables in current scope: 
    a 
    b 

"syms" por sí solo imprimirá todos los símbolos que ha definido.

octave> mat = [a,b] 
mat = (sym) [a b] (1×2 matrix) 

octave:34> mat * 2 
ans = (sym) [2⋅a 2⋅b] (1×2 matrix) 

me encontré con este paquete de gran ayuda en el cálculo de las matrices de rotación para mi clase robóticos manipuladores. Espero que esto ayude.

Aquí es parte de mi guión para más ejemplos:

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

Por favor Answer

0

matriz de identificadores

Puede utilizar el Octave Struct Array para crear una matriz simbólica de esta manera:

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) 

Ejecutar Ning esta por encima de los rendimientos:

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 

Matriz de símbolos

podría reemplazar el @sin, @cos, etc por 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 

de reproducción esto de arriba devuelve:

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 

Referencias:

  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

Esta es una matriz de identificadores ... no variables simbólicas. – rayryeng

+0

La agregué trabajando también con una serie de símbolos ejemplo. – user

1

Otro ejemplo para la posteridad.

Usé http://octave-online.net/ para desarrollar y ejecutar este script de octava.

NB: Incluí la salida como comentarios para mostrar los resultados.

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⎟ 
# ⎝-λ - μ ⎠ 
Cuestiones relacionadas