Pregunta

En MatLab, puedes declarar símbolos con bastante facilidad:

syms a,b
mat = [a,b]

Sin embargo, recibo un error cuando intento 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 octava?

¿Fue útil?

Solución

este ayudar?

Parece que es posible que tenga la simbólica paquete de caja de herramientas , la referencia aquí .

Otros consejos

Si usted no tiene ya el paquete simbólico, descargarlo. De línea de comandos de octava, o la línea de comandos GUI. por ejemplo.

octave> pkg install -forge symbolic

Si tiene instalado Python y sympy, que instalará el paquete para usted de forja octava. He utilizado Google para encontrar la manera de conseguir sympy instalado, me golpeó hasta si necesita ayuda.

Con el paquete simbólico instalado, utilice "carga PKG" para importar las funciones del paquete, y luego usar syms funcionan para declarar símbolos.

octave> pkg load symbolic

octave> syms a b

Este símbolos definidos por a y b.

octave> syms
Symbolic variables in current scope:
  a
  b

"syms" por sí mismo se imprimirán todos los símbolos que haya 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)

He encontrado 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.

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

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.

Caja de herramientas simbólico para Octave es más o menos inútiles. No se puede cambiar el tamaño de una matriz como en su caso, no se puede utilizar 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 valores simbólicos

Otro ejemplo para la posteridad.

solía http://octave-online.net/ para desarrollar y ejecutar este script de octava.

NÓTESE BIEN:Incluí resultados 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⎟
#    ⎝-λ - μ    ⎠

Array de manijas

Puede utilizar el Octave Struct array para crear una matriz simbólica como esto:

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)

Al ejecutar este 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

Array de los símbolos

Se puede 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

Al ejecutar este por encima de los rendimientos:

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 de octava
  5. https://github.com/sympy/sympy
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top