convolution integral with ode45

254 views (last 30 days)
Angie
Angie on 8 Jun 2019
Edited: Paul about 2 hours ago
Hi guys, can someone help me solve this equation of motion using ode45 or any other way? I dont know how to approach the convolution integral. Thank you!

Accepted Answer

Star Strider
Star Strider on 8 Jun 2019
Try this:
odefcn = @(t,y,c,F,k,m,w) [y(2); -(k.*y(1) - F.*cos(t.*w) + integral(@(tau)c(t - tau).*y(2).*tau, 0, t))./m];
c = @(t) exp(-t.^2); % Make Something Up
[F,k,m,w] = deal(rand,rand,rand,rand); % Replace With Correct Values
tspan = [0 10];
ics = [1; 1];
[t,y] = ode45(@(t,y)odefcn(t,y,c,F,k,m,w), tspan, ics);
figure
plot(t, y)
hl = legend('$u(t)$', '$\dot{u}(t)$');
set(hl,'Interpreter','latex')
Noite that ‘c’ actually has to be defined as a function in order for this to work. Supply the correct one.
I derived it with the help of the Symbolic Math Toolbox.
  8 Comments
JINGYU KANG
JINGYU KANG on 12 Sep 2023
Star Strider's answer solves the different differential equation. That is,
where the desired equation to solve is as below
One can verify that by letting c(t) = 1 with k = 0, F = 0 for simplicity
David Goodmanson
David Goodmanson on 11 Dec 2025 at 1:16
Edited: David Goodmanson on 11 Dec 2025 at 7:35
Whether you include a factor of tau or not, I believe both of these solutions are incorrect, and every solution along these lines will be incorrect. The term is
Int{0,t} c(t-tau) u'(tau) dtau % u' instead of udot
i.e. a convolution that depends on the past history of u' from 0 to t. Replacing u'(tau) with u'(t) says that u' is a constant factor in the integrand (which it isn't). This gives
Int{0,t)} c(t-tau) u'(t) dtau = u'(t) Int{0,t)} c(t-tau) dtau.
If you attemp to fix this up by inserting tau or any function f(tau) inside the integral, and then do the integration you get
u'(t) Int{0,t} c(t-tau) f(tau) dtau = u'(t) g(t)
for some function g, which is a pointlike expression that does not involve past history of u' at all.
I have never unaccepted someone else's answer but would encourage Star Strider to take a hard look at that answer.

Sign in to comment.

More Answers (4)

Paul
Paul on 7 Dec 2025 at 3:05
Edited: Paul on 11 Dec 2025 at 2:18
If c(t) has a Laplace transform then we can take advantage of the convolution property and convert to the s-domain, solve for U(s), and then convert back to the t-domain. For simple c(t) we can actually get a closed form expression for u(t), though a numerical or vpa solution is more likely going to be needed.
Define the differential equation
syms m k F omega t tau real
syms u(t) c(t)
du(t) = diff(u(t),t);
z(t) = int(c(t-tau)*diff(u(tau),tau),tau,0,t);
eqn = m*diff(u(t),t,2) + z(t) + k*u(t) == F*cos(omega*t)
eqn = 
Take the Laplace transform
Leqn = laplace(eqn)
Leqn = 
Sub in U(s) and C(s)
syms U(s) C(s)
Leqn = subs(Leqn,laplace([u(t),c(t)],t,s),[U(s),C(s)])
Leqn = 
Solve for U(s)
Leqn = isolate(Leqn,U(s))
Leqn = 
At this point we need the expresion for C(s). Assume a simple form of c(t) and sub C(s) into the expression for U(s)
c(t) = exp(-t);
Leqn = subs(Leqn,C,laplace(c(t),t,s))
Leqn = 
Simplify the expression for U(s)
[num,den] = numden(rhs(Leqn));
Leqn = lhs(Leqn) == num/den
Leqn = 
Choose some arbitrary parameters for illustration and sub in
mval = 1; kval = 2; Fval = 3; omegaval = 4;
Leqn = subs(Leqn,[m,k,F,omega,u(0),du(0)],[mval,kval,Fval,omegaval,5,6])
Leqn = 
If we only want a numerical evaluation of the solution, we can just use impulse
figure
[num,den] = numden(rhs(Leqn));
impulse(tf(double(coeffs(num,'all')),double(coeffs(den,'all'))),0:.01:20);grid
Get the solution for u(t)
u(t) = ilaplace(rhs(Leqn),s,t)
u(t) = 
u(t) = rewrite(rewrite(u(t),'expandsum'),'expandroot');
The solution includes some terms in i = sqrt(-1), but we know the solution has to be real. It proved too difficult to simplify u(t) into an expression with only real terms.
Derivative of u(t)
du(t) = diff(u(t),t);
Plot the real and imaginary parts of u(t) to verify the latter is zero, and plot the derivative of u(t)
figure;
fplot([real(u(t)),imag(u(t)),real(du(t))],[0,20]);grid
legend('u(t)','imag(u(t))','du(t)');
Note that u(0) and du(0) satisfy the initial conditions assumed above.
Now verify the solution satisfies the differential equation.
z(t) actually has a closed form expression
z(t) = int(c(t-tau)*du(tau),tau,0,t)
z(t) = 
Subtract the rhs of the differential equation from the lhs and sub in the parameters
check = subs(lhs(eqn) - rhs(eqn),[m,k,F,omega],[mval,kval,Fval,omegaval]);
Sub in the expressions for u(t) and c(t), note we could just set u(t) = real(u(t)) and z(t) = real(z(t)).
check = subs(check);
Check the result at some points in time, the answer should be zero
vpa(subs(check,t,0:10)).'
ans = 
  10 Comments
