Advanced Math - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim


Advanced Math Improvements in Maple 2023

Maple 2023 includes many improvements to the math engine.  In addition to those described on this page, Maple 2023 includes a new package for Quantifier Elimination and updates to the Graph Theory package.

 

Better answers for indefinite integrals of algebraic functions

Enhanced 'method' option for indefinite integrals

Better assumption support of MeijerG integrals

Support in solve for element-wise equations of rtables

Polyhedral sets

New support for Z-polyhedral sets

Improvements to parametric limits on branch cuts

New certified univariate complex solver

New method option for fsolve, for a univariate polynomial

New method option for fsolve, for a univariate non-polynomial equation

New support for lazy multivariate Puiseux series

Better answers for indefinite integrals of algebraic functions

• 

The int command now uses Blake's heuristic to look for substitutions to find elementary forms for certain algebraic integrands. Blake's method works by considering algebraic function integrands of the form pxrxnmqx and then searching for substitutions (by solving systems of linear equations) that can put the integral into a simpler form, e.g. pxrxnmqxⅆx=vuau+bmwuⅆu, for which compact elementary answers can often be easily computed.

• 

Blake's heuristic has been available since Maple 2022 via the option method=pseudoelliptic but it is now tied directly into the default methods for computing integrals of algebraic functions.

Examples

• 

The following examples produced a very complicated expression in earlier versions of Maple, but now produce a simple, elementary answer.

• 

This is an example where in Maple 2022 the default answer comes from the elliptic integration method, and the answer is in terms of elliptic functions and is quite long.

intx32x31x3+1x3+x2+1,x,method='elliptic'

2I3Ix12I323x+132+I32−Ix12+I323EllipticF3Ix12I3233,I332+I323x31+I2_α=RootOf_Z3+_Z2+1_αI21+2xI3x+13+I3I21+2x+I3_α2+3+I3_α22_α1EllipticPi3Ix12I3233,3_α22+3_αI_α232+32+3I32,I332+I32x31

(1)
• 

In Maple 2023 the answer is elementary and compact.

∫x32x31x3+1x3+x2+1ⅆx

2arctanhx31x

(2)
• 

In Maple 2022 the following integral produced an answer in terms of elliptic functions and RootOfs of length 790119, but now the answer is elementary and very compact.

∫x4+x3+1x42x3+1x4+2x31x4+2x3+x21ⅆx

arctanhx42x3+1x

(3)
• 

Finally, here is a fairly long integral with a compact new answer in Maple 2023. method=elliptic shows the answer previously returned in Maple 2022.

∫x3+2112x64x5+3x4224x3+4x2+1122x3+x2212x416x68x5x432x3+8x2+16ⅆx

95212495x36+22arctanh22x3+x22x622+x32+12495arctanh22x3+x22x6+221122x3+x22x3+5328x216+2228562286226+22x3

(4)

intx3+2112x64x5+3x4224x3+4x2+1122x3+x2212x416x68x5x432x3+8x2+16,x,method='elliptic'

