suptitle matlab octave

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

  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


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