Paul
Paul on 20 Dec 2025 at 18:25
This example considers periodic c(t) with period T = 2. The fundamental period of c(t) is c0(t) = exp(-t) for 0 <= t <= T, and 0 otherwise.
Three solutions are considered:
a) Laplace transform followed by impulse
b) ode45 using the augmented state derived by differentiating the convolution integral, as suggested by @Sam Chak and @David Goodmanson, after expanding c(t) into a Fourier series.
c) ode45 storing the solution of udot in a persistent variable via the OutputFcn and numerically evaluating the convolution integral in the odefun as suggested by @Torsten
I'd be interested if anyone has references that discuss typical c(t) functions for this type of problem.
clearvars; assume(assumptions,'clear');
m = 1; k = 2; F = 3; omega = 4;
u0 = 5; udot0 = 6;
Method (a)
syms t tau real
syms u(t) c(t)
du(t) = diff(u(t),t);
z(t) = int(c(t-tau)*diff(u(tau),tau),tau,0,t);
eqn = m*diff(u(t),t,2) + z(t) + k*u(t) == F*cos(omega*t);
syms U(s) C(s)
Leqn = laplace(eqn);
Leqn = subs(Leqn,laplace([u(t),c(t)],t,s),[U(s),C(s)]);
Leqn = subs(Leqn,[u(0),du(0)],[u0,udot0]);
Leqn = isolate(Leqn,U(s));
[num,den] = numden(rhs(Leqn));
Leqn = lhs(Leqn) == num/expand(den);
[num,den] = numden(rhs(Leqn));
numU = coeffs(num,C(s),'all');
denU = coeffs(den,C(s),'all');
T = 2;
c0(t) = exp(-t);
C(s) = (laplace(c0(t)*rectangularPulse(0,T,t),t,s)/(1-exp(-s*T)))
C(s) = 
sv = tf('s');
% for exp(-t)*rect(0,T,t)
C = (exp(-2)*exp(-sv*T) - 1)/((sv+1)*(exp(-sv*T)-1));
U = ...
(tf(double(coeffs(numU(1),s,'all')),1)*C + tf(double(coeffs(numU(2),s,'all')),1)) / ...
(tf(double(coeffs(denU(1),s,'all')),1)*C + tf(double(coeffs(denU(2),s,'all')),1));
tfinal = 50;
[uimp,timp] = impulse(pade(U,7),0:.05:tfinal);
Method (b)
syms n integer
f(n) = fourier(c0(t)*rectangularPulse(0,T,t),t,2*sym(pi)/T*n)/T;
f0 = limit(f(n),n,0);
f(n) = simplify(f(n));
w0 = 2*sym(pi)/T;
figure
nFourier = 30; % 61-term series is a reasonable approximation.
kk = 1:nFourier;kk = [kk,-kk];
fplot([c0(t)*rectangularPulse(0,T,t),f0 + sum(f(kk).*exp(1j*w0*kk*t))],[0,10])
f = matlabFunction(f);
f0 = double(f0);
w0 = double(w0);
% consider setting the MaxStep based on nFourier*w0
[tG,uG] = ode45(@(t,u) odefun(t,u,m,k,F,omega,u0,f0,f,w0),[0,tfinal],[u0;udot0;zeros(nFourier,1)]);
Method (c)
c0 = matlabFunction(c0);
c = @(t) c0(mod(t,T));
[tout,uout] = ode45(@(t,u) fun(t,u,m,c,k,F,omega),[0,tfinal],[u0;udot0],odeset('OutputFcn',@OutputFcn,'OutputSel',2));
Compare results
figure
plot(timp,uimp,tG,uG(:,1),tout,uout(:,1)),grid
legend('Laplace','Fourier+diffconv','persistent')
function xdot = fun(t,x,m,c,k,F,w,flag,tsol,udotsol)
persistent thist udothist nhist
if nargin == 10
if strcmp(flag,'init')
if ~isempty(thist)
error('thist is not empty at initialization');
end
if ~isempty(udothist)
error('udothist is not empty at initialization');
end
thist = zeros(1,10000);
udothist = zeros(1,10000);
thist(1) = tsol(1);
udothist(1) = udotsol;
nhist = 1;
elseif isempty(flag)
if nhist + numel(tsol) > numel(thist)
disp('Growing storage!');
thist = [thist,zeros(1,1000)];
udothist = [udothist,zeros(1,1000)];
end
thist(nhist+1:nhist+numel(tsol)) = tsol;
udothist(nhist+1:nhist+numel(tsol)) = udotsol;
nhist = nhist + numel(tsol);
elseif strcmp(flag,'done')
thist = [];
udothist = [];
nhist = [];
end
return
end
if isempty(nhist)
z = 0;
else
udotfun = @(tt) interp1([thist(1:nhist),t],[udothist(1:nhist),x(2)],tt);
%z = integral(@(tau) c(t-tau).*udotfun(tau),0,t);
% could also use trapz
dt = 0.01;
tconv = 0:dt:t;
z = conv(c(tconv),udotfun(tconv));
z = dt*z(numel(tconv));
end
xdot = zeros(2,1);
xdot(1) = x(2);
xdot(2) = (F*cos(w*t) - k*x(1) - z)/m;
end
function status = OutputFcn(tsol,udotsol,flag)
status = 0;
fun([],[],[],[],[],[],[],flag,tsol,udotsol)
end
function udot = odefun(t,u,m,k,F,omega,u0,f0,f,w0)
nFourier = numel(u) - 2;
n = (1:nFourier).';
b = f(n);
a = -1j*w0*n;
udot = zeros(numel(u),1);
udot(1) = u(2);
udot(2) = (F*cos(omega*t) - k*u(1) - f0*(u(1)-u0) - 2*sum(real(u(3:end))))/m;
udot(3:end) = -a.*u(3:end) + b.*u(2);
end
Paul
Paul about 4 hours ago
Edited: Paul about 2 hours ago
Suppose c(t) is defined over a finite interval t1 <= t <= t2 and is 0 outside that interval. In that case (and probably under mild assumptions), c(t) can be represented by a complex Fourier series. However, unlike when c(t) is periodic, the complex exponentials are windowed over the defining interval to represent c(t). So we need to explore how to implement the solution for c(t) being a windowed exponential (which extends to sums of those). Using the OutputFcn/Persistent approach (@Torsten) doesn't change for this type of c(t), so we focus on how to use one of the built in solvers (@David Goodmanson, @Sam Chak)
clearvars; assume(assumptions,'clear');
Define c(t) as a finite-duration exponential
syms t tau real
syms t1 t2 positive
syms a b
c(t) = b*exp(-a*t)*rectangularPulse(t1,t2,t);
u(t) and its derivative
syms u(t) du(t) % du(t) == diff(u(t),t)
G(t) is the convolution integral
syms G(t)
eqn1 = G(t) == int(c(t-tau)*du(tau),tau,0,t)
eqn1 = 
Differentiate the convolution
eqn = diff(eqn1,t);
And simplify it
eqn = lhs(eqn) == simplify(rhs(eqn),10)
eqn = 
ccc = children(rhs(eqn));
eqn = lhs(eqn) == subs(expand(ccc{1}),-a*expand(rhs(eqn1)),-a*lhs(eqn1)) + rewrite(ccc{2},'heaviside') + rewrite(ccc{3},'heaviside')
eqn = 
The derivative of the convolution contains two delayed terms. So we can use ode45 in three steps (0 -> t1, t1->t2, t2 -> t3) and adjust the odefun over those intervals, and we'd have to store udot persistently as well. Alternatively, we can use dde23, at least I think it applies to this type of problem. I've never used dde23 before, so thought I'd give it try.
clearvars
% Parameters of the system
m = 1; k = 2; F = 3; omega = 4;
u0 = 5; udot0 = 6;
a = 1/2; b = 5; t1 = 1; t2 = 3; % c(t) = b*exp(-a*t) t1 <= t <= t2, 0 otherwise
lags = [t1,t2];
tspan = [0,10];
c0 = 5; % Additional, constant damping in the system; keeps it stable.
% solve with dde23
sol = dde23(@(t,y,Z) ddefun(t,y,Z,m,k,F,omega,t1,t2,a,b,c0),lags,@(t)[u0,udot0,0],tspan,ddeset('Jumps',[t1,t2],'RelTol',1e-6,'AbsTol',1e-9));
function ydot = ddefun(t,y,Z,m,k,F,omega,t1,t2,a,b,c0)
ylag1 = Z(:,1);
ylag2 = Z(:,2);
ydot = zeros(3,1);
ydot(1) = y(2);
ydot(2) = (F*cos(omega*t) - k*y(1) - c0*y(2) - y(3))/m;
ydot(3) = -a*y(3) + b*ylag1(2)*exp(-a*t1)*(t>=t1) - b*ylag2(2)*exp(-a*t2)*(t>=t2);
end
% function for c(t) and udot(t)
c = @(t) b*exp(-a*t).*(t >= t1 & t <= t2);
udot = @(t) deval(sol,t,2);
% extract the solution from the mesh output
dtsol = 0.01;
tsol = 0:dtsol:10;
[ysol,ypsol] = deval(sol,tsol);
% plot the solution and its derivative
figure
plot(tsol,ysol),legend('y(t)','ydot(t)','G(t)');
figure
plot(tsol,ypsol),legend('ydot(t)','ydotdot(t)','Gdot(t)');
% compute the convolution G(t) from the solution
G = nan(1,numel(tsol));
for ii = 1:numel(tsol)
G(ii) = integral(@(tau) c(tsol(ii)-tau).*udot(tau),0,tsol(ii));
end
% verify the solution
figure
plot(tsol,m*ypsol(2,:) + k*ysol(1,:) + c0*ysol(2,:) + G - F*cos(omega*tsol)),grid
The verification seems reasonable, but I really have no idea what to expect from this approach.
Would be interested in any feedback on this use of dde23.