142x3+x223x3+532x3+x226x+142x3+x223+31I3107+631813616107+631813−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+631813x107+631813616107+631813+16107+631813414107+631813I3107+631813616107+6318132Ix+107+63181312+112107+631813+16I3107+631813616107+63181323107+631813616107+631813EllipticF3−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+6318133,−I3107+631813616107+631813107+631813414107+631813I3107+631813616107+631813262x3+x22+I2_α=RootOf16_Z68_Z5_Z432_Z3+8_Z2+16_α1520_α4760_α395_α21520_α+876107+6318131107+631813I22+12x+107+631813+1107+631813+I3107+6318131107+631813107+6318131107+6318131+6x107+6318131107+6318133107+6318133107+631813I3107+6318131107+631813I22+12x+107+631813+1107+631813I3107+6318131107+631813107+6318131107+631813320+61063107+63106131861063107+6310623+3316107+631062376107+6310613+64_α5+352_α468_α3216_α2528I106_α3107+6310623+3137I3_α3107+63106235730I3107+6310623_α2+66I3107+6310623_α+963I106107+6310623_α299I106107+6310613_α2+642I3107+6310613_α2592I3_α5107+6310613+96I106_α5107+6310613384I106_α5107+6310623+2288I3_α5107+631062312I106107+6310623_α96I106_α107+6310613+570I3_α107+6310613+8I3_α4107+6310613+144I106_α4107+6310623856I3_α4107+6310623+149I3_α3107+631061330I106_α3107+631061310_α31063107+6310613+176_α31063107+6310623+32_α51063107+6310613+128_α51063107+631062348_α43107+6310623106321_α2107+6310623106332106_α3107+6310613+4_α1063107+631062333_α21063107+631061376I3107+63106133316I3107+6310623+558I106107+6310623+18I106107+6310613+570_α107+631061366107+6310623_α+5730107+6310623_α2+642107+6310613_α2+149_α3107+63106133137_α3107+6310623+856_α4107+6310623+8_α4107+6310613592_α5107+63106132288_α5107+6310623360_αEllipticPi3−Ix+107+63181312+112107+631813+16+I3107+631813616107+63181323107+631813616107+6318133,311063107+631061356+1063107+63106235619107+631062384+829107+631061384+74_α521_α421149_α3168+I10628107_α228+1942107I_α2107+6310613106112+991I_α23107+63106131687I_α53107+63106133I107+6310613_α41067_α41063107+63106137+8I_α5107+63106131062126I_α5107+631062310621+155I_α53107+631062321+137I_α107+631062310621+I_α107+631061310684+7I_α3107+631061324+I_α43107+6310613244I_α4107+63106231067+523I_α43107+631062314341I_α33107+6310613112+11I_α3107+631061310621+209I_α3107+6310623106168825I_α33107+63106231123959I_α23107+63106231686515I_α3107+6310623168+443I_α2107+6310623106112+11_α31063107+6310613215_α31063107+6310623168+8_α51063107+631061321+2_α51063107+63106232111_α2107+63106231063112+106_α3107+6310613842_α1063107+631062321107_α21063107+631061311211_α107+631061356+95107+6310623_α56+107107+6310623_α256+955107+6310613_α2563137_α3107+6310613336+149_α3107+6310623336+_α4107+631062342+107_α4107+631061342143_α5107+63106132137_α5107+6310623215I_α3106844I_α10621+4I_α51062111I_α210656+101I3107+631061328949I107+6310623328+319I107+63106231065631I107+63106131065695_α28,−I3107+631813616107+631813107+631813414107+631813I3107+631813616107+63181322x3+x2264512

(5)

Enhanced 'method' option for indefinite integrals

• 

The int command now exposes more internal routines for indefinite integration through the method option.  It is now possible to directly call the integration by parts routine Parts and a parallel version of the Risch algorithm ParallelRisch.

int(ln(exp(x)),x,method=parallelrisch);

x22+lnⅇxx

(6)

int(4*x^2*arcsinh(x),x,method=parts);

4x3arcsinhx34x2x2+19+8x2+19

(7)

Better assumption support of MeijerG integrals

• 

The definite integration method that works via MeijerG convolutions now does a better job of checking conditions on parameters so that they are only applied under proper assumptions. As well, the methods will prompt via warning when the method could have produced an answer using additional assumptions.

int( x*exp(-a*x^3 - b*x), x=0..infinity );

Warning, not enough assumptions for a closed form integral: a MeijerG transformation may be possible with additional assumptions: a <> 0, 0 <= Re(a), b <> 0, 0 <= Re(b)

intxexpax3bx&comma;x&equals;0..&infin;

(8)

assume(a::real, b::real);

int( x*exp(-a*x^3 - b*x), x=0..infinity );

Warning, not enough assumptions for a closed form integral: a MeijerG transformation may be possible with additional assumptions: 0 < a, 0 < b

intxexpa~x3b~x&comma;x&equals;0..&infin;

(9)

assume(c>0, d>0);

int( x*exp(-c*x^3 - d*x), x=0..infinity );

d~d~32c~131+LommelS21&comma;23&comma;2d~3239c~3c~56

(10)

restart:

Support in solve for element-wise equations of rtables

• 

The solve command can now directly accept element-wise relations between vectors and matrices. Inputs of the form M, M=c, or M=N are transformed into a list of scalar equations (where M and N are rtables of the same dimensions and c is any scalar, and instead of = any binary relation of type,relation can be used).

solve( (<<x+1|y+1>,<z+2|w+2>>) = 1 );

w=−1&comma;x=0&comma;y=0&comma;z=−1

(11)
• 

With no relations, a right-hand side of 0 is assumed

