2010-03-18 13 views
24

in Matlab, è possibile dichiarare i simboli abbastanza facilmente:Come si dichiara una matrice simbolica in Octave?

syms a,b 
mat = [a,b] 

Ricevo un errore, tuttavia, quando si tenta di replicare questo in ottava. Questo è il codice che sto utilizzando:

> 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?

risposta

10

this help?

Sembra che potrebbe essere necessario il symbolic toolbox package, riferimento here.

+1

No. Ho già il pacchetto di simboli, ma il problema persiste. –

+1

@Gryllida Sfortunatamente non uso Octave da un po 'e non sono così veloce nel capire le cose. Raccomando caldamente anche di chiedere sulla [mailing list di Octave] (https://mailman.cae.wisc.edu/listinfo/help-octave): un sacco di persone utili e competenti laggiù. –

+0

La pagina nel "questo" link non esiste più. –

6

Dopo aver installato il Symbolic Toolbox (si può fare questo in 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 .

1

Symbolic Toolbox per Octave è più o meno inutile. Non puoi ridimensionare una matrice come nel tuo caso, non puoi usare l'operatore "-". Ad esempio, si può 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 tuo caso, vale a dire il ridimensionamento di una matrice contenente valori simbolici

11

Se non si dispone già del pacchetto simbolico, scaricarlo. Dalla riga di comando di Octave o dalla riga di comando di GUI. per esempio.

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 installare sympy, mi ha colpito se hai bisogno di aiuto.

Con il pacchetto simbolico installato, utilizzare "pkg load" per importare le funzioni del pacchetto, quindi utilizzare la funzione syms per dichiarare i simboli.

octave> pkg load symbolic 

octave> syms a b 

Questi simboli definiti ae b.

octave> syms 
Symbolic variables in current scope: 
    a 
    b 

"syms" di per sé stamperà tutti i simboli che hai 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 calcolo delle matrici di rotazione per la mia classe di manipolatori robotici. Spero che questo ti aiuti.

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

prego fino voto

0

matrice di handle

È possibile utilizzare il Octave Struct Array per creare una matrice simbolica come questo:

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) 

Esegui ning 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 questo sopra 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 

Riferimenti:

  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
+0

Questo è un array di handle ... non variabili simboliche. – rayryeng

+0

L'ho aggiunto lavorando anche con una serie di simboli esempio. – user

1

Un altro esempio per i posteri.

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

NB: Ho incluso l'output 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⎟ 
# ⎝-λ - μ ⎠ 
Problemi correlati