Sign in to comment.


David Goodmanson
David Goodmanson on 13 Dec 2025 at 10:37
Edited: David Goodmanson on 16 Dec 2025 at 9:19
******************** MODIFIED ******(**************
because the method suggested here does not work. I took out some useless text but left the basic idea as an example of what not to do.
Hi Paul, Torsten et. al.
The code below saves the history of udot in ode45 and then does the convolution. I used delt = 1e-2 as Matt did and the plot is pretty similar. Taking delt down to 1e-4 does not change things very much.
A more accurate method might be available and I will add it to this answer if it works.
m = 1;
k = 2;
F = 3;
wF = 4;
a = 1; % c = exp(-a*t)
delt = 1e-2; % step size for the convolution integration
tspan = [0 20];
icond = [5;6];
[t u] = ode45(@(t,u) fun(t,u,m,k,a,delt,F,wF,tspan,icond), tspan, icond);
figure(3); grid on
plot(t,u)
function udot = fun(t,u,m,k,a,delt,F,wF,tspan,icond)
persistent udotstore
persistent tstore
if t == tspan(1)
udotstore = icond(2);
tstore = tspan(1);
G = 0;
else
udotstore = [udotstore u(2)];
tstore = [tstore t];
% sort the times, toss out near-duplcate times
[t1 ind] = sort(tstore);
udot1 = udotstore(ind);
fin = find(diff(t1)<1e-7); % judgment call here
t1(fin) = [];
udot1(fin) = [];
% set up equally spaced time array, do the convolution G
t2 = t1(1):delt:t1(end);
udot2 = interp1(t1,udot1,t2);
c = exp(-a*t2);
G = trapz(t2,flip(c).*(udot2));
end
udot = [0 1; (-k/m) 0]*u -(G/m)*[0;1] + (F/m)*cos(wF*t)*[0;1];
end
  5 Comments
Paul
Paul on 13 Dec 2025 at 22:17
Edited: Paul on 13 Dec 2025 at 22:46
I didn't see this comment before I prepared and submitted mine. I see that we both have the same fundamental concern (I think).
I did not think of using an OutputFcn.
I think the derivative function can include additional arguments, which won't be used by the ode solver, but can be used in a call from the OutputFcn to pass data from the OutputFcn to the derivative function for the derivative function to store persistently. Don't see why that wouldn't work.
Or the state data could be stored persistently in the OutputFcn and it could be called from the derivative function with an optional second argument and specific value of flag or a fourth argument to return the stored state data. I think that should work too.
David Goodmanson
David Goodmanson on 16 Dec 2025 at 9:11
I see that persistent is not going to work. Thanks to Torsten and especially Paul for taking the time to point out the flaws in that idea.
Going back somewhere on this thread I mentioned Matt in conndection with delta t = .01 but I meant to say Torsten.

Sign in to comment.


Sam Chak
Sam Chak on 15 Dec 2025 at 18:56
In the past few days, I have been closely following the discussions on this intriguing topic of solving the integro-differential equation that involves a convolution integral term using the ode45 solver. It seems challenging to define the time-shifted dummy variable τ, which serves as a temporary placeholder for integration in the ODE function, as pointed out by @Star Strider.
I commend everyone for their contributions, including @JINGYU KANG, who revived this unsolved problem, and @David Goodmanson, who initially implemented storing the historical solutions from ode45 needed to perform the convolution. I would also like to especially recognize @Paul for developing solutions using the Laplace transform method, the fixed-step RK4 method, and the OutputFcn method (under @Torsten's insightful suggestion).
Here is my take: I initially wondered if the product of functions in the convolution integral term could be decomposed using integration by parts, a common mathematical technique that we all learned in high school calculus.
The idea eventually evolved into a mathematical technique inspired by integration by substitution.
Methodology:
The mass-spring-damper system is given by:
where is the convolution integral term.
If the damping function, is differentiable or Laplace transformable, we can introduce an auxiliary variable y to define that
Next, applying Leibniz integral rule for differentiating , we obtain
where the kernel function is
.
Evaluating the two terms:
and
.
Since
it can be rewritten simply as a coupled ODE:
.
Essentially, the integro-differential equation is converted into a coupled ODE system, allowing the ode45 solver to adaptively solve the system.
% Parameters
m = 1; % mass
k = 2; % stiffness
F = 3; % amplitude of the sinusoidal Force
w = 4; % natural angular frequency
% Call ode45 solver
tspan = [0, 20]; % simulation time
icond = [5 % u(0) = 5
6 % u'(0) = 6
0]; % y(0) = 0
[tu, u] = ode45(@(t, u) odefcn(t, u, m, k, F, w), tspan, icond);
% Compare with impulse response
[v, tv] = impulse(tf([5, 11, 94, 179, 176], conv([1, 0, 16], [1, 1, 3, 2])), tspan(2));
% Plot results
figure
hold on
plot(tu, u(:,1), '.')
plot(tv, v)
hold off
grid on
xlabel('Time')
ylabel('Amplitude')
legend('Adaptive ode45', 'Impulse response')
%% Transform the integro-differential equation into a coupled ODE system
function du = odefcn(t, u, m, k, F, w)
du = zeros(3, 1);
du(1) = u(2);
du(2) = 1/m*(F*cos(w*t) - k*u(1) - u(3)); % convolution integral is substituted by u(3) = y
du(3) = u(2) - u(3); % dy/dt = du/dt - y, after applying Leibniz rule
end
  2 Comments
Torsten
Torsten on 15 Dec 2025 at 20:05
Edited: Torsten on 15 Dec 2025 at 20:17
Very nice solution.
What a luck that
d/dt (c(t-tau)) = -c(t-tau)
in this specific case :-)
Can you think of a similar approach for a general convolution integral
int_{tau = 0}^{tau = t} c(t-tau) * u(tau) d(tau)
with an arbitrary function c ?
Sam Chak
Sam Chak on 17 Dec 2025 at 13:38
This high-school integration technique clearly does not work for arbitrary functions. If this technique cannot be applied, then the convolution must be evaluated numerically while integrating the ODE function, as demonstrated by @Paul using the OutputFcn method. In theory, this should be analogous to solving a Volterra integral equation. Are there any examples available in the MathWorks Help Center or official documentation?

Sign in to comment.


David Goodmanson
David Goodmanson on 16 Dec 2025 at 9:04
Edited: David Goodmanson on 16 Dec 2025 at 22:43
This is a very interesting problem! Convolution of the loss term for the harmonic oscillator. I had been working on some extensions of the same approach that Sam posted so I will post these. If
c = b e^(-at)
G = Int{0,t} b e^(-a(t-tau)) u'(tau) dtau
then
(d/dt + a) G(t) = b u'(t)
and the system consists of that result combined with
mu'' + G + ku = F cos(wt)
Let
y = [u u' G]' % two different uses of '
The odefun is
ydot = [ 0 1 0
-k/m 0 -1/m
0 b -a ] y + (F/m) cos(wt) [0 1 0]'
with initial condition G(0) = 0, all of which was covered by Sam. An advantage of this method is that as well as u and u' you get the convolution integral as a function of time.
In everything below, the initial condition for every G is zero.
Some generalizations of c are possible. These are sums of functions of the form
% b t^n e^(-at)
which include e.g.
% b1 e^(-a1 t) + b2 e^(-a2 t) + b3 e^(-a3 t) .... sum of exponentials b)
% ( ... b3 t^3 + b2 t^2 + b1 t + b0 ) e^(-a t) polymomials a)
and mixtures of those. If additional easily calculated c functions don't come around, then one task would be to fit an arbitrary c function to sums of these functions There are more possibilites for success there than it might seem. For example in addition to [ t e^(-at) ], the function [ e^(-a1 t) - e^(-a2 t) ] also equals 0 at the origin and has one peak.
a) For polynomials you can define the convolutions
G_n = Int{0,t} b (t-tau)^n e^(-a(t-tau)) u'(tau) dtau
in which case
(d/dt + a) G_n) = n G_(n-1)
(d/dt + a) G_0) = b u' % as before
For a fourth degree polynomial with
y = [u u' G4 G3 G2 G1 G0]'
then after a straightforward process the odefun looks like
ydot= [ 0 1 0 0 0 0 0
-k/m 0 -1/m 0 0 0 0
0 b4 -a 1 0 0 0
0 b3 0 -a 1 0 0
0 2b2 0 0 -a 1 0
0 6b1 0 0 0 -a 1
0 24b0 0 0 0 0 -a] y + (F/m) cos(wt) [0 1 0 0 0 0 0]'
A better loooking result is obtained by rescaling the G's with
Gnew_n = Gold_n / (4-n)!
in which case
ydot= [ 0 1 0 0 0 0 0
-k/m 0 -1/m 0 0 0 0
0 b4 -a 1 0 0 0
0 b3 0 -a 2 0 0
0 b2 0 0 -a 3 0
0 b1 0 0 0 -a 4
0 b0 0 0 0 0 -a] y + (F/m) cos(wt) [0 1 0 0 0 0 0]'
b) An easier process is the sums of terms of the same type. For e.g. three exponentials the odefun is
ydot = [ 0 1 0 0 0
-k/m 0 -1/m -1/m -1/m
0 b1 -a1 0 0 ]
0 b2 0 -a2 0 ]
0 b3 0 0 -a3 ] y + (F/m) cos(wt) [0 1 0 0 0]'
  6 Comments
David Goodmanson
David Goodmanson on 19 Dec 2025 at 9:28
Edited: David Goodmanson on 19 Dec 2025 at 9:43
Hi Paul
Impressive agreement. I tried running your code (I have the Signal Processing toolbox) and got the following error message:
---------
Incorrect number or types of inputs or outputs for function 'tf'.
Error in ode_example1 (line 21)
[uimp,timp] = impulse(tf(double(coeffs(num,'all')),double(coeffs(den,'all'))),20);
--------------
and I guess it's saying it wants a digital filter object, I dunno.
Paul
Paul on 19 Dec 2025 at 13:13
Edited: Paul on 19 Dec 2025 at 20:29
Hi David,
I used the tf and impulse functions from the Control System Toolbox.
AFAIK, the Signal Processing Toolbox does not have a function to compute the impulse response of a continuous-time system. I guess the next best thing would be to extract the continuous-time transfer function coefficents as above and then use impinvar or bilinear to convert to discrete-time and then use impz for the impulse response.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!