solve( (<<x+1|y+1>,<z+2|w+2>>) );

w=−2&comma;x=−1&comma;y=−1&comma;z=−2

(12)

solve( (<<x+1|y+1>,<z+2|w+2>>) = (<<1|1>,<2|2>>) );

w=0&comma;x=0&comma;y=0&comma;z=0

(13)

solve( (<<x+1|y+1>,<z+2|w+2>>) < (<<1|1>,<2|2>>) );

w<0&comma;x<0&comma;y<0&comma;z<0

(14)
• 

While it is now possible to solve linear equations this way, it is advisable to use LinearAlgebra:-LinearSolve instead.

n := 200:

M := LinearAlgebra:-RandomMatrix(n):

b := LinearAlgebra:-RandomVector(n):

v := Vector( [ seq(cat(`v__`,i), i=1..n)]):

CodeTools:-Usage( eval(v, solve( M.v = b )) ):

memory used=110.74MiB, alloc change=40.17MiB, cpu time=2.10s, real time=1.90s, gc time=436.46ms

CodeTools:-Usage( LinearAlgebra:-LinearSolve(M, b) ):

memory used=54.78MiB, alloc change=1.01MiB, cpu time=1.28s, real time=1.16s, gc time=292.64ms

Polyhedral sets

• 

The IntegerHull command in the PolyhedralSets package has been extended to support higher dimensional polyhedral sets, both bounded and unbounded ones.

• 

The following example is an unbounded three-dimensional set.

with(PolyhedralSets):

ineqs := [-x[1] - 132/205*x[2] - 62/205*x[3] <= -1358/123,
          -x[1] + x[2] + x[3] <= 1405/17,
          x[1] - 6/59*x[2] + 83/177*x[3] <= 3500/59];

ineqsx1132x220562x32051358123&comma;x1+x2+x3140517&comma;x16x259+83x3177350059

(15)

poly := PolyhedralSet(ineqs, [x[1], x[2], x[3]]);

PolyhedralSets:-PolyhedralSet1358123132205x262205x3x1&comma;140517&plus;x2&plus;x3x1&comma;x1659x283177x3&plus;350059&comma;x1&comma;x2&comma;x3

(16)

IsBounded(poly);

false

(17)

IntegerHull(poly);

−20&comma;36&comma;26&comma;−4&comma;−25&comma;103&comma;−2&comma;−30&comma;107&comma;−1&comma;−36&comma;117&comma;0&comma;−38&comma;118&comma;0&comma;−36&comma;118&comma;1&comma;−37&comma;112&comma;1&comma;−34&comma;117&comma;2&comma;−39&comma;113&comma;2&comma;−38&comma;114&comma;10&comma;−43&comma;95&comma;26&comma;−51&comma;60&comma;399&comma;−238&comma;−776&comma;403&comma;−240&comma;−785&comma;453&comma;−265&comma;−897&comma;1544&comma;−811&comma;−3342&comma;101&comma;260&comma;−159&comma;12072&comma;−6041&comma;−27054&comma;−70&comma;267&comma;−337

(18)
• 

A bounded four-dimensional example.

vertices := [[10, 10, 10, 10/3],
             [-140/8, -220/12, -10, -10/3],
             [60/8, 20, -100/12, -70/3],
             [-10/4, -100/12, 70/2, 35/3],
             [0, 0, 0, 50/3]];

vertices10&comma;10&comma;10&comma;103&comma;352&comma;553&comma;−10&comma;103&comma;152&comma;20&comma;253&comma;703&comma;52&comma;253&comma;35&comma;353&comma;0&comma;0&comma;0&comma;503

(19)

vars := [x[1], x[2], x[3], x[4]]:

poly := PolyhedralSet(vertices, [], vars);

PolyhedralSets:-PolyhedralSet77753123&plus;503694x2&plus;85694x3&plus;3112082x4x1&comma;67751117&plus;27152234x2&plus;6032234x3&plus;8132234x4x1&comma;x1543&plus;7586x2&plus;59430x3&plus;3430x4&comma;x1543&plus;7586x233182x3&plus;13413182x4&comma;x1145148&plus;123185x2&plus;153370x3&plus;871480x4&comma;x1&comma;x2&comma;x3&comma;x4

(20)

IsBounded(poly);

true

(21)

IntegerHull(poly);

