# How can I determine the order of a symbolic differential equation?

9 views (last 30 days)
Bill Tubbs on 24 Jul 2020
Commented: Paul on 2 Apr 2023
I'm writing a function that takes a differential equation in symbolic form as an argument and I want to determine the order of the equation in terms of certain variables.
Example 1 A first-order system:
syms t s y(t) u(t) R L
diff_eqn = R*y(t) + L*diff(y(t), t) == u(t); % differential equation
The order (w.r.t. y(t)) is 1.
Example 2 A second-order system:
syms t s y(t) u(t) omega_n z K
diff_eqn = 1/omega_n^2*diff(y(t), t, 2) + 2*z/omega_n*diff(y(t), t) + y(t) == K*u(t);
The order is 2.
I would also like to know the order w.r.t. u(t) if possible as well which in general might not be 0.

Ayush Gupta on 10 Sep 2020
There doesn’t exist a direct function to determine the order of a differential equation. However, there is a workaround, and we can use the reduceDifferentialOrder and get newvars from where we can get the last element and see the occurrence of t and this is one plus than the order of equation. Refer to the following code:
syms x(t) y(t) f(t)
eqs = [diff(x(t),t,t) == diff(f(t),t,t,t), diff(y(t),t,t,t) == diff(f(t),t,t)];
vars = [x(t), y(t)];
[newEqs, newVars, R] = reduceDifferentialOrder(eqs, vars)
l = length(newVars);
s = string(newVars(l,1));
order_of_equation = count(s, 't') -1;
Paul on 2 Apr 2023
It's a bit easier if dealing wth ODEs as in the Question, at least to find the order of the ODE
syms t s y(t) u(t) R L
diff_eqn = R*y(t) + L*diff(y(t), t) == u(t) % differential equation
diff_eqn =
%The order (w.r.t. y(t)) is 1.
numel(odeToVectorField(diff_eqn))
ans = 1
% Example 2 A second-order system:
syms t s y(t) u(t) omega_n z K
diff_eqn = 1/omega_n^2*diff(y(t), t, 2) + 2*z/omega_n*diff(y(t), t) + y(t) == K*u(t)
diff_eqn =
numel(odeToVectorField(diff_eqn))
ans = 2
Finding the order wrt u(t) would take more work.

Ganesh on 1 Apr 2023
Edited: Walter Roberson on 1 Apr 2023
function order = order_polynomial(poly1,x)
count=0;
temp=1;
while(temp~=0)
poly1=diff(poly1,x);
if poly1==0
temp=0;
else
count=count+1;
end
end
disp(count);
end
Ganesh on 1 Apr 2023
this is for finding the order of polynomial function
Walter Roberson on 1 Apr 2023
You can use coeffs to get the information without a loop

Walter Roberson on 1 Apr 2023
Moved: Walter Roberson on 1 Apr 2023
p = poly2sym(randi([-9,9],1,randi(15)))
p =
poly_degree = length(coeffs(p,'all'))-1
poly_degree = 6
##### 3 CommentsShow 1 older commentHide 1 older comment
Paul on 1 Apr 2023
If the coefficient vector is double there's no need to go the Symbolic route.
rng('default')
c = 1×16
0 0 0 8 -7 8 3 -8 -4 1 9 9 -7 9 9 0
tic
for ii = 1:1e3
p = poly2sym(c);
poly_degree_s = length(coeffs(p,'all'))-1;
end
toc
Elapsed time is 2.962911 seconds.
tic
for ii = 1:1e3
poly_degree_d = numel(c) - find(c,1,'first');
end
toc
Elapsed time is 0.004062 seconds.
[poly_degree_s poly_degree_d]
ans = 1×2
12 12
Walter Roberson on 2 Apr 2023
@Paul is of course correct that if you have a vector of coefficients then the difference between the length of the vector and the position of the first non-zero tells you about the degree.
However... the original question deals with symbolic polynomials. My creation of p with intermediate numeric form was just to have some polynomial to work with, and to demonstrate that I my code worked with polynomials of different degrees, not just something that "happened" to work with a particular length.

### Categories

Find more on Numeric Solvers in Help Center and File Exchange

R2019b

### Community Treasure Hunt

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

Start Hunting!