mathjs 10.5.2 → 10.5.3
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +8 -0
- package/lib/browser/math.js +3 -3
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/version.js +1 -1
- package/package.json +6 -11
- package/docs/command_line_interface.md +0 -87
- package/docs/core/chaining.md +0 -41
- package/docs/core/configuration.md +0 -144
- package/docs/core/extension.md +0 -263
- package/docs/core/index.md +0 -21
- package/docs/core/serialization.md +0 -50
- package/docs/custom_bundling.md +0 -116
- package/docs/datatypes/bignumbers.md +0 -102
- package/docs/datatypes/complex_numbers.md +0 -168
- package/docs/datatypes/fractions.md +0 -75
- package/docs/datatypes/index.md +0 -67
- package/docs/datatypes/matrices.md +0 -375
- package/docs/datatypes/numbers.md +0 -106
- package/docs/datatypes/units.md +0 -444
- package/docs/expressions/algebra.md +0 -110
- package/docs/expressions/customization.md +0 -379
- package/docs/expressions/expression_trees.md +0 -710
- package/docs/expressions/html_classes.md +0 -38
- package/docs/expressions/index.md +0 -21
- package/docs/expressions/parsing.md +0 -224
- package/docs/expressions/security.md +0 -89
- package/docs/expressions/syntax.md +0 -706
- package/docs/getting_started.md +0 -124
- package/docs/index.md +0 -39
- package/docs/reference/classes/densematrix.md +0 -247
- package/docs/reference/classes/fibonacciheap.md +0 -70
- package/docs/reference/classes/matrixindex.md +0 -133
- package/docs/reference/classes/matrixrange.md +0 -158
- package/docs/reference/classes/resultset.md +0 -47
- package/docs/reference/classes/sparsematrix.md +0 -245
- package/docs/reference/classes/unit.md +0 -242
- package/docs/reference/classes.md +0 -86
- package/docs/reference/constants.md +0 -29
- package/docs/reference/functions/abs.md +0 -46
- package/docs/reference/functions/acos.md +0 -49
- package/docs/reference/functions/acosh.md +0 -47
- package/docs/reference/functions/acot.md +0 -48
- package/docs/reference/functions/acoth.md +0 -46
- package/docs/reference/functions/acsc.md +0 -49
- package/docs/reference/functions/acsch.md +0 -46
- package/docs/reference/functions/add.md +0 -59
- package/docs/reference/functions/and.md +0 -53
- package/docs/reference/functions/apply.md +0 -56
- package/docs/reference/functions/arg.md +0 -53
- package/docs/reference/functions/asec.md +0 -49
- package/docs/reference/functions/asech.md +0 -46
- package/docs/reference/functions/asin.md +0 -49
- package/docs/reference/functions/asinh.md +0 -46
- package/docs/reference/functions/atan.md +0 -49
- package/docs/reference/functions/atan2.md +0 -56
- package/docs/reference/functions/atanh.md +0 -46
- package/docs/reference/functions/bellNumbers.md +0 -45
- package/docs/reference/functions/bignumber.md +0 -47
- package/docs/reference/functions/bin.md +0 -45
- package/docs/reference/functions/bitAnd.md +0 -51
- package/docs/reference/functions/bitNot.md +0 -51
- package/docs/reference/functions/bitOr.md +0 -52
- package/docs/reference/functions/bitXor.md +0 -51
- package/docs/reference/functions/boolean.md +0 -50
- package/docs/reference/functions/catalan.md +0 -45
- package/docs/reference/functions/cbrt.md +0 -60
- package/docs/reference/functions/ceil.md +0 -63
- package/docs/reference/functions/chain.md +0 -54
- package/docs/reference/functions/clone.md +0 -43
- package/docs/reference/functions/column.md +0 -45
- package/docs/reference/functions/combinations.md +0 -49
- package/docs/reference/functions/combinationsWithRep.md +0 -49
- package/docs/reference/functions/compare.md +0 -67
- package/docs/reference/functions/compareNatural.md +0 -92
- package/docs/reference/functions/compareText.md +0 -54
- package/docs/reference/functions/compile.md +0 -56
- package/docs/reference/functions/complex.md +0 -17
- package/docs/reference/functions/composition.md +0 -46
- package/docs/reference/functions/concat.md +0 -56
- package/docs/reference/functions/config.md +0 -44
- package/docs/reference/functions/conj.md +0 -50
- package/docs/reference/functions/cos.md +0 -51
- package/docs/reference/functions/cosh.md +0 -46
- package/docs/reference/functions/cot.md +0 -47
- package/docs/reference/functions/coth.md +0 -49
- package/docs/reference/functions/count.md +0 -45
- package/docs/reference/functions/createUnit.md +0 -52
- package/docs/reference/functions/cross.md +0 -58
- package/docs/reference/functions/csc.md +0 -47
- package/docs/reference/functions/csch.md +0 -49
- package/docs/reference/functions/ctranspose.md +0 -50
- package/docs/reference/functions/cube.md +0 -51
- package/docs/reference/functions/cumsum.md +0 -57
- package/docs/reference/functions/deepEqual.md +0 -53
- package/docs/reference/functions/derivative.md +0 -61
- package/docs/reference/functions/det.md +0 -49
- package/docs/reference/functions/diag.md +0 -61
- package/docs/reference/functions/diff.md +0 -70
- package/docs/reference/functions/distance.md +0 -80
- package/docs/reference/functions/divide.md +0 -55
- package/docs/reference/functions/dot.md +0 -48
- package/docs/reference/functions/dotDivide.md +0 -52
- package/docs/reference/functions/dotMultiply.md +0 -52
- package/docs/reference/functions/dotPow.md +0 -49
- package/docs/reference/functions/eigs.md +0 -54
- package/docs/reference/functions/equal.md +0 -75
- package/docs/reference/functions/equalText.md +0 -53
- package/docs/reference/functions/erf.md +0 -49
- package/docs/reference/functions/evaluate.md +0 -56
- package/docs/reference/functions/exp.md +0 -54
- package/docs/reference/functions/expm.md +0 -49
- package/docs/reference/functions/expm1.md +0 -54
- package/docs/reference/functions/factorial.md +0 -49
- package/docs/reference/functions/fft.md +0 -35
- package/docs/reference/functions/filter.md +0 -50
- package/docs/reference/functions/fix.md +0 -62
- package/docs/reference/functions/flatten.md +0 -46
- package/docs/reference/functions/floor.md +0 -66
- package/docs/reference/functions/forEach.md +0 -41
- package/docs/reference/functions/format.md +0 -127
- package/docs/reference/functions/fraction.md +0 -45
- package/docs/reference/functions/gamma.md +0 -49
- package/docs/reference/functions/gcd.md +0 -50
- package/docs/reference/functions/getMatrixDataType.md +0 -59
- package/docs/reference/functions/hasNumericValue.md +0 -55
- package/docs/reference/functions/help.md +0 -42
- package/docs/reference/functions/hex.md +0 -45
- package/docs/reference/functions/hypot.md +0 -51
- package/docs/reference/functions/identity.md +0 -57
- package/docs/reference/functions/ifft.md +0 -35
- package/docs/reference/functions/im.md +0 -53
- package/docs/reference/functions/import.md +0 -68
- package/docs/reference/functions/index.md +0 -55
- package/docs/reference/functions/intersect.md +0 -50
- package/docs/reference/functions/inv.md +0 -45
- package/docs/reference/functions/invmod.md +0 -47
- package/docs/reference/functions/isInteger.md +0 -55
- package/docs/reference/functions/isNaN.md +0 -56
- package/docs/reference/functions/isNegative.md +0 -55
- package/docs/reference/functions/isNumeric.md +0 -55
- package/docs/reference/functions/isPositive.md +0 -57
- package/docs/reference/functions/isPrime.md +0 -54
- package/docs/reference/functions/isZero.md +0 -59
- package/docs/reference/functions/kldivergence.md +0 -41
- package/docs/reference/functions/kron.md +0 -53
- package/docs/reference/functions/larger.md +0 -60
- package/docs/reference/functions/largerEq.md +0 -56
- package/docs/reference/functions/lcm.md +0 -54
- package/docs/reference/functions/leafCount.md +0 -52
- package/docs/reference/functions/leftShift.md +0 -52
- package/docs/reference/functions/lgamma.md +0 -46
- package/docs/reference/functions/log.md +0 -57
- package/docs/reference/functions/log10.md +0 -50
- package/docs/reference/functions/log1p.md +0 -54
- package/docs/reference/functions/log2.md +0 -50
- package/docs/reference/functions/lsolve.md +0 -51
- package/docs/reference/functions/lsolveAll.md +0 -51
- package/docs/reference/functions/lup.md +0 -52
- package/docs/reference/functions/lusolve.md +0 -59
- package/docs/reference/functions/mad.md +0 -50
- package/docs/reference/functions/map.md +0 -65
- package/docs/reference/functions/matrix.md +0 -56
- package/docs/reference/functions/matrixFromColumns.md +0 -49
- package/docs/reference/functions/matrixFromFunction.md +0 -54
- package/docs/reference/functions/matrixFromRows.md +0 -49
- package/docs/reference/functions/max.md +0 -61
- package/docs/reference/functions/mean.md +0 -57
- package/docs/reference/functions/median.md +0 -57
- package/docs/reference/functions/min.md +0 -61
- package/docs/reference/functions/mod.md +0 -59
- package/docs/reference/functions/mode.md +0 -50
- package/docs/reference/functions/multinomial.md +0 -46
- package/docs/reference/functions/multiply.md +0 -60
- package/docs/reference/functions/norm.md +0 -59
- package/docs/reference/functions/not.md +0 -50
- package/docs/reference/functions/nthRoot.md +0 -53
- package/docs/reference/functions/nthRoots.md +0 -58
- package/docs/reference/functions/number.md +0 -49
- package/docs/reference/functions/numeric.md +0 -52
- package/docs/reference/functions/oct.md +0 -45
- package/docs/reference/functions/ones.md +0 -59
- package/docs/reference/functions/or.md +0 -53
- package/docs/reference/functions/parse.md +0 -56
- package/docs/reference/functions/parser.md +0 -70
- package/docs/reference/functions/partitionSelect.md +0 -53
- package/docs/reference/functions/permutations.md +0 -51
- package/docs/reference/functions/pickRandom.md +0 -59
- package/docs/reference/functions/pinv.md +0 -44
- package/docs/reference/functions/pow.md +0 -65
- package/docs/reference/functions/print.md +0 -64
- package/docs/reference/functions/prod.md +0 -55
- package/docs/reference/functions/qr.md +0 -65
- package/docs/reference/functions/quantileSeq.md +0 -62
- package/docs/reference/functions/random.md +0 -54
- package/docs/reference/functions/randomInt.md +0 -53
- package/docs/reference/functions/range.md +0 -70
- package/docs/reference/functions/rationalize.md +0 -68
- package/docs/reference/functions/re.md +0 -53
- package/docs/reference/functions/reshape.md +0 -60
- package/docs/reference/functions/resize.md +0 -51
- package/docs/reference/functions/resolve.md +0 -46
- package/docs/reference/functions/rightArithShift.md +0 -52
- package/docs/reference/functions/rightLogShift.md +0 -52
- package/docs/reference/functions/rotate.md +0 -53
- package/docs/reference/functions/rotationMatrix.md +0 -57
- package/docs/reference/functions/round.md +0 -61
- package/docs/reference/functions/row.md +0 -45
- package/docs/reference/functions/sec.md +0 -47
- package/docs/reference/functions/sech.md +0 -49
- package/docs/reference/functions/setCartesian.md +0 -49
- package/docs/reference/functions/setDifference.md +0 -47
- package/docs/reference/functions/setDistinct.md +0 -43
- package/docs/reference/functions/setIntersect.md +0 -46
- package/docs/reference/functions/setIsSubset.md +0 -47
- package/docs/reference/functions/setMultiplicity.md +0 -46
- package/docs/reference/functions/setPowerset.md +0 -43
- package/docs/reference/functions/setSize.md +0 -47
- package/docs/reference/functions/setSymDifference.md +0 -47
- package/docs/reference/functions/setUnion.md +0 -46
- package/docs/reference/functions/sign.md +0 -52
- package/docs/reference/functions/simplify.md +0 -130
- package/docs/reference/functions/simplifyConstant.md +0 -52
- package/docs/reference/functions/simplifyCore.md +0 -50
- package/docs/reference/functions/sin.md +0 -51
- package/docs/reference/functions/sinh.md +0 -46
- package/docs/reference/functions/size.md +0 -50
- package/docs/reference/functions/slu.md +0 -57
- package/docs/reference/functions/smaller.md +0 -60
- package/docs/reference/functions/smallerEq.md +0 -56
- package/docs/reference/functions/sort.md +0 -56
- package/docs/reference/functions/sparse.md +0 -51
- package/docs/reference/functions/splitUnit.md +0 -37
- package/docs/reference/functions/sqrt.md +0 -50
- package/docs/reference/functions/sqrtm.md +0 -46
- package/docs/reference/functions/square.md +0 -51
- package/docs/reference/functions/squeeze.md +0 -53
- package/docs/reference/functions/std.md +0 -76
- package/docs/reference/functions/stirlingS2.md +0 -52
- package/docs/reference/functions/string.md +0 -49
- package/docs/reference/functions/subset.md +0 -65
- package/docs/reference/functions/subtract.md +0 -54
- package/docs/reference/functions/sum.md +0 -54
- package/docs/reference/functions/symbolicEqual.md +0 -62
- package/docs/reference/functions/tan.md +0 -49
- package/docs/reference/functions/tanh.md +0 -50
- package/docs/reference/functions/to.md +0 -47
- package/docs/reference/functions/trace.md +0 -50
- package/docs/reference/functions/transpose.md +0 -49
- package/docs/reference/functions/typeOf.md +0 -81
- package/docs/reference/functions/typed.md +0 -56
- package/docs/reference/functions/unaryMinus.md +0 -49
- package/docs/reference/functions/unaryPlus.md +0 -48
- package/docs/reference/functions/unequal.md +0 -74
- package/docs/reference/functions/unit.md +0 -48
- package/docs/reference/functions/usolve.md +0 -51
- package/docs/reference/functions/usolveAll.md +0 -51
- package/docs/reference/functions/variance.md +0 -78
- package/docs/reference/functions/xgcd.md +0 -47
- package/docs/reference/functions/xor.md +0 -53
- package/docs/reference/functions/zeros.md +0 -57
- package/docs/reference/functions.md +0 -297
- package/docs/reference/index.md +0 -5
- package/examples/advanced/convert_fraction_to_bignumber.js +0 -59
- package/examples/advanced/custom_argument_parsing.js +0 -98
- package/examples/advanced/custom_datatype.js +0 -56
- package/examples/advanced/custom_evaluate_using_factories.js +0 -19
- package/examples/advanced/custom_evaluate_using_import.js +0 -18
- package/examples/advanced/custom_loading.js +0 -33
- package/examples/advanced/custom_relational_functions.js +0 -62
- package/examples/advanced/custom_scope_objects.js +0 -115
- package/examples/advanced/expression_trees.js +0 -55
- package/examples/advanced/function_transform.js +0 -50
- package/examples/advanced/more_secure_eval.js +0 -36
- package/examples/advanced/use_bigint.js +0 -43
- package/examples/advanced/web_server/math_worker.js +0 -24
- package/examples/advanced/web_server/server.js +0 -80
- package/examples/algebra.js +0 -34
- package/examples/basic_usage.js +0 -49
- package/examples/bignumbers.js +0 -52
- package/examples/browser/angle_configuration.html +0 -134
- package/examples/browser/basic_usage.html +0 -39
- package/examples/browser/currency_conversion.html +0 -125
- package/examples/browser/custom_separators.html +0 -81
- package/examples/browser/plot.html +0 -78
- package/examples/browser/pretty_printing_with_mathjax.html +0 -122
- package/examples/browser/printing_html.html +0 -170
- package/examples/browser/requirejs_loading.html +0 -20
- package/examples/browser/rocket_trajectory_optimization.html +0 -301
- package/examples/browser/webworkers/webworkers.html +0 -80
- package/examples/browser/webworkers/worker.js +0 -28
- package/examples/chaining.js +0 -56
- package/examples/complex_numbers.js +0 -67
- package/examples/expressions.js +0 -188
- package/examples/fractions.js +0 -74
- package/examples/import.js +0 -95
- package/examples/matrices.js +0 -101
- package/examples/objects.js +0 -35
- package/examples/package.json +0 -3
- package/examples/serialization.js +0 -16
- package/examples/sparse_matrices.js +0 -19
- package/examples/units.js +0 -108
@@ -1,170 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>math.js | printing HTML</title>
|
6
|
-
|
7
|
-
<script src="../../lib/browser/math.js"></script>
|
8
|
-
|
9
|
-
<style>
|
10
|
-
body {
|
11
|
-
font-size: 11pt;
|
12
|
-
font-family: verdana, arial, sans-serif;
|
13
|
-
}
|
14
|
-
|
15
|
-
h1 {
|
16
|
-
font-size: 1rem;
|
17
|
-
}
|
18
|
-
|
19
|
-
fieldset {
|
20
|
-
display: inline;
|
21
|
-
margin: 0 50px 10px 0;
|
22
|
-
padding: 0;
|
23
|
-
border: none;
|
24
|
-
}
|
25
|
-
|
26
|
-
input[type=text] {
|
27
|
-
font-size: 11pt;
|
28
|
-
font-family: verdana, arial, sans-serif;
|
29
|
-
padding: 5px;
|
30
|
-
width: calc(100% - 14px);
|
31
|
-
}
|
32
|
-
|
33
|
-
label {
|
34
|
-
margin: 0 5px 0 0;
|
35
|
-
}
|
36
|
-
|
37
|
-
table {
|
38
|
-
width: 100%;
|
39
|
-
border-collapse: collapse;
|
40
|
-
}
|
41
|
-
|
42
|
-
table td,
|
43
|
-
table th {
|
44
|
-
padding: 5px;
|
45
|
-
border: 1px solid LightGrey;
|
46
|
-
}
|
47
|
-
|
48
|
-
table th {
|
49
|
-
background-color: LightGrey;
|
50
|
-
}
|
51
|
-
|
52
|
-
/* style the HTML output */
|
53
|
-
.math-function {
|
54
|
-
color: Purple;
|
55
|
-
font-weight: bold;
|
56
|
-
}
|
57
|
-
|
58
|
-
.math-number {
|
59
|
-
color: Blue;
|
60
|
-
}
|
61
|
-
|
62
|
-
.math-boolean {
|
63
|
-
color: Green;
|
64
|
-
}
|
65
|
-
|
66
|
-
.math-string {
|
67
|
-
color: Grey;
|
68
|
-
}
|
69
|
-
|
70
|
-
.math-string::before,
|
71
|
-
.math-string::after {
|
72
|
-
content: "\"";
|
73
|
-
}
|
74
|
-
|
75
|
-
.math-property {
|
76
|
-
font-style: italic;
|
77
|
-
}
|
78
|
-
|
79
|
-
.math-explicit-binary-operator::before,
|
80
|
-
.math-explicit-binary-operator::after {
|
81
|
-
content: " ";
|
82
|
-
}
|
83
|
-
|
84
|
-
.math-separator::after,
|
85
|
-
.math-assignment-operator::after {
|
86
|
-
content: " ";
|
87
|
-
}
|
88
|
-
</style>
|
89
|
-
</head>
|
90
|
-
<body>
|
91
|
-
<h1>Expression evaluation and HTML code generation with math.js</h1>
|
92
|
-
<form>
|
93
|
-
<fieldset>
|
94
|
-
Parenthesis option:
|
95
|
-
<label><input type="radio" name="parenthesis" value="keep" checked>keep</label>
|
96
|
-
<label><input type="radio" name="parenthesis" value="auto">auto</label>
|
97
|
-
<label><input type="radio" name="parenthesis" value="all">all</label>
|
98
|
-
</fieldset>
|
99
|
-
<fieldset>
|
100
|
-
Implicit multiplication:
|
101
|
-
<label><input type="radio" name="implicit" value="hide" checked>hide</label>
|
102
|
-
<label><input type="radio" name="implicit" value="show">show</label>
|
103
|
-
</fieldset>
|
104
|
-
</form>
|
105
|
-
<table>
|
106
|
-
<tr>
|
107
|
-
<th>Expression</th>
|
108
|
-
<td><input type="text" id="expr"/></td>
|
109
|
-
</tr>
|
110
|
-
<tr>
|
111
|
-
<th>Result</th>
|
112
|
-
<td><div id="result"></div></td>
|
113
|
-
</tr>
|
114
|
-
<tr>
|
115
|
-
<th>HTML output</th>
|
116
|
-
<td><div id="output">$$$$</div></td>
|
117
|
-
</tr>
|
118
|
-
<tr>
|
119
|
-
<th>HTML code</th>
|
120
|
-
<td><div id="code">$$$$</div></td>
|
121
|
-
</tr>
|
122
|
-
</table>
|
123
|
-
<script>
|
124
|
-
const expr = document.getElementById('expr')
|
125
|
-
const output = document.getElementById('output')
|
126
|
-
const code = document.getElementById('code')
|
127
|
-
const result = document.getElementById('result')
|
128
|
-
let options = {parenthesis: 'keep', implicit: 'hide'}
|
129
|
-
|
130
|
-
// initialize with an example expression
|
131
|
-
expr.value = 'sqrt(75/3)+det([[-1,2],[3,1]])-sin(pi/4)^2'
|
132
|
-
|
133
|
-
function print () {
|
134
|
-
let parsed = null
|
135
|
-
|
136
|
-
try {
|
137
|
-
// parse the expression
|
138
|
-
parsed = math.parse(expr.value)
|
139
|
-
|
140
|
-
// evaluate the result of the expression
|
141
|
-
result.innerHTML = math.format(parsed.compile().evaluate())
|
142
|
-
|
143
|
-
// print the HTML output
|
144
|
-
const html = math.parse(expr.value).toHTML(options)
|
145
|
-
output.innerHTML = html
|
146
|
-
|
147
|
-
// print the HTML code
|
148
|
-
code.innerHTML = html.replace(/</g, '<').
|
149
|
-
replace(/>/g, '>').
|
150
|
-
replace(/<\/span>/g, '</span><br />')
|
151
|
-
}
|
152
|
-
catch (err) {
|
153
|
-
result.innerHTML = '<span style="color: red;">' + err.toString() + '</span>'
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
window.onload = print
|
158
|
-
expr.oninput = print
|
159
|
-
|
160
|
-
// make the controls work
|
161
|
-
const controls = document.querySelectorAll('input[type=radio]')
|
162
|
-
controls.forEach(function (control) {
|
163
|
-
control.onclick = function() {
|
164
|
-
options[control.name] = control.value
|
165
|
-
print()
|
166
|
-
}
|
167
|
-
})
|
168
|
-
</script>
|
169
|
-
</body>
|
170
|
-
</html>
|
@@ -1,20 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>math.js | require.js loading</title>
|
6
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.min.js"></script>
|
7
|
-
</head>
|
8
|
-
<body>
|
9
|
-
|
10
|
-
<script>
|
11
|
-
// load math.js using require.js
|
12
|
-
require(['../../lib/browser/math.js'], function (math) {
|
13
|
-
// evaluate some expression
|
14
|
-
const result = math.evaluate('1.2 * (2 + 4.5)')
|
15
|
-
document.write(result)
|
16
|
-
})
|
17
|
-
</script>
|
18
|
-
|
19
|
-
</body>
|
20
|
-
</html>
|
@@ -1,301 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8">
|
6
|
-
<title>math.js | rocket trajectory optimization</title>
|
7
|
-
|
8
|
-
<script src="../../lib/browser/math.js"></script>
|
9
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
|
10
|
-
|
11
|
-
<style>
|
12
|
-
body {
|
13
|
-
font-family: sans-serif;
|
14
|
-
}
|
15
|
-
|
16
|
-
#canvas-grid {
|
17
|
-
display: grid;
|
18
|
-
grid-template-columns: repeat(2, 1fr);
|
19
|
-
gap: 5%;
|
20
|
-
margin-top: 5%;
|
21
|
-
}
|
22
|
-
|
23
|
-
#canvas-grid>div {
|
24
|
-
overflow: hidden;
|
25
|
-
}
|
26
|
-
</style>
|
27
|
-
</head>
|
28
|
-
|
29
|
-
<body>
|
30
|
-
<h1>Rocket trajectory optimization</h1>
|
31
|
-
<p>
|
32
|
-
This example simulates the launch of a SpaceX Falcon 9 modeled using a system of ordinary differential equations.
|
33
|
-
</p>
|
34
|
-
|
35
|
-
<canvas id="canvas" width="1600" height="600"></canvas>
|
36
|
-
<div id="canvas-grid"></div>
|
37
|
-
|
38
|
-
<script>
|
39
|
-
// Solve ODE `dx/dt = f(x,t), x(0) = x0` numerically.
|
40
|
-
function ndsolve(f, x0, dt, tmax) {
|
41
|
-
let x = x0.clone() // Current values of variables
|
42
|
-
const result = [x] // Contains entire solution
|
43
|
-
const nsteps = math.divide(tmax, dt) // Number of time steps
|
44
|
-
for (let i = 0; i < nsteps; i++) {
|
45
|
-
// Compute derivatives
|
46
|
-
const dxdt = f.map(func => func(...x.toArray()))
|
47
|
-
// Euler method to compute next time step
|
48
|
-
const dx = math.multiply(dxdt, dt)
|
49
|
-
x = math.add(x, dx)
|
50
|
-
result.push(x)
|
51
|
-
}
|
52
|
-
return math.matrix(result)
|
53
|
-
}
|
54
|
-
|
55
|
-
// Import the numerical ODE solver
|
56
|
-
math.import({ ndsolve })
|
57
|
-
|
58
|
-
// Create a math.js context for our simulation. Everything else occurs in the context of the expression parser!
|
59
|
-
const sim = math.parser()
|
60
|
-
|
61
|
-
sim.evaluate("G = 6.67408e-11 m^3 kg^-1 s^-2") // Gravitational constant
|
62
|
-
sim.evaluate("mbody = 5.9724e24 kg") // Mass of Earth
|
63
|
-
sim.evaluate("mu = G * mbody") // Standard gravitational parameter
|
64
|
-
sim.evaluate("g0 = 9.80665 m/s^2") // Standard gravity: used for calculating prop consumption (dmdt)
|
65
|
-
sim.evaluate("r0 = 6371 km") // Mean radius of Earth
|
66
|
-
sim.evaluate("t0 = 0 s") // Simulation start
|
67
|
-
sim.evaluate("dt = 0.5 s") // Simulation timestep
|
68
|
-
sim.evaluate("tfinal = 149.5 s") // Simulation duration
|
69
|
-
sim.evaluate("isp_sea = 282 s") // Specific impulse (at sea level)
|
70
|
-
sim.evaluate("isp_vac = 311 s") // Specific impulse (in vacuum)
|
71
|
-
sim.evaluate("gamma0 = 89.99970 deg") // Initial pitch angle (90 deg is vertical)
|
72
|
-
sim.evaluate("v0 = 1 m/s") // Initial velocity (must be non-zero because ODE is ill-conditioned)
|
73
|
-
sim.evaluate("phi0 = 0 deg") // Initial orbital reference angle
|
74
|
-
sim.evaluate("m1 = 433100 kg") // First stage mass
|
75
|
-
sim.evaluate("m2 = 111500 kg") // Second stage mass
|
76
|
-
sim.evaluate("m3 = 1700 kg") // Third stage / fairing mass
|
77
|
-
sim.evaluate("mp = 5000 kg") // Payload mass
|
78
|
-
sim.evaluate("m0 = m1+m2+m3+mp") // Initial mass of rocket
|
79
|
-
sim.evaluate("dm = 2750 kg/s") // Mass flow rate
|
80
|
-
sim.evaluate("A = (3.66 m)^2 * pi") // Area of the rocket
|
81
|
-
sim.evaluate("dragCoef = 0.2") // Drag coefficient
|
82
|
-
|
83
|
-
// Define the equations of motion. We just thrust into current direction of motion, e.g. making a gravity turn.
|
84
|
-
sim.evaluate("gravity(r) = mu / r^2")
|
85
|
-
sim.evaluate("angVel(r, v, gamma) = v/r * cos(gamma) * rad") // Angular velocity of rocket around moon
|
86
|
-
sim.evaluate("density(r) = 1.2250 kg/m^3 * exp(-g0 * (r - r0) / (83246.8 m^2/s^2))") // Assume constant temperature
|
87
|
-
sim.evaluate("drag(r, v) = 1/2 * density(r) .* v.^2 * A * dragCoef")
|
88
|
-
sim.evaluate("isp(r) = isp_vac + (isp_sea - isp_vac) * density(r)/density(r0)") // pressure ~ density for constant temperature
|
89
|
-
sim.evaluate("thrust(isp) = g0 * isp * dm")
|
90
|
-
// It is important to maintain the same argument order for each of these functions.
|
91
|
-
sim.evaluate("drdt(r, v, m, phi, gamma, t) = v sin(gamma)")
|
92
|
-
sim.evaluate("dvdt(r, v, m, phi, gamma, t) = - gravity(r) * sin(gamma) + (thrust(isp(r)) - drag(r, v)) / m")
|
93
|
-
sim.evaluate("dmdt(r, v, m, phi, gamma, t) = - dm")
|
94
|
-
sim.evaluate("dphidt(r, v, m, phi, gamma, t) = angVel(r, v, gamma)")
|
95
|
-
sim.evaluate("dgammadt(r, v, m, phi, gamma, t) = angVel(r, v, gamma) - gravity(r) * cos(gamma) / v * rad")
|
96
|
-
sim.evaluate("dtdt(r, v, m, phi, gamma, t) = 1")
|
97
|
-
|
98
|
-
// Remember to maintain the same variable order in the call to ndsolve.
|
99
|
-
sim.evaluate("result_stage1 = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], [r0, v0, m0, phi0, gamma0, t0], dt, tfinal)")
|
100
|
-
|
101
|
-
// Reset initial conditions for interstage flight
|
102
|
-
sim.evaluate("dm = 0 kg/s")
|
103
|
-
sim.evaluate("tfinal = 10 s")
|
104
|
-
sim.evaluate("x = flatten(result_stage1[end,:])")
|
105
|
-
sim.evaluate("x[3] = m2+m3+mp") // New mass after stage seperation
|
106
|
-
sim.evaluate("result_interstage = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], x, dt, tfinal)")
|
107
|
-
|
108
|
-
// Reset initial conditions for stage 2 flight
|
109
|
-
sim.evaluate("dm = 270.8 kg/s")
|
110
|
-
sim.evaluate("isp_vac = 348 s")
|
111
|
-
sim.evaluate("tfinal = 350 s")
|
112
|
-
sim.evaluate("x = flatten(result_interstage[end,:])")
|
113
|
-
sim.evaluate("result_stage2 = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], x, dt, tfinal)")
|
114
|
-
|
115
|
-
// Reset initial conditions for unpowered flight
|
116
|
-
sim.evaluate("dm = 0 kg/s")
|
117
|
-
sim.evaluate("tfinal = 900 s")
|
118
|
-
sim.evaluate("dt = 10 s")
|
119
|
-
sim.evaluate("x = flatten(result_stage2[end,:])")
|
120
|
-
sim.evaluate("result_unpowered1 = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], x, dt, tfinal)")
|
121
|
-
|
122
|
-
// Reset initial conditions for final orbit insertion
|
123
|
-
sim.evaluate("dm = 270.8 kg/s")
|
124
|
-
sim.evaluate("tfinal = 39 s")
|
125
|
-
sim.evaluate("dt = 0.5 s")
|
126
|
-
sim.evaluate("x = flatten(result_unpowered1[end,:])")
|
127
|
-
sim.evaluate("result_insertion = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], x, dt, tfinal)")
|
128
|
-
|
129
|
-
// Reset initial conditions for unpowered flight
|
130
|
-
sim.evaluate("dm = 0 kg/s")
|
131
|
-
sim.evaluate("tfinal = 250 s")
|
132
|
-
sim.evaluate("dt = 10 s")
|
133
|
-
sim.evaluate("x = flatten(result_insertion[end,:])")
|
134
|
-
sim.evaluate("result_unpowered2 = ndsolve([drdt, dvdt, dmdt, dphidt, dgammadt, dtdt], x, dt, tfinal)")
|
135
|
-
|
136
|
-
// Now it's time to prepare results for plotting
|
137
|
-
const resultNames = ['stage1', 'interstage', 'stage2', 'unpowered1', 'insertion', 'unpowered2']
|
138
|
-
.map(stageName => `result_${stageName}`)
|
139
|
-
|
140
|
-
// Concat result matrices
|
141
|
-
sim.set('result',
|
142
|
-
math.concat(
|
143
|
-
...resultNames.map(resultName =>
|
144
|
-
sim.evaluate(`${resultName}[:end-1, :]`) // Avoid overlap
|
145
|
-
),
|
146
|
-
0 // Concat in row-dimension
|
147
|
-
)
|
148
|
-
)
|
149
|
-
|
150
|
-
const mainDatasets = resultNames.map((resultName, i) => ({
|
151
|
-
label: resultName.slice(7),
|
152
|
-
data: sim.evaluate(
|
153
|
-
'concat('
|
154
|
-
+ `(${resultName}[:,4] - phi0) * r0 / rad / km,` // Surface distance from start (in km)
|
155
|
-
+ `(${resultName}[:,1] - r0) / km` // Height above surface (in km)
|
156
|
-
+ ')'
|
157
|
-
).toArray().map(([x, y]) => ({ x, y })),
|
158
|
-
borderColor: i % 2 ? '#999' : '#dc3912',
|
159
|
-
fill: false,
|
160
|
-
pointRadius: 0,
|
161
|
-
}))
|
162
|
-
new Chart(document.getElementById('canvas'), {
|
163
|
-
type: 'line',
|
164
|
-
data: { datasets: mainDatasets },
|
165
|
-
options: getMainChartOptions()
|
166
|
-
})
|
167
|
-
|
168
|
-
createChart([{
|
169
|
-
label: 'velocity (in m/s)',
|
170
|
-
data: sim.evaluate("result[:,[2,6]]")
|
171
|
-
.toArray()
|
172
|
-
.map(([v, t]) => ({ x: t.toNumber('s'), y: v.toNumber('m/s') }))
|
173
|
-
}])
|
174
|
-
createChart([{
|
175
|
-
label: 'height (in km)',
|
176
|
-
data: sim.evaluate("concat((result[:, 1] - r0), result[:, 6])")
|
177
|
-
.toArray()
|
178
|
-
.map(([r, t]) => ({ x: t.toNumber('s'), y: r.toNumber('km') })),
|
179
|
-
}])
|
180
|
-
createChart([{
|
181
|
-
label: 'gamma (in deg)',
|
182
|
-
data: sim.evaluate("result[:, [5,6]]")
|
183
|
-
.toArray()
|
184
|
-
.map(([gamma, t]) => ({ x: t.toNumber('s'), y: gamma.toNumber('deg') })),
|
185
|
-
}])
|
186
|
-
createChart([{
|
187
|
-
label: 'acceleration (in m/s^2)',
|
188
|
-
data: sim.evaluate("concat(diff(result[:, 2]) ./ diff(result[:, 6]), result[:end-1, 6])")
|
189
|
-
.toArray()
|
190
|
-
.map(([acc, t]) => ({ x: t.toNumber('s'), y: acc.toNumber('m/s^2') })),
|
191
|
-
}])
|
192
|
-
createChart([{
|
193
|
-
label: 'drag acceleration (in m/s^2)',
|
194
|
-
data: sim.evaluate("concat(drag(result[:, 1], result[:, 2]) ./ result[:, 3], result[:, 6])")
|
195
|
-
.toArray()
|
196
|
-
.map(([dragAcc, t]) => ({ x: t.toNumber('s'), y: dragAcc.toNumber('m/s^2') })),
|
197
|
-
}])
|
198
|
-
createChart(
|
199
|
-
[
|
200
|
-
{
|
201
|
-
data: sim.evaluate("result[:, [1,4]]")
|
202
|
-
.toArray()
|
203
|
-
.map(([r, phi]) => math.rotate([r.toNumber('km'), 0], phi))
|
204
|
-
.map(([x, y]) => ({ x, y })),
|
205
|
-
},
|
206
|
-
{
|
207
|
-
data: sim.evaluate("map(0:0.25:360, function(angle) = rotate([r0/km, 0], angle))")
|
208
|
-
.toArray()
|
209
|
-
.map(([x, y]) => ({ x, y })),
|
210
|
-
borderColor: "#999",
|
211
|
-
fill: true
|
212
|
-
}
|
213
|
-
],
|
214
|
-
getEarthChartOptions()
|
215
|
-
)
|
216
|
-
|
217
|
-
// Helper functions for plotting data (nothing to learn about math.js from here on)
|
218
|
-
function createChart(datasets, options = {}) {
|
219
|
-
const container = document.createElement("div")
|
220
|
-
document.querySelector("#canvas-grid").appendChild(container)
|
221
|
-
const canvas = document.createElement("canvas")
|
222
|
-
container.appendChild(canvas)
|
223
|
-
new Chart(canvas, {
|
224
|
-
type: 'line',
|
225
|
-
data: {
|
226
|
-
datasets: datasets.map(dataset => ({
|
227
|
-
borderColor: "#dc3912",
|
228
|
-
fill: false,
|
229
|
-
pointRadius: 0,
|
230
|
-
...dataset
|
231
|
-
}))
|
232
|
-
},
|
233
|
-
options: getChartOptions(options)
|
234
|
-
})
|
235
|
-
}
|
236
|
-
|
237
|
-
function getMainChartOptions() {
|
238
|
-
return {
|
239
|
-
scales: {
|
240
|
-
xAxes: [{
|
241
|
-
type: 'linear',
|
242
|
-
position: 'bottom',
|
243
|
-
scaleLabel: {
|
244
|
-
display: true,
|
245
|
-
labelString: 'surface distance travelled (in km)'
|
246
|
-
}
|
247
|
-
}],
|
248
|
-
yAxes: [{
|
249
|
-
type: 'linear',
|
250
|
-
scaleLabel: {
|
251
|
-
display: true,
|
252
|
-
labelString: 'height above surface (in km)'
|
253
|
-
}
|
254
|
-
}]
|
255
|
-
},
|
256
|
-
animation: false
|
257
|
-
}
|
258
|
-
}
|
259
|
-
|
260
|
-
function getChartOptions(options) {
|
261
|
-
return {
|
262
|
-
scales: {
|
263
|
-
xAxes: [{
|
264
|
-
type: 'linear',
|
265
|
-
position: 'bottom',
|
266
|
-
scaleLabel: {
|
267
|
-
display: true,
|
268
|
-
labelString: 'time (in s)'
|
269
|
-
}
|
270
|
-
}]
|
271
|
-
},
|
272
|
-
animation: false,
|
273
|
-
...options
|
274
|
-
}
|
275
|
-
}
|
276
|
-
|
277
|
-
function getEarthChartOptions() {
|
278
|
-
return {
|
279
|
-
aspectRatio: 1,
|
280
|
-
scales: {
|
281
|
-
xAxes: [{
|
282
|
-
type: 'linear',
|
283
|
-
position: 'bottom',
|
284
|
-
min: -8000,
|
285
|
-
max: 8000,
|
286
|
-
display: false
|
287
|
-
}],
|
288
|
-
yAxes: [{
|
289
|
-
type: 'linear',
|
290
|
-
min: -8000,
|
291
|
-
max: 8000,
|
292
|
-
display: false
|
293
|
-
}]
|
294
|
-
},
|
295
|
-
legend: { display: false }
|
296
|
-
}
|
297
|
-
}
|
298
|
-
</script>
|
299
|
-
</body>
|
300
|
-
|
301
|
-
</html>
|
@@ -1,80 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>math.js | web workers</title>
|
6
|
-
</head>
|
7
|
-
<body>
|
8
|
-
|
9
|
-
<p>
|
10
|
-
In this example, a math.js parser is running in a separate
|
11
|
-
<a href="https://www.html5rocks.com/en/tutorials/workers/basics/">web worker</a>,
|
12
|
-
preventing the user interface from freezing during heavy calculations.
|
13
|
-
</p>
|
14
|
-
|
15
|
-
<p id="results"></p>
|
16
|
-
|
17
|
-
<script>
|
18
|
-
/**
|
19
|
-
* MathWorker evaluates expressions asynchronously in a web worker.
|
20
|
-
*
|
21
|
-
* Example usage:
|
22
|
-
*
|
23
|
-
* const worker = new MathWorker()
|
24
|
-
* const expr = '12 / (2.3 + 0.7)'
|
25
|
-
* worker.evaluate(expr, function (err, result) {
|
26
|
-
* console.log(err, result)
|
27
|
-
* })
|
28
|
-
*/
|
29
|
-
function MathWorker () {
|
30
|
-
this.worker = new Worker('worker.js')
|
31
|
-
this.callbacks = {}
|
32
|
-
this.seq = 0
|
33
|
-
|
34
|
-
// create a listener to receive responses from the web worker
|
35
|
-
const me = this
|
36
|
-
this.worker.addEventListener('message', function(event) {
|
37
|
-
const response = JSON.parse(event.data)
|
38
|
-
|
39
|
-
// find the callback corresponding to this response
|
40
|
-
const callback = me.callbacks[response.id]
|
41
|
-
delete me.callbacks[response.id]
|
42
|
-
|
43
|
-
// call the requests callback with the result
|
44
|
-
callback(response.err, response.result)
|
45
|
-
}, false)
|
46
|
-
}
|
47
|
-
|
48
|
-
/**
|
49
|
-
* Evaluate an expression
|
50
|
-
* @param {string} expr
|
51
|
-
* @param {Function} callback Called as callback(err, result)
|
52
|
-
*/
|
53
|
-
MathWorker.prototype.evaluate = function evaluate (expr, callback) {
|
54
|
-
// build a request,
|
55
|
-
// add an id so we can link returned responses to the right callback
|
56
|
-
const id = this.seq++
|
57
|
-
const request = {
|
58
|
-
id: id,
|
59
|
-
expr: expr
|
60
|
-
}
|
61
|
-
|
62
|
-
// queue the callback, it will be called when the worker returns the result
|
63
|
-
this.callbacks[id] = callback
|
64
|
-
|
65
|
-
// send the request to the worker
|
66
|
-
this.worker.postMessage(JSON.stringify(request))
|
67
|
-
}
|
68
|
-
|
69
|
-
// create a MathWorker
|
70
|
-
const worker = new MathWorker()
|
71
|
-
|
72
|
-
// evaluate an expression via the worker
|
73
|
-
worker.evaluate('12 / (2.3 + 0.7)', function (err, result) {
|
74
|
-
document.getElementById('results').innerHTML += 'result: ' + result + '<br>'
|
75
|
-
})
|
76
|
-
|
77
|
-
</script>
|
78
|
-
|
79
|
-
</body>
|
80
|
-
</html>
|
@@ -1,28 +0,0 @@
|
|
1
|
-
importScripts('../../../lib/browser/math.js')
|
2
|
-
|
3
|
-
// create a parser
|
4
|
-
const parser = self.math.parser()
|
5
|
-
|
6
|
-
self.addEventListener('message', function (event) {
|
7
|
-
const request = JSON.parse(event.data)
|
8
|
-
let result = null
|
9
|
-
let err = null
|
10
|
-
|
11
|
-
try {
|
12
|
-
// evaluate the expression
|
13
|
-
result = parser.evaluate(request.expr)
|
14
|
-
} catch (e) {
|
15
|
-
// return the error
|
16
|
-
err = e
|
17
|
-
}
|
18
|
-
|
19
|
-
// build a response
|
20
|
-
const response = {
|
21
|
-
id: request.id,
|
22
|
-
result: self.math.format(result),
|
23
|
-
err: err
|
24
|
-
}
|
25
|
-
|
26
|
-
// send the response back
|
27
|
-
self.postMessage(JSON.stringify(response))
|
28
|
-
}, false)
|
package/examples/chaining.js
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
// chaining
|
2
|
-
|
3
|
-
// load math.js (using node.js)
|
4
|
-
const math = require('..')
|
5
|
-
|
6
|
-
// create a chained operation using the function `chain(value)`
|
7
|
-
// end a chain using done(). Let's calculate (3 + 4) * 2
|
8
|
-
const a = math.chain(3)
|
9
|
-
.add(4)
|
10
|
-
.multiply(2)
|
11
|
-
.done()
|
12
|
-
print(a) // 14
|
13
|
-
|
14
|
-
// Another example, calculate square(sin(pi / 4))
|
15
|
-
const b = math.chain(math.pi)
|
16
|
-
.divide(4)
|
17
|
-
.sin()
|
18
|
-
.square()
|
19
|
-
.done()
|
20
|
-
print(b) // 0.5
|
21
|
-
|
22
|
-
// A chain has a few special methods: done, toString, valueOf, get, and set.
|
23
|
-
// these are demonstrated in the following examples
|
24
|
-
|
25
|
-
// toString will return a string representation of the chain's value
|
26
|
-
const chain = math.chain(2).divide(3)
|
27
|
-
const str = chain.toString()
|
28
|
-
print(str) // "0.6666666666666666"
|
29
|
-
|
30
|
-
// a chain has a function .valueOf(), which returns the value hold by the chain.
|
31
|
-
// This allows using it in regular operations. The function valueOf() acts the
|
32
|
-
// same as function done().
|
33
|
-
print(chain.valueOf()) // 0.66666666666667
|
34
|
-
print(chain + 2) // 2.6666666666667
|
35
|
-
|
36
|
-
// the function subset can be used to get or replace sub matrices
|
37
|
-
const array = [[1, 2], [3, 4]]
|
38
|
-
const v = math.chain(array)
|
39
|
-
.subset(math.index(1, 0))
|
40
|
-
.done()
|
41
|
-
print(v) // 3
|
42
|
-
|
43
|
-
const m = math.chain(array)
|
44
|
-
.subset(math.index(0, 0), 8)
|
45
|
-
.multiply(3)
|
46
|
-
.done()
|
47
|
-
print(m) // [[24, 6], [9, 12]]
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Helper function to output a value in the console. Value will be formatted.
|
51
|
-
* @param {*} value
|
52
|
-
*/
|
53
|
-
function print (value) {
|
54
|
-
const precision = 14
|
55
|
-
console.log(math.format(value, precision))
|
56
|
-
}
|