suptitle matlab
¿Cómo declaro una matriz simbólica en Octave? (6)
En MatLab, puede declarar símbolos con bastante facilidad:
syms a,b
mat = [a,b]
Sin embargo, recibo un error cuando trato 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 declaras una matriz simbólica en octava?
Matriz de mangos
Puede usar Octave Struct Array para crear una matriz simbólica como esta:
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)
Ejecutando esto arriba, regresa:
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
Puede reemplazar @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
Ejecutando esto arriba, regresa:
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
Ayudaría this ?
Parece que puede necesitar el paquete de herramientas simbólicas , haga referencia here .
Después de instalar la caja de herramientas simbólica (puede hacerlo en algunos entornos al emitir sudo apt-get install octave-symbolic
), debe hacer lo siguiente:
symbols
x = sym(''x'')
pero ten cuidado con que las funciones de Octave para manipular expresiones simbólicas son mucho peores que las de MATLAB.
Otro ejemplo para la posteridad.
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⎟
# ⎝-λ - μ ⎠
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 tienes python y sympy instalados, eso instalará el paquete para ti desde la octava fragua. 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)
Encontré este paquete muy útil en el cálculo de matrices de rotación para mi clase de manipuladores robóticos. Espero que esto ayude.
Aquí hay una parte de mi script para ver 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(θ) ⎦
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, puede diferenciar una operación simbólica simple:
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 intentas 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
Lo mismo ocurre en su caso, es decir, cambiar el tamaño de una matriz que contiene valores simbólicos