3.20 find order and degree of highest derivative

I need to find the degree of the highest derivative in an ode.

For example, if the input is

\[ x \left (\frac {d^{2}}{d x^{2}}y \left (x \right )\right )^{5}+x \left (\frac {d^{2}}{d x^{2}}y \left (x \right )\right )^{2}+\left (\frac {d}{d x}y \left (x \right )\right ) y \left (x \right )+\left (\frac {d^{3}}{d x^{3}}y \left (x \right )\right )^{4} \sin \left (x \right )+5 y \left (x \right )+\sin \left (x \right )+\frac {d^{6}}{d x^{6}}r \left (x \right )+\left (\frac {d^{3}}{d x^{3}}y \left (x \right )\right )^{4} \cos \left (x \right ) = 0 \]

Then the degree for highest derivative of \(y\) w.r.t. \(x\) is 4. For

\[ y''(x)^2 + y'(x)+y(x)=0 \]
It will be 2.

This function returns the order and degree of such term.

 
find_all_derivatives_of_specific_order:=proc(expr,y::symbol,x::symbol,N::posint)::set; 
local t1,t2; 
 
if not has(expr,diff(y(x),x$N)) then 
   return {}; 
fi; 
 
t1  := identical(diff(y(x),x$N))^anything; 
t2  := identical(diff(y(x),x$N)); 
return indets[flat](expr,{t1,t2});  #MUST use flat 
 
end proc: 
 
get_order_and_degree_of_largest_derivative:=proc(expr,y::symbol,x::symbol)::integer,anything; 
local the_order,the_degree; 
local cand::set; 
local the_exponent; 
local item; 
 
    if not has(expr,diff(y(x),x)) then return 0,0; fi; 
    the_order := PDEtools:-difforder(expr,x); 
    cand       := find_all_derivatives_of_specific_order(expr,y,x,the_order); 
 
    if nops(cand)=0 then 
        the_degree := 0; 
    else 
        the_degree:=1; 
        for item in cand do 
            if type(item,`^`) then 
                the_exponent := op(2,item); 
                if type( the_exponent,symbol) or not type( the_exponent,numeric) then #assume larger 
                    the_degree :=the_exponent; 
                else 
                    if type(the_degree,symbol) or not  type( the_exponent,numeric) then 
                        next; 
                    else 
                        if op(2,item)>the_degree then 
                            the_degree := op(2,item); 
                        fi; 
                    fi; 
                fi; 
            else 
                if type(the_degree,symbol) then 
                    next; 
                else 
                    if the_degree=0 then 
                        the_degree := 1; 
                    fi; 
                fi; 
            fi; 
        od; 
    fi; 
 
    return the_order,the_degree; 
end proc:
 

And now it can be called as follows

ode:=diff(y(x),x$2)+diff(y(x),x)+y(x)=0; 
get_order_and_degree_of_largest_derivative(lhs(ode),y,x) 
 
    #2,1 
 
ode:=diff(y(x),x$2)*diff(y(x),x$2)^4+diff(y(x),x)+y(x)=0; 
get_order_and_degree_of_largest_derivative(lhs(ode),y,x) 
 
   #2,5 
 
ode:=y(x)=0; 
get_order_and_degree_of_largest_derivative(lhs(ode),y,x) 
 
   #0,0 
 
ode:=diff(y(x),x)^n=0; 
get_order_and_degree_of_largest_derivative(lhs(ode),y,x) 
 
   #1,n