−15&comma;−16&comma;−6&comma;−2&comma;−15&comma;−15&comma;−9&comma;−4&comma;−14&comma;−15&comma;−4&comma;−1&comma;−13&comma;−13&comma;−8&comma;−1&comma;−13&comma;−12&comma;−9&comma;−5&comma;−12&comma;−13&comma;−4&comma;1&comma;−12&comma;−13&comma;−4&comma;2&comma;−12&comma;−12&comma;−3&comma;−3&comma;−11&comma;−12&comma;−3&comma;−1&comma;−11&comma;−11&comma;−6&comma;−3&comma;−11&comma;−11&comma;−1&comma;−3&comma;−10&comma;−8&comma;−8&comma;−5&comma;−9&comma;−6&comma;−8&comma;−8&comma;−7&comma;−7&comma;−4&comma;7&comma;−7&comma;−6&comma;−5&comma;3&comma;−7&comma;−3&comma;−8&comma;−10&comma;−7&comma;−3&comma;−7&comma;−10&comma;−6&comma;−4&comma;−5&comma;0&comma;−5&comma;−9&comma;23&comma;8&comma;−5&comma;−4&comma;−4&comma;5&comma;−5&comma;−4&comma;−3&comma;−2&comma;−4&comma;−5&comma;3&comma;10&comma;−4&comma;−5&comma;3&comma;11&comma;−4&comma;−3&comma;−2&comma;−3&comma;−4&comma;0&comma;−6&comma;−9&comma;−3&comma;−8&comma;30&comma;10&comma;−3&comma;−7&comma;23&comma;10&comma;−3&comma;−7&comma;23&comma;11&comma;−3&comma;−6&comma;24&comma;6&comma;−3&comma;3&comma;−8&comma;−12&comma;−3&comma;3&comma;−7&comma;−13&comma;−2&comma;−7&comma;31&comma;11&comma;−2&comma;−6&comma;24&comma;8&comma;−2&comma;−6&comma;24&comma;12&comma;−2&comma;−6&comma;26&comma;11&comma;−2&comma;−5&comma;25&comma;7&comma;−2&comma;−5&comma;26&comma;6&comma;−2&comma;−2&comma;−1&comma;13&comma;−2&comma;−1&comma;−1&comma;1&comma;−2&comma;3&comma;−4&comma;−8&comma;−1&comma;−5&comma;25&comma;12&comma;−1&comma;−5&comma;29&comma;9&comma;−1&comma;−4&comma;19&comma;13&comma;−1&comma;−4&comma;27&comma;7&comma;−1&comma;−3&comma;12&comma;13&comma;−1&comma;−3&comma;12&comma;14&comma;−1&comma;−1&comma;1&comma;14&comma;−1&comma;−1&comma;2&comma;0&comma;−1&comma;1&comma;11&comma;−4&comma;0&comma;−2&comma;22&comma;7&comma;0&comma;−1&comma;8&comma;14&comma;0&comma;−1&comma;20&comma;5&comma;0&comma;0&comma;1&comma;15&comma;0&comma;0&comma;2&comma;15&comma;0&comma;0&comma;13&comma;6&comma;0&comma;3&comma;−3&comma;4&comma;0&comma;8&comma;−8&comma;−16&comma;1&comma;−3&comma;27&comma;9&comma;1&comma;−2&comma;23&comma;9&comma;1&comma;0&comma;8&comma;3&comma;1&comma;0&comma;22&comma;3&comma;1&comma;2&comma;0&comma;12&comma;1&comma;2&comma;5&comma;9&comma;1&comma;2&comma;9&comma;6&comma;1&comma;3&comma;−1&comma;9&comma;1&comma;5&comma;5&comma;−5&comma;1&comma;8&comma;−3&comma;−13&comma;2&comma;1&comma;9&comma;3&comma;2&comma;1&comma;21&comma;3&comma;2&comma;2&comma;2&comma;14&comma;2&comma;2&comma;4&comma;1&comma;2&comma;5&comma;7&comma;0&comma;2&comma;5&comma;13&comma;−5&comma;2&comma;10&comma;−7&comma;−13&comma;2&comma;11&comma;−8&comma;−17&comma;3&comma;7&comma;−2&comma;3&comma;3&comma;7&comma;10&comma;−6&comma;3&comma;7&comma;11&comma;−7&comma;3&comma;8&comma;−3&comma;0&comma;3&comma;8&comma;6&comma;−7&comma;3&comma;11&comma;−2&comma;−15&comma;4&comma;2&comma;17&comma;6&comma;4&comma;8&comma;8&comma;−5&comma;4&comma;9&comma;−2&comma;−3&comma;4&comma;10&comma;−1&comma;−5&comma;4&comma;10&comma;3&comma;−8&comma;4&comma;11&comma;−3&comma;−13&comma;4&comma;11&comma;−2&comma;−13&comma;4&comma;12&comma;−5&comma;−15&comma;4&comma;12&comma;0&comma;−15&comma;4&comma;14&comma;−7&comma;−19&comma;5&comma;3&comma;18&comma;6&comma;5&comma;3&comma;18&comma;7&comma;5&comma;3&comma;19&comma;6&comma;5&comma;5&comma;6&comma;3&comma;5&comma;13&comma;−5&comma;−10&comma;5&comma;13&comma;1&comma;−14&comma;5&comma;14&comma;−6&comma;−13&comma;5&comma;15&comma;−7&comma;−18&comma;5&comma;15&comma;−7&comma;−17&comma;6&comma;9&comma;3&comma;−4&comma;6&comma;15&comma;−4&comma;−14&comma;6&comma;16&comma;−6&comma;−16&comma;6&comma;17&comma;−7&comma;−20&comma;7&comma;6&comma;14&comma;5&comma;7&comma;12&comma;1&comma;−7&comma;7&comma;13&comma;0&comma;−10&comma;7&comma;13&comma;2&comma;−9&comma;7&comma;13&comma;3&comma;−10&comma;7&comma;15&comma;−3&comma;−12&comma;7&comma;16&comma;−4&comma;−16&comma;7&comma;17&comma;−4&comma;−18&comma;7&comma;18&comma;−6&comma;−20&comma;8&comma;8&comma;8&comma;6&comma;8&comma;8&comma;9&comma;3&comma;8&comma;8&comma;12&comma;3&comma;8&comma;12&comma;3&comma;−4&comma;9&comma;10&comma;8&comma;1&comma;9&comma;10&comma;8&comma;2&comma;9&comma;10&comma;9&comma;1&comma;9&comma;13&comma;4&comma;−5&comma;

