184 lines
4.2 KiB
Matlab
184 lines
4.2 KiB
Matlab
%% Symbolic Toolbox
|
|
% MATLAB is typically associated with computing *numerical* solutions
|
|
% (i.e., estimating solutions using floating point calculations), we
|
|
% may often want to compute *analytic* solutions (exact solutions,
|
|
% often represented by formulas).
|
|
%
|
|
% Wolfram Mathematica is a premier example of technical software with
|
|
% support for symbolic computation, but we can achieve many useful
|
|
% symbolic calculations in MATLAB using the *symbolic toolbox*.
|
|
%
|
|
% The symbolic toolbox is useful if you want to represent an abstract
|
|
% expression. You can think of a symbolic calculation as storing the
|
|
% structure of expressions to operate on rather than the values
|
|
% themselves.
|
|
clear; clc; close all;
|
|
|
|
%% Create symbolic variables
|
|
syms x z;
|
|
|
|
%% Creating expressions
|
|
v = x + 2;
|
|
w = x * z;
|
|
|
|
%% Substituting expressions into a symbolic expression
|
|
subs(v, x, 3);
|
|
|
|
% You can also substitute symbolic expressions, not only values.
|
|
syms r;
|
|
subs(w, z, r);
|
|
|
|
%% Solve a symbolic equation for a variable
|
|
% You may want to look at the documentation page for the `solve` function.
|
|
% If the expression cannot be solved analytically, MATLAB will default
|
|
% to using a numerical solver.
|
|
solve(x + 3 == 5, x);
|
|
|
|
syms a b c;
|
|
solve(a*x^2 + b*x + c, x);
|
|
|
|
% Solving multiple variables simultaneously
|
|
eqs = [x + z == 14, x - z == 6];
|
|
soln = solve(eqs, [x z]);
|
|
soln.x;
|
|
soln.z;
|
|
|
|
%% Set "assumptions" (constraints) on a variable
|
|
% This is the shorthand syntax for setting assumptions on symbolic objects.
|
|
% See also the `assume` function.
|
|
syms n positive;
|
|
solve(n^2 == 4, n);
|
|
|
|
%% Simplify an expression
|
|
% This attempts to simplify an expression using known
|
|
% mathematical identities.
|
|
simplify(exp(log(x)));
|
|
|
|
% See also `simplifyFraction` for more efficient simplification
|
|
% of fractions only.
|
|
|
|
%% Collect
|
|
% This collects coefficients of like terms together.
|
|
collect((x + 2) * (x + 3), x);
|
|
|
|
%% Combine
|
|
% Tries to rewrite products of powers in the expression as a single power
|
|
combine(x^4 * x^3);
|
|
|
|
% Has other options such as 'log' and 'sincos'
|
|
assume(x > 0);
|
|
combine(log(x) + log(2*x), 'log');
|
|
combine(sin(x)*cos(x), 'sincos');
|
|
|
|
%% Expand
|
|
% Similar to `collect`, but expands all variables. More or less the
|
|
% inverse of `combine`.
|
|
expand((x + 5)^3);
|
|
|
|
%% Partial fraction decomposition
|
|
partfrac((x^7+x^2)/(x^3 - 3*x + 2));
|
|
|
|
%% poly2sym and sym2poly
|
|
p = [1 2 3 4];
|
|
psym = poly2sym(p, x);
|
|
q = sym2poly(psym);
|
|
|
|
%% Symbolic functions
|
|
% Symbolic functions are like symbolic expressions but with a formal
|
|
% parameter rather than all free parameters. This may be useful for
|
|
% substituting for a symbolic variable or for differential equations.
|
|
syms f(y);
|
|
f(y) = y^2;
|
|
f(4);
|
|
|
|
%% Compose symbolic functions
|
|
syms g(y)
|
|
g(y) = sin(y);
|
|
h = compose(f, g);
|
|
|
|
%% Symbolic function inverse
|
|
f(y) = exp(y);
|
|
finverse(f)
|
|
|
|
%% Symbolic differentiation
|
|
% Note that this `diff` is different from the `diff` from before.
|
|
% This one is actually `sym.diff`.
|
|
syms x y z;
|
|
v = x^2 + 16*x + 5;
|
|
dvdx = diff(v);
|
|
dvdx_3 = subs(dvdx, x,3);
|
|
|
|
%% Partial differentiation
|
|
% This function assumes derivatives commute (i.e., second partials exist
|
|
% and are continuous).
|
|
w = -x^3 + x^2 + 3*y + 25*sin(x*y);
|
|
dwdx = diff(w, x);
|
|
dwdy = diff(w, y);
|
|
|
|
% third order derivative w.r.t. x
|
|
dw3dx3 = diff(w, x, 3);
|
|
|
|
% Vector operations exist as well such as: curl, divergence, gradient,
|
|
% laplacian, jacobian, hessian...
|
|
|
|
%% Differential equations
|
|
syms y(t) a;
|
|
dsolve(diff(y) == a*y, t);
|
|
dsolve(diff(y) == a*y, y(0) == 5); % with initial conditions
|
|
|
|
%% Symbolic integration
|
|
v = x^2 + 16*x + 5;
|
|
V = int(v);
|
|
|
|
%% Definite integral
|
|
syms a b;
|
|
Vab = int(v, a, b);
|
|
V01 = int(v, 0, 1);
|
|
|
|
%% z transform
|
|
syms a n z;
|
|
f = a^n;
|
|
ztrans(f);
|
|
|
|
%% Symbolic matrices
|
|
syms m;
|
|
n = 4;
|
|
A = m.^((0:n)'*(0:n));
|
|
D = diff(A);
|
|
|
|
%% Laplace Transform
|
|
syms t a s;
|
|
f = exp(-a*t);
|
|
laplace(f);
|
|
|
|
%% Inverse Laplace Transform
|
|
ilaplace(-4*s+8/(s^2+6*s+8));
|
|
|
|
%% Fourier Transform
|
|
f = dirac(x) + sin(x);
|
|
fourier(f);
|
|
|
|
%% Inverse Fourier Transform
|
|
syms w;
|
|
|
|
% fourier transform of cosine(t)
|
|
expr = dirac(w+1) + dirac(w-1);
|
|
ift = ifourier(expr);
|
|
simplify(ift);
|
|
|
|
%% Note: performance
|
|
syms x v;
|
|
v = x^3 + 5*x^2 - 3*x + 9;
|
|
t = 1:1e4;
|
|
|
|
tic;
|
|
X = t.^3 + 5*t.^2 - 3*t + 9;
|
|
toc;
|
|
|
|
tic;
|
|
Y = subs(v,x,t);
|
|
toc;
|
|
|
|
% Symbolic computation and data structures are relatively expensive
|
|
% when compared to numerical operations! Use sparingly!
|