mathjs 10.2.0 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +12 -0
- package/docs/expressions/syntax.md +31 -2
- package/docs/reference/functions/map.md +22 -5
- package/docs/reference/functions/subset.md +10 -2
- package/docs/reference/functions/symbolicEqual.md +62 -0
- package/docs/reference/functions.md +2 -1
- package/lib/browser/math.js +5 -5
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +29 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +8 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +16 -8
- package/lib/cjs/entry/pureFunctionsAny.generated.js +9 -9
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +237 -234
- package/lib/cjs/expression/embeddedDocs/function/algebra/symbolicEqual.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/matrix/subset.js +2 -2
- package/lib/cjs/expression/node/FunctionNode.js +74 -55
- package/lib/cjs/factoriesAny.js +8 -0
- package/lib/cjs/function/algebra/simplify.js +8 -0
- package/lib/cjs/function/algebra/symbolicEqual.js +88 -0
- package/lib/cjs/function/matrix/eigs/complexEigs.js +8 -6
- package/lib/cjs/function/matrix/map.js +53 -15
- package/lib/cjs/function/matrix/subset.js +15 -5
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesSymbolicEqual.generated.js +16 -0
- package/lib/esm/entry/dependenciesAny.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +16 -9
- package/lib/esm/entry/pureFunctionsAny.generated.js +8 -8
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +218 -216
- package/lib/esm/expression/embeddedDocs/function/algebra/symbolicEqual.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/matrix/subset.js +2 -2
- package/lib/esm/expression/node/FunctionNode.js +70 -53
- package/lib/esm/factoriesAny.js +1 -0
- package/lib/esm/function/algebra/simplify.js +8 -0
- package/lib/esm/function/algebra/symbolicEqual.js +80 -0
- package/lib/esm/function/matrix/eigs/complexEigs.js +8 -6
- package/lib/esm/function/matrix/map.js +53 -15
- package/lib/esm/function/matrix/subset.js +15 -5
- package/lib/esm/version.js +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +4 -4
package/HISTORY.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# History
|
2
2
|
|
3
|
+
# 2021-03-02, version 10.3.0
|
4
|
+
|
5
|
+
- Fix #1260: implement function `symbolicEqual` (#2424). Thanks @gwhitney.
|
6
|
+
- Fix #2441, #2442: support passing a function as argument to functions created
|
7
|
+
in the expression parser (#2443). Thanks @gwhitney.
|
8
|
+
- Fix #2325: improve documentation of subset indices (#2446). Thanks @gwhitney.
|
9
|
+
- Fix #2439: fix a bug in `complexEigs` in which real-valued norms were
|
10
|
+
inadvertently being typed as complex numbers (#2445). Thanks @gwhitney.
|
11
|
+
- Fix #2436: improve documentation and error message of function `map` (#2457).
|
12
|
+
Thanks @gwhitney.
|
13
|
+
|
14
|
+
|
3
15
|
# 2022-03-01, version 10.2.0
|
4
16
|
|
5
17
|
- Implemented context options to control simplifications allowed in `simplify`,
|
@@ -138,8 +138,8 @@ math.evaluate('log(10000, 3 + 7)') // 4
|
|
138
138
|
math.evaluate('sin(pi / 4)') // 0.7071067811865475
|
139
139
|
```
|
140
140
|
|
141
|
-
New functions can be defined
|
142
|
-
|
141
|
+
New functions can be defined by "assigning" an expression to a function call
|
142
|
+
with one or more variables. Such function assignments are limited: they can
|
143
143
|
only be defined on a single line.
|
144
144
|
|
145
145
|
```js
|
@@ -153,6 +153,35 @@ parser.evaluate('g(x, y) = x ^ y')
|
|
153
153
|
parser.evaluate('g(2, 3)') // 8
|
154
154
|
```
|
155
155
|
|
156
|
+
Note that these function assignments do _not_ create closures; put another way,
|
157
|
+
all free variables in mathjs are dynamic:
|
158
|
+
|
159
|
+
```js
|
160
|
+
const parser = math.parser()
|
161
|
+
|
162
|
+
parser.evaluate('x = 7')
|
163
|
+
parser.evaluate('h(y) = x + y')
|
164
|
+
parser.evaluate('h(3)') // 10
|
165
|
+
parser.evaluate('x = 3')
|
166
|
+
parser.evaluate('h(3)') // 6, *not* 10
|
167
|
+
```
|
168
|
+
|
169
|
+
It is however possible to pass functions as parameters:
|
170
|
+
|
171
|
+
```js
|
172
|
+
const parser = math.parser()
|
173
|
+
|
174
|
+
parser.evaluate('twice(func, x) = func(func(x))')
|
175
|
+
parser.evaluate('twice(square, 2)') // 16
|
176
|
+
parser.evaluate('f(x) = 3*x')
|
177
|
+
parser.evaluate('twice(f, 2)') // 18
|
178
|
+
|
179
|
+
// a simplistic "numerical derivative":
|
180
|
+
parser.evaluate('eps = 1e-10')
|
181
|
+
parser.evaluate('nd(f, x) = (f(x+eps) - func(x-eps))/(2*eps)')
|
182
|
+
parser.evaluate('nd(square,2)') // 4.000000330961484
|
183
|
+
```
|
184
|
+
|
156
185
|
Math.js itself heavily uses typed functions, which ensure correct inputs and
|
157
186
|
throws meaningful errors when the input arguments are invalid. One can create
|
158
187
|
a [typed-function](https://github.com/josdejong/typed-function) in the
|
@@ -2,8 +2,15 @@
|
|
2
2
|
|
3
3
|
# Function map
|
4
4
|
|
5
|
-
Create a new matrix or array with the results of
|
6
|
-
each entry of
|
5
|
+
Create a new matrix or array with the results of a callback function executed on
|
6
|
+
each entry of a given matrix/array.
|
7
|
+
|
8
|
+
For each entry of the input, the callback is invoked with three arguments:
|
9
|
+
the value of the entry, the index at which that entry occurs, and the full
|
10
|
+
matrix/array being traversed. Note that because the matrix/array might be
|
11
|
+
multidimensional, the "index" argument is always an array of numbers giving
|
12
|
+
the index in each dimension. This is true even for vectors: the "index"
|
13
|
+
argument is an array of length 1, rather than simply a number.
|
7
14
|
|
8
15
|
|
9
16
|
## Syntax
|
@@ -16,14 +23,14 @@ math.map(x, callback)
|
|
16
23
|
|
17
24
|
Parameter | Type | Description
|
18
25
|
--------- | ---- | -----------
|
19
|
-
`x` | Matrix | Array | The
|
20
|
-
`callback` | Function |
|
26
|
+
`x` | Matrix | Array | The input to iterate on.
|
27
|
+
`callback` | Function | The function to call (as described above) on each entry of the input
|
21
28
|
|
22
29
|
### Returns
|
23
30
|
|
24
31
|
Type | Description
|
25
32
|
---- | -----------
|
26
|
-
Matrix | array |
|
33
|
+
Matrix | array | Transformed map of x; always has the same type and shape as x
|
27
34
|
|
28
35
|
|
29
36
|
### Throws
|
@@ -38,6 +45,16 @@ Type | Description
|
|
38
45
|
math.map([1, 2, 3], function(value) {
|
39
46
|
return value * value
|
40
47
|
}) // returns [1, 4, 9]
|
48
|
+
|
49
|
+
// The calling convention for the callback can cause subtleties:
|
50
|
+
math.map([1, 2, 3], math.format)
|
51
|
+
// throws TypeError: map attempted to call 'format(1,[0])' but argument 2 of type Array does not match expected type number or function or Object or string or boolean
|
52
|
+
// [This happens because `format` _can_ take a second argument,
|
53
|
+
// but its semantics don't match that of the 2nd argument `map` provides]
|
54
|
+
|
55
|
+
// To avoid this error, use a function that takes exactly the
|
56
|
+
// desired arguments:
|
57
|
+
math.map([1, 2, 3], x => math.format(x)) // returns ['1', '2', '3']
|
41
58
|
```
|
42
59
|
|
43
60
|
|
@@ -17,7 +17,7 @@ math.subset(value, index, replacement [, defaultValue]) // replace a subset
|
|
17
17
|
Parameter | Type | Description
|
18
18
|
--------- | ---- | -----------
|
19
19
|
`matrix` | Array | Matrix | string | An array, matrix, or string
|
20
|
-
`index` | Index |
|
20
|
+
`index` | Index | For each dimension of the target, specifies an index or a list of indices to fetch or set. `subset` uses the cartesian product of the indices specified in each dimension.
|
21
21
|
`replacement` | * | An array, matrix, or scalar. If provided, the subset is replaced with replacement. If not provided, the subset is returned
|
22
22
|
`defaultValue` | * | Default value, filled in on new entries when the matrix is resized. If not provided, math.matrix elements will be left undefined. Default value: undefined.
|
23
23
|
|
@@ -44,8 +44,16 @@ math.subset(d, math.index([0, 1], 1)) // returns [[2], [4]]
|
|
44
44
|
|
45
45
|
// replace a subset
|
46
46
|
const e = []
|
47
|
-
const f = math.subset(e, math.index(0, [0, 2]), [5, 6]) // f = [[5, 6]]
|
47
|
+
const f = math.subset(e, math.index(0, [0, 2]), [5, 6]) // f = [[5, 6]] and e = [[5, 0, 6]]
|
48
48
|
const g = math.subset(f, math.index(1, 1), 7, 0) // g = [[5, 6], [0, 7]]
|
49
|
+
|
50
|
+
// get submatrix using ranges
|
51
|
+
const M = [
|
52
|
+
[1,2,3],
|
53
|
+
[4,5,6],
|
54
|
+
[7,8,9]
|
55
|
+
]
|
56
|
+
math.subset(M, math.index(math.range(0,2), math.range(0,3))) // [[1,2,3],[4,5,6]]
|
49
57
|
```
|
50
58
|
|
51
59
|
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<!-- Note: This file is automatically generated from source code comments. Changes made in this file will be overridden. -->
|
2
|
+
|
3
|
+
# Function symbolicEqual
|
4
|
+
|
5
|
+
Attempts to determine if two expressions are symbolically equal, i.e.
|
6
|
+
one is the result of valid algebraic manipulations on the other.
|
7
|
+
Currently, this simply checks if the difference of the two expressions
|
8
|
+
simplifies down to 0. So there are two important caveats:
|
9
|
+
1. whether two expressions are symbolically equal depends on the
|
10
|
+
manipulations allowed. Therefore, this function takes an optional
|
11
|
+
third argument, which are the options that control the behavior
|
12
|
+
as documented for the `simplify()` function.
|
13
|
+
2. it is in general intractable to find the minimal simplification of
|
14
|
+
an arbitrarily complicated expression. So while a `true` value
|
15
|
+
of `symbolicEqual` ensures that the two expressions can be manipulated
|
16
|
+
to match each other, a `false` value does not absolutely rule this out.
|
17
|
+
|
18
|
+
|
19
|
+
## Syntax
|
20
|
+
|
21
|
+
```js
|
22
|
+
symbolicEqual(expr1, expr2)
|
23
|
+
symbolicEqual(expr1, expr2, options)
|
24
|
+
```
|
25
|
+
|
26
|
+
### Parameters
|
27
|
+
|
28
|
+
Parameter | Type | Description
|
29
|
+
--------- | ---- | -----------
|
30
|
+
`expr1` | Node | string | The first expression to compare
|
31
|
+
`expr2` | Node | string | The second expression to compare
|
32
|
+
`options` | Object | Optional option object, passed to simplify
|
33
|
+
|
34
|
+
### Returns
|
35
|
+
|
36
|
+
Type | Description
|
37
|
+
---- | -----------
|
38
|
+
boolean | Returns true if a valid manipulation making the expressions equal is found.
|
39
|
+
|
40
|
+
|
41
|
+
### Throws
|
42
|
+
|
43
|
+
Type | Description
|
44
|
+
---- | -----------
|
45
|
+
|
46
|
+
|
47
|
+
## Examples
|
48
|
+
|
49
|
+
```js
|
50
|
+
symbolicEqual('x*y', 'y*x') // true
|
51
|
+
symbolicEqual('x*y', 'y*x', {context: {multiply: {commutative: false}}})
|
52
|
+
//false
|
53
|
+
symbolicEqual('x/y', '(y*x^(-1))^(-1)') // true
|
54
|
+
symbolicEqual('abs(x)','x') // false
|
55
|
+
symbolicEqual('abs(x)','x', simplify.positiveContext) // true
|
56
|
+
```
|
57
|
+
|
58
|
+
|
59
|
+
## See also
|
60
|
+
|
61
|
+
[simplify](simplify.md),
|
62
|
+
[evaluate](evaluate.md)
|
@@ -25,6 +25,7 @@ Function | Description
|
|
25
25
|
[simplify(expr)](functions/simplify.md) | Simplify an expression tree.
|
26
26
|
[simplifyCore(expr)](functions/simplifyCore.md) | simplifyCore() performs single pass simplification suitable for applications requiring ultimate performance.
|
27
27
|
[math.slu(A, order, threshold)](functions/slu.md) | Calculate the Sparse Matrix LU decomposition with full pivoting.
|
28
|
+
[symbolicEqual(expr1, expr2)](functions/symbolicEqual.md) | Attempts to determine if two expressions are symbolically equal, i.
|
28
29
|
[math.usolve(U, b)](functions/usolve.md) | Finds one solution of a linear equation system by backward substitution.
|
29
30
|
[math.usolveAll(U, b)](functions/usolveAll.md) | Finds all solutions of a linear equation system by backward substitution.
|
30
31
|
|
@@ -137,7 +138,7 @@ Function | Description
|
|
137
138
|
[math.identity(n)](functions/identity.md) | Create a 2-dimensional identity matrix with size m x n or n x n.
|
138
139
|
[math.inv(x)](functions/inv.md) | Calculate the inverse of a square matrix.
|
139
140
|
[math.kron(x, y)](functions/kron.md) | Calculates the kronecker product of 2 matrices or vectors.
|
140
|
-
[math.map(x, callback)](functions/map.md) | Create a new matrix or array with the results of
|
141
|
+
[math.map(x, callback)](functions/map.md) | Create a new matrix or array with the results of a callback function executed on each entry of a given matrix/array.
|
141
142
|
[math.matrixFromColumns(...arr)](functions/matrixFromColumns.md) | Create a dense matrix from vectors as individual columns.
|
142
143
|
[math.matrixFromFunction(size, fn)](functions/matrixFromFunction.md) | Create a matrix by evaluating a generating function at each index.
|
143
144
|
[math.matrixFromRows(...arr)](functions/matrixFromRows.md) | Create a dense matrix from vectors as individual rows.
|