Release Notes for 1.9  sympy/sympy Wiki
These are the release notes for SymPy 1.9. You can also find release notes for previous versions.
SymPy 1.9 was released on 9th October 2021
This version of SymPy has been tested on Python 3.6, 3.7, 3.8, 3.9, 3.10 and PyPy. See our Python version support policy for more information on when we plan to drop support for older Python versions.
Note in particular that SymPy 1.5.1 was the last release to support Python 2.7. SymPy 1.9 will not work on Python 2.7. Python 2.7 users should install SymPy 1.5.1 and will not be able to install any further SymPy updates without updating to Python 3.
Install SymPy with
pip install U sympy
or if you use Anaconda
conda install sympy
Highlights

The internal implementation of Matrix and other matrix classes (SparseMatrix etc) is now DomainMatrix. The ZZ and QQ domains are used for matrices with only integer or rational elements. Otherwise the new EXRAW domain is used. This should be backwards compatible although many internal methods and attributes are changed. At the time of this change the DomainMatrix routines are only used for addition and multiplication of matrices and some other simple lowlevel operations. Further changes will use DomainMatrix routines for operations like
rref
,det
,lu
etc and are expected to lead to big speedups for these computations. At this stage those big speedups are not realised but some basic operations such as indexing a matrix likeM[0, 0]
could potentially be slower. The new implementation can be much faster for most operations and is expected to lead to significant speed ups over the next few SymPy releases. (#21626 by @oscarbenjamin) 
Leading term methods now raise
PoleError
at singularities. There was a longstanding issue of incorrect handling of leading term at singularities, where earlier, for compatibility reasons, the original expression itself was incorrectly returned.exp(1/x).as_leading_term(x)
returnedexp(1/x)
, but it does not have any leading term as x>0, so an error must be raised. Note thatleadterm
used to throw aValueError
even in the previous implementation as the original expression depends on the symbolx
. A few examples of functions where this change would be visible Pow
,exp
,log
,factorial
andgamma
. (#21589 by @0sidharth)
There are many changes in 1.9 (see below).
Backwards compatibility breaks and deprecations
Please manually add any backwards compatibility breaks or deprecations here, in addition to the automatic listing below.
There are a number of changes and deprecations listed below. Most of these are really internal changes but they are listed here because in some cases it is hard to know if e.g. a downstream library has subclassed a SymPy class and modified its internals in an unexpected way. Few of the changes affect documented usage of SymPy.

The next version of SymPy will be 1.10. If your code checks
sympy.__version__
be sure it will handle this version properly. 
assumptions

CHANGE: The
func
property ofAppliedPredicate
returnsAppliedPredicate
class instead of unapplied predicate object. User must usefunction
property to get the predicate. (#20847 by @JSS95 and @oscarbenjamin) 
CHANGE: The
args
property ofAppliedPredicate
returns unapplied predicate object and arguments. User must usearguments
property to get the arguments without the unapplied predicate. This breaks backwards compatibility. (#20847 by @JSS95 and @oscarbenjamin)


core

CHANGE:
rewrite()
method is redesigned. It is now encouraged to define_eval_rewrite()
method instead of_eval_rewrite_as_[...]()
method. @JSS95 
_rewrite()
method is defined forBasic
. If user code had defined_rewrite()
method, this change may raise backwards incompatibility issue.


functions

integrals
 DEPRECATION: Using
laplace_transform
with aMatrix
and without passingnoconds=True
is now deprecated. The behaviour of this function will change in future to return the conditions separately from the Matrix. The new behaviour can be obtained by passing the keyword argumentlegacy_matrix=False
. (#21496 by @oscarbenjamin)
 DEPRECATION: Using

matrices

DEPRECATION: Using nonExpr elements in a Matrix is now deprecated. (#21496 by @oscarbenjamin)

INCOMPATIBLE CHANGE: The
smith_normal_form
function now requires an ordinaryMatrix
as input rather than aRawMatrix
. (#21402 by @oscarbenjamin) 
INCOMPATIBLE CHANGE: The
RawMatrix
class has been removed. UseMatrix
,DomainMatrix
orPolyMatrix
instead depending on the application. (#21402 by @oscarbenjamin)


physics.matrices
 DEPRECATION:
mdft
was deprecated, useDFT
frommatrices.fourier
instead. See #20246.
 DEPRECATION:

polys
 INCOMPATIBLE CHANGE: The (internal) PolyMatrix class has been changed and now requires generators to be provided on construction. (#21441 by @oscarbenjamin)

stats

INCOMPATIBLE CHANGE:
sample
now returns samples as float and arrays instead of an iterator. This restores and extends the behavior from SymPy 1.6 which was changed to an iterator in 1.7. Usesample_iter
to get an iterator consistently in all versions of SymPy. (#21590 by @mostlyaman) 
DEPRECATION:
numsamples
parameter insample
function is now deprecated. The parameter was added in SymPy 1.7 and continues to work but will emit a DeprecationWarning. The parameter will be removed in a future release. (#21590 by @mostlyaman)

Changes

algebras
 Added evalf method for Quaternion Class (#21806 by @praneethratna)

assumptions

func
property ofAppliedPredicate
returnsAppliedPredicate
class instead of unapplied predicate object. User must usefunction
property to get the predicate. This breaks backwards compatibility. (#20847 by @JSS95 and @oscarbenjamin) 
args
property ofAppliedPredicate
returns unapplied predicate object and arguments. User must usearguments
property to get the arguments without unapplied predicate. This breaks backwards compatibility. (#20847 by @JSS95 and @oscarbenjamin)

Q.positive_infinite()
andQ.negative_infinite()
predicates are introduced. (#21279 by @JSS95) 
Q.extended_positive()
,Q.extended_negative()
,Q.extended_nonzero()
,Q.extended_nonpositive()
, andQ.extended_nonnegative()
predicates are introduced. (#21279 by @JSS95) 
Q.positive()
andQ.negative()
now correctly implies the argument being finite. (#21279 by @JSS95) 
Incorrect results from
Q.hermitian()
andQ.antihermitian()
are fixed. (#21279 by @JSS95)


calculus

codegen

More capable rewriting of terms such as
2*exp(x) + 3*exp(y)  5
into2*expm1(x) + 3*expm1(y)
. (#21608 by @ArunSanganal, @bjodah, and @smichr) 
Fixed a bug in the code optimization for
expm1
(#21531 by @lcontento)


core
 Fixed unpickling of pickles created using older versions (<1.9) of SymPy. (#22245 by @oscarbenjamin)

A bug that preventing
Float
from being unpickled in SageMath was fixed. (#21996 by @mkoeppe) 
The
_sage_
SymPy/Sage interface methods are no longer included with SymPy, but are now initialized on the first use of a_sage_
method from within Sage. (#21958 by @mkoeppe and @oscarbenjamin) 
better detection of odd/even/integer for expressions with symbolic powers of even bases (#21952 by @smichr)

Fixes
PoleError
by invokingaseries()
whenseries()
fails (#21948 by @PKshitij) 
Fixed issue where
is_integer
returned incorrectly for multiplications. (#21928 by @oscargus) 
Rational**Rational
works better for large numbers. (#21900 by @oscargus)
 Fix the internal caching code to not run a cached function twice if it raises a TypeError. (#21799 by @asmeurer)

rewrite()
method is redesigned. It is now encouraged to define_eval_rewrite()
method instead of_eval_rewrite_as_[...]()
method. If user code had overridden_eval_rewrite()
method, this change may raise backwards incompatibility issue. (#21472 by @JSS95) 
_rewrite()
method is defined forBasic
. If user code had defined_rewrite()
method, this change may raise backwards incompatibility issue. (#21472 by @JSS95) 
Add missing bitwise operator implementations to sympy.core.numbers.Integer and register with numbers.Integral (#21699 by @posita)

Pow._eval_as_leading_term
now raisesPoleError
when the argument is unbounded (#21589 by @0sidharth) 
leadterm
now takeslogx
argument (#21589 by @0sidharth) 
kind attribute of Derivative class now returns the kind of its argument (#21614 by @Davidesd)

check_assumptions
now properly tests against 0 (#21586 by @smichr) 
Leading term methods of
Add
andPow
now simplify irrational and imaginary expressions (#21253 by @0sidharth) 
_keep_coeff
will distribute coeff on nonrational if doing so does not produce a rational (#21518 by @smichr) 
replace uses exact equality testing so 0.5 can be changed to 1/2 (#21508 by @smichr)

Rational exponents of I are now less than 2 (#21400 by @smichr)

Catch
PolynomialError
forPiecewise
expressions inMod
(#21379 by @craymichael) 
Fixed pickling for a number of Basic subclasses (such as a Symbol with assumptions) for protocol 2 or higher. Removed support for pickling with protocol 0 or 1. (#21260 by @oscarbenjamin)

is_ge
,is_le
,is_gt
,is_lt
now takes assumptions (#21309 by @JSS95)

sympify()
now obeys evaluate flag in case of iterable inputs. (#21553 by @mostlyaman) 
Eq
andNe
can be refined by predicates such asQ.positive
,Q.zero
, etc. (#21203 by @JSS95)

diffgeom

CoordinateSymbol
now can be rewritten to the expression containing the coordinate symbols of other coordinate system. (#21781 by @JSS95) 
Bug in indirect transformation between coordinate systems is fixed. (#21476 by @JSS95)

Transform relation between coordinate systems now consists of two tuples instead of
Lambda
. (#21476 by @JSS95) 
Fixed a bug in the
CoordSystem._inverse_transformation
method. (#21366 by @Halfogerty)


external
 No longer use deprecated distutils. Previously a deprecation warning was seen when importing sympy on Python 3.10. (#22039 by @oscarbenjamin)

functions
 Improve sign(..., evaluate=False).doit(). (#22112 by @eagleoflqj and @oscarbenjamin)

Added
polylog
nseries expansion (#21775 by @0sidharth) 
Fixes bug in
erf
nseries expansion leading to wrong number of terms (#21775 by @0sidharth) 
log
leading term method handleszoo
better, thus raises more often (#21775 by @0sidharth) 
binomial
leading term method added (#21775 by @0sidharth) 
Fixed bugs related to direction in
floor
andceiling
leading terms (#21731 by @0sidharth) 
Fixed bugs in
sinh
andcosh
leading terms (#21731 by @0sidharth) 
Added
Ei
,Ci
,Shi
,Chi
leading term methods (#21731 by @0sidharth) 
sin
andcos
now returnAccumBounds(1, 1)
as the leading term at real infinities (#21731 by @0sidharth) 
exp
,factorial
andgamma
._eval_as_leading_term
now raisesPoleError
when the argument is unbounded (#21589 by @0sidharth) 
Add
LambertW
,erfi
,fresnels
,fresnelc
andSingularityFunction
leading term methods (#21589 by @0sidharth) 
Add
SingularityFunction
power series expansion (#21589 by @0sidharth) 
Fixed
besselj
andbessely
leading term methods (#21589 by @0sidharth) 
Implemented expand_trig for csch, sech and coth (#21567 by @LucyMountain and @smichr)
 The derivatives of sinc(x) no longer return Piecewise results, which were previously incorrect at x=0. The value of the derivatives at x=0 can be computed with
limit
. (#21568 by @asmeurer)

doit/simplify should no longer be needed to evaluate limits after Piecewise integration in some cases (#21554 by @smichr)

Leading term methods of
tan
andcot
now work for angles outside their principle domain (#21253 by @0sidharth) 
Fixed a bug in MaxMin of elementary functions (#21547 by @shashankks0987 and @smichr)

expand_trig
no longer expands functions with integer args, e.g. cos(2) is unchanged (#21507 by @oostben and @smichr) 
Add _eval_expand_trig method for tanh. (#21380 by @oostben and @smichr)

Heaviside(0) now returns 1/2 instead of being undefined. (#21452 by @hanspi42)

holonomic
 The holonomic module now uses
DomainMatrix
instead ofNewMatrix
. TheNewMatrix
class is removed. (#21427 by @oscarbenjamin)
 The holonomic module now uses

integrals

inverse_laplace_transform
can now transform a wider range of rational functions (#21566 by @hanspi42) 
laplace_transform(DiracDelta(t),t,s)
now gives 1 as expected. (#21469 by @hanspi42) 
DEPRECATION: Using
laplace_transform
with aMatrix
and without passingnoconds=True
is now deprecated. The behaviour of this function will change in future to return the conditions separately from the Matrix. The new behaviour can be obtained by passing the keyword argumentlegacy_matrix=False
. (#21496 by @oscarbenjamin) 
Fixed a bug in the heurisch module (#21404 by @jainachal03)

The heurisch integration routine was made faster. (#21354 by @oscarbenjamin)


interactive
 Enable tab completion with
isympy c python
. (#21719 by @stevenleeS0ht)
 Enable tab completion with

logic

subs
works better when replacing parts of a Boolean expression. (#21976 by @oscargus and @smichr) 
Pattern based logic simplification is actually used when doing
simplify
with relations. (#21854 by @oscargus) 
Improved logic simplification, dealing better with some symmetric cases and always producing consistent results. (#21854 by @oscargus)

The relational simplification no longer results in symbolic
Min
/Max
. (#21854 by @oscargus) 
Fixed simplification bug when equalities contained certain nonlinear expressions. (#21873 by @oscargus and @smichr)


matrices

A bug that raised an exception when inverting an explicit matrix derived from a
MatrixSymbol
was fixed. (#20691 by @oscarbenjamin, @sidhu1012, and @Upabjojr) 
fixed bug in is_positive_semidefinite() in eigen.py. (#21901 by @praneethratna)

The internal implementation of Matrix and other matrix classes (SparseMatrix etc) is now DomainMatrix. The ZZ and QQ domains are used for matrices with only integer or rational elements. Otherwise the new EXRAW domain is used. This should be backwards compatible although many internal methods and attributes are changed. At the time of this change the DomainMatrix routines are only used for addition and multiplication of matrices and some other simple lowlevel operations. Further changes will use DomainMatrix routines for operations like
rref
,det
,lu
etc and are expected to lead to big speedups for these computations. At this stage those big speedups are not realised but some basic operations such as indexing a matrix likeM[0, 0]
could potentially be slower. The new implementation can be much faster for most operations and is expected to lead to significant speed ups over the next few SymPy releases. (#21626 by @oscarbenjamin) 
DEPRECATION: Using nonExpr elements in a Matrix is now deprecated. (#21496 by @oscarbenjamin)
 Added
Matrix.strongly_connected_components
andMatrix.strongly_connected_components_decomposition
for computing block triangulation of the matrix. (#21474 by @sylee957)
 The
smith_normal_form
function now expects in ordinaryMatrix
as input rather than aRawMatrix
(#21402 by @oscarbenjamin)


ntheory

Updated wiki link for describing deterministic MillerRabin test (#21765 by @jeffro256)

primerange
now accepts a single argument, a, which gives the range [2, a) (#21321 by @smichr)


parsing
 Support evaluate=False for common functions in parse_expr. (#22112 by @eagleoflqj and @oscarbenjamin)

physics.continuum_mechanics

Added ability to find maximum shear force, bending moment and deflection in Beam3D class (#21919 by @PsychoPirate)

Added ability to plot shear stress in Beam class and Beam3D class (#21877 by @PsychoPirate)

Added ability to calculate and plot I.L.D. Moment Equations (#21871 by @PsychoPirate)

Added ability to calculate and plot I.L.D. Shear Equations (#21810 by @PsychoPirate)

Added ability to calculate and plot I.L.D. Reaction Equations (#21714 by @PsychoPirate)

Added ability to plot all loading results in Beam3D class (#21648 by @PsychoPirate)

Added ability to plot deflection in Beam3D class (#21640 by @PsychoPirate)

Added ability to plot slope in Beam3D class (#21583 by @PsychoPirate)

Added ability to plot bending moment in Beam3D class (#21582 by @PsychoPirate)

Created the
handle_end
function to remove redundant duplicate code in theapply_load
andremove_load
functions. (#21248 by @angadsinghsandhu)


physics.control

Added
MIMOFeedback
class to support closedloop MIMO systems. (#21833 by @akshanshbhatt) 
Added common plots related to control theory. (#21763 by @akshanshbhatt and @namannimmo10)

Added Series and Parallel configuration's support for MIMO systems (
MIMOSeries
andMIMOParallel
classes). (#21703 by @akshanshbhatt) 
Added
TransferFunctionMatrix
class in physics.control (#19761 by @namannimmo10) 
Added
TransferFunctionMatrix
class, enabling support for MIMO systems. (#21653 by @akshanshbhatt and @namannimmo10) 
to_expr
method added inTransferFunction
for convertingTransferFunction
to sympy expr. (#21634 by @akshanshbhatt and @namannimmo10) 
from_rational_expression
classmethod added for creatingTransferFunction
objects directly from rational expressions. (#21634 by @akshanshbhatt and @namannimmo10)


physics.matrices

physics.mechanics

JointsMethod
is implemented to formulate equations of motion using Body and Joint objects. (#21759 by @sahilshekhawat and @sidhu1012) 
Add
.loads
andbodies
property toKanesMethod
andLagrangesMethod
. (#21759 by @sahilshekhawat and @sidhu1012) 
is_rigidbody
property is added to classBody
. (#21759 by @sahilshekhawat and @sidhu1012) 
KanesMethod
can now take body list and force list in object instantiation. (#21778 by @sidhu1012) 
KanesMethod.kanes_equations
both parameters are optional and can be taken automaticaly if they are passed at object instantiation. (#21778 by @sidhu1012) 
.bodies
attribute is added toKanesMethod
which is advised to use instead of.bodylist
attribute. (#21778 by @sidhu1012) 
Update
apply_force
function of classBody
to apply force on one body, or equal and opposite forces on two bodies. (#21712 by @sidhu1012) 
Update
apply_torque
function of classBody
to apply torque on one body, or equal and opposite torques on two bodies. (#21712 by @sidhu1012) 
Body.loads
is now an immutable attribute. (#21712 by @sidhu1012) 
Add
clear_loads
function to classBody
to clear Body's load list. (#21712 by @sidhu1012) 
Add
remove_load
function toBody
to remove a load from Body's load list. (#21712 by @sidhu1012) 
Implemented a PrismaticJoint class that generate the kinematics of a prismatic joint. (#21674 by @sidhu1012)

Joint class is implemented which could be inherited to create custom joints. (#21564 by @moorepants, @sahilshekhawat, and @sidhu1012)

PinJoint has been implemented which can form KDEs, orient frames, set linear and angular velocities all by itself. (#21564 by @moorepants, @sahilshekhawat, and @sidhu1012)

Add basis vectors to
Body
. (#21700 by @sidhu1012) 
Add
masscenter_vel()
to classBody
to calculate velocity of one body's masscenter wrt other body's frame. (#21689 by @sidhu1012) 
Add
ang_vel_in()
to classBody
to calculate angular velocity of one body's frame wrt other body's frame. (#21689 by @sidhu1012) 
Add
dcm()
to class Body to calculate dcm of one body's frame wrt other body's frame. (#21689 by @sidhu1012)


physics.quantum

physics.vector

Vector.angle_between()
has a new sectionWarnings
. (#21749 by @sidhu1012) 
Vector.magnitude()
has a new sectionWarnings
. (#21749 by @sidhu1012) 
Point.vel()
checks velocity in intermediate frames before taking derivative of position vector. (#21730 by @sidhu1012) 
The
orient_axis()
works if the order of axis and angle is swapped. (#21662 by @sidhu1012) 
Added a new function,
angle_between
to Vector class to calculate angle between two vectors. (#21600 by @sidhu1012) 
Warning is raised if orientation of frames is looped. (#21436 by @sidhu1012)

Reference frames can be oriented in arbitrary order. (#21271 by @sidhu1012)


plotting
 Automatic line coloring (#21256 by @Davidesd)

polys

Fixed a bug in itermonomials when using min_degrees argument (#21847 by @sebastianeast)

Polynomial rings involving
E
can now recognise functions likeexp(3)
as being the powerE**3
. (#21835 by @gautammenghani and @gum3ng)

Made
DomainMatrix.hstack
,DomainMatrix.vstack
andDomainMatrix.unify
work with Nary arguments. (#21755 by @sylee957) 
Made
DDM.hstack
andDDM.vstack
work with nary arguments (#21745 by @sylee957)

The (internal) PolyMatrix class has been changed and now requires generators to be provided on construction. (#21441 by @oscarbenjamin)

_minpoly_tan
method is added for calculating minimal polynomial for tan(n*pi), if n is rational. (#21442 by @hyadav2k)

The
RawMatrix
class has been removed. UseMatrix
,DomainMatrix
orPolyMatrix
instead depending on the application. (#21402 by @oscarbenjamin) 
The accuracy of the
minpoly
algorithm was improved to handle complicated algebraic expressions more reliably. (#21370 by @oscarbenjamin) 
from_Matrix choose internal representation automatically from DDM and SDM (#21322 by @ks147)

added a function ones to DomainMatrix and DDM class (#21106 by @ks147)

gcd over the Gaussian integers (
ZZ_I
) is now canonicalised with respect to multiplication byI
. (#21353 by @oscarbenjamin) 
The polynomials module now only supports using gmpy2 as an accelerator for the
ZZ
andQQ
domains (gmpy 1.x is no longer supported). (#21016 by @oscarbenjamin) 
roots_quintic
better detects nonrational coefficients (#21276 by @smichr) 
roots_cubic
results are simpler for cubics that can be written (or rewritten) asx**3 + y = 0
(#21276 by @smichr) 
cornercase bugs fixed in
to_rational_coeffs
(#21276 by @smichr)


printing
 Fix
help()
not displaying the docstring for various printing functions (latex
,sstr
, etc.). (#22038 by @oscarbenjamin)

FiniteSet
now prints as{...}
instead ofFiniteSet(...)
in the string printer, unless it contains aFiniteSet
. (#21931 by @oscargus) 
Corrected LaTeXprinting of
Bd
etc fromphysics.secondquant
(#21930 by @oscargus) 
Fixed a bug in _print_LambertW when LambertW function is raised to some power (#21849 by @BalasubramanyamEvani)

Fixed issue with generating latex for some unevaluated negative powers of rational numbers. (#20264 by @theanshm)

fixed parenthesizing issue of denominators that are powers (#21612 by @ArunSanganal)

NumExprPrinter
now properly supports expressions containingITE
(#21386 by @craymichael) 
fixed bug that caused factors in unevaluated expressions to be swapped (#21390 by @dsaw and @smichr)

powers with negative signs in the exponent are now printed in the denominator (#21390 by @dsaw and @smichr)

parentheses no longer appear on first factors in unevaluated Mul that have a negative sign (#21390 by @dsaw and @smichr)

Amended a test case of
TheanoPrinter
constant and complex functions (#20500 by @craymichael)
 Fix

series

Limit
now throwsNotImplementedError
if the point contains the variable wrt which limit is being found (#21775 by @0sidharth) 
Limit code has better handling of
sign
(#21589 by @0sidharth)


sets

Better support for symbolic
Range
. (#21932 by @oscargus and @smichr) 
Fixed a bug in is_subset() (#21596 by @shashankks0987 and @smichr)

Fixed a bug in is_subset() (#21580 by @shashankks0987)

Range involving symbols will be made more canonical (correcting a bug in calculation of
sup
) and errors will be raised when trying to compute attributes that are not known due to limitations of assumptions on the arguments. (#21286 by @smichr) 
imageset involving Integers will not make linear expressions canonical when they contain Floats (#21313 by @smichr)


simplify

fixed bug in radsimp. (#21887 by @praneethratna)

cse
will no longer generate an error when passed an unevaluated 2arg Mul with a Rational arg (#21518 by @smichr); in addition the expression can be returned as the same type of the input with keywordlist=False
(#21546 by @robinechuca 
bottom_up uses exact equality testing so 0.5 can be changed to 1/2 (#21508 by @smichr)

use of
force=True
withpowdenest
is more effective (#21432 by @smichr) 
Modified the Fu transformation
_TR56
to handle odd powers (#21332 by @meganly)


solvers

use of
match
was removed to make solving more reliable (#22079 by @Maelstrom6 and @smichr) 
nonlinsolve properly handles instances of Eq in systems of equations (#21989 by @alijosephine and @smichr)

fixed a bug in nonlinsolve() method in solveset. (#21929 by @praneethratna)

fixed bug in solvers.polysys (#22005 by @praneethratna)

A bug when splitting separable systems of equations in solve was fixed. (#21883 by @oscarbenjamin and @smichr)

Better handling of
Piecewise
ofPiecewise
insolveset
. (#21924 by @oscargus) 
fixed bug in solvers.solve_linear (#21862 by @praneethratna)

dsolve
: A new solver for Riccati ODEs has been added. Riccati ODEs which have atleast one rational particular solution can now be solved. This solver is a step towards Kovacic's algorithm for second order linear homogeneous ODEs. (#21459 by @naveensaigit) 
nonlinsolve
now recognizes Equalities that may already be true or false (#21602 by @shashankks0987 and @smichr) 
Added a new solver, Minisat22, for the satisfiability problem (#21510 by @migueltorrescosta)

Some bugs in the new implementation of linsolve are fixed by the dense RREF implementation instead of the sparse implemention. These bugs previously led to incorrect results being returned linsolve. (#21527 by @oscarbenjamin)

Refactor exact EDO solving into the FirstExact class. (#21124 by @habitzreuter and @invalidemailaddress)

Fixed bug in solveset (#21326 by @ljohnston and @smichr)

Fixed a bug where solving Liouville ODE with multiple terms fails. (#21327 by @YaserAlOsh)

unrad
better detects radicals to be removed even when they are hidden as bases of rational powers (#21276 by @smichr) 
unrad
no longer makes the highest order term positive when making sign canonical (#21276 by @smichr) 
_has_rational_power
(a private function) is no longer used and is removed (#21276 by @smichr) 
_solve_as_rational
now fully expands the expression to be solved (#21276 by @smichr) 
the signature of
_solve_radical
was changed to accept the unrad form of f (#21276 by @smichr) 
_solveset
will now useunrad
to see if an equation needs to use_solve_radical
before doing so (#21276 by @smichr) 
solveset
now usesfactor
as a lastresort (#21276 by @smichr)


stats

Added support for positive semidefinite covariance matrix in joint Multivariate normal distribution. (#21817 by @praneethratna)

Fixed a bug regarding symbolic arguments to the multivariate normal distribution. (#21650 by @InfProbSciX)

BACKWARDS COMPATIBILITY:
sample
now returns samples as float and arrays instead of an iterator. This restores and extends the behavior from SymPy 1.6 which was changed to an iterator in 1.7. Usesample_iter
to get an iterator consistently in all versions of SymPy. (#21590 by @mostlyaman) 
DEPRECATION:
numsamples
parameter insample
function is now deprecated. The parameter was added in SymPy 1.7 and continues to work but will emit a DeprecationWarning. The parameter will be removed in a future release. (#21590 by @mostlyaman) 
PyMC3 library implementation in
sample
function has been fixed. (#21590 by @mostlyaman)


tensor
 Fix bug with arrays of rank 0 getting promoted to arrays of rank 1 (#21875 by @JasonSRoss)

utilities

Fixed bug in iterables.py and now multiset_permutations can handle [] (#21864 by @praneethratna and @smichr)

Add
cse
argument tolambdify
. (#21546 by @bjodah, @Nornort, @robinechuca, and @smichr)
