File Exchange

image thumbnail

Euler-Lagrange tool package

version (75.4 KB) by Mischa Kim
Use the Euler-Lagrange equation to derive differential equations


Updated 24 Oct 2016

View License

Use the Euler-Lagrange tool to derive differential equations based on the system Lagrangian. The Lagrangian is defined symbolically in terms of the generalized coordinates and velocities, and the system parameters. Additional inputs are the vector of generalized forces and a Rayleigh-type dissipation function.

The function returns the vector field description of the differential equations and the associated MATLAB function and Simulink block. The MATLAB function and Simulink block are readily available in a form to be used with e.g. ode45 or in a Simulink model.

To check out the exact syntax and function definition type

>> help eulerlagrange

at the MATLAB command prompt, copy-paste one of the examples into the command window, and execute. As an example:

syms th thd g m l k
L = m*l^2*thd^2/2 + m*g*l*cos(th); % Lagrangian
X = {th thd}; % Vector of generalized coordinates
Q_i = {0}; Q_e = {0}; % No generalized forces
R = k*thd^2/2; % Friction term
par = {g m l k}; % System parameters
% Create symbolic differential equations …
% …and the corresponding 'm'ATLAB function and 's'imulink block
VF = EulerLagrange(L,X,Q_i,Q_e,R,par,'m','s');

Included in the tool package are two ready-made demos, a pendulum and an inverted rotary pendulum system. The pendulum demo shows the usage of the Euler-Lagrange tool from beginning to end. The rotary system is illustrated with a MATLAB and a Simulink demo. If the Simulink 3D Animation toolbox is available the system dynamics can be visualized in a VR world.

Note: Only MATLAB and the Symbolic Math Toolbox are required to use the tool. Simulink, Simulink 3D Animation, and the Aerospace blockset are recommended to run the demos with all the bells and whistles.

Compatibility: This function has been successfully tested with the following releases
- R2013a
- R2014a through R2016b

Cite As

Mischa Kim (2020). Euler-Lagrange tool package (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (17)

Fahad Raza

Agree with @Johannes Geisler. I faced the same problem and his solution worked. Thank you.

ram ram

Symbolic computation of EL is good


Index exceeds
array bounds.

Error in
(line 117)

Error in
(line 458)
VF =

can anyone explain why this error is repeatedly showing up??
what might be the problem??

i am getting an error in the reshape function (line 89).
X2n = reshape(X,[ ],2); %this line.
any help out there?

Works really good, had to change a little:
I had to swap in line 133 the subs to : VF = subs(VF,Y(indqqd(:)),Y);
Otherwise my coordinates didn't came out the way I threw them in.

Also I had to change in line 128 to ind(length(ind)/2+1:length(ind)); and in line 131 to ['[Y[kk] $ kk = 1..',num2str(length(ind)),']'];
so I wouldnt get an error when some functions turned out to be zero and thrown away by odeToVectorField

why would you try to use Functional Derivative of Vector of Functionals

Index exceeds matrix dimensions.

Error in EulerLagrange (line 116)
DE = [DE; simplify(L_qdotdt - L_qt + R_qtdot) == ...

Error in mathmodel (line 257)

I got this error while running. In my case i have use 10-variables in X cell

I have an issue. I am using MATLAB 2012b.
I am trying to solve the differential equations of a 3 DOF PUMA robot. I have the joint torques and I need to obtain the joint angles and joint velocities.
I have formulated the Lagrangian and while running the function, I am getting the following error:
Operands to the || and && operators must be convertible to logical scalar values.

Error in sym/subs>evalableY (line 231)
s = isnumeric(Y) || (iscell(Y) && all(cellfun(@(y)isnumeric(y)||isempty(y),Y)));

Error in sym/subs>tryFunctionHandle (line 177)
if ~evalableY(F,Y)

Error in sym/subs>mupadsubs (line 134)
[G,worked] = tryFunctionHandle(F,X,Y);

Error in sym/subs (line 119)
G = mupadsubs(F,X,Y);

Error in EulerLagrange (line 116)
L_qtdot = subs(L_qdot,X2n,Xt2n);

Error in ABCD (line 11)
vf = EulerLagrange(L,X,Q_i,Q_e,R,par,'m');
I would appreciate any help. I am in urgent need of a solution to this issue.

Mischa Kim

Eric, thanks for your feedback. What is the earlier version you are referring to?

Works great. For earlier MATLAB versions I find that I need to slightly modify EulerLagrange.m for it to work:
Line 86 initially has,
arrayfun(@(ii) symfun(['q' int2str(ii) '(t)']),t),1:numcoor,'UniformOutput',false);
The symfun part needs to be changed to,
symfun(sym(['q' int2str(ii) '(t)']))
for the code to work in older MATLAB versions.


Is it possible to input generalized forces, Q, that are functions of the generalized coordinates, X? I tried to do so, but the code throws an error unless the Q matrix is made up of variable names. I tried to assign the Q matrix later on, but then ode45 cannot properly solve the system of equations. Thank you!


Nice and easy to use!

Uber useful! Thanks!


Very nice tool!


Improved backward compatibility. This function now works with the following releases: R2013a, and R2014a through R2016b.

Replaced code fragments that will be removed in future MATLAB releases (creating symbolic variables from strings). Added support for internal and external generalized forces.

Minor update: the tool now accounts for the fact that odeToVectorField performs substitutions during conversion. As a result, the order of the created differential equations now matches the order of the state vector components.

Fixed another typo

This version also accounts for Rayleigh-type dissipation functions

Added tool picture.

MATLAB Release Compatibility
Created with R2016b
Compatible with any release
Platform Compatibility
Windows macOS Linux