@johnhenry/math-sample 0.0.1 → 0.1.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/dist/mesh.d.ts ADDED
@@ -0,0 +1,90 @@
1
+ import { type Budget, type Cancellable, type Progress } from "./budget.ts";
2
+ import type { Domain } from "./sample.ts";
3
+ /**
4
+ * Triangle mesh as typed arrays, ready for a GPU buffer.
5
+ *
6
+ * - `positions` and `normals` hold `vertexCount * 3` floats (x, y, z per vertex).
7
+ * - `indices` holds triangles (3 per triangle), counter-clockwise seen from the side the normals point to.
8
+ * - A grid vertex whose position is not finite (or is outside `zRange`) is a hole: its position is `NaN`, its normal
9
+ * is `0, 0, 0`, `valid[v]` is 0, and no triangle references it, so a hole never produces a spike.
10
+ * - `bounds` covers the valid vertices only (`NaN`s if there are none).
11
+ * - `columns` x `rows` is the vertex grid (vertex `(i, j)` is `j * columns + i`), for callers that want to build wireframes.
12
+ */
13
+ export interface Mesh {
14
+ positions: Float32Array;
15
+ normals: Float32Array;
16
+ indices: Uint32Array;
17
+ valid: Uint8Array;
18
+ vertexCount: number;
19
+ columns: number;
20
+ rows: number;
21
+ bounds: {
22
+ min: [number, number, number];
23
+ max: [number, number, number];
24
+ };
25
+ progress: Progress;
26
+ }
27
+ export interface MeshOptions extends Budget, Cancellable {
28
+ /** Vertices along the first parameter (x or u). Default 64. */
29
+ columns?: number;
30
+ /** Vertices along the second parameter (y or v). Default 64. */
31
+ rows?: number;
32
+ /** Vertices with z outside this range are holes (a pole's huge finite shoulders). `z = f(x, y)` only. */
33
+ zRange?: {
34
+ min: number;
35
+ max: number;
36
+ };
37
+ }
38
+ export type Fn2 = (x: number, y: number) => number;
39
+ export type ParametricSurfaceFn = (u: number, v: number) => readonly [number, number, number];
40
+ export type CurveFn3 = (t: number) => readonly [number, number, number];
41
+ export type VectorFn3 = (x: number, y: number, z: number) => readonly [number, number, number];
42
+ /**
43
+ * Sample the surface `z = f(x, y)` on a regular grid. Normals point up (`+z` side). Non-finite values, and
44
+ * values outside `options.zRange`, become holes. When the budget ends early, `rows` is the number of grid
45
+ * rows built and `progress` says why.
46
+ */
47
+ export declare function sampleSurface(f: Fn2, xDomain: Domain, yDomain: Domain, options?: MeshOptions): Mesh;
48
+ /**
49
+ * Sample a parametric surface `(u, v) -> [x, y, z]`. Normals are `dP/du x dP/dv`, so swap the parameters (or
50
+ * negate a component) to flip them. Any non-finite coordinate makes the vertex a hole.
51
+ */
52
+ export declare function sampleParametricSurface(f: ParametricSurfaceFn, uDomain: Domain, vDomain: Domain, options?: MeshOptions): Mesh;
53
+ export interface Curve3 {
54
+ /** `count * 3` doubles. A gap row is `NaN, NaN, NaN`; gaps are never first, last or adjacent to another gap. */
55
+ positions: Float64Array;
56
+ /** The parameter value of each row. */
57
+ t: Float64Array;
58
+ count: number;
59
+ progress: Progress;
60
+ }
61
+ export interface CurveOptions extends Budget, Cancellable {
62
+ /** Samples. Default 512. */
63
+ samples?: number;
64
+ /** Segments longer than this (Euclidean) become gaps, which cuts a curve at a jump. Default: no limit. */
65
+ maxStep?: number;
66
+ }
67
+ /** Sample a space curve `t -> [x, y, z]`; non-finite points become gaps rather than spikes. */
68
+ export declare function sampleSpaceCurve(f: CurveFn3, tDomain: Domain, options?: CurveOptions): Curve3;
69
+ /** Index ranges `[start, end)` of consecutive data rows in a {@link Curve3}. */
70
+ export declare function curve3Runs(c: Curve3): Array<[number, number]>;
71
+ export interface VectorField3 {
72
+ /** `count * 3` floats: arrow tails. */
73
+ origins: Float32Array;
74
+ /** `count * 3` floats: the vector at each tail. */
75
+ vectors: Float32Array;
76
+ magnitudes: Float32Array;
77
+ maxMagnitude: number;
78
+ /** Arrows kept: grid points where the field was finite. */
79
+ count: number;
80
+ /** Grid points skipped because the field was non-finite there. */
81
+ skipped: number;
82
+ progress: Progress;
83
+ }
84
+ export interface VectorField3Options extends Budget, Cancellable {
85
+ /** Points per axis, `[nx, ny, nz]` or one number for all. Default 8. */
86
+ grid?: number | [number, number, number];
87
+ }
88
+ /** Sample a 3D vector field on a regular grid of the box `x` by `y` by `z`. `progress.rows` counts z-slabs. */
89
+ export declare function sampleVectorField3(f: VectorFn3, xDomain: Domain, yDomain: Domain, zDomain: Domain, options?: VectorField3Options): VectorField3;
90
+ //# sourceMappingURL=mesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.d.ts","sourceRoot":"","sources":["../src/mesh.ts"],"names":[],"mappings":"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"}
package/dist/mesh.js ADDED
@@ -0,0 +1,294 @@
1
+ import { assertCount, assertRange, Meter, progress } from "./budget.js";
2
+ const fin = (a, b, c) => Number.isFinite(a) && Number.isFinite(b) && Number.isFinite(c);
3
+ function build(evalAt, uDom, vDom, options, rangeZ, flip) {
4
+ const columns = options.columns ?? 64;
5
+ const rows = options.rows ?? 64;
6
+ assertCount("columns", columns);
7
+ assertCount("rows", rows);
8
+ assertRange("u domain", uDom);
9
+ assertRange("v domain", vDom);
10
+ const meter = new Meter(options, options);
11
+ const pos = new Float64Array(columns * rows * 3).fill(Number.NaN);
12
+ const ok = new Uint8Array(columns * rows);
13
+ let done = 0;
14
+ let reason;
15
+ for (let j = 0; j < rows; j++) {
16
+ reason = meter.check(columns);
17
+ if (reason)
18
+ break;
19
+ const v = j === rows - 1 ? vDom.max : vDom.min + ((vDom.max - vDom.min) * j) / (rows - 1);
20
+ for (let i = 0; i < columns; i++) {
21
+ const u = i === columns - 1 ? uDom.max : uDom.min + ((uDom.max - uDom.min) * i) / (columns - 1);
22
+ const p = evalAt(u, v);
23
+ const k = j * columns + i;
24
+ if (fin(p[0], p[1], p[2]) && !(rangeZ && (p[2] < rangeZ.min || p[2] > rangeZ.max))) {
25
+ pos[3 * k] = p[0];
26
+ pos[3 * k + 1] = p[1];
27
+ pos[3 * k + 2] = p[2];
28
+ ok[k] = 1;
29
+ }
30
+ }
31
+ meter.spend(columns);
32
+ done++;
33
+ }
34
+ const usedRows = done;
35
+ const vertexCount = columns * usedRows;
36
+ const positions = new Float32Array(vertexCount * 3);
37
+ const normals = new Float32Array(vertexCount * 3);
38
+ const valid = ok.slice(0, vertexCount);
39
+ const min = [Infinity, Infinity, Infinity];
40
+ const max = [-Infinity, -Infinity, -Infinity];
41
+ for (let k = 0; k < vertexCount; k++) {
42
+ for (let c = 0; c < 3; c++) {
43
+ const val = pos[3 * k + c];
44
+ positions[3 * k + c] = val;
45
+ if (valid[k]) {
46
+ if (val < min[c])
47
+ min[c] = val;
48
+ if (val > max[c])
49
+ max[c] = val;
50
+ }
51
+ }
52
+ }
53
+ // normals: cross of central/one-sided differences over valid neighbours
54
+ const at = (i, j) => 3 * (j * columns + i);
55
+ const isOk = (i, j) => i >= 0 && i < columns && j >= 0 && j < usedRows && valid[j * columns + i] === 1;
56
+ for (let j = 0; j < usedRows; j++) {
57
+ for (let i = 0; i < columns; i++) {
58
+ if (!isOk(i, j))
59
+ continue;
60
+ const iA = isOk(i - 1, j) ? i - 1 : i;
61
+ const iB = isOk(i + 1, j) ? i + 1 : i;
62
+ const jA = isOk(i, j - 1) ? j - 1 : j;
63
+ const jB = isOk(i, j + 1) ? j + 1 : j;
64
+ const du = [0, 1, 2].map((c) => pos[at(iB, j) + c] - pos[at(iA, j) + c]);
65
+ const dv = [0, 1, 2].map((c) => pos[at(i, jB) + c] - pos[at(i, jA) + c]);
66
+ let nx = du[1] * dv[2] - du[2] * dv[1];
67
+ let ny = du[2] * dv[0] - du[0] * dv[2];
68
+ let nz = du[0] * dv[1] - du[1] * dv[0];
69
+ const len = Math.hypot(nx, ny, nz);
70
+ if (len > 0 && Number.isFinite(len)) {
71
+ const s = (flip ? -1 : 1) / len;
72
+ nx *= s;
73
+ ny *= s;
74
+ nz *= s;
75
+ const o = at(i, j);
76
+ normals[o] = nx;
77
+ normals[o + 1] = ny;
78
+ normals[o + 2] = nz;
79
+ }
80
+ }
81
+ }
82
+ // valid vertices with a degenerate normal (the poles of a sphere parameterisation): borrow from a neighbour
83
+ for (let j = 0; j < usedRows; j++) {
84
+ for (let i = 0; i < columns; i++) {
85
+ const o = at(i, j);
86
+ if (!isOk(i, j) || normals[o] !== 0 || normals[o + 1] !== 0 || normals[o + 2] !== 0)
87
+ continue;
88
+ for (const [di, dj] of [
89
+ [0, 1],
90
+ [0, -1],
91
+ [1, 0],
92
+ [-1, 0],
93
+ [0, 2],
94
+ [0, -2],
95
+ ]) {
96
+ if (!isOk(i + di, j + dj))
97
+ continue;
98
+ const q = at(i + di, j + dj);
99
+ if (normals[q] !== 0 || normals[q + 1] !== 0 || normals[q + 2] !== 0) {
100
+ normals[o] = normals[q];
101
+ normals[o + 1] = normals[q + 1];
102
+ normals[o + 2] = normals[q + 2];
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ if (!valid.some((x) => x === 1)) {
109
+ for (let c = 0; c < 3; c++) {
110
+ min[c] = Number.NaN;
111
+ max[c] = Number.NaN;
112
+ }
113
+ }
114
+ const tri = [];
115
+ for (let j = 0; j + 1 < usedRows; j++) {
116
+ for (let i = 0; i + 1 < columns; i++) {
117
+ const a = j * columns + i;
118
+ const b = a + 1;
119
+ const c = a + columns;
120
+ const d = c + 1;
121
+ const [va, vb, vc, vd] = [valid[a], valid[b], valid[c], valid[d]];
122
+ // counter-clockwise in (u, v): a, b, d and a, d, c
123
+ if (va && vb && vd)
124
+ tri.push(a, b, d);
125
+ if (va && vd && vc)
126
+ tri.push(a, d, c);
127
+ // a quad with exactly one hole corner still yields its one good triangle via the complementary split
128
+ if (!(va && vb && vd) && !(va && vd && vc)) {
129
+ if (va && vb && vc)
130
+ tri.push(a, b, c);
131
+ else if (vb && vd && vc)
132
+ tri.push(b, d, c);
133
+ }
134
+ }
135
+ }
136
+ return {
137
+ positions,
138
+ normals,
139
+ indices: Uint32Array.from(tri),
140
+ valid,
141
+ vertexCount,
142
+ columns,
143
+ rows: usedRows,
144
+ bounds: { min, max },
145
+ progress: progress(usedRows, rows, reason),
146
+ };
147
+ }
148
+ /**
149
+ * Sample the surface `z = f(x, y)` on a regular grid. Normals point up (`+z` side). Non-finite values, and
150
+ * values outside `options.zRange`, become holes. When the budget ends early, `rows` is the number of grid
151
+ * rows built and `progress` says why.
152
+ */
153
+ export function sampleSurface(f, xDomain, yDomain, options = {}) {
154
+ return build((x, y) => [x, y, f(x, y)], xDomain, yDomain, options, options.zRange, false);
155
+ }
156
+ /**
157
+ * Sample a parametric surface `(u, v) -> [x, y, z]`. Normals are `dP/du x dP/dv`, so swap the parameters (or
158
+ * negate a component) to flip them. Any non-finite coordinate makes the vertex a hole.
159
+ */
160
+ export function sampleParametricSurface(f, uDomain, vDomain, options = {}) {
161
+ return build(f, uDomain, vDomain, { ...options, zRange: undefined }, undefined, false);
162
+ }
163
+ /** Sample a space curve `t -> [x, y, z]`; non-finite points become gaps rather than spikes. */
164
+ export function sampleSpaceCurve(f, tDomain, options = {}) {
165
+ const n = options.samples ?? 512;
166
+ assertCount("samples", n);
167
+ assertRange("t domain", tDomain);
168
+ const meter = new Meter(options, options);
169
+ const rows = [];
170
+ const ts = [];
171
+ let done = 0;
172
+ let reason;
173
+ const CHUNK = 256;
174
+ for (let k = 0; k < n; k++) {
175
+ if (k % CHUNK === 0) {
176
+ reason = meter.check(Math.min(CHUNK, n - k));
177
+ if (reason)
178
+ break;
179
+ }
180
+ const t = k === n - 1 ? tDomain.max : tDomain.min + ((tDomain.max - tDomain.min) * k) / (n - 1);
181
+ const p = f(t);
182
+ ts.push(t);
183
+ rows.push(fin(p[0], p[1], p[2]) ? p[0] : Number.NaN, p[1], p[2]);
184
+ meter.spend(1);
185
+ done++;
186
+ }
187
+ // gap rule: NaN rows, with maxStep cuts, no leading/trailing/adjacent gaps
188
+ const outP = [];
189
+ const outT = [];
190
+ let prev; // index into rows of previous valid row
191
+ let pendingGap = false;
192
+ for (let k = 0; k < done; k++) {
193
+ const x = rows[3 * k];
194
+ if (Number.isNaN(x)) {
195
+ pendingGap = outP.length > 0;
196
+ prev = undefined;
197
+ continue;
198
+ }
199
+ const y = rows[3 * k + 1];
200
+ const z = rows[3 * k + 2];
201
+ let gap = pendingGap;
202
+ if (prev !== undefined && options.maxStep !== undefined) {
203
+ const d = Math.hypot(x - rows[3 * prev], y - rows[3 * prev + 1], z - rows[3 * prev + 2]);
204
+ if (d > options.maxStep)
205
+ gap = true;
206
+ }
207
+ if (gap && outP.length > 0) {
208
+ outP.push(Number.NaN, Number.NaN, Number.NaN);
209
+ outT.push(Number.NaN);
210
+ }
211
+ outP.push(x, y, z);
212
+ outT.push(ts[k]);
213
+ prev = k;
214
+ pendingGap = false;
215
+ }
216
+ return {
217
+ positions: Float64Array.from(outP),
218
+ t: Float64Array.from(outT),
219
+ count: outT.length,
220
+ progress: progress(done, n, reason),
221
+ };
222
+ }
223
+ /** Index ranges `[start, end)` of consecutive data rows in a {@link Curve3}. */
224
+ export function curve3Runs(c) {
225
+ const runs = [];
226
+ let start = -1;
227
+ for (let k = 0; k < c.count; k++) {
228
+ if (Number.isNaN(c.positions[3 * k])) {
229
+ if (start >= 0)
230
+ runs.push([start, k]);
231
+ start = -1;
232
+ }
233
+ else if (start < 0)
234
+ start = k;
235
+ }
236
+ if (start >= 0)
237
+ runs.push([start, c.count]);
238
+ return runs;
239
+ }
240
+ /** Sample a 3D vector field on a regular grid of the box `x` by `y` by `z`. `progress.rows` counts z-slabs. */
241
+ export function sampleVectorField3(f, xDomain, yDomain, zDomain, options = {}) {
242
+ const g = options.grid ?? 8;
243
+ const [nx, ny, nz] = typeof g === "number" ? [g, g, g] : g;
244
+ assertCount("grid", nx);
245
+ assertCount("grid", ny);
246
+ assertCount("grid", nz);
247
+ assertRange("x domain", xDomain);
248
+ assertRange("y domain", yDomain);
249
+ assertRange("z domain", zDomain);
250
+ const meter = new Meter(options, options);
251
+ const o = [];
252
+ const vs = [];
253
+ const mags = [];
254
+ let skipped = 0;
255
+ let slabs = 0;
256
+ let reason;
257
+ const lerp = (d, k, n) => (k === n - 1 ? d.max : d.min + ((d.max - d.min) * k) / (n - 1));
258
+ for (let kz = 0; kz < nz; kz++) {
259
+ reason = meter.check(nx * ny);
260
+ if (reason)
261
+ break;
262
+ for (let jy = 0; jy < ny; jy++) {
263
+ for (let ix = 0; ix < nx; ix++) {
264
+ const x = lerp(xDomain, ix, nx);
265
+ const y = lerp(yDomain, jy, ny);
266
+ const z = lerp(zDomain, kz, nz);
267
+ const v = f(x, y, z);
268
+ if (!fin(v[0], v[1], v[2])) {
269
+ skipped++;
270
+ continue;
271
+ }
272
+ o.push(x, y, z);
273
+ vs.push(v[0], v[1], v[2]);
274
+ mags.push(Math.hypot(v[0], v[1], v[2]));
275
+ }
276
+ }
277
+ meter.spend(nx * ny);
278
+ slabs++;
279
+ }
280
+ let maxMagnitude = 0;
281
+ for (const m of mags)
282
+ if (m > maxMagnitude)
283
+ maxMagnitude = m;
284
+ return {
285
+ origins: Float32Array.from(o),
286
+ vectors: Float32Array.from(vs),
287
+ magnitudes: Float32Array.from(mags),
288
+ maxMagnitude,
289
+ count: mags.length,
290
+ skipped,
291
+ progress: progress(slabs, nz, reason),
292
+ };
293
+ }
294
+ //# sourceMappingURL=mesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh.js","sourceRoot":"","sources":["../src/mesh.ts"],"names":[],"mappings":"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"}
package/dist/ode.d.ts ADDED
@@ -0,0 +1,147 @@
1
+ import { type Budget, type Cancellable, type Progress } from "./budget.ts";
2
+ import { type Domain, type Samples } from "./sample.ts";
3
+ /** `dy/dx = f(x, y)` for a scalar equation. */
4
+ export type Slope = (x: number, y: number) => number;
5
+ /** `dy/dt = f(t, y)` for a system; returns a new array (or the same-length output) of derivatives. */
6
+ export type System = (t: number, y: readonly number[]) => readonly number[];
7
+ /** Autonomous planar system `[dx/dt, dy/dt] = F(x, y)`. */
8
+ export type Field2 = (x: number, y: number) => readonly [number, number];
9
+ export interface SlopeField {
10
+ columns: number;
11
+ rows: number;
12
+ /** Grid points (cell centres when `centered`, else grid nodes), `columns * rows` each, row-major from the smallest y. */
13
+ x: Float64Array;
14
+ y: Float64Array;
15
+ slope: Float64Array;
16
+ /**
17
+ * Unit direction `(dirX, dirY)` of each segment in data space (`(1, m) / |(1, m)|`; a vertical slope `+-Infinity`
18
+ * is `(0, +-1)`). `NaN` where the slope is `NaN` (undefined there).
19
+ */
20
+ dirX: Float64Array;
21
+ dirY: Float64Array;
22
+ progress: Progress;
23
+ }
24
+ export interface SlopeFieldOptions extends Budget, Cancellable {
25
+ columns?: number;
26
+ rows?: number;
27
+ }
28
+ /** Evaluate the slope field of `dy/dx = f(x, y)` on a `columns` x `rows` grid including both edges. */
29
+ export declare function sampleSlopeField(f: Slope, xDomain: Domain, yDomain: Domain, options?: SlopeFieldOptions): SlopeField;
30
+ export type StopReason = "end" | "blowup" | "maxSteps" | "stopped" | "stepTooSmall";
31
+ export interface Trajectory {
32
+ /** Times of the accepted steps, including the start. */
33
+ t: Float64Array;
34
+ /** `steps * dim` states, row-major. */
35
+ y: Float64Array;
36
+ dim: number;
37
+ steps: number;
38
+ reason: StopReason;
39
+ }
40
+ export interface OdeOptions extends Cancellable {
41
+ /** Stop (reason `"stopped"`) when this returns true for an accepted state. */
42
+ stop?: (t: number, y: readonly number[]) => boolean;
43
+ /** Abort with `"blowup"` when any component is non-finite or its magnitude exceeds this. Default 1e12. */
44
+ blowup?: number;
45
+ /** Hard cap on accepted steps. Default 100000. */
46
+ maxSteps?: number;
47
+ }
48
+ export interface Rk4Options extends OdeOptions {
49
+ /** Number of equal steps from `t0` to `tEnd`. Default 200. */
50
+ steps?: number;
51
+ }
52
+ export interface AdaptiveOdeOptions extends OdeOptions {
53
+ /** Absolute tolerance per step. Default 1e-8. */
54
+ atol?: number;
55
+ /** Relative tolerance per step. Default 1e-6. */
56
+ rtol?: number;
57
+ /** First step size; default `|tEnd - t0| / 100`. */
58
+ h0?: number;
59
+ /** Smallest step; below it the integration stops with `"stepTooSmall"`. Default `|tEnd - t0| * 1e-12`. */
60
+ hMin?: number;
61
+ /** Largest step. Default `|tEnd - t0|`. */
62
+ hMax?: number;
63
+ }
64
+ /**
65
+ * Fixed-step classical Runge-Kutta (order 4) for a system `y' = f(t, y)` from `t0` to `tEnd` (which may be
66
+ * smaller than `t0`: integrates backward). Stops early, with a reason, on blow-up or `options.stop`.
67
+ */
68
+ export declare function integrateRk4(f: System, t0: number, y0: readonly number[], tEnd: number, options?: Rk4Options): Trajectory;
69
+ /**
70
+ * Adaptive Dormand-Prince (RK45) with error control, forward or backward in `t`. Stops with `"blowup"` near a
71
+ * finite-time singularity, or `"stepTooSmall"` when the step would fall below `hMin`.
72
+ */
73
+ export declare function integrateAdaptive(f: System, t0: number, y0: readonly number[], tEnd: number, options?: AdaptiveOdeOptions): Trajectory;
74
+ export interface SolutionCurveOptions extends AdaptiveOdeOptions {
75
+ /** `"adaptive"` (default) or `"rk4"` with `steps` per direction. */
76
+ method?: "adaptive" | "rk4";
77
+ steps?: number;
78
+ /** Curve points with |y| beyond this end the curve (a blow-up asymptote). Default 1e6. */
79
+ yLimit?: number;
80
+ }
81
+ /**
82
+ * The solution curve of `dy/dx = f(x, y)` through `(x0, y0)`, extended both ways across `xDomain`, as
83
+ * `Samples` (x ascending). It ends where the solution blows up, so a vertical asymptote leaves a clean
84
+ * end, not a spike. `reasonBefore` / `reasonAfter` say why each side stopped.
85
+ */
86
+ export declare function sampleSolutionCurve(f: Slope, x0: number, y0: number, xDomain: Domain, options?: SolutionCurveOptions): Samples & {
87
+ reasonBefore: StopReason;
88
+ reasonAfter: StopReason;
89
+ };
90
+ export type FixedPointType = "stable node" | "unstable node" | "saddle" | "stable spiral" | "unstable spiral" | "center" | "stable star or degenerate node" | "unstable star or degenerate node" | "non-hyperbolic";
91
+ export interface FixedPoint {
92
+ x: number;
93
+ y: number;
94
+ /** `[[dFx/dx, dFx/dy], [dFy/dx, dFy/dy]]` by central differences. */
95
+ jacobian: [[number, number], [number, number]];
96
+ trace: number;
97
+ determinant: number;
98
+ /** Eigenvalues as `[re, im]` pairs (complex conjugates for a spiral or center). */
99
+ eigenvalues: [[number, number], [number, number]];
100
+ type: FixedPointType;
101
+ }
102
+ /** Numerical Jacobian of a planar field at a point, by central differences. */
103
+ export declare function jacobian2(F: Field2, x: number, y: number): [[number, number], [number, number]];
104
+ /** Classify an equilibrium from its 2x2 Jacobian (linearisation; `tolerance` is the zero threshold, default 1e-7). */
105
+ export declare function classifyFixedPoint(J: [[number, number], [number, number]], tolerance?: number): Pick<FixedPoint, "trace" | "determinant" | "eigenvalues" | "type">;
106
+ export interface PhasePortraitOptions extends Budget, Cancellable {
107
+ /** Field arrows per axis (`[columns, rows]` or one number). Default 15. */
108
+ grid?: number | [number, number];
109
+ /** Trajectory start points. Default: a 5 x 5 interior grid. */
110
+ seeds?: Array<[number, number]>;
111
+ /** Integrate each seed forward to `+tMax` and backward to `-tMax`. Default: 10. */
112
+ tMax?: number;
113
+ /** Search for fixed points with Newton from this many starts per axis. Default 8. 0 disables. */
114
+ fixedPointStarts?: number;
115
+ /** Trajectories are cut when they leave the window grown by this factor on each side. Default 0.5. */
116
+ margin?: number;
117
+ }
118
+ export interface PhasePortrait {
119
+ field: {
120
+ columns: number;
121
+ rows: number;
122
+ x: Float64Array;
123
+ y: Float64Array;
124
+ /** The vector at each node; `NaN` where `F` is non-finite. */
125
+ u: Float64Array;
126
+ v: Float64Array;
127
+ magnitude: Float64Array;
128
+ };
129
+ /** One entry per seed: backward half reversed then forward half, joined at the seed. */
130
+ trajectories: Array<{
131
+ seed: [number, number];
132
+ x: Float64Array;
133
+ y: Float64Array;
134
+ reasonBefore: StopReason;
135
+ reasonAfter: StopReason;
136
+ }>;
137
+ fixedPoints: FixedPoint[];
138
+ progress: Progress;
139
+ }
140
+ /**
141
+ * Phase portrait of an autonomous planar system: the vector field on a grid, trajectories from seed points
142
+ * (forward and backward, cut at the window's margin or at blow-up), and fixed points classified from the Jacobian.
143
+ * With a budget, `progress.rows` counts field rows and the trajectories and fixed points are only computed
144
+ * when the field finished.
145
+ */
146
+ export declare function samplePhasePortrait(F: Field2, xDomain: Domain, yDomain: Domain, options?: PhasePortraitOptions): PhasePortrait;
147
+ //# sourceMappingURL=ode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ode.d.ts","sourceRoot":"","sources":["../src/ode.ts"],"names":[],"mappings":"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"}