Domanda

in MATLAB, è possibile dichiarare i simboli abbastanza facilmente:

syms a,b
mat = [a,b]

Ricevo un errore, tuttavia, quando si tenta di replicare questo in ottava. Questo è il codice che sto 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

Come si dichiara una matrice simbolica in ottava?

È stato utile?

Soluzione

questo aiutare?

Sembra che potrebbe essere necessario il simbolico pacchetto toolbox , riferimento qui .

Altri suggerimenti

Se non si dispone già del pacchetto simbolica, scaricarlo. Dalla linea di comando di ottava, o riga di comando gui. per es.

octave> pkg install -forge symbolic

Se si dispone di pitone e sympy installato, che installerà il pacchetto per voi da un'ottava fucina. Ho usato google per capire come ottenere sympy installato, mi ha colpito in su se avete bisogno di aiuto.

Con il pacchetto simbolica installato, utilizzare "carico pkg" per importare le funzioni del pacchetto, e quindi utilizzare Syms funzione di dichiarare i simboli.

octave> pkg load symbolic

octave> syms a b

Questa simboli definito ae b.

octave> syms
Symbolic variables in current scope:
  a
  b

"Syms" di per sé verranno stampati tutti i simboli che avete definito.

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

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

Ho trovato questo pacchetto molto utile nel calcolare Matrici di rotazione per la mia classe robot manipolatori. Spero che questo aiuti.

Ecco la parte del mio script per ulteriori esempi:

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

Dopo aver installato il Symbolic Toolbox (si può fare questo su alcuni ambienti mediante l'emissione di sudo apt-get install octave-symbolic), è necessario effettuare le seguenti operazioni:

symbols
x = sym('x')

ma attenzione che le funzioni di Octave per manipolare le espressioni simboliche sono molto peggio di MATLAB di.

Symbolic Toolbox per Octave è più o meno inutile. Non è possibile ridimensionare una matrice come nel tuo caso, non è possibile utilizzare l'operatore - "". Ad esempio, è possibile distinguere una semplice operazione simbolica:

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

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

, ma se si tenta di fare questo:

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

Lo stesso accade nel caso, cioè ridimensionare una matrice contenente valori simbolici

Un altro esempio per i posteri.

http://octave-online.net/ per sviluppare ed eseguire questo script ottava.

NB: ho inserito uscita come commenti per mostrare i risultati

.
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 di Maniglie

È possibile utilizzare il ottava Struct Array per creare una matrice simbolica in questo modo:

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)

Esecuzione di questo precedente restituisce:

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 dei simboli

Si potrebbe sostituire il @sin, @cos, ecc da sym("a"), sym("b"), sym("c"), ecc.

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

Esecuzione di questo precedente restituisce:

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

References:

  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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top