(22)

New support for Z-polyhedral sets

• 

The ZPolyhedralSets subpackage is new in Maple 2023. It is part of the PolyhedralSets package and deals with Z-polyhedral sets. A Z-polyhedral set is the intersection of a polyhedral set with an integer lattice.

with(PolyhedralSets): with(ZPolyhedralSets):

• 

Here is a three-dimensional polyhedral set.

ineqs := [0 <= -16 + 2*y + z, 0 <= -72 + 4*x + 4*y + 3*z, 0 <= 2*y - z, 0 <= -24 + 4*x + 4*y - 3*z, 0 <= -4*x + 4*y + 3*z, 0 <= 48 - 4*x + 4*y - 3*z, 0 <= 48 - 4*x - 4*y + 3*z, 0 <= 8 - 2*y + z, 0 <= -24 + 4*x - 4*y + 3*z, 0 <= 24 - 2*y - z, 0 <= 24 + 4*x - 4*y - 3*z, 0 <= 96 - 4*x - 4*y - 3*z]:

ps := PolyhedralSet(ineqs):

Plot(ps);

• 

Now we define the Z-polyhedral set of all integer lattice points in ps.

psz := ZPolyhedralSet(ineqs, [x, y, z]):

PlotIntegerPoints3d(psz);

Improvements to parametric limits on branch cuts

• 

The option parametric to the limit command has been extended to handle more cases where the expansion point may lie on the branch cut of a mathematical function for some real parameter values. Examples:

unassign('a'):

limit(ln(a+I*x), x=0, 'right', 'parametric');

lna+Iπa<0a=0lna0<alimx0+lna+Ixotherwise

(23)

limit(arccoth(a+I*x), x=0, 'right', 'parametric');

arccothaa<−1a=−1arctanhaIπ2a<1a=1arccotha1<alimx0+arccotha+Ixotherwise

(24)

limit(Li(a+I*x), x=0, 'right', 'parametric');

Eilna+Iπa<0Iπa=0Iπ+Eilnaa<1a=1Eilna1<alimx0+Lia+Ixotherwise

(25)

New certified univariate complex solver

• 

