%% Symbolic Laplace Transforms
% How to use Matlab Symbolics Toolbox to work with Laplace Transforms
%
% BJ Furman
%
% 16SEP2014
%% Laplace Transform of a function of time
% 
clear all;

syms s t;   % define the symbolic variables s and t
ft = 3*sinh(2*t) + 3*sin(2*t);  % form f(t)
Fs = laplace(ft)    % find the Laplace transform!
%% Inverse Laplace Transform
% 
syms s t;   % define the symbolic variables s and t
ft = 3*sinh(2*t) + 3*sin(2*t);  % form f(t)
Fs = laplace(ft);    % find the Laplace transform!
f_t = ilaplace(Fs)
simplify(f_t)
simplify((3*exp(2*t))/2 - (3*exp(-2*t))/2)
%% Solve a differential equation symbolically using Laplace Transform
% 
% Consider the first order ODE describing a simple open-loop cruise control
% (m/b)*dV(t)/dt + V(t) = (Ke/b)*Theta0
% Let the symbolic mathematics capability of Matlab do all the work:

% Constants for the physical system
m = 1000; % kg
b = 50; % N-s/m
tau = m/b;  % the time constant
g = 9.81; % m/s^2
Theta0 = 30*pi/180; % radians
Ke = 500/Theta0; % N/rad
K = (Ke/b)*Theta0; 
v0 = 0; % initial velocity at t=0-

% Do the symbolic operations
syms s t Vs V(t)  % define the symbolic variables s, t, and V(t)

Vdot(t) = diff( V(t),t );   % take the derivative of V(t)

eq1(t) = tau*Vdot(t) + V(t) - K;

L1(t) = laplace(eq1(t),t,s);    % take the Laplace transform of eq1(t). Remove the semicolon to see what this generates

L1  = subs(L1(t),V(0),v0);   % substitute the initial condition, V(0)=0. Remove the semicolon to see what this generates

L2 = subs(L1, laplace(V(t), t, s), Vs); % substitute the symbolic variable Vs for the transformed V(t). Remove the semicolon to see what this generates

L2 = solve(L2,Vs);  % solve for V(s). Remove the semicolon to see what this generates

V = ilaplace(L2)   % take the inverse Laplace transform

ezplot(V,[0 100])
%% Alternate way to solve a differential equation symbolically using Laplace Transform
% 
% Consider the first order ODE describing a simple open-loop cruise control
% (m/b)*dV(t)/dt + V(t) = (Ke/b)*Theta0
% This example has the programmer do some of the Laplace transform work:

% Constants for the physical system
m = 1000; % kg
b = 50; % N-s/m
tau = m/b;  % the time constant
g = 9.81 % m/s^2
Theta0 = 30*pi/180; % radians
Ke = 500/Theta0; % N/rad
K = (Ke/b)*Theta0; 
v0 = 0; % initial velocity at t=0-

syms s t Vs  % define the symbolic variables s, t, and Vs
ft = K;  % (RHS of ODE) forcing function f(t) is just the step value, K, a constant for this problem
Fs = laplace(ft,t,s);   % take the Laplace transform of f(t)
V1s = s*Vs - v0;    % the Laplace transform of dV(t)/dt
eq2 = tau*V1s + Vs - Fs;    % the Laplace transform of the full ODE with RHS brought to the LHS
sol = solve(eq2, Vs);
Vt = ilaplace(sol,s,t)
ezplot(Vt,[0 100])  % plots the function over the range 0<= t <= 100
%% Another way to symbolically solve an ODE using dsolve
% 
eq3 = '20*Dv + v = 10'; % the ODE expressed as a string
init = 'v(0)=0';    % the initial condition
vt = dsolve(eq3,init,'t')   % solves the ODE symbolically
ezplot(vt,[0 100])  % plots the function over the range 0<= t <= 100
%% Turn a symbolic result into a function that can generate a numeric solution
% 
% Use the Matlab function, matlabFunction()
%
% matlabFunction() can:
% 
% * generate an 'anonymous' function, or
% * a function defined as a file.
%
% An anonymous functon is a function that is NOT stored in a program file, but
% is associated with a variable whose data type is function_handle.
% Anonymous functions can accept inputs and return outputs, just as
% standard functions do. However, they can contain only a single executable
% statement.
%
Vt_num = matlabFunction(Vt) % converts the symbolic function Vt into an anonymous numeric function, Vt_num(t)

t=0:0.1:100;    % give t some values of time
plot(t, Vt_num(t))  % plot the results
grid
%%

