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

11 Ansichten (letzte 30 Tage)
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.

Akzeptierte Antwort

Ayush Gupta
Ayush Gupta am 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;
  1 Kommentar
Paul
Paul am 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Ganesh
Ganesh am 1 Apr. 2023
Bearbeitet: Walter Roberson am 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
  2 Kommentare
Ganesh
Ganesh am 1 Apr. 2023
this is for finding the order of polynomial function
Walter Roberson
Walter Roberson am 1 Apr. 2023
You can use coeffs to get the information without a loop

Melden Sie sich an, um zu kommentieren.


Walter Roberson
Walter Roberson am 1 Apr. 2023
Verschoben: Walter Roberson am 1 Apr. 2023
p = poly2sym(randi([-9,9],1,randi(15)))
p = 
poly_degree = length(coeffs(p,'all'))-1
poly_degree = 6
  3 Kommentare
Paul
Paul am 1 Apr. 2023
If the coefficient vector is double there's no need to go the Symbolic route.
rng('default')
c = [0 0 0 randi([-9,9],1,randi(15))] % add some leading zeros
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
Walter Roberson am 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.

Melden Sie sich an, um zu kommentieren.

Produkte


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by