A new, faster method for isolating the complex roots of a univariate polynomial with complex(numeric) coefficients has been added to the RootFinding:-Isolate command. It is accessible through the option complex or method=HR and supports most of the existing options of RootFinding:-Isolate, as well as a new option domain for limiting the search space. See the corresponding help page for more details. Examples:

with(RootFinding):

Isolate(x^6-1, x, 'complex');

x=−1.&comma;x=1.&comma;x=0.5000000000+0.8660254038I&comma;x=0.50000000000.8660254038I&comma;x=−0.5000000000+0.8660254038I&comma;x=−0.50000000000.8660254038I

(26)

Isolate(x^2-I, x, 'complex', 'output=interval');

x=8548396450010082566043051208925819614629174706176+854839645001008256604305I1208925819614629174706176&comma;8548396450010102904031831208925819614629174706176+854839645001010290403183I1208925819614629174706176&comma;x=8548396450010102904031831208925819614629174706176854839645001010290403183I1208925819614629174706176&comma;8548396450010082566043051208925819614629174706176854839645001008256604305I1208925819614629174706176

(27)

Isolate(x^2-I, x, 'complex', 'digits'=100);

x=0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864+0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864I&comma;x=−0.70710678118654752440084436210484903928483593768847403658833986899536623923105351942519376716382078640.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864I

(28)
• 

Find 10 roots in the first quadrant.

Isolate(x^100+x^3-1, x, 'method=HR', 'domain'=[0,infinity+I*infinity], 'maxroots'=10);

x=0.9744076649&comma;x=0.9781052241+0.1737357669I&comma;x=0.9531760998+0.2980270829I&comma;x=0.9680195472+0.2362266682I&comma;x=0.9104543811+0.4181438477I&comma;x=0.9827791401+0.1111417351I&comma;x=0.9804852800+0.05036970385I&comma;x=0.1198693017+0.9978851093I&comma;x=0.4848690063+0.8826473106I&comma;x=0.2461381235+0.9755862161I

(29)

restart:

New method option for fsolve, for a univariate polynomial

• 

The fsolve command has been updated with a new method option.  When solving for roots of a univariate polynomial this option allows specification of the new solver within the RootFinding:-Isolate command, or the original modified Laguerre method of the NAG Library. The value for the option can be specified here as method=hefroots or method=NAG. The current default is method=NAG, unless fsolve determines that the problem is ill-conditioned.

[ fsolve(x^4-5.591265174*x^3+2.936595076*x^2+17.11912543*x-10.52786025, x=0..4, method=hefroots) ];

0.6180339885&comma;2.718281830&comma;3.872983344

(30)

New method option for fsolve, for a univariate non-polynomial equation

• 

When solving for roots of an equation in one variable that is not a polynomial, the new method option to fsolve lets you specify the method used. The value for the option can be specified here as method=subdivide or method=NextZero. This option must be accompanied by the maxsols option. The subdivide method repeatedly searches on new subintervals between roots already found, using a custom mix of approaches on each. The NextZero method utilizes the RootFinding:-NextZero command to repeatedly search past the last root found. The default is method=subdivide, which may be more suitable for equations that are not continuous or have non-isolated roots. For some problems the NextZero method may be significantly faster.

[ fsolve(BesselJ(0,x^3)-1/100*x^2-floor(x)+2, x=0..4, maxsols=10, method=subdivide) ];

2.040911370&comma;2.290794873&comma;2.446318006&comma;2.642712321&comma;2.748619065&comma;2.920713827&comma;2.995225008

(31)

[ fsolve(BesselJ(0,x^3)-1/100*x^2, x=0..4, maxsols=10, method=':-NextZero') ];

1.333416382&comma;1.777268850&comma;2.040911369&comma;2.290794872&comma;2.446318005&comma;2.642712321&comma;2.748619064&comma;2.920713827&comma;2.995225007&comma;3.155131991

(32)

New support for lazy multivariate Puiseux series

• 

The MultivariatePowerSeries package was introduced in Maple 2021. It deals with multivariate power series in a lazy fashion, meaning that extra terms for a given result can be computed quickly.

• 

In Maple 2023, this package can now deal with multivariate Puiseux series and univariate polynomials over multivariate Puiseux series.

with(MultivariatePowerSeries):

a := PowerSeries(exp(s + t)*ln(1+t));

