it-swarm.com.de

Wie deklariere ich eine symbolische Matrix in Octave?

In MatLab können Sie Symbole ganz einfach deklarieren:

syms a,b
mat = [a,b]

Ich erhalte jedoch eine Fehlermeldung, wenn ich versuche, dies in Octave zu replizieren. Dies ist der Code, den ich verwende:

> 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

Wie deklariert man eine symbolische Matrix in Oktave?

24
TwentyMiles

Würde das helfen?

Es scheint, dass Sie das Paket symbolic toolbox , reference hier benötigen.

10
George Profenza

Wenn Sie das symbolische Paket noch nicht haben, laden Sie es herunter. Von der Octave-Befehlszeile oder der GUI-Befehlszeile. z.B.

octave> pkg install -forge symbolic

Wenn Sie Python und Sympy installiert haben, wird das Paket von Octave Forge für Sie installiert. Ich nutzte Google, um herauszufinden, wie Sympy installiert werden kann. Wenn Sie Hilfe benötigen, wenden Sie sich an mich.

Wenn das symbolische Paket installiert ist, verwenden Sie "pkg load", um die Paketfunktionen zu importieren, und verwenden Sie dann die syms-Funktion, um Symbole zu deklarieren.

octave> pkg load symbolic

octave> syms a b

Dies definierte die Symbole a und b.

octave> syms
Symbolic variables in current scope:
  a
  b

Bei "syms" werden alle von Ihnen definierten Symbole gedruckt.

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

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

Ich fand dieses Paket sehr hilfreich bei der Berechnung von Rotationsmatrizen für meine Robotik-Manipulator-Klasse. Hoffe das hilft.

Hier ist ein Teil meines Skripts für weitere Beispiele:

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

Nach der Installation der symbolischen Toolbox (dies ist in einigen Umgebungen durch Ausgabe von Sudo apt-get install octave-symbolic möglich), müssen Sie Folgendes tun:

symbols
x = sym('x')

beachten Sie jedoch, dass Octaves Funktionen zum Bearbeiten symbolischer Ausdrücke wesentlich schlechter sind als die von MATLAB.

6
Salvador Dali

Symbolic Toolbox for Octave ist mehr oder weniger nutzlos. Sie können die Größe einer Matrix nicht ändern, da Sie in diesem Fall den Operator "-" nicht verwenden können. Beispielsweise können Sie eine einfache symbolische Operation unterscheiden:

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

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

aber wenn Sie versuchen, dies zu tun:

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

Dasselbe passiert in Ihrem Fall, d. H. Das Ändern der Größe einer Matrix, die symbolische Werte enthält

1
bartux

Ein weiteres Beispiel für die Nachwelt.

Ich habe http://octave-online.net/ verwendet, um dieses Oktav-Skript zu entwickeln und auszuführen.

Hinweis: Ich habe die Ausgabe als Kommentar eingefügt, um die Ergebnisse anzuzeigen.

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⎟
#    ⎝-λ - μ    ⎠
1
philcolbourn

Array von Griffen

Sie können das Octave Struct Array verwenden, um eine symbolische Matrix wie folgt zu erstellen:

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)

Wenn Sie das oben ausführen, erhalten Sie:

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

Reihe von Symbolen

Sie könnten den @sin, @cos usw. durch sym("a"), sym("b"), sym("c") usw. ersetzen.

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

Wenn Sie das oben ausführen, erhalten Sie:

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

Verweise:

  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
user