Ответ 1
Была ли эта помощь?
Похоже, вам может понадобиться символический пакет инструментов, ссылка здесь.
В MatLab вы можете легко объявить символы:
syms a,b
mat = [a,b]
Я получаю сообщение об ошибке, однако, когда я пытаюсь воспроизвести это в Octave. Это код, который я использую:
> 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
Как вы объявляете символическую матрицу в октаве?
Была ли эта помощь?
Похоже, вам может понадобиться символический пакет инструментов, ссылка здесь.
Если у вас еще нет символического пакета, загрузите его. Из командной строки Octave или командной строки gui. например.
octave> pkg install -forge symbolic
Если у вас установлен python и sympy, это установит пакет для вас из октавной кузницы. Я использовал google, чтобы понять, как установить Sympy, и ударил меня, если вам нужна помощь.
С установленным символическим пакетом используйте "pkg load" для импорта функций пакета, а затем используйте функцию syms для объявления символов.
octave> pkg load symbolic
octave> syms a b
Эти определенные символы a и b.
octave> syms
Symbolic variables in current scope:
a
b
"syms" сам по себе напечатает все символы, которые вы определили.
octave> mat = [a,b]
mat = (sym) [a b] (1×2 matrix)
octave:34> mat * 2
ans = (sym) [2⋅a 2⋅b] (1×2 matrix)
Я нашел этот пакет очень полезным при вычислении матриц Rotation для моего класса Robotic Manipulators. Надеюсь, это поможет.
Вот часть моего script для получения дополнительных примеров:
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(θ) ⎦
Пожалуйста, проголосуйте
После установки символического инструментария (вы можете сделать это в некоторых средах, выпустив sudo apt-get install octave-symbolic
), вы должны сделать следующее:
symbols
x = sym('x')
но будьте осторожны, что функции Octave для манипулирования символическими выражениями намного хуже, чем MATLAB.
Symbolic Toolbox для Octave более или менее бесполезен. Вы не можете изменять размер матрицы, как в вашем случае, вы не можете использовать оператор "-". Например, вы можете отличить простую символическую операцию:
octave:1> symbols
octave:2> q1 = sym("q1");
octave:3> differentiate(Sin(q1)*Cos(q1),q1)
ans =
-sin(q1)^2+cos(q1)^2
но если вы попытаетесь сделать это:
octave:6> -Sin(q1)
error: unary operator `-' not implemented for `ex' operands
octave:6> -q1
error: unary operator `-' not implemented for `ex' operands
То же самое происходит в вашем случае, т.е. изменение размера матрицы, содержащей символические значения
Другой пример для потомков.
Я использовал http://octave-online.net/ для разработки и запуска этой октавы script.
NB: я включил вывод в качестве комментариев для отображения результатов.
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⎟
# ⎝-λ - μ ⎠
Вы можете использовать Octave Struct Array для создания символической матрицы следующим образом:
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)
Выполнение этого действия возвращает:
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
Вы можете заменить @sin
, @cos
и т.д. на sym("a")
, sym("b")
, sym("c")
и т.д.
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
Выполнение этого действия возвращает:
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
Литература: