Come faccio a dichiarare una matrice simbolica in Octave?
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?
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: