Maple 2020 includes a very large number of improvements that strengthen the math engine, expanding Maple's abilities to handle new areas of mathematics and solve harder problems, faster. In addition to the advancements in ODEs/PDEs, graph theory, group theory, integral transforms, and other topics that are detailed elsewhere, there are also enhancements to fundamental routines that are used regularly both by customers and by other Maple commands.
assume, is, coulditbe, getassumptions, about
User friendly improvements to getassumptions
The getassumptions command now returns all assumptions directly or indirectly related to the variables in the input. now returns all assumptions directly or indirectly related to the variables in the input.
> |
In the following, the two assumption not directly involving are now also returned because together with the other assumption they provide extra information about , namely that is real and greater than 0. These facts cannot be inferred from the assumption alone.
> |
> |
assume can now handle generic Or-type assumptions
Previously Maple could only handle Or-type assumptions involving the same subexpression, such as:
Now, any conditions that can be assumed independently can also appear in an Or-type assumption:
> |
> |
> |
> |
is now makes calls to the SMTLIB package
The is command now makes use of SMTLIB:-Satisfy to help compute some answers involving real variables.
> |
> |
> |
> |
> |
Triangle Inequality:
> |
Other new results from is and coulditbe
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
> |
The following result used to be true. It now returns FAIL since is cannot determine if the property is always satisfied.
> |
about
This result from about is now simpler:
> |
Originally x, renamed x~: is assumed to be: RealRange(0,infinity) |
Maple can now compute asymptotic expansions for various mathematical functions of type with rational parameter values.
> |
> |
> |
ComputationalGeometry:-PointInPolygon
The new command PointInPolygon determines if a point lies within the polygon formed by a list of points.
> |
> |
> |
> |
> |
> |
> |
The new command evala/Minpoly computes the minimal polynomial of
> |
> |
> |
> |
> |
A subset of this functionality is also available through a new calling sequence in the MinimalPolynomial command in the PolynomialTools package.
> |
> |
Integration
There have been some improvements in integration of algebraic, elementary, and piecewise functions:
> |
> |
> |
> |
> |
> |
> |
> |
> |
Maple now performs this change of variables correctly.
> |
The integral transforms of the inttrans package have also added more functionality - see What's New in Integral Transforms.
The definition of the JacobiP function has been extended to cases when the 2nd or 3rd argument is a negative integer.
In Maple 2019 and earlier, the following used to return or unevaluated:
> |
> |
> |
> |
> |
The Logic package contains a number of new routines for understanding the structure of logical expressions.
Incidence graph and primal graph
The new IncidenceGraph and PrimalGraph command return Graph objects which encode the incidence graph and the primal graph of a logical expression.
If e is a Boolean expression in conjunctive normal form (CNF), the primal graph of e is a graph whose vertices are the variables of e. An edge exists between two variables if these variables occur together in a clause of e, in either negated or non-negated form.
In the following example, the variables a and b share an edge because they appear together in the first clause, while a and c do not share an edge because they appear in distinct clauses.
Similarly, if e is a Boolean expression in CNF, the incidence graph of e is a bipartite graph whose vertices correspond to the variables and clauses of e. Edges in the graph consist of pairs (v,c) where v is a variable and c is a clause, and clause c contains v in negated or non-negated form.
In the example seen earlier, the vertex Clause 1 shares edges with variables a, b, and d because each of these appears in the first clause of expr, but does not share an edge with c as it does not appear in this clause.
Symmetry group
The new SymmetryGroup command returns a Group object describing the group of symmetries of a logical expression.
Let e be a logical expression with variables . A symmetry is an which maps each variable to either or for some , while preserving the structure of e. Symmetry detection is an important problem in the simplification of logical expressions and especially in determining satisfiability, as a straightforward effort to find solutions for a highly symmetric expression could waste resources exploring paths which are the symmetric analogues of paths already visited.
In this example, we can see that the symmetry group of this logical expression has order 2:
The generators of the symmetry group correspond to variables and clauses of the input expression. If we wish to see the correspondence, we can request both the group and the expressions using the output option:
Examining the above output and comparing the elements of the first list with the generators of the symmetry group, we can see that the symmetry discovered here is the one which leaves variable unchanged but which maps to .
NumberTheory:-JordanTotient
The new JordanTotient command in the NumberTheory package computes the th Jordan totient of a positive integer , defined as the number of -tuples of positive integers such that the greatest common divisor is equal to . This generalizes the Euler totient, which is the special case in which .
> | with( NumberTheory ): |
> | seq( Totient( n ) = JordanTotient( 1, n ), n = 1 .. 10 ); |
> | seq( JordanTotient( 2, n ), n = 1 ..10 ); |
> | Matrix( 10, 10, JordanTotient ); |
The limit command has a new option parametric. If specified, limit will attempt to return a (piecewise) answer that is correct for all real parameter values.
> |
> |
Simplification
abs, csgn, signum, and sqrt have improved normalization and simplification:
> |
> |
> |
> |
> |
> |
> |
radnormal is now more careful at simplifying expressions containing roots of negative numbers:
> |
simplify is more careful not to expand powers, avoiding large expressions:
> |
There have been some improvements in simplification of special functions:
> |
> |
This sum can now be evaluated to a float due to an improvement in simplification of Psi of large integers:
> |
Trig simplifications have been improved:
> |
Some improvements in simplification of piecewise functions:
> |
> |
> |
simplify can now recognize that the following expressions are 0:
> |
> |
Combining expressions with trig functions is now more efficient in many cases:
> |
Miscellaneous
Some other miscellaneous improvements:
> |
> |
evalrC has been improved. The output means that abs(1/xy) can take values in the interval from 0+0*I to infinity+0*I.
> |
This result from isolate is now correctly expressed in terms of a RootOf:
> |
frontend is now more careful when recursing:
> |