ObjectPowerSeriesObject&comma;Array(0..5, {(1) = 0, (2) = t, (3) = `+`(`*`(`/`(1, 2), `*`(`^`(t, 2))), `*`(s, `*`(t))), (4) = `+`(`*`(`/`(1, 3), `*`(`^`(t, 3))), `*`(`/`(1, 2), `*`(s, `*`(`^`(t, 2)))), `*`(`/`(1, 2), `*`(`^`(s, 2), `*`(t)))), (5) = `+`(`*`(`/`(1, 3), `*`(s, `*`(`^`(t, 3)))), `*`(`/`(1, 4), `*`(`^`(s, 2), `*`(`^`(t, 2)))), `*`(`/`(1, 6), `*`(`^`(s, 3), `*`(t))))})&comma;5&comma;mul_gen&comma;s&comma;t&comma;ancestors

(33)

b := PuiseuxSeries(a, [s = sqrt(x), t = y^(1/3)*x]);

ObjectPuiseuxSeriesObject&comma;modulePowerSeriesObjectoptionobject&semi;localhpoly::Array&comma;deg::nonnegint&comma;gen::procedure&comma;vars::setname&comma;ancestors::record&comma;algexpr::algebraic&comma;dstyle::list:-identical:-maxterms&comma;:-precision&equals;:-nonnegint&comma;:-identical:-&infin;&semi;end module&comma;x&comma;y&comma;s&comma;t&comma;12&comma;0&comma;1&comma;13&comma;

(34)

Truncate(1/b, 3, mode=absolute);

12+1xy131xy13+12y13x6y13+x2+x24y13x4x32120y13y13x12+x3212+x2720y13+x32y1312x248x525040y13x2y1324+x52240+5y23x224+x52y1372x31440

(35)
• 

The package can also compute a Puiseux factorization of a univariate polynomial over univariate Puiseux series. We set this up by defining a univariate Puiseux series.

c := PowerSeries(exp(t) * ln(1+t));

ObjectPowerSeriesObject&comma;Array(0..5, {(1) = 0, (2) = t, (3) = `+`(`*`(`/`(1, 2), `*`(`^`(t, 2)))), (4) = `+`(`*`(`/`(1, 3), `*`(`^`(t, 3)))), (5) = 0})&comma;5&comma;algebraic_expression_gen_series&comma;t&comma;ancestors

(36)

d := PuiseuxSeries(c, [t = y^(1/3)]);

ObjectPuiseuxSeriesObject&comma;modulePowerSeriesObjectoptionobject&semi;localhpoly::Array&comma;deg::nonnegint&comma;gen::procedure&comma;vars::setname&comma;ancestors::record&comma;algexpr::algebraic&comma;dstyle::list:-identical:-maxterms&comma;:-precision&equals;:-nonnegint&comma;:-identical:-&infin;&semi;end module&comma;y&comma;t&comma;13&comma;

(37)
• 

We now define e as dz2&plus;1dz&plus;1 and compute its Puiseux factorization.

e := UnivariatePolynomialOverPuiseuxSeries([d, 1/d, PuiseuxSeries(1)], z);

ObjectUnivariatePolynomialOverPowerSeriesObject&comma;Array(0..2, {(1) = module PuiseuxSeriesObject () local pso, rays::(list(list(rational))), e::table, ord::list, ordCV::list, dstyle::(list(:-identical(:-maxterms, :-precision) = {:-nonnegint, :-identical(:-infinity)})), nonzero_pso_bound::{nonnegint, identical(undefined)}, smallest_term_bound::{nonnegint, identical(undefined)}, SublistLessThanV; option object; end module, (2) = module PuiseuxSeriesObject () local pso, rays::(list(list(rational))), e::table, ord::list, ordCV::list, dstyle::(list(:-identical(:-maxterms, :-precision) = {:-nonnegint, :-identical(:-infinity)})), nonzero_pso_bound::{nonnegint, identical(undefined)}, smallest_term_bound::{nonnegint, identical(undefined)}, SublistLessThanV; option object; end module})

(38)

e_factors := PuiseuxFactorize(e, returnleadingcoefficient=false):

for f in e_factors do print(Truncate(f, 4)); end do:

1y23

y43+y+y13z

1y132y231219y24829y43720+y13z

(39)

Truncate(e - mul(f, f in e_factors), 6);

0

(40)
• 

We see that the factors are linear or constant in z and they multiply to e.