@zushah/chalkboard 1.5.0 → 1.7.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.
@@ -1,17 +1,17 @@
1
1
  /*
2
2
  The Chalkboard Library
3
- Version 1.5.0 released 12/18/2023
3
+ Version 1.7.0 Descartes released 01/01/2024
4
4
  Authored by Zushah ===> https://www.github.com/Zushah
5
5
  Available under the MIT License ===> https://www.opensource.org/license/mit/
6
6
 
7
7
  The Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.
8
8
 
9
- Latest release ===> https://www.github.com/Zushah/Chalkboard/releases/tag/v1.5.0
10
- Documentation ===> https://zushah.github.io/Chalkboard/documentation.html/
9
+ Repository ===> https://www.github.com/Zushah/Chalkboard
10
+ Website ===> https://zushah.github.io/Chalkboard/home.html
11
11
  */
12
12
  var Chalkboard = {
13
13
  README: function() {
14
- console.log("The Chalkboard Library\nVersion 1.5.0 released 12/18/2023\nAuthored by Zushah ===> https://www.github.com/Zushah\nAvailable under the MIT License ===> https://www.opensource.org/license/mit/\n\nThe Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.\n\nLatest release ===> https://www.github.com/Zushah/Chalkboard/releases/tag/v1.5.0\nDocumentation ===> https://zushah.github.io/Chalkboard/documentation.html/");
14
+ console.log("The Chalkboard Library\nVersion 1.7.0 Descartes released 01/01/2024\nAuthored by Zushah ===> https://www.github.com/Zushah\nAvailable under the MIT License ===> https://www.opensource.org/license/mit/\n\nThe Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.\n\nRepository ===> https://www.github.com/Zushah/Chalkboard\nWebsite ===> https://zushah.github.io/Chalkboard/home.html");
15
15
  },
16
16
  LOGO: function(x, y, s) {
17
17
  x = x || width / 2;
@@ -45,11 +45,49 @@ var Chalkboard = {
45
45
  exponent = exponent || 1;
46
46
  return Math.pow(Math.pow(10, 1 / Math.log(10)), exponent);
47
47
  },
48
+ CONTEXT: "ctx",
49
+ PARSEPREFIX: "",
48
50
  numb: {
49
51
  random: function(inf, sup) {
50
- inf = inf || 0;
51
- sup = sup || 0;
52
- return inf + Math.random() * (sup - inf);
52
+ if(inf === undefined) {
53
+ inf = 0;
54
+ }
55
+ if(sup === undefined) {
56
+ sup = 1;
57
+ }
58
+ return inf + (sup - inf) * Math.random();
59
+ },
60
+ exponential: function(l) {
61
+ if(l === undefined) {
62
+ l = 1;
63
+ }
64
+ return l <= 0 ? 0 : -Math.log(Math.random()) / l;
65
+ },
66
+ Gaussian: function(height, mean, deviation) {
67
+ var u1 = Math.random(), u2 = Math.random();
68
+ var random = Chalkboard.real.sqrt(-2 * Chalkboard.real.ln(u1)) * Chalkboard.trig.cos(Chalkboard.PI(2) * u2);
69
+ return random * height * Chalkboard.real.sqrt(deviation) + mean;
70
+ },
71
+ Bernoullian: function(p) {
72
+ if(p === undefined) {
73
+ p = 0.5;
74
+ }
75
+ return Math.random() < p ? 1 : 0;
76
+ },
77
+ Poissonian: function(l) {
78
+ if(l === undefined) {
79
+ l = 1;
80
+ }
81
+ if(l > 0) {
82
+ var L = Chalkboard.E(-l);
83
+ var p = 1, k = 0;
84
+ for(; p > L; ++k) {
85
+ p *= Math.random();
86
+ }
87
+ return k - 1;
88
+ } else {
89
+ return 0;
90
+ }
53
91
  },
54
92
  factorial: function(num) {
55
93
  if(num >= 0) {
@@ -223,11 +261,23 @@ var Chalkboard = {
223
261
  }
224
262
  },
225
263
  binomial: function(n, k) {
264
+ if(k < 0 || k > n) {
265
+ return 0;
266
+ }
226
267
  if(k === 0 || k === n) {
227
268
  return 1;
228
- } else {
229
- return Chalkboard.numb.binomial(n - 1, k - 1) + Chalkboard.numb.binomial(n - 1, k);
230
269
  }
270
+ if(k === 1 || k === n - 1) {
271
+ return n;
272
+ }
273
+ if(n - k < k) {
274
+ k = n - k;
275
+ }
276
+ var result = n;
277
+ for(var i = 2; i <= k; i++) {
278
+ result *= (n - i + 1) / i;
279
+ }
280
+ return Math.round(result);
231
281
  },
232
282
  Fibonacci: function(num) {
233
283
  var sequence = [0, 1];
@@ -236,18 +286,39 @@ var Chalkboard = {
236
286
  }
237
287
  return sequence[num];
238
288
  },
239
- Gaussian: function(height, mean, deviation) {
240
- var u, v, s;
241
- for(;;) {
242
- u = Chalkboard.numb.random(-1, 1);
243
- v = Chalkboard.numb.random(-1, 1);
244
- s = u * u + v * v;
245
- if(s < 1 && s !== 0) {
246
- break;
289
+ Goldbach: function(num) {
290
+ if(num % 2 === 0) {
291
+ if(num !== 4) {
292
+ var a = num / 2, b = num / 2;
293
+ if(a % 2 === 0) {
294
+ a--;
295
+ b++;
296
+ }
297
+ while(a >= 3) {
298
+ if(Chalkboard.numb.isPrime(a) && Chalkboard.numb.isPrime(b)) {
299
+ return [a, b];
300
+ }
301
+ a -= 2;
302
+ b += 2;
303
+ }
304
+ return undefined;
305
+ } else {
306
+ return [2, 2];
247
307
  }
308
+ } else {
309
+ return undefined;
310
+ }
311
+ },
312
+ Euler: function(num) {
313
+ if(num > 0) {
314
+ var factors = Chalkboard.numb.factors(num);
315
+ for(var i = 0; i < factors.length; i++) {
316
+ num *= (factors[i] - 1) / factors[i];
317
+ }
318
+ return num;
319
+ } else {
320
+ return undefined;
248
321
  }
249
- var z = u * Chalkboard.real.sqrt(-2 * Chalkboard.real.ln(s) / s);
250
- return z * height * deviation + mean;
251
322
  }
252
323
  },
253
324
  real: {
@@ -255,7 +326,9 @@ var Chalkboard = {
255
326
  type = type || "expl";
256
327
  if(type === "expl") {
257
328
  return {definition: definition, type: type};
258
- } else if(type === "pola") {
329
+ } else if(type === "inve") {
330
+ return {definition: definition, type: type};
331
+ } else if(type === "pola") {
259
332
  return {definition: definition, type: type};
260
333
  } else if(type === "curv") {
261
334
  return definition.length === 2 ? {definition: [definition[0], definition[1]], type: type} : {definition: [definition[0], definition[1], definition[2]], type: type};
@@ -264,17 +337,19 @@ var Chalkboard = {
264
337
  } else if(type === "mult") {
265
338
  return {definition: definition, type: type};
266
339
  } else {
267
- return "TypeError: Parameter \"type\" must be either \"expl\", \"pola\", \"curv\", \"surf\", or \"mult\".";
340
+ return "TypeError: Parameter \"type\" must be either \"expl\", \"inve\", \"pola\", \"curv\", \"surf\", or \"mult\".";
268
341
  }
269
342
  },
270
- parse: function(str, init) {
271
- init = init || '';
272
- return Function('"use strict"; ' + init + ' return (' + str + ')')();
343
+ parse: function(str) {
344
+ return Function('"use strict"; ' + Chalkboard.PARSEPREFIX + ' return (' + str + ')')();
273
345
  },
274
346
  val: function(func, val) {
275
347
  if(func.type === "expl") {
276
348
  var f = Chalkboard.real.parse("x => " + func.definition);
277
349
  return f(val);
350
+ } else if(func.type === "inve") {
351
+ var f = Chalkboard.real.parse("y => " + func.definition);
352
+ return f(val);
278
353
  } else if(func.type === "pola") {
279
354
  var r = Chalkboard.real.parse("O => " + func.definition);
280
355
  return r(val);
@@ -310,7 +385,11 @@ var Chalkboard = {
310
385
  }
311
386
  },
312
387
  pow: function(base, num) {
313
- return Math.exp(num * Math.log(base));
388
+ if(base === 0 && num === 0) {
389
+ return 1;
390
+ } else {
391
+ return Math.exp(num * Math.log(base));
392
+ }
314
393
  },
315
394
  log: function(base, num) {
316
395
  return Chalkboard.real.ln(num) / Chalkboard.real.ln(base);
@@ -328,7 +407,8 @@ var Chalkboard = {
328
407
  return undefined;
329
408
  }
330
409
  },
331
- nrt: function(num, index) {
410
+ root: function(num, index) {
411
+ index = index || 3;
332
412
  return Math.exp(Math.log(num) / index);
333
413
  },
334
414
  tetration: function(base, num) {
@@ -443,14 +523,20 @@ var Chalkboard = {
443
523
  },
444
524
  comp: {
445
525
  new: function(a, b) {
446
- return {a: a, b: b, type: "comp"};
526
+ if(b === undefined) {
527
+ return {a: a, b: 0, type: "comp"};
528
+ } else {
529
+ return {a: a, b: b, type: "comp"};
530
+ }
531
+ },
532
+ copy: function(comp) {
533
+ return Object.create(Object.getPrototypeOf(comp), Object.getOwnPropertyDescriptors(comp));
447
534
  },
448
535
  function: function(realDefinition, imagDefinition) {
449
536
  return {definition: [realDefinition, imagDefinition], type: "comp"};
450
537
  },
451
- parse: function(str, init) {
452
- init = init || '';
453
- return Function('"use strict"; ' + init + ' return (' + str + ')')();
538
+ parse: function(str) {
539
+ return Function('"use strict"; ' + Chalkboard.PARSEPREFIX + ' return (' + str + ')')();
454
540
  },
455
541
  val: function(func, comp) {
456
542
  if(func.type === "comp") {
@@ -529,6 +615,18 @@ var Chalkboard = {
529
615
  sqrt: function(comp) {
530
616
  return Chalkboard.comp.new(Chalkboard.real.sqrt((comp.a + Chalkboard.real.sqrt((comp.a * comp.a) + (comp.b * comp.b))) / 2), Chalkboard.numb.sgn(comp.b) * Chalkboard.real.sqrt((-comp.a + Chalkboard.real.sqrt((comp.a * comp.a) + (comp.b * comp.b))) / 2));
531
617
  },
618
+ root: function(comp, index) {
619
+ index = index || 3;
620
+ if(Number.isInteger(index) && index > 0) {
621
+ var result = [];
622
+ var r = Chalkboard.comp.mag(comp);
623
+ var t = Chalkboard.comp.arg(comp);
624
+ for(var i = 0; i < index; i++) {
625
+ result.push(Chalkboard.comp.new(Chalkboard.real.root(r, index) * Chalkboard.trig.cos((t + Chalkboard.PI(2 * i)) / index), Chalkboard.real.root(r, index) * Chalkboard.trig.sin((t + Chalkboard.PI(2 * i)) / index)));
626
+ }
627
+ return result;
628
+ }
629
+ },
532
630
  rotate: function(comp, rad) {
533
631
  return Chalkboard.comp.new(Chalkboard.comp.mag(comp) * Chalkboard.trig.cos(Chalkboard.comp.arg(comp) + rad), Chalkboard.comp.mag(comp) * Chalkboard.trig.sin(Chalkboard.comp.arg(comp) + rad));
534
632
  },
@@ -538,21 +636,22 @@ var Chalkboard = {
538
636
  conjugate: function(comp) {
539
637
  return Chalkboard.comp.new(comp.a, -comp.b);
540
638
  },
541
- root: function(comp, n) {
542
- if(Number.isInteger(n) && n > 0) {
543
- var result = [];
544
- var r = Chalkboard.comp.mag(comp);
545
- var t = Chalkboard.comp.arg(comp);
546
- for(var i = 0; i < n; i++) {
547
- result.push(Chalkboard.comp.new(Chalkboard.real.nrt(r, n) * Chalkboard.trig.cos((t + Chalkboard.PI(2 * i)) / n), Chalkboard.real.nrt(r, n) * Chalkboard.trig.sin((t + Chalkboard.PI(2 * i)) / n)));
548
- }
549
- return result;
550
- }
551
- },
552
639
  dist: function(comp_1, comp_2) {
640
+ if(typeof comp_1 === "number") {
641
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
642
+ }
643
+ if(typeof comp_2 === "number") {
644
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
645
+ }
553
646
  return Chalkboard.real.sqrt(((comp_2.a - comp_1.a) * (comp_2.a - comp_1.a)) + ((comp_2.b - comp_1.b) * (comp_2.b - comp_1.b)));
554
647
  },
555
648
  distsq: function(comp_1, comp_2) {
649
+ if(typeof comp_1 === "number") {
650
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
651
+ }
652
+ if(typeof comp_2 === "number") {
653
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
654
+ }
556
655
  return ((comp_2.a - comp_1.a) * (comp_2.a - comp_1.a)) + ((comp_2.b - comp_1.b) * (comp_2.b - comp_1.b));
557
656
  },
558
657
  scl: function(comp, num) {
@@ -562,15 +661,39 @@ var Chalkboard = {
562
661
  return Chalkboard.comp.new(Chalkboard.numb.constrain(comp.a, range), Chalkboard.numb.constrain(comp.b, range));
563
662
  },
564
663
  add: function(comp_1, comp_2) {
664
+ if(typeof comp_1 === "number") {
665
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
666
+ }
667
+ if(typeof comp_2 === "number") {
668
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
669
+ }
565
670
  return Chalkboard.comp.new(comp_1.a + comp_2.a, comp_1.b + comp_2.b);
566
671
  },
567
672
  sub: function(comp_1, comp_2) {
673
+ if(typeof comp_1 === "number") {
674
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
675
+ }
676
+ if(typeof comp_2 === "number") {
677
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
678
+ }
568
679
  return Chalkboard.comp.new(comp_1.a - comp_2.a, comp_1.b - comp_2.b);
569
680
  },
570
681
  mul: function(comp_1, comp_2) {
682
+ if(typeof comp_1 === "number") {
683
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
684
+ }
685
+ if(typeof comp_2 === "number") {
686
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
687
+ }
571
688
  return Chalkboard.comp.new((comp_1.a * comp_2.a) - (comp_1.b * comp_2.b), (comp_1.a * comp_2.b) + (comp_1.b * comp_2.a));
572
689
  },
573
690
  div: function(comp_1, comp_2) {
691
+ if(typeof comp_1 === "number") {
692
+ comp_1 = Chalkboard.comp.new(comp_1, 0);
693
+ }
694
+ if(typeof comp_2 === "number") {
695
+ comp_2 = Chalkboard.comp.new(comp_2, 0);
696
+ }
574
697
  return Chalkboard.comp.new(((comp_1.a * comp_2.a) - (comp_1.b * comp_2.b)) / Chalkboard.comp.magsq(comp_2), ((comp_1.a * comp_2.b) + (comp_1.b * comp_2.a)) / Chalkboard.comp.magsq(comp_2));
575
698
  },
576
699
  toVector: function(comp) {
@@ -592,7 +715,14 @@ var Chalkboard = {
592
715
  },
593
716
  quat: {
594
717
  new: function(a, b, c, d) {
595
- return {a: a, b: b, c: c, d: d, type: "quat"};
718
+ if(b === undefined && c === undefined && d === undefined) {
719
+ return {a: a, b: 0, c: 0, d: 0, type: "quat"};
720
+ } else {
721
+ return {a: a, b: b, c: c, d: d, type: "quat"};
722
+ }
723
+ },
724
+ copy: function(quat) {
725
+ return Object.create(Object.getPrototypeOf(quat), Object.getOwnPropertyDescriptors(quat));
596
726
  },
597
727
  random: function(inf, sup) {
598
728
  return Chalkboard.quat.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
@@ -634,9 +764,21 @@ var Chalkboard = {
634
764
  return Chalkboard.quat.new(quat.a, -quat.b, -quat.c, -quat.d);
635
765
  },
636
766
  dist: function(quat_1, quat_2) {
767
+ if(typeof quat_1 === "number") {
768
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
769
+ }
770
+ if(typeof quat_2 === "number") {
771
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
772
+ }
637
773
  return Chalkboard.real.sqrt(((quat_2.a - quat_1.a) * (quat_2.a - quat_1.a)) + ((quat_2.b - quat_1.b) * (quat_2.b - quat_1.b)) + ((quat_2.c - quat_1.c) * (quat_2.c - quat_1.c)) + ((quat_2.d - quat_1.d) * (quat_2.d - quat_1.d)));
638
774
  },
639
775
  distsq: function(quat_1, quat_2) {
776
+ if(typeof quat_1 === "number") {
777
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
778
+ }
779
+ if(typeof quat_2 === "number") {
780
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
781
+ }
640
782
  return ((quat_2.a - quat_1.a) * (quat_2.a - quat_1.a)) + ((quat_2.b - quat_1.b) * (quat_2.b - quat_1.b)) + ((quat_2.c - quat_1.c) * (quat_2.c - quat_1.c)) + ((quat_2.d - quat_1.d) * (quat_2.d - quat_1.d));
641
783
  },
642
784
  scl: function(quat, num) {
@@ -646,14 +788,41 @@ var Chalkboard = {
646
788
  return Chalkboard.quat.new(Chalkboard.numb.constrain(quat.a, range), Chalkboard.numb.constrain(quat.b, range), Chalkboard.numb.constrain(quat.c, range), Chalkboard.numb.constrain(quat.d, range));
647
789
  },
648
790
  add: function(quat_1, quat_2) {
791
+ if(typeof quat_1 === "number") {
792
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
793
+ }
794
+ if(typeof quat_2 === "number") {
795
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
796
+ }
649
797
  return Chalkboard.quat.new(quat_1.a + quat_2.a, quat_1.b + quat_2.b, quat_1.c + quat_2.c, quat_1.d + quat_2.d);
650
798
  },
651
799
  sub: function(quat_1, quat_2) {
800
+ if(typeof quat_1 === "number") {
801
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
802
+ }
803
+ if(typeof quat_2 === "number") {
804
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
805
+ }
652
806
  return Chalkboard.quat.new(quat_1.a - quat_2.a, quat_1.b - quat_2.b, quat_1.c - quat_2.c, quat_1.d - quat_2.d);
653
807
  },
654
808
  mul: function(quat_1, quat_2) {
809
+ if(typeof quat_1 === "number") {
810
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
811
+ }
812
+ if(typeof quat_2 === "number") {
813
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
814
+ }
655
815
  return Chalkboard.quat.new((quat_1.a * quat_2.a) - (quat_1.b * quat_2.b) - (quat_1.c * quat_2.c) - (quat_1.d * quat_2.d), (quat_1.a * quat_2.b) + (quat_1.b * quat_2.a) + (quat_1.c * quat_2.d) - (quat_1.d * quat_2.c), (quat_1.a * quat_2.c) - (quat_1.b * quat_2.d) + (quat_1.c * quat_2.a) + (quat_1.d * quat_2.b), (quat_1.a * quat_2.d) + (quat_1.b * quat_2.c) - (quat_1.c * quat_2.b) + (quat_1.d * quat_2.a));
656
816
  },
817
+ div: function(quat_1, quat_2) {
818
+ if(typeof quat_1 === "number") {
819
+ quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
820
+ }
821
+ if(typeof quat_2 === "number") {
822
+ quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
823
+ }
824
+ return Chalkboard.quat.new((quat_1.a * quat_2.a + quat_1.b * quat_2.b + quat_1.c * quat_2.c + quat_1.d * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.b * quat_2.a - quat_1.a * quat_2.b - quat_1.d * quat_2.c + quat_1.c * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.c * quat_2.a + quat_1.d * quat_2.b - quat_1.a * quat_2.c - quat_1.b * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.d * quat_2.a - quat_1.c * quat_2.b + quat_1.b * quat_2.c - quat_1.a * quat_2.d) / Chalkboard.quat.magsq(quat_2));
825
+ },
657
826
  fromAxis: function(vec3, rad) {
658
827
  return Chalkboard.quat.new(Chalkboard.trig.cos(rad / 2), vec3.x * Chalkboard.trig.sin(rad / 2), vec3.y * Chalkboard.trig.sin(rad / 2), vec3.z * Chalkboard.trig.sin(rad / 2));
659
828
  },
@@ -698,85 +867,97 @@ var Chalkboard = {
698
867
  }
699
868
  },
700
869
  plot: {
701
- xyplane: function(scl, rgba, origin, weight) {
702
- scl = scl || 1;
703
- scl /= 100;
704
- rgba = rgba || [0, 0, 0];
705
- origin = origin || [width / 2, height / 2];
706
- weight = weight || 2;
870
+ xyplane: function(config) {
871
+ (config = {
872
+ x: (config = config || {}).x || width / 2,
873
+ y: config.y || height / 2,
874
+ size: config.size || 1,
875
+ stroke: config.stroke || color(0),
876
+ strokeWeight: config.strokeWeight || 2
877
+ }).size /= 100;
707
878
  pushMatrix();
708
- translate(origin[0], origin[1]);
709
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
710
- strokeWeight(weight / 4);
711
- for(var i = Math.floor(-origin[0] / scl); i <= (width - origin[0]) / scl; i++) {
712
- line(i / scl, -origin[1], i / scl, width - origin[1]);
713
- }
714
- for(var i = Math.floor(-origin[1] / scl); i <= (width - origin[1]) / scl; i++) {
715
- line(-origin[0], i / scl, width - origin[0], i / scl);
716
- }
717
- strokeWeight(weight);
718
- line(-origin[0], 0, width - origin[0], 0);
719
- line(0, -origin[1], 0, width - origin[1]);
879
+ translate(config.x, config.y);
880
+ stroke(config.stroke);
881
+ strokeWeight(config.strokeWeight / 4);
882
+ for(var i = Math.floor(-config.x / config.size); i <= (width - config.x) / config.size; i++) {
883
+ line(i / config.size, -config.y, i / config.size, width - config.y);
884
+ }
885
+ for(var i = Math.floor(-config.y / config.size); i <= (width - config.y) / config.size; i++) {
886
+ line(-config.x, i / config.size, width - config.x, i / config.size);
887
+ }
888
+ strokeWeight(config.strokeWeight);
889
+ line(-config.x, 0, width - config.x, 0);
890
+ line(0, -config.y, 0, width - config.y);
720
891
  popMatrix();
721
892
  },
722
- rOplane: function(scl, rgba, origin, weight) {
723
- scl = scl || 1;
724
- scl /= 100;
725
- rgba = rgba || [0, 0, 0];
726
- origin = origin || [width / 2, height / 2];
727
- weight = weight || 2;
893
+ rOplane: function(config) {
894
+ (config = {
895
+ x: (config = config || {}).x || width / 2,
896
+ y: config.y || height / 2,
897
+ size: config.size || 1,
898
+ stroke: config.stroke || color(0),
899
+ strokeWeight: config.strokeWeight || 2
900
+ }).size /= 100;
728
901
  pushMatrix();
729
- translate(origin[0], origin[1]);
902
+ translate(config.x, config.y);
730
903
  noFill();
731
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
732
- strokeWeight(weight / 4);
733
- for(var i = 0; i <= scl * width / 2; i++) {
734
- ellipse(0, 0, 2 * i / scl, 2 * i / scl);
735
- }
736
- strokeWeight(weight);
737
- line(-origin[0], 0, width - origin[0], 0);
738
- line(0, -origin[1], 0, width - origin[1]);
904
+ stroke(config.stroke);
905
+ strokeWeight(config.strokeWeight / 4);
906
+ for(var i = 0; i <= config.size * width / 2; i++) {
907
+ ellipse(0, 0, 2 * i / config.size, 2 * i / config.size);
908
+ }
909
+ strokeWeight(config.strokeWeight);
910
+ line(-config.x, 0, width - config.x, 0);
911
+ line(0, -config.y, 0, width - config.y);
739
912
  popMatrix();
740
913
  },
741
- function: function(func, scl, rgba, domain, origin, weight) {
742
- scl = scl || 1;
743
- scl /= 100;
744
- rgba = rgba || [0, 0, 0];
745
- domain = domain || func.type === "comp" ? [[-10, 10], [-10, 10]] : [-10, 10];
746
- origin = origin || [width / 2, height / 2];
747
- weight = weight || 2;
914
+ function: function(func, config) {
915
+ (config = {
916
+ x: (config = config || {}).x || width / 2,
917
+ y: config.y || height / 2,
918
+ size: config.size || 1,
919
+ stroke: config.stroke || color(0),
920
+ strokeWeight: config.strokeWeight || 2,
921
+ domain: config.domain || (func.type === "comp" ? [[-10, 10], [-10, 10]] : [-10, 10])
922
+ }).size /= 100;
748
923
  var data = [];
749
924
  pushMatrix();
750
- translate(origin[0], origin[1]);
925
+ translate(config.x, config.y);
751
926
  noFill();
752
- strokeWeight(weight);
753
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
927
+ strokeWeight(config.strokeWeight);
928
+ stroke(config.stroke);
754
929
  beginShape();
755
930
  if(func.type === "expl") {
756
931
  var f = Chalkboard.real.parse("x => " + func.definition);
757
- for(var i = domain[0] / scl; i <= domain[1] / scl; i++) {
758
- vertex(i, -f(i * scl) / scl);
932
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i++) {
933
+ vertex(i, -f(i * config.size) / config.size);
759
934
  data.push([i, f(i)]);
760
935
  }
936
+ } else if(func.type === "inve") {
937
+ var f = Chalkboard.real.parse("y => " + func.definition);
938
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i++) {
939
+ vertex(f(i * config.size) / config.size, -i);
940
+ data.push([f(i), i]);
941
+ }
761
942
  } else if(func.type === "pola") {
762
943
  var r = Chalkboard.real.parse("O => " + func.definition);
763
- for(var i = domain[0] / scl; i < domain[1] / scl; i++) {
764
- vertex(r(i * scl) / scl * Chalkboard.trig.cos(i * scl), -r(i * scl) / scl * Chalkboard.trig.sin(i * scl));
944
+ for(var i = config.domain[0] / config.size; i < config.domain[1] / config.size; i++) {
945
+ vertex(r(i * config.size) / config.size * Chalkboard.trig.cos(i * config.size), -r(i * config.size) / config.size * Chalkboard.trig.sin(i * config.size));
765
946
  data.push([i, r(i)]);
766
947
  }
767
948
  } else if(func.type === "curv") {
768
949
  var x = Chalkboard.real.parse("t => " + func.definition[0]),
769
950
  y = Chalkboard.real.parse("t => " + func.definition[1]);
770
- for(var i = domain[0] / scl; i < domain[1] / scl; i++) {
771
- vertex(x(i * scl) / scl, -y(i * scl) / scl);
951
+ for(var i = config.domain[0] / config.size; i < config.domain[1] / config.size; i++) {
952
+ vertex(x(i * config.size) / config.size, -y(i * config.size) / config.size);
772
953
  data.push([x(i), y(i)]);
773
954
  }
774
955
  } else if(func.type === "comp") {
775
956
  var u = Chalkboard.comp.parse("(a, b) => " + func.definition[0]),
776
957
  v = Chalkboard.comp.parse("(a, b) => " + func.definition[1]);
777
- for(var i = domain[0][0] / scl; i <= domain[0][1] / scl; i += 5) {
778
- for(var j = domain[1][0] / scl; j <= domain[1][1] / scl; j += 5) {
779
- var z = Chalkboard.comp.new(u(i * scl, j * scl) / scl, v(i * scl, j * scl) / scl);
958
+ for(var i = config.domain[0][0] / config.size; i <= config.domain[0][1] / config.size; i += 5) {
959
+ for(var j = config.domain[1][0] / config.size; j <= config.domain[1][1] / config.size; j += 5) {
960
+ var z = Chalkboard.comp.new(u(i * config.size, j * config.size) / config.size, v(i * config.size, j * config.size) / config.size);
780
961
  noStroke();
781
962
  if(z.a === 0 && z.b === 0) {
782
963
  fill(0, 0, 0);
@@ -792,23 +973,26 @@ var Chalkboard = {
792
973
  }
793
974
  }
794
975
  } else {
795
- return "TypeError: Property \"type\" of parameter \"func\" must be either \"expl\", \"pola\", \"curv\", or \"comp\".";
976
+ return "TypeError: Property \"type\" of parameter \"func\" must be either \"expl\", \"inve\", \"pola\", \"curv\", or \"comp\".";
796
977
  }
797
978
  endShape();
798
979
  popMatrix();
799
980
  return data;
800
981
  },
801
- barplot: function(arr, bins, scl, rgba, origin, weight) {
802
- scl = scl || 1;
803
- scl /= 100;
804
- rgba = rgba || [[0, 0, 0], [255, 255, 255]];
805
- origin = origin || [width / 2, height / 2];
806
- weight = weight || 2;
982
+ barplot: function(arr, bins, config) {
983
+ (config = {
984
+ x: (config = config || {}).x || width / 2,
985
+ y: config.y || height / 2,
986
+ size: config.size || 1,
987
+ fill: config.fill || color(255),
988
+ stroke: config.stroke || color(0),
989
+ strokeWeight: config.strokeWeight || 2
990
+ }).size /= 100;
807
991
  pushMatrix();
808
- translate(origin[0], origin[1]);
809
- strokeWeight(weight);
810
- stroke(rgba.length === 3 ? color(rgba[0][0], rgba[0][1], rgba[0][2]) : color(rgba[0][0], rgba[0][1], rgba[0][2], rgba[0][3]));
811
- fill(rgba.length === 3 ? color(rgba[1][0], rgba[1][1], rgba[1][2]) : color(rgba[1][0], rgba[1][1], rgba[1][2], rgba[1][3]));
992
+ translate(config.x, config.y);
993
+ strokeWeight(config.strokeWeight);
994
+ stroke(config.stroke);
995
+ fill(config.fill);
812
996
  var bars = [];
813
997
  for(var i = 0; i < bins.length; i++) {
814
998
  if(i === 0) {
@@ -823,25 +1007,27 @@ var Chalkboard = {
823
1007
  for(var i = 0; i < bars.length; i++) {
824
1008
  counts.push(bars[i].length);
825
1009
  }
826
- var x = 0, width = counts.length / (2 * scl);
1010
+ var x = 0, width = counts.length / (2 * config.size);
827
1011
  for(var i = 0; i < counts.length; i++) {
828
- rect(x - width, 0, 1 / scl, -counts[i] / scl);
829
- x += 1 / scl;
1012
+ rect(x - width, 0, 1 / config.size, -counts[i] / config.size);
1013
+ x += 1 / config.size;
830
1014
  }
831
1015
  popMatrix();
832
1016
  return bars;
833
1017
  },
834
- lineplot: function(arr, bins, scl, rgba, origin, weight) {
835
- scl = scl || 1;
836
- scl /= 100;
837
- rgba = rgba || [0, 0, 0];
838
- origin = origin || [width / 2, height / 2];
839
- weight = weight || 2;
1018
+ lineplot: function(arr, bins, config) {
1019
+ (config = {
1020
+ x: (config = config || {}).x || width / 2,
1021
+ y: config.y || height / 2,
1022
+ size: config.size || 1,
1023
+ stroke: config.stroke || color(0),
1024
+ strokeWeight: config.strokeWeight || 2
1025
+ }).size /= 100;
840
1026
  pushMatrix();
841
- translate(origin[0], origin[1]);
1027
+ translate(config.x, config.y);
842
1028
  noFill();
843
- strokeWeight(weight);
844
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1029
+ strokeWeight(config.strokeWeight);
1030
+ stroke(config.stroke);
845
1031
  var verts = [];
846
1032
  for(var i = 0; i < bins.length; i++) {
847
1033
  if(i === 0) {
@@ -858,77 +1044,85 @@ var Chalkboard = {
858
1044
  }
859
1045
  beginShape();
860
1046
  for(var i = 0; i < counts.length; i++) {
861
- vertex(i / scl, -counts[i] / scl);
1047
+ vertex(i / config.size, -counts[i] / config.size);
862
1048
  }
863
1049
  endShape();
864
1050
  popMatrix();
865
1051
  return verts;
866
1052
  },
867
- scatterplot: function(arr1, arr2, scl, rgba, origin, weight) {
868
- scl = scl || 1;
869
- scl /= 100;
870
- rgba = rgba || [0, 0, 0];
871
- origin = origin || [width / 2, height / 2];
872
- weight = weight || 5;
1053
+ scatterplot: function(arr1, arr2, config) {
1054
+ (config = {
1055
+ x: (config = config || {}).x || width / 2,
1056
+ y: config.y || height / 2,
1057
+ size: config.size || 1,
1058
+ stroke: config.stroke || color(0),
1059
+ strokeWeight: config.strokeWeight || 5
1060
+ }).size /= 100;
873
1061
  var data = [];
874
1062
  pushMatrix();
875
- translate(origin[0], origin[1]);
876
- strokeWeight(weight * 5);
877
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1063
+ translate(config.x, config.y);
1064
+ strokeWeight(config.strokeWeight);
1065
+ stroke(config.stroke);
878
1066
  if(arr1.length === arr2.length) {
879
1067
  for(var i = 0; i < arr1.length; i++) {
880
- point(arr1[i] / scl - arr1.length / (2 * scl), -arr2[i] / scl + arr1.length / (2 * scl));
1068
+ point(arr1[i] / config.size - arr1.length / (2 * config.size), -arr2[i] / config.size + arr1.length / (2 * config.size));
881
1069
  data.push([arr1[i], arr2[i]]);
882
1070
  }
883
1071
  }
884
1072
  popMatrix();
885
1073
  return data;
886
1074
  },
887
- comp: function(comp, scl, origin, weight, rgba) {
888
- scl = scl || 1;
889
- origin = origin || [width / 2, height / 2];
890
- weight = weight || 5;
891
- rgba = rgba || [0, 0, 0];
892
- scl /= 100;
893
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
894
- strokeWeight(weight * 5);
1075
+ comp: function(comp, config) {
1076
+ (config = {
1077
+ x: (config = config || {}).x || width / 2,
1078
+ y: config.y || height / 2,
1079
+ size: config.size || 1,
1080
+ stroke: config.stroke || color(0),
1081
+ strokeWeight: config.strokeWeight || 5
1082
+ }).size /= 100;
1083
+ stroke(config.stroke);
1084
+ strokeWeight(config.strokeWeight);
895
1085
  pushMatrix();
896
- translate(origin[0], origin[1]);
897
- point(comp.a / scl, -comp.b / scl);
1086
+ translate(config.x, config.y);
1087
+ point(comp.a / config.size, -comp.b / config.size);
898
1088
  popMatrix();
899
1089
  noStroke();
900
1090
  noFill();
901
1091
  return [[comp.a], [comp.b]];
902
1092
  },
903
- vec2: function(vec2, scl, rgba, origin, weight) {
904
- scl = scl || 1;
905
- scl /= 100;
906
- rgba = rgba || [0, 0, 0];
907
- origin = origin || [width / 2, height / 2];
908
- weight = weight || 5;
909
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
910
- strokeWeight(weight);
1093
+ vec2: function(vec2, config) {
1094
+ (config = {
1095
+ x: (config = config || {}).x || width / 2,
1096
+ y: config.y || height / 2,
1097
+ size: config.size || 1,
1098
+ stroke: config.stroke || color(0),
1099
+ strokeWeight: config.strokeWeight || 5
1100
+ }).size /= 100;
1101
+ stroke(config.stroke);
1102
+ strokeWeight(config.strokeWeight);
911
1103
  pushMatrix();
912
- translate(origin[0], origin[1]);
913
- line(0, 0, vec2.x / scl, -vec2.y / scl);
1104
+ translate(config.x, config.y);
1105
+ line(0, 0, vec2.x / config.size, -vec2.y / config.size);
914
1106
  popMatrix();
915
1107
  return [[vec2.x], [vec2.y]];
916
1108
  },
917
- field: function(vec2field, scl, rgba, domain, origin, weight, res) {
918
- scl = scl || 1;
919
- scl /= 100;
920
- rgba = rgba || [0, 0, 0];
921
- domain = domain || [[-10, 10], [-10, 10]];
922
- origin = origin || [width / 2, height / 2];
923
- weight = weight || 5;
924
- res = res || 25;
1109
+ field: function(vec2field, config) {
1110
+ (config = {
1111
+ x: (config = config || {}).x || width / 2,
1112
+ y: config.y || height / 2,
1113
+ size: config.size || 1,
1114
+ stroke: config.stroke || color(0),
1115
+ strokeWeight: config.strokeWeight || 5,
1116
+ domain: config.domain || [[-10, 10], [-10, 10]],
1117
+ res: config.res || 25
1118
+ }).size /= 100;
925
1119
  var data = [];
926
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
927
- strokeWeight(weight);
1120
+ stroke(config.stroke);
1121
+ strokeWeight(config.strokeWeight);
928
1122
  pushMatrix();
929
- translate(origin[0], origin[1]);
930
- for(var i = domain[0][0] / scl; i <= domain[0][1] / scl; i += res) {
931
- for(var j = domain[1][0] / scl; j <= domain[1][1] / scl; j += res) {
1123
+ translate(config.x, config.y);
1124
+ for(var i = config.domain[0][0] / config.size; i <= config.domain[0][1] / config.size; i += config.res) {
1125
+ for(var j = config.domain[1][0] / config.size; j <= config.domain[1][1] / config.size; j += config.res) {
932
1126
  var v = Chalkboard.vec2.fromField(vec2field, Chalkboard.vec2.new(i, j));
933
1127
  line(i, j, i + v.x, j + v.y);
934
1128
  data.push([i + v.x, j + v.y]);
@@ -937,230 +1131,258 @@ var Chalkboard = {
937
1131
  popMatrix();
938
1132
  return data;
939
1133
  },
940
- vec3: function(vec3, scl, rgba, origin, weight) {
941
- scl = scl || 1;
942
- scl /= 100;
943
- rgba = rgba || [0, 0, 0];
944
- origin = origin || [width / 2, height / 2];
945
- weight = weight || 5;
946
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
947
- strokeWeight(weight);
1134
+ vec3: function(vec3, config) {
1135
+ (config = {
1136
+ x: (config = config || {}).x || width / 2,
1137
+ y: config.y || height / 2,
1138
+ size: config.size || 1,
1139
+ stroke: config.stroke || color(0),
1140
+ strokeWeight: config.strokeWeight || 5
1141
+ }).size /= 100;
1142
+ stroke(config.stroke);
1143
+ strokeWeight(config.strokeWeight);
948
1144
  pushMatrix();
949
- translate(origin[0], origin[1]);
950
- line(0, 0, (vec3.x / scl) / (vec3.z * 0.25 + 1), (-vec3.y / scl) / (vec3.z * 0.25 + 1));
1145
+ translate(config.x, config.y);
1146
+ line(0, 0, (vec3.x / config.size) / (vec3.z * 0.25 + 1), (-vec3.y / config.size) / (vec3.z * 0.25 + 1));
951
1147
  popMatrix();
952
1148
  return [[vec3.x], [vec3.y], [vec3.z]];
953
1149
  },
954
- matr: function(matr, scl, rgba, origin, weight) {
955
- scl = scl || 1;
956
- scl /= 100;
957
- rgba = rgba || [0, 0, 0];
958
- origin = origin || [width / 2, height / 2];
959
- weight = weight || 2;
960
- var plotposx = Chalkboard.vec2.new(matr[0][0], matr[1][0]);
961
- var plotnegx = Chalkboard.vec2.new(-matr[0][0], -matr[1][0]);
962
- var plotposy = Chalkboard.vec2.new(matr[0][1], matr[1][1]);
963
- var plotnegy = Chalkboard.vec2.new(-matr[0][1], -matr[1][1]);
964
- for(var i = -10; i <= 10; i++) {
965
- Chalkboard.vec2.plot(plotposx, scl, rgba, [origin[0], origin[1] + (i / scl) * matr[1][1]], weight / 4);
966
- Chalkboard.vec2.plot(plotnegx, scl, rgba, [origin[0], origin[1] + (i / scl) * matr[1][1]], weight / 4);
967
- Chalkboard.vec2.plot(plotposy, scl, rgba, [origin[0] + (i / scl) * matr[0][0], origin[1]], weight / 4);
968
- Chalkboard.vec2.plot(plotnegy, scl, rgba, [origin[0] + (i / scl) * matr[0][0], origin[1]], weight / 4);
969
- }
970
- var plotposaxisx = Chalkboard.vec2.new(matr[0][0], matr[1][0]);
971
- var plotnegaxisx = Chalkboard.vec2.new(-matr[0][0], -matr[1][0]);
972
- var plotposaxisy = Chalkboard.vec2.new(matr[0][1], matr[1][1]);
973
- var plotnegaxisy = Chalkboard.vec2.new(-matr[0][1], -matr[1][1]);
974
- Chalkboard.vec2.plot(plotposaxisx, scl, rgba, origin, weight);
975
- Chalkboard.vec2.plot(plotnegaxisx, scl, rgba, origin, weight);
976
- Chalkboard.vec2.plot(plotposaxisy, scl, rgba, origin, weight);
977
- Chalkboard.vec2.plot(plotnegaxisy, scl, rgba, origin, weight);
1150
+ matr: function(matr, config) {
1151
+ (config = {
1152
+ x: (config = config || {}).x || width / 2,
1153
+ y: config.y || height / 2,
1154
+ size: config.size || 1,
1155
+ stroke: config.stroke || color(0),
1156
+ strokeWeight: config.strokeWeight || 2,
1157
+ domain: config.domain || [-10, 10]
1158
+ }).size /= 100;
1159
+ for(var i = config.domain[0]; i <= config.domain[1]; i++) {
1160
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][0], matr[1][0]), {x: config.x, y: config.y + (i / config.size) * matr[1][1], size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
1161
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][0], -matr[1][0]), {x: config.x, y: config.y + (i / config.size) * matr[1][1], size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
1162
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][1], matr[1][1]), {x: config.x + (i / config.size) * matr[0][0], y: config.y, size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
1163
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][1], -matr[1][1]), {x: config.x + (i / config.size) * matr[0][0], y: config.y, size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
1164
+ }
1165
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][0], matr[1][0]), config);
1166
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][0], -matr[1][0]), config);
1167
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][1], matr[1][1]), config);
1168
+ Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][1], -matr[1][1]), config);
978
1169
  return matr;
979
1170
  },
980
- dfdx: function(func, scl, rgba, domain, origin, weight, res) {
981
- scl = scl || 1;
982
- scl /= 100;
983
- rgba = rgba || [0, 0, 0];
984
- domain = domain || [-10, 10];
985
- origin = origin || [width / 2, height / 2];
986
- weight = weight || 2;
987
- res = res || 25;
1171
+ dfdx: function(func, config) {
1172
+ (config = {
1173
+ x: (config = config || {}).x || width / 2,
1174
+ y: config.y || height / 2,
1175
+ size: config.size || 1,
1176
+ stroke: config.stroke || color(0),
1177
+ strokeWeight: config.strokeWeight || 2,
1178
+ domain: config.domain || [-10, 10],
1179
+ res: config.res || 25
1180
+ }).size /= 100;
988
1181
  var data = [];
989
1182
  pushMatrix();
990
- translate(origin[0], origin[1]);
1183
+ translate(config.x, config.y);
991
1184
  noFill();
992
- strokeWeight(weight);
993
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1185
+ strokeWeight(config.strokeWeight);
1186
+ stroke(config.stroke);
994
1187
  beginShape();
995
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
996
- vertex(i, -Chalkboard.calc.dfdx(func, i * scl) / scl);
997
- data.push([i, Chalkboard.calc.dfdx(func, i)]);
1188
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1189
+ if(func.type === "expl") {
1190
+ vertex(i, -Chalkboard.calc.dfdx(func, i * config.size) / config.size);
1191
+ data.push([i, Chalkboard.calc.dfdx(func, i)]);
1192
+ } else if(func.type === "inve") {
1193
+ vertex(Chalkboard.calc.dfdx(func, i * config.size) / config.size, -i);
1194
+ data.push([Chalkboard.calc.dfdx(func, i), i]);
1195
+ }
998
1196
  }
999
1197
  endShape();
1000
1198
  popMatrix();
1001
1199
  return data;
1002
1200
  },
1003
- d2fdx2: function(func, scl, rgba, domain, origin, weight, res) {
1004
- scl = scl || 1;
1005
- scl /= 100;
1006
- rgba = rgba || [0, 0, 0];
1007
- domain = domain || [-10, 10];
1008
- origin = origin || [width / 2, height / 2];
1009
- weight = weight || 2;
1010
- res = res || 25;
1201
+ d2fdx2: function(func, config) {
1202
+ (config = {
1203
+ x: (config = config || {}).x || width / 2,
1204
+ y: config.y || height / 2,
1205
+ size: config.size || 1,
1206
+ stroke: config.stroke || color(0),
1207
+ strokeWeight: config.strokeWeight || 2,
1208
+ domain: config.domain || [-10, 10],
1209
+ res: config.res || 25
1210
+ }).size /= 100;
1011
1211
  var data = [];
1012
1212
  pushMatrix();
1013
- translate(origin[0], origin[1]);
1213
+ translate(config.x, config.y);
1014
1214
  noFill();
1015
- strokeWeight(weight);
1016
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1215
+ strokeWeight(config.strokeWeight);
1216
+ stroke(config.stroke);
1017
1217
  beginShape();
1018
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1019
- vertex(i, -Chalkboard.calc.d2fdx2(func, i * scl) / scl);
1020
- data.push([i, Chalkboard.calc.d2fdx2(func, i)]);
1218
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1219
+ if(func.type === "expl") {
1220
+ vertex(i, -Chalkboard.calc.d2fdx2(func, i * config.size) / config.size);
1221
+ data.push([i, Chalkboard.calc.d2fdx2(func, i)]);
1222
+ } else if(func.type === "inve") {
1223
+ vertex(Chalkboard.calc.d2fdx2(func, i * config.size) / config.size, -i);
1224
+ data.push([Chalkboard.calc.d2fdx2(func, i), i]);
1225
+ }
1021
1226
  }
1022
1227
  endShape();
1023
1228
  popMatrix();
1024
1229
  return data;
1025
1230
  },
1026
- fxdx: function(func, scl, rgba, domain, origin, weight, res) {
1027
- scl = scl || 1;
1028
- scl /= 100;
1029
- rgba = rgba || [0, 0, 0];
1030
- domain = domain || [-10, 10];
1031
- origin = origin || [width / 2, height / 2];
1032
- weight = weight || 2;
1033
- res = res || 25;
1231
+ fxdx: function(func, config) {
1232
+ (config = {
1233
+ x: (config = config || {}).x || width / 2,
1234
+ y: config.y || height / 2,
1235
+ size: config.size || 1,
1236
+ stroke: config.stroke || color(0),
1237
+ strokeWeight: config.strokeWeight || 2,
1238
+ domain: config.domain || [-10, 10],
1239
+ res: config.res || 25
1240
+ }).size /= 100;
1034
1241
  var data = [];
1035
1242
  pushMatrix();
1036
- translate(origin[0], origin[1]);
1243
+ translate(config.x, config.y);
1037
1244
  noFill();
1038
- strokeWeight(weight);
1039
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1245
+ strokeWeight(config.strokeWeight);
1246
+ stroke(config.stroke);
1040
1247
  beginShape();
1041
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1042
- vertex(i, -Chalkboard.calc.fxdx(func, 0, i * scl) / scl);
1043
- data.push([i, Chalkboard.calc.fxdx(func, 0, i)]);
1248
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1249
+ if(func.type === "expl") {
1250
+ vertex(i, -Chalkboard.calc.fxdx(func, 0, i * config.size) / config.size);
1251
+ data.push([i, Chalkboard.calc.fxdx(func, 0, i)]);
1252
+ } else if(func.type === "inve") {
1253
+ vertex(Chalkboard.calc.fxdx(func, 0, i * config.size) / config.size, -i);
1254
+ data.push([Chalkboard.calc.fxdx(func, 0, i), i]);
1255
+ }
1044
1256
  }
1045
1257
  endShape();
1046
1258
  popMatrix();
1047
1259
  return data;
1048
1260
  },
1049
- convolution: function(func_1, func_2, scl, rgba, domain, origin, weight, res) {
1050
- scl = scl || 1;
1051
- scl /= 100;
1052
- rgba = rgba || [0, 0, 0];
1053
- domain = domain || [-10, 10];
1054
- origin = origin || [width / 2, height / 2];
1055
- weight = weight || 2;
1056
- res = res || 25;
1261
+ convolution: function(func_1, func_2, config) {
1262
+ (config = {
1263
+ x: (config = config || {}).x || width / 2,
1264
+ y: config.y || height / 2,
1265
+ size: config.size || 1,
1266
+ stroke: config.stroke || color(0),
1267
+ strokeWeight: config.strokeWeight || 2,
1268
+ domain: config.domain || [-10, 10],
1269
+ res: config.res || 25
1270
+ }).size /= 100;
1057
1271
  var data = [];
1058
1272
  pushMatrix();
1059
- translate(origin[0], origin[1]);
1273
+ translate(config.x, config.y);
1060
1274
  noFill();
1061
- strokeWeight(weight);
1062
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1275
+ strokeWeight(config.strokeWeight);
1276
+ stroke(config.stroke);
1063
1277
  beginShape();
1064
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1065
- vertex(i, -Chalkboard.calc.convolution(func_1, func_2, i * scl) / scl);
1278
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1279
+ vertex(i, -Chalkboard.calc.convolution(func_1, func_2, i * config.size) / config.size);
1066
1280
  data.push([i, Chalkboard.calc.convolution(func_1, func_2, i)]);
1067
1281
  }
1068
1282
  endShape();
1069
1283
  popMatrix();
1070
1284
  return data;
1071
1285
  },
1072
- correlation: function(func_1, func_2, scl, rgba, domain, origin, weight, res) {
1073
- scl = scl || 1;
1074
- scl /= 100;
1075
- rgba = rgba || [0, 0, 0];
1076
- domain = domain || [-10, 10];
1077
- origin = origin || [width / 2, height / 2];
1078
- weight = weight || 2;
1079
- res = res || 25;
1286
+ correlation: function(func_1, func_2, config) {
1287
+ (config = {
1288
+ x: (config = config || {}).x || width / 2,
1289
+ y: config.y || height / 2,
1290
+ size: config.size || 1,
1291
+ stroke: config.stroke || color(0),
1292
+ strokeWeight: config.strokeWeight || 2,
1293
+ domain: config.domain || [-10, 10],
1294
+ res: config.res || 25
1295
+ }).size /= 100;
1080
1296
  var data = [];
1081
1297
  pushMatrix();
1082
- translate(origin[0], origin[1]);
1298
+ translate(config.x, config.y);
1083
1299
  noFill();
1084
- strokeWeight(weight);
1085
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1300
+ strokeWeight(config.strokeWeight);
1301
+ stroke(config.stroke);
1086
1302
  beginShape();
1087
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1088
- vertex(i, -Chalkboard.calc.correlation(func_1, func_2, i * scl) / scl);
1303
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1304
+ vertex(i, -Chalkboard.calc.correlation(func_1, func_2, i * config.size) / config.size);
1089
1305
  data.push([i, Chalkboard.calc.correlation(func_1, func_2, i)]);
1090
1306
  }
1091
1307
  endShape();
1092
1308
  popMatrix();
1093
1309
  return data;
1094
1310
  },
1095
- autocorrelation: function(func, scl, rgba, domain, origin, weight, res) {
1096
- scl = scl || 1;
1097
- scl /= 100;
1098
- rgba = rgba || [0, 0, 0];
1099
- domain = domain || [-10, 10];
1100
- origin = origin || [width / 2, height / 2];
1101
- weight = weight || 2;
1102
- res = res || 25;
1311
+ autocorrelation: function(func, config) {
1312
+ (config = {
1313
+ x: (config = config || {}).x || width / 2,
1314
+ y: config.y || height / 2,
1315
+ size: config.size || 1,
1316
+ stroke: config.stroke || color(0),
1317
+ strokeWeight: config.strokeWeight || 2,
1318
+ domain: config.domain || [-10, 10],
1319
+ res: config.res || 25
1320
+ }).size /= 100;
1103
1321
  var data = [];
1104
1322
  pushMatrix();
1105
- translate(origin[0], origin[1]);
1323
+ translate(config.x, config.y);
1106
1324
  noFill();
1107
- strokeWeight(weight);
1108
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1325
+ strokeWeight(config.strokeWeight);
1326
+ stroke(config.stroke);
1109
1327
  beginShape();
1110
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1111
- vertex(i, -Chalkboard.calc.autocorrelation(func, i * scl) / scl);
1328
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1329
+ vertex(i, -Chalkboard.calc.autocorrelation(func, i * config.size) / config.size);
1112
1330
  data.push([i, Chalkboard.calc.autocorrelation(func, i)]);
1113
1331
  }
1114
1332
  endShape();
1115
1333
  popMatrix();
1116
1334
  return data;
1117
1335
  },
1118
- Taylor: function(func, n, a, scl, rgba, domain, origin, weight, res) {
1119
- scl = scl || 1;
1120
- scl /= 100;
1121
- rgba = rgba || [0, 0, 0];
1122
- domain = domain || [-10, 10];
1123
- origin = origin || [width / 2, height / 2];
1124
- weight = weight || 2;
1125
- res = res || 25;
1336
+ Taylor: function(func, n, a, config) {
1337
+ (config = {
1338
+ x: (config = config || {}).x || width / 2,
1339
+ y: config.y || height / 2,
1340
+ size: config.size || 1,
1341
+ stroke: config.stroke || color(0),
1342
+ strokeWeight: config.strokeWeight || 2,
1343
+ domain: config.domain || [-10, 10],
1344
+ res: config.res || 25
1345
+ }).size /= 100;
1126
1346
  var data = [];
1127
1347
  pushMatrix();
1128
- translate(origin[0], origin[1]);
1348
+ translate(config.x, config.y);
1129
1349
  noFill();
1130
- strokeWeight(weight);
1131
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1350
+ strokeWeight(config.strokeWeight);
1351
+ stroke(config.stroke);
1132
1352
  beginShape();
1133
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1134
- vertex(i, -Chalkboard.calc.Taylor(func, i * scl, n, a) / scl);
1353
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1354
+ vertex(i, -Chalkboard.calc.Taylor(func, i * config.size, n, a) / config.size);
1135
1355
  data.push([i, Chalkboard.calc.Taylor(func, i, n, a)]);
1136
1356
  }
1137
1357
  endShape();
1138
1358
  popMatrix();
1139
1359
  return data;
1140
1360
  },
1141
- Laplace: function(func, scl, rgba, domain, origin, weight, res) {
1142
- scl = scl || 1;
1143
- scl /= 100;
1144
- rgba = rgba || [0, 0, 0];
1145
- domain = domain || [-10, 10];
1146
- origin = origin || [width / 2, height / 2];
1147
- weight = weight || 2;
1148
- res = res || 25;
1361
+ Laplace: function(func, config) {
1362
+ (config = {
1363
+ x: (config = config || {}).x || width / 2,
1364
+ y: config.y || height / 2,
1365
+ size: config.size || 1,
1366
+ stroke: config.stroke || color(0),
1367
+ strokeWeight: config.strokeWeight || 2,
1368
+ domain: config.domain || [-10, 10],
1369
+ res: config.res || 25
1370
+ }).size /= 100;
1149
1371
  var data = [];
1150
1372
  pushMatrix();
1151
- translate(origin[0], origin[1]);
1373
+ translate(config.x, config.y);
1152
1374
  noFill();
1153
- strokeWeight(weight);
1154
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1375
+ strokeWeight(config.strokeWeight);
1376
+ stroke(config.stroke);
1155
1377
  beginShape();
1156
- if(domain[0] >= 0) {
1157
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1158
- vertex(i, -Chalkboard.calc.Laplace(func, i * scl) / scl);
1378
+ if(config.domain[0] >= 0) {
1379
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1380
+ vertex(i, -Chalkboard.calc.Laplace(func, i * config.size) / config.size);
1159
1381
  data.push([i, Chalkboard.calc.Laplace(func, i)]);
1160
1382
  }
1161
1383
  } else {
1162
- for(var i = 0; i <= domain[1] / scl; i += res) {
1163
- vertex(i, -Chalkboard.calc.Laplace(func, i * scl) / scl);
1384
+ for(var i = 0; i <= config.domain[1] / config.size; i += config.res) {
1385
+ vertex(i, -Chalkboard.calc.Laplace(func, i * config.size) / config.size);
1164
1386
  data.push([i, Chalkboard.calc.Laplace(func, i)]);
1165
1387
  }
1166
1388
  }
@@ -1168,23 +1390,25 @@ var Chalkboard = {
1168
1390
  popMatrix();
1169
1391
  return data;
1170
1392
  },
1171
- Fourier: function(func, scl, rgba, domain, origin, weight, res) {
1172
- scl = scl || 1;
1173
- scl /= 100;
1174
- rgba = rgba || [0, 0, 0];
1175
- domain = domain || [-10, 10];
1176
- origin = origin || [width / 2, height / 2];
1177
- weight = weight || 2;
1178
- res = res || 25;
1393
+ Fourier: function(func, config) {
1394
+ (config = {
1395
+ x: (config = config || {}).x || width / 2,
1396
+ y: config.y || height / 2,
1397
+ size: config.size || 1,
1398
+ stroke: config.stroke || color(0),
1399
+ strokeWeight: config.strokeWeight || 2,
1400
+ domain: config.domain || [-10, 10],
1401
+ res: config.res || 25
1402
+ }).size /= 100;
1179
1403
  var data = [];
1180
1404
  pushMatrix();
1181
- translate(origin[0], origin[1]);
1405
+ translate(config.x, config.y);
1182
1406
  noFill();
1183
- strokeWeight(weight);
1184
- stroke(rgba.length === 3 ? color(rgba[0], rgba[1], rgba[2]) : color(rgba[0], rgba[1], rgba[2], rgba[3]));
1407
+ strokeWeight(config.strokeWeight);
1408
+ stroke(config.stroke);
1185
1409
  beginShape();
1186
- for(var i = domain[0] / scl; i <= domain[1] / scl; i += res) {
1187
- vertex(i, -Chalkboard.calc.Fourier(func, i * scl) / scl);
1410
+ for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
1411
+ vertex(i, -Chalkboard.calc.Fourier(func, i * config.size) / config.size);
1188
1412
  data.push([i, Chalkboard.calc.Fourier(func, i)]);
1189
1413
  }
1190
1414
  endShape();
@@ -1516,6 +1740,16 @@ var Chalkboard = {
1516
1740
  }
1517
1741
  return result;
1518
1742
  },
1743
+ shuffle: function(arr) {
1744
+ var index, temp, rindex;
1745
+ for(index = arr.length - 1; index > 0; index--) {
1746
+ rindex = Math.floor(Chalkboard.numb.random(0, index + 1));
1747
+ temp = arr[index];
1748
+ arr[index] = arr[rindex];
1749
+ arr[rindex] = temp;
1750
+ }
1751
+ return arr;
1752
+ },
1519
1753
  norm: function(arr, type) {
1520
1754
  type = type || "L2";
1521
1755
  var result = 0;
@@ -1589,7 +1823,7 @@ var Chalkboard = {
1589
1823
  },
1590
1824
  eq: function(arr, arrORnum) {
1591
1825
  var result = [];
1592
- if(arrORnum.constructor === Array) {
1826
+ if(Array.isArray(arrORnum)) {
1593
1827
  if(arr.length === arrORnum.length) {
1594
1828
  for(var i = 0; i < arr.length; i++) {
1595
1829
  if(arr[i] === arrORnum[i]) {
@@ -1610,7 +1844,7 @@ var Chalkboard = {
1610
1844
  includeInf = includeInf || false;
1611
1845
  includeSup = includeSup || false;
1612
1846
  var result = [];
1613
- if(inf.constructor === Array && sup.constructor === Array) {
1847
+ if(Array.isArray(inf) && Array.isArray(sup)) {
1614
1848
  if(arr.length === inf.length && arr.length === sup.length) {
1615
1849
  for(var i = 0; i < arr.length; i++) {
1616
1850
  if(includeInf) {
@@ -1666,7 +1900,7 @@ var Chalkboard = {
1666
1900
  lt: function(arr, arrORnum, includeEnd) {
1667
1901
  includeEnd = includeEnd || false;
1668
1902
  var result = [];
1669
- if(arrORnum.constructor === Array) {
1903
+ if(Array.isArray(arrORnum)) {
1670
1904
  if(arr.length === arrORnum.length) {
1671
1905
  for(var i = 0; i < arr.length; i++) {
1672
1906
  if(includeEnd) {
@@ -1698,7 +1932,7 @@ var Chalkboard = {
1698
1932
  gt: function(arr, arrORnum, includeEnd) {
1699
1933
  includeEnd = includeEnd || false;
1700
1934
  var result = [];
1701
- if(arrORnum.constructor === Array) {
1935
+ if(Array.isArray(arrORnum)) {
1702
1936
  if(arr.length === arrORnum.length) {
1703
1937
  for(var i = 0; i < arr.length; i++) {
1704
1938
  if(includeEnd) {
@@ -1727,6 +1961,23 @@ var Chalkboard = {
1727
1961
  }
1728
1962
  return result;
1729
1963
  },
1964
+ subsets: function(arr) {
1965
+ var result = [[]];
1966
+ arr.sort();
1967
+ for(var i = 0; i < arr.length; i++) {
1968
+ if(i === 0 || arr[i] !== arr[i - 1]) {
1969
+ var curr = arr[i];
1970
+ var subsetsWithCurr = [];
1971
+ for(var j = 0; j < result.length; j++) {
1972
+ var subset = result[j].slice();
1973
+ subset.push(curr);
1974
+ subsetsWithCurr.push(subset);
1975
+ }
1976
+ result = result.concat(subsetsWithCurr);
1977
+ }
1978
+ }
1979
+ return result;
1980
+ },
1730
1981
  max: function(arr) {
1731
1982
  var max = arr[0];
1732
1983
  for(var i = 0; i < arr.length; i++) {
@@ -1760,7 +2011,7 @@ var Chalkboard = {
1760
2011
  for(var i = 0; i < arr.length; i++) {
1761
2012
  result *= arr[i];
1762
2013
  }
1763
- return Chalkboard.real.nrt(Math.abs(result), arr.length);
2014
+ return Chalkboard.real.root(Math.abs(result), arr.length);
1764
2015
  } else if(type === "harmonic") {
1765
2016
  for(var i = 0; i < arr.length; i++) {
1766
2017
  result += 1 / arr[i];
@@ -1925,13 +2176,93 @@ var Chalkboard = {
1925
2176
  Gaussian: function(height, mean, deviation) {
1926
2177
  return Chalkboard.real.function(height.toString() + " * Math.exp(-((x - " + mean.toString() + ") * (x - " + mean.toString() + ")) / (2 * " + deviation.toString() + " * " + deviation.toString() + "))");
1927
2178
  },
1928
- toVector: function(arr, type) {
2179
+ regression: function(data, type, degree) {
2180
+ type = type || "linear";
2181
+ degree = degree || 2;
2182
+ if(type === "linear") {
2183
+ var x = 0, y = 0;
2184
+ var xx = 0, xy = 0;
2185
+ for(var i = 0; i < data.length; i++) {
2186
+ x += data[i][0];
2187
+ y += data[i][1];
2188
+ xx += data[i][0] * data[i][0];
2189
+ xy += data[i][0] * data[i][1];
2190
+ }
2191
+ var a = (data.length * xy - x * y) / (data.length * xx - x * x),
2192
+ b = (y / data.length) - (a * x) / data.length;
2193
+ return Chalkboard.real.function(a + " * x + " + b);
2194
+ } else if(type === "polynomial") {
2195
+ var A = Chalkboard.matr.new();
2196
+ for(var i = 0; i < data.length; i++) {
2197
+ A.push([]);
2198
+ for(var j = 0; j <= degree; j++) {
2199
+ A[i].push(Chalkboard.real.pow(data[i][0], j));
2200
+ }
2201
+ }
2202
+ var AT = Chalkboard.matr.transpose(A);
2203
+ var B = Chalkboard.matr.new();
2204
+ for(var i = 0; i < data.length; i++) {
2205
+ B.push([data[i][1]]);
2206
+ }
2207
+ var ATA = Chalkboard.matr.mul(AT, A);
2208
+ var ATAI = Chalkboard.matr.invert(ATA);
2209
+ var x = Chalkboard.matr.mul(Chalkboard.matr.mul(ATAI, AT), B);
2210
+ var coeff = [];
2211
+ for(var i = 0; i < x.length; i++) {
2212
+ coeff.push(x[i][0]);
2213
+ }
2214
+ var f = coeff[0].toString() + " + " + coeff[1].toString() + " * x";
2215
+ for(var i = 2; i <= degree; i++) {
2216
+ f += " + " + coeff[i].toString() + " * Math.pow(x, " + i + ")";
2217
+ }
2218
+ return Chalkboard.real.function(f);
2219
+ } else if(type === "power") {
2220
+ var arr = [0, 0, 0, 0];
2221
+ for(var i = 0; i < data.length; i++) {
2222
+ arr[0] += Chalkboard.real.ln(data[i][0]);
2223
+ arr[1] += data[i][1] * Chalkboard.real.ln(data[i][0]);
2224
+ arr[2] += data[i][1];
2225
+ arr[3] += Chalkboard.real.ln(data[i][0]) * Chalkboard.real.ln(data[i][0]);
2226
+ }
2227
+ var a = Chalkboard.E((arr[2] - ((data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0])) * arr[0]) / data.length),
2228
+ b = (data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0]);
2229
+ return Chalkboard.real.function(a + " * Math.pow(x, " + b + ")");
2230
+ } else if(type === "exponential") {
2231
+ var arr = [0, 0, 0, 0, 0, 0];
2232
+ for(var i = 0; i < data.length; i++) {
2233
+ arr[0] += data[i][0];
2234
+ arr[1] += data[i][1];
2235
+ arr[2] += data[i][0] * data[i][0] * data[i][1];
2236
+ arr[3] += data[i][1] * Chalkboard.real.ln(data[i][1]);
2237
+ arr[4] += data[i][0] & data[i][1] * Chalkboard.real.ln(data[i][1]);
2238
+ arr[5] += data[i][0] * data[i][1];
2239
+ }
2240
+ var a = Chalkboard.E((arr[2] * arr[3] - arr[5] * arr[4]) / (arr[1] * arr[2] - arr[5] * arr[5])),
2241
+ b = (arr[1] * arr[4] - arr[5] * arr[3]) / (arr[1] * arr[2] - arr[5] * arr[5]);
2242
+ return Chalkboard.real.function(a + "* Math.exp(" + b + " * x)");
2243
+ } else if(type === "logarithmic") {
2244
+ var arr = [0, 0, 0, 0];
2245
+ for(var i = 0; i < data.length; i++) {
2246
+ arr[0] += Chalkboard.real.ln(data[i][0]);
2247
+ arr[1] += data[i][1] * Chalkboard.real.ln(data[i][0]);
2248
+ arr[2] += data[i][1];
2249
+ arr[3] += Chalkboard.real.ln(data[i][0]) * Chalkboard.real.ln(data[i][0]);
2250
+ }
2251
+ var a = (arr[2] - ((data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0])) * arr[0]) / data.length,
2252
+ b = (data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0]);
2253
+ return Chalkboard.real.function(a + " + " + b + " * Math.log(x)");
2254
+ } else {
2255
+ return "TypeError: Parameter \"type\" must be either \"linear\", \"polynomial\", \"power\", \"exponential\", or \"logarithmic\".";
2256
+ }
2257
+ },
2258
+ toVector: function(arr, type, index) {
2259
+ if(index === undefined) { index = 0; }
1929
2260
  if(type === "vec2") {
1930
- return Chalkboard.vec2.new(arr[0], arr[1]);
2261
+ return Chalkboard.vec2.new(arr[index], arr[index + 1]);
1931
2262
  } else if(type === "vec3") {
1932
- return Chalkboard.vec3.new(arr[0], arr[1], arr[2]);
2263
+ return Chalkboard.vec3.new(arr[index], arr[index + 1], arr[index + 2]);
1933
2264
  } else if(type === "vec4") {
1934
- return Chalkboard.vec4.new(arr[0], arr[1], arr[2], arr[3]);
2265
+ return Chalkboard.vec4.new(arr[index], arr[index + 1], arr[index + 2], arr[index + 3]);
1935
2266
  } else {
1936
2267
  return "TypeError: Parameter \"type\" should be \"vec2\", \"vec3\", or \"vec4\".";
1937
2268
  }
@@ -1952,6 +2283,12 @@ var Chalkboard = {
1952
2283
  }
1953
2284
  return result;
1954
2285
  },
2286
+ toTensor: function(arr, size) {
2287
+ if(!Array.isArray(size)) {
2288
+ size = Array.from(arguments).slice(1);
2289
+ }
2290
+ return Chalkboard.tens.resize(arr, size);
2291
+ },
1955
2292
  toObject: function(arr) {
1956
2293
  var result = {};
1957
2294
  for(var i = 0; i < arr.length; i++) {
@@ -1974,6 +2311,9 @@ var Chalkboard = {
1974
2311
  return {x: x, y: y, type: "vec2"};
1975
2312
  }
1976
2313
  },
2314
+ copy: function(vec2) {
2315
+ return Object.create(Object.getPrototypeOf(vec2), Object.getOwnPropertyDescriptors(vec2));
2316
+ },
1977
2317
  random: function(inf, sup) {
1978
2318
  return Chalkboard.vec2.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
1979
2319
  },
@@ -2118,6 +2458,9 @@ var Chalkboard = {
2118
2458
  return {x: x, y: y, z: z, type: "vec3"};
2119
2459
  }
2120
2460
  },
2461
+ copy: function(vec3) {
2462
+ return Object.create(Object.getPrototypeOf(vec3), Object.getOwnPropertyDescriptors(vec3));
2463
+ },
2121
2464
  random: function(inf, sup) {
2122
2465
  return Chalkboard.vec3.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
2123
2466
  },
@@ -2269,6 +2612,9 @@ var Chalkboard = {
2269
2612
  return {x: x, y: y, z: z, w: w, type: "vec4"};
2270
2613
  }
2271
2614
  },
2615
+ copy: function(vec4) {
2616
+ return Object.create(Object.getPrototypeOf(vec4), Object.getOwnPropertyDescriptors(vec4));
2617
+ },
2272
2618
  random: function(inf, sup) {
2273
2619
  return Chalkboard.vec4.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
2274
2620
  },
@@ -2403,7 +2749,23 @@ var Chalkboard = {
2403
2749
  },
2404
2750
  matr: {
2405
2751
  new: function(matrix) {
2406
- return Array.from(arguments);
2752
+ if(arguments.length === 0) {
2753
+ return [];
2754
+ } else if(Array.isArray(matrix) && Array.isArray(matrix[0])) {
2755
+ return matrix;
2756
+ } else {
2757
+ return Array.from(arguments);
2758
+ }
2759
+ },
2760
+ copy: function(matr) {
2761
+ var result = Chalkboard.matr.new();
2762
+ for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2763
+ result.push([]);
2764
+ for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2765
+ result[i].push(matr[i][j]);
2766
+ }
2767
+ }
2768
+ return result;
2407
2769
  },
2408
2770
  rows: function(matr) {
2409
2771
  return matr.length;
@@ -2411,12 +2773,75 @@ var Chalkboard = {
2411
2773
  cols: function(matr) {
2412
2774
  return matr[0].length;
2413
2775
  },
2414
- empty: function(dimension) {
2415
- if(Number.isInteger(dimension) && dimension > 0) {
2776
+ resize: function(matr, rows, cols) {
2777
+ if(cols === undefined) {
2778
+ cols = rows;
2779
+ }
2780
+ var result = Chalkboard.matr.new();
2781
+ var flat = Chalkboard.matr.toArray(matr);
2782
+ var index = 0;
2783
+ for(var i = 0; i < rows; i++) {
2784
+ result.push([]);
2785
+ for(var j = 0; j < cols; j++) {
2786
+ result[i].push(index < flat.length ? flat[index++] : 0);
2787
+ }
2788
+ }
2789
+ return result;
2790
+ },
2791
+ push: function(matr, type, rowORcol, elements) {
2792
+ rowORcol -= 1;
2793
+ if(type === "row") {
2794
+ matr.splice(rowORcol, 0, elements);
2795
+ return matr;
2796
+ } else if(type === "col") {
2797
+ for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2798
+ matr[i].splice(rowORcol, 0, elements[i]);
2799
+ }
2800
+ return matr;
2801
+ } else {
2802
+ return "TypeError: Parameter \"type\" must be either \"row\" or \"col\".";
2803
+ }
2804
+ },
2805
+ pull: function(matr, type, rowORcol) {
2806
+ rowORcol -= 1;
2807
+ if(type === "row") {
2808
+ matr.splice(rowORcol, 1);
2809
+ return matr;
2810
+ } else if(type === "col") {
2811
+ for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2812
+ matr[i].splice(rowORcol, 1);
2813
+ }
2814
+ return matr;
2815
+ } else {
2816
+ return "TypeError: Parameter \"type\" must be either \"row\" or \"col\".";
2817
+ }
2818
+ },
2819
+ fill: function(element, rows, cols) {
2820
+ if(cols === undefined) {
2821
+ cols = rows;
2822
+ }
2823
+ if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
2416
2824
  var result = Chalkboard.matr.new();
2417
- for(var i = 0; i < dimension; i++) {
2825
+ for(var i = 0; i < rows; i++) {
2418
2826
  result.push([]);
2419
- for(var j = 0; j < dimension; j++) {
2827
+ for(var j = 0; j < cols; j++) {
2828
+ result[i].push(element);
2829
+ }
2830
+ }
2831
+ return result;
2832
+ } else {
2833
+ return undefined;
2834
+ }
2835
+ },
2836
+ empty: function(rows, cols) {
2837
+ if(cols === undefined) {
2838
+ cols = rows;
2839
+ }
2840
+ if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
2841
+ var result = Chalkboard.matr.new();
2842
+ for(var i = 0; i < rows; i++) {
2843
+ result.push([]);
2844
+ for(var j = 0; j < cols; j++) {
2420
2845
  result[i].push(null);
2421
2846
  }
2422
2847
  }
@@ -2425,11 +2850,11 @@ var Chalkboard = {
2425
2850
  return undefined;
2426
2851
  }
2427
2852
  },
2428
- identity: function(dimension) {
2429
- if(Number.isInteger(dimension) && dimension > 0) {
2853
+ identity: function(size) {
2854
+ if(Number.isInteger(size) && size > 0) {
2430
2855
  var result = Chalkboard.matr.new();
2431
- for(var i = 0; i < dimension; i++) {
2432
- result.push(Array(dimension).fill(0));
2856
+ for(var i = 0; i < size; i++) {
2857
+ result.push(Array(size).fill(0));
2433
2858
  result[i][i] = 1;
2434
2859
  }
2435
2860
  return result;
@@ -2437,14 +2862,30 @@ var Chalkboard = {
2437
2862
  return undefined;
2438
2863
  }
2439
2864
  },
2440
- random: function(dimension, inf, sup) {
2441
- if(Number.isInteger(dimension) && dimension > 0) {
2442
- inf = inf || 0;
2443
- sup = sup || 1;
2865
+ exchange: function(size) {
2866
+ if(Number.isInteger(size) && size > 0) {
2867
+ var result = Chalkboard.matr.fill(0, size, size);
2868
+ for(var i = 0; i < size; i++) {
2869
+ for(var j = 0; j < size; j++) {
2870
+ if(i + j === size - 1) {
2871
+ result[i][j] = 1;
2872
+ }
2873
+ }
2874
+ }
2875
+ return result;
2876
+ } else {
2877
+ return undefined;
2878
+ }
2879
+ },
2880
+ random: function(inf, sup, rows, cols) {
2881
+ if(cols === undefined) {
2882
+ cols = rows;
2883
+ }
2884
+ if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
2444
2885
  var result = Chalkboard.matr.new();
2445
- for(var i = 0; i < dimension; i++) {
2886
+ for(var i = 0; i < rows; i++) {
2446
2887
  result.push([]);
2447
- for(var j = 0; j < dimension; j++) {
2888
+ for(var j = 0; j < cols; j++) {
2448
2889
  result[i].push(Chalkboard.numb.random(inf, sup));
2449
2890
  }
2450
2891
  }
@@ -2453,8 +2894,75 @@ var Chalkboard = {
2453
2894
  return undefined;
2454
2895
  }
2455
2896
  },
2897
+ shift: function(size, shiftAmount) {
2898
+ shiftAmount = shiftAmount || 1;
2899
+ if(Number.isInteger(size) && size > 0) {
2900
+ var result = Chalkboard.matr.fill(0, size, size);
2901
+ for(var i = 0; i < size; i++) {
2902
+ for(var j = 0; j < size; j++) {
2903
+ result[i][j] = Chalkboard.numb.Kronecker(i + shiftAmount, j);
2904
+ }
2905
+ }
2906
+ return result;
2907
+ } else {
2908
+ return undefined;
2909
+ }
2910
+ },
2911
+ binomial: function(size, type) {
2912
+ type = type || "lower";
2913
+ if(Number.isInteger(size) && size > 0) {
2914
+ var result = Chalkboard.matr.new();
2915
+ for(var i = 0; i < size; i++) {
2916
+ result.push([]);
2917
+ for(var j = 0; j < size; j++) {
2918
+ if(type === "lower") {
2919
+ result[i].push(Chalkboard.numb.binomial(i, j));
2920
+ } else if(type === "upper") {
2921
+ result[i].push(Chalkboard.numb.binomial(j, i));
2922
+ }
2923
+ }
2924
+ }
2925
+ if(type === "symmetric") {
2926
+ return Chalkboard.matr.mul(Chalkboard.matr.binomial(size, "lower"), Chalkboard.matr.binomial(size, "upper"));
2927
+ } else if(type !== "lower" && type !== "upper") {
2928
+ return "TypeError: Parameter \"type\" must be either \"lower\", \"upper\", or \"symmetric\".";
2929
+ } else {
2930
+ return result;
2931
+ }
2932
+ } else {
2933
+ return undefined;
2934
+ }
2935
+ },
2936
+ Hilbert: function(size) {
2937
+ if(Number.isInteger(size) && size > 0) {
2938
+ var result = Chalkboard.matr.new();
2939
+ for(var i = 0; i < size; i++) {
2940
+ result.push([]);
2941
+ for(var j = 0; j < size; j++) {
2942
+ result[i].push(1 / (i + j + 1));
2943
+ }
2944
+ }
2945
+ return result;
2946
+ } else {
2947
+ return undefined;
2948
+ }
2949
+ },
2950
+ Lehmer: function(size) {
2951
+ if(Number.isInteger(size) && size > 0) {
2952
+ var result = Chalkboard.matr.new();
2953
+ for(var i = 0; i < size; i++) {
2954
+ result.push([]);
2955
+ for(var j = 0; j < size; j++) {
2956
+ result[i].push(Math.min(i + 1, j + 1) / Math.max(i + 1, j + 1));
2957
+ }
2958
+ }
2959
+ return result;
2960
+ } else {
2961
+ return undefined;
2962
+ }
2963
+ },
2456
2964
  cofactor: function(matr, row, col) {
2457
- return matr.slice(0, row - 1).concat(matr.slice(row)).map(function (row) {
2965
+ return matr.slice(0, row - 1).concat(matr.slice(row)).map(function(row) {
2458
2966
  return row.slice(0, col - 1).concat(row.slice(col));
2459
2967
  });
2460
2968
  },
@@ -2491,15 +2999,15 @@ var Chalkboard = {
2491
2999
  }
2492
3000
  },
2493
3001
  rank: function(matr) {
2494
- return Chalkboard.matr.reduce(matr).filter(function (row) {
2495
- return row.some(function (element) {
3002
+ return Chalkboard.matr.reduce(matr).filter(function(row) {
3003
+ return row.some(function(element) {
2496
3004
  return element !== 0;
2497
3005
  });
2498
3006
  }).length;
2499
3007
  },
2500
3008
  rowspace: function(matr) {
2501
- return Chalkboard.matr.reduce(matr).filter(function (row) {
2502
- return row.some(function (element) {
3009
+ return Chalkboard.matr.reduce(matr).filter(function(row) {
3010
+ return row.some(function(element) {
2503
3011
  return element !== 0;
2504
3012
  });
2505
3013
  });
@@ -2508,15 +3016,15 @@ var Chalkboard = {
2508
3016
  return Chalkboard.matr.transpose(Chalkboard.matr.rowspace(Chalkboard.matr.transpose(matr)));
2509
3017
  },
2510
3018
  nullspace: function(matr) {
2511
- var augmented = matr.map(function (row) {
3019
+ var augmented = matr.map(function(row) {
2512
3020
  return row.slice().concat(Array(Chalkboard.matr.rows(matr)).fill(0));
2513
3021
  });
2514
3022
  var reduced = Chalkboard.matr.reduce(augmented);
2515
- return reduced.filter(function (row) {
2516
- return row.slice(0, Chalkboard.matr.rows(matr)).every(function (element) {
3023
+ return reduced.filter(function(row) {
3024
+ return row.slice(0, Chalkboard.matr.rows(matr)).every(function(element) {
2517
3025
  return element === 0;
2518
3026
  });
2519
- }).map(function (row) {
3027
+ }).map(function(row) {
2520
3028
  return row.slice(Chalkboard.matr.rows(matr));
2521
3029
  });
2522
3030
  },
@@ -2572,6 +3080,78 @@ var Chalkboard = {
2572
3080
  return undefined;
2573
3081
  }
2574
3082
  },
3083
+ LUdecomp: function(matr) {
3084
+ if(Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
3085
+ var L = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)),
3086
+ U = Chalkboard.matr.fill(0, Chalkboard.matr.rows(matr));
3087
+ for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
3088
+ for(var i = 0; i <= j; i++) {
3089
+ var sum = 0;
3090
+ for(var k = 0; k < i; k++) {
3091
+ sum += L[i][k] * U[k][j];
3092
+ }
3093
+ U[i][j] = matr[i][j] - sum;
3094
+ }
3095
+ for(var i = j + 1; i < Chalkboard.matr.rows(matr); i++) {
3096
+ var sum = 0;
3097
+ for(var k = 0; k < j; k++) {
3098
+ sum += L[i][k] * U[k][j];
3099
+ }
3100
+ L[i][j] = (matr[i][j] - sum) / U[j][j];
3101
+ }
3102
+ }
3103
+ return {L: L, U: U};
3104
+ } else {
3105
+ return undefined;
3106
+ }
3107
+ },
3108
+ QRdecomp: function(matr) {
3109
+ var Q = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)),
3110
+ R = Chalkboard.matr.copy(matr);
3111
+ for(var j = 0; j < Math.min(Chalkboard.matr.rows(matr), Chalkboard.matr.cols(matr)) - (Chalkboard.matr.rows(matr) > Chalkboard.matr.cols(matr) ? 0 : 1); j++) {
3112
+ var norm = 0;
3113
+ for(var i = j; i < Chalkboard.matr.rows(matr); i++) {
3114
+ norm += R[i][j] * R[i][j];
3115
+ }
3116
+ norm = Chalkboard.real.sqrt(norm);
3117
+ var v = [];
3118
+ v[0] = norm - R[j][j];
3119
+ var normalizer = v[0] * v[0];
3120
+ for(var i = 1; i < Chalkboard.matr.rows(matr) - j; i++) {
3121
+ v[i] = -R[i + j][j];
3122
+ normalizer += v[i] * v[i];
3123
+ }
3124
+ normalizer = 1 / Chalkboard.real.sqrt(normalizer);
3125
+ for(var i = 0; i < v.length; i++) {
3126
+ v[i] *= normalizer;
3127
+ }
3128
+ R[j][j] = norm;
3129
+ for(var i = j + 1; i < Chalkboard.matr.rows(R); i++) {
3130
+ R[i][j] = 0;
3131
+ }
3132
+ for(var k = j + 1; k < Chalkboard.matr.cols(R); k++) {
3133
+ var dot = 0;
3134
+ for(var i = 0; i < v.length; i++) {
3135
+ dot += v[i] * R[i + j][k];
3136
+ }
3137
+ dot *= 2;
3138
+ for(var i = 0; i < v.length; i++) {
3139
+ R[i + j][k] -= dot * v[i];
3140
+ }
3141
+ }
3142
+ for(var k = 0; k < Chalkboard.matr.cols(Q); k++) {
3143
+ var dot = 0;
3144
+ for(var i = 0; i < v.length; i++) {
3145
+ dot += v[i] * Q[k][i + j];
3146
+ }
3147
+ dot *= 2;
3148
+ for(var i = 0; i < v.length; i++) {
3149
+ Q[k][i + j] -= dot * v[i];
3150
+ }
3151
+ }
3152
+ }
3153
+ return {Q: Q, R: R};
3154
+ },
2575
3155
  zero: function(matr) {
2576
3156
  var result = Chalkboard.matr.new();
2577
3157
  for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
@@ -2672,6 +3252,28 @@ var Chalkboard = {
2672
3252
  }
2673
3253
  return result;
2674
3254
  },
3255
+ concat: function(matr_1, matr_2, type) {
3256
+ type = type || "row";
3257
+ if(type === "row") {
3258
+ if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.rows(matr_2)) {
3259
+ return Chalkboard.matr.new(matr_1.concat(matr_2));
3260
+ } else {
3261
+ return undefined;
3262
+ }
3263
+ } else if(type === "col") {
3264
+ if(Chalkboard.matr.cols(matr_1) === Chalkboard.matr.cols(matr_2)) {
3265
+ var result = Chalkboard.matr.new();
3266
+ for(var i = 0; i < Chalkboard.matr.rows(matr_1); i++) {
3267
+ result.push(matr_1[i].concat(matr_2[i]));
3268
+ }
3269
+ return result;
3270
+ } else {
3271
+ return undefined;
3272
+ }
3273
+ } else {
3274
+ return "TypeError: Parameter \"type\" should be either \"row\" or \"col\".";
3275
+ }
3276
+ },
2675
3277
  add: function(matr_1, matr_2) {
2676
3278
  if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.rows(matr_2) && Chalkboard.matr.cols(matr_1) === Chalkboard.matr.cols(matr_2)) {
2677
3279
  var result = Chalkboard.matr.new();
@@ -2717,6 +3319,29 @@ var Chalkboard = {
2717
3319
  return undefined;
2718
3320
  }
2719
3321
  },
3322
+ mulvec: function(matr, vec) {
3323
+ if(vec.type === "vec2") {
3324
+ if(Chalkboard.matr.rows(matr) === 2) {
3325
+ return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec)), "vec2");
3326
+ } else {
3327
+ return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
3328
+ }
3329
+ } else if(vec.type === "vec3") {
3330
+ if(Chalkboard.matr.rows(matr) === 3) {
3331
+ return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec3.toMatrix(vec)), "vec3");
3332
+ } else {
3333
+ return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
3334
+ }
3335
+ } else if(vec.type === "vec4") {
3336
+ if(Chalkboard.matr.rows(matr) === 4) {
3337
+ return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec4.toMatrix(vec)), "vec4");
3338
+ } else {
3339
+ return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
3340
+ }
3341
+ } else {
3342
+ return "TypeError: Parameter \"vec\" should be \"vec2\", \"vec3\", or \"vec4\".";
3343
+ }
3344
+ },
2720
3345
  pow: function(matr, num) {
2721
3346
  if(Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
2722
3347
  if(Number.isInteger(num) && num >= 0) {
@@ -2736,6 +3361,29 @@ var Chalkboard = {
2736
3361
  return undefined;
2737
3362
  }
2738
3363
  },
3364
+ addKronecker: function(matr_1, matr_2) {
3365
+ if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.cols(matr_1) && Chalkboard.matr.rows(matr_2) === Chalkboard.matr.cols(matr_2)) {
3366
+ return Chalkboard.matr.add(Chalkboard.matr.mulKronecker(matr_1, Chalkboard.matr.identity(Chalkboard.matr.rows(matr_1))), Chalkboard.matr.mulKronecker(Chalkboard.matr.identity(Chalkboard.matr.rows(matr_2)), matr_2));
3367
+ } else {
3368
+ return undefined;
3369
+ }
3370
+ },
3371
+ mulKronecker: function(matr_1, matr_2) {
3372
+ var result = Chalkboard.matr.new();
3373
+ for(var i = 0; i < Chalkboard.matr.rows(matr_1); i++) {
3374
+ for(var j = 0; j < Chalkboard.matr.cols(matr_1); j++) {
3375
+ for(var k = 0; k < Chalkboard.matr.rows(matr_2); k++) {
3376
+ for(var l = 0; l < Chalkboard.matr.cols(matr_2); l++) {
3377
+ if(!result[i * Chalkboard.matr.rows(matr_2) + k]) {
3378
+ result[i * Chalkboard.matr.rows(matr_2) + k] = [];
3379
+ }
3380
+ result[i * Chalkboard.matr.rows(matr_2) + k][j * Chalkboard.matr.cols(matr_2) + l] = matr_1[i][j] * matr_2[k][l];
3381
+ }
3382
+ }
3383
+ }
3384
+ }
3385
+ return result;
3386
+ },
2739
3387
  reduce: function(matr) {
2740
3388
  var lead = 0;
2741
3389
  for(var row = 0; row < Chalkboard.matr.rows(matr); row++) {
@@ -2819,6 +3467,12 @@ var Chalkboard = {
2819
3467
  return "TypeError: Parameter \"vec\" should be \"vec2\", \"vec3\", or \"vec4\".";
2820
3468
  }
2821
3469
  },
3470
+ toTensor: function(matr, size) {
3471
+ if(!Array.isArray(size)) {
3472
+ size = Array.from(arguments).slice(1);
3473
+ }
3474
+ return Chalkboard.tens.resize(matr, size);
3475
+ },
2822
3476
  toArray: function(matr) {
2823
3477
  var result = [];
2824
3478
  for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
@@ -2828,6 +3482,16 @@ var Chalkboard = {
2828
3482
  }
2829
3483
  return result;
2830
3484
  },
3485
+ toObject: function(matr) {
3486
+ var result = {};
3487
+ for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
3488
+ result["i" + (i + 1)] = {};
3489
+ for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
3490
+ result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
3491
+ }
3492
+ }
3493
+ return result;
3494
+ },
2831
3495
  toString: function(matr) {
2832
3496
  var result = "";
2833
3497
  for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
@@ -2839,18 +3503,369 @@ var Chalkboard = {
2839
3503
  }
2840
3504
  return result;
2841
3505
  },
2842
- toObject: function(matr) {
2843
- var result = {};
2844
- for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2845
- result["i" + (i + 1)] = {};
2846
- for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2847
- result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
3506
+ print: function(matr) {
3507
+ console.log(Chalkboard.matr.toString(matr));
3508
+ }
3509
+ },
3510
+ tens: {
3511
+ new: function(tensor) {
3512
+ if(arguments.length === 0) {
3513
+ return [];
3514
+ } else if(arguments.length === 1 && Array.isArray(arguments[0])) {
3515
+ tensor = arguments[0];
3516
+ } else {
3517
+ tensor = Array.from(arguments);
3518
+ }
3519
+ var newNDArray = function(arr) {
3520
+ return arr.map(function(subarr) {
3521
+ if(Array.isArray(subarr)) {
3522
+ return newNDArray(subarr);
3523
+ } else {
3524
+ return subarr;
3525
+ }
3526
+ });
3527
+ };
3528
+ return newNDArray(tensor);
3529
+ },
3530
+ copy: function(tens) {
3531
+ if(Array.isArray(tens)) {
3532
+ var result = Chalkboard.tens.new();
3533
+ for(var i = 0; i < tens.length; i++) {
3534
+ result[i] = Chalkboard.tens.copy(tens[i]);
2848
3535
  }
3536
+ return result;
3537
+ } else {
3538
+ return tens;
2849
3539
  }
3540
+ },
3541
+ rank: function(tens) {
3542
+ if(Array.isArray(tens)) {
3543
+ var result = 0;
3544
+ for(var i = 0; i < tens.length; i++) {
3545
+ result = Math.max(result, Chalkboard.tens.rank(tens[i]));
3546
+ }
3547
+ return result + 1;
3548
+ } else {
3549
+ return 0;
3550
+ }
3551
+ },
3552
+ size: function(tens) {
3553
+ if(Array.isArray(tens)) {
3554
+ var result = [tens.length];
3555
+ if(Array.isArray(tens[0])) {
3556
+ result = result.concat(Chalkboard.tens.size(tens[0]));
3557
+ }
3558
+ return result;
3559
+ } else {
3560
+ return [];
3561
+ }
3562
+ },
3563
+ resize: function(tens, size) {
3564
+ if(!Array.isArray(size)) {
3565
+ size = Array.from(arguments).slice(1);
3566
+ }
3567
+ var result = Chalkboard.tens.fill(0, size);
3568
+ var refill = function(arr1, arr2) {
3569
+ for(var i = 0; i < arr2.length; i++) {
3570
+ if(Array.isArray(arr2[i])) {
3571
+ refill(arr1, arr2[i]);
3572
+ } else {
3573
+ arr2[i] = arr1.length > 0 ? arr1.shift() : 0;
3574
+ }
3575
+ }
3576
+ };
3577
+ refill(Chalkboard.tens.toArray(tens), result);
2850
3578
  return result;
2851
3579
  },
2852
- print: function(matr) {
2853
- console.log(Chalkboard.matr.toString(matr));
3580
+ push: function(tens, rank, index, elements) {
3581
+ if(rank === 0) {
3582
+ tens.splice(index, 0, elements);
3583
+ return tens;
3584
+ } else {
3585
+ for(var i = 0; i < tens.length; i++) {
3586
+ Chalkboard.tens.push(tens[i], rank - 1, index, elements[i]);
3587
+ }
3588
+ return tens;
3589
+ }
3590
+ },
3591
+ pull: function(tens, rank, index) {
3592
+ if(rank === 0) {
3593
+ tens.splice(index, 1);
3594
+ return tens;
3595
+ } else {
3596
+ for(var i = 0; i < tens.length; i++) {
3597
+ Chalkboard.tens.pull(tens[i], rank - 1, index);
3598
+ }
3599
+ return tens;
3600
+ }
3601
+ },
3602
+ fill: function(element, size) {
3603
+ if(!Array.isArray(size)) {
3604
+ size = Array.from(arguments).slice(1);
3605
+ }
3606
+ var newNDArray = function(size) {
3607
+ if(size.length === 0) {
3608
+ return element;
3609
+ }
3610
+ var curr = size[0];
3611
+ var rest = size.slice(1);
3612
+ var result = [];
3613
+ for(var i = 0; i < curr; i++) {
3614
+ result[i] = newNDArray(rest);
3615
+ }
3616
+ return result;
3617
+ }
3618
+ return newNDArray(size);
3619
+ },
3620
+ empty: function(size) {
3621
+ if(!Array.isArray(size)) {
3622
+ size = Array.from(arguments);
3623
+ }
3624
+ var newNDArray = function(size) {
3625
+ if(size.length === 0) {
3626
+ return null;
3627
+ }
3628
+ var curr = size[0];
3629
+ var rest = size.slice(1);
3630
+ var result = [];
3631
+ for(var i = 0; i < curr; i++) {
3632
+ result[i] = newNDArray(rest);
3633
+ }
3634
+ return result;
3635
+ }
3636
+ return newNDArray(size);
3637
+ },
3638
+ random: function(inf, sup, size) {
3639
+ if(!Array.isArray(size)) {
3640
+ size = Array.from(arguments).slice(2);
3641
+ }
3642
+ var newNDArray = function(size) {
3643
+ if(size.length === 0) {
3644
+ return Chalkboard.numb.random(inf, sup);
3645
+ }
3646
+ var curr = size[0];
3647
+ var rest = size.slice(1);
3648
+ var result = [];
3649
+ for(var i = 0; i < curr; i++) {
3650
+ result[i] = newNDArray(rest);
3651
+ }
3652
+ return result;
3653
+ }
3654
+ return newNDArray(size);
3655
+ },
3656
+ contract: function(tens) {
3657
+ if(Chalkboard.tens.rank(tens) > 2) {
3658
+ return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens)[0], Chalkboard.tens.size(tens).slice(1).reduce(function(a, b) { return a * b; }) / Chalkboard.tens.size(tens)[0]);
3659
+ } else if(Chalkboard.tens.rank(tens) === 2) {
3660
+ return Chalkboard.matr.trace(tens);
3661
+ }
3662
+ },
3663
+ transpose: function(tens) {
3664
+ return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens).reverse());
3665
+ },
3666
+ zero: function(tens) {
3667
+ var result = Chalkboard.tens.new();
3668
+ if(Array.isArray(tens)) {
3669
+ for(var i = 0; i < tens.length; i++) {
3670
+ result[i] = Chalkboard.tens.zero(tens[i]);
3671
+ }
3672
+ return result;
3673
+ } else {
3674
+ return 0;
3675
+ }
3676
+ },
3677
+ negate: function(tens) {
3678
+ var result = Chalkboard.tens.new();
3679
+ if(Array.isArray(tens)) {
3680
+ for(var i = 0; i < tens.length; i++) {
3681
+ result[i] = Chalkboard.tens.negate(tens[i]);
3682
+ }
3683
+ return result;
3684
+ } else {
3685
+ return -tens;
3686
+ }
3687
+ },
3688
+ reciprocate: function(tens) {
3689
+ var result = Chalkboard.tens.new();
3690
+ if(Array.isArray(tens)) {
3691
+ for(var i = 0; i < tens.length; i++) {
3692
+ result[i] = Chalkboard.tens.reciprocate(tens[i]);
3693
+ }
3694
+ return result;
3695
+ } else {
3696
+ return 1 / tens;
3697
+ }
3698
+ },
3699
+ absolute: function(tens) {
3700
+ var result = Chalkboard.tens.new();
3701
+ if(Array.isArray(tens)) {
3702
+ for(var i = 0; i < tens.length; i++) {
3703
+ result[i] = Chalkboard.tens.absolute(tens[i]);
3704
+ }
3705
+ return result;
3706
+ } else {
3707
+ return Math.abs(tens);
3708
+ }
3709
+ },
3710
+ round: function(tens) {
3711
+ var result = Chalkboard.tens.new();
3712
+ if(Array.isArray(tens)) {
3713
+ for(var i = 0; i < tens.length; i++) {
3714
+ result[i] = Chalkboard.tens.round(tens[i]);
3715
+ }
3716
+ return result;
3717
+ } else {
3718
+ return Math.round(tens);
3719
+ }
3720
+ },
3721
+ scl: function(tens, num) {
3722
+ var result = Chalkboard.tens.new();
3723
+ if(Array.isArray(tens)) {
3724
+ for(var i = 0; i < tens.length; i++) {
3725
+ result[i] = Chalkboard.tens.scl(tens[i], num);
3726
+ }
3727
+ return result;
3728
+ } else {
3729
+ return tens * num;
3730
+ }
3731
+ },
3732
+ constrain: function(tens, range) {
3733
+ var result = Chalkboard.tens.new();
3734
+ if(Array.isArray(tens)) {
3735
+ for(var i = 0; i < tens.length; i++) {
3736
+ result[i] = Chalkboard.tens.constrain(tens[i], range);
3737
+ }
3738
+ return result;
3739
+ } else {
3740
+ return Chalkboard.numb.constrain(tens, range);
3741
+ }
3742
+ },
3743
+ concat: function(tens_1, tens_2, rank) {
3744
+ rank = rank || 1;
3745
+ var concatAtRank = function(arr1, arr2, currentRank) {
3746
+ if(currentRank === rank) {
3747
+ return Chalkboard.tens.new(arr1.concat(arr2));
3748
+ }
3749
+ return arr1.map(function(element, index) {
3750
+ return concatAtRank(element, arr2[index], currentRank);
3751
+ });
3752
+ }
3753
+ return concatAtRank(tens_1, tens_2, 1);
3754
+ },
3755
+ add: function(tens_1, tens_2) {
3756
+ var result = Chalkboard.tens.new();
3757
+ if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
3758
+ for(var i = 0; i < Math.max(tens_1.length, tens_2.length); i++) {
3759
+ result[i] = Chalkboard.tens.add(tens_1[i] !== undefined ? tens_1[i] : 0, tens_2[i] !== undefined ? tens_2[i] : 0);
3760
+ }
3761
+ return result;
3762
+ } else {
3763
+ return tens_1 + tens_2;
3764
+ }
3765
+ },
3766
+ sub: function(tens_1, tens_2) {
3767
+ var result = Chalkboard.tens.new();
3768
+ if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
3769
+ for(var i = 0; i < Math.max(tens_1.length, tens_2.length); i++) {
3770
+ result[i] = Chalkboard.tens.sub(tens_1[i] !== undefined ? tens_1[i] : 0, tens_2[i] !== undefined ? tens_2[i] : 0);
3771
+ }
3772
+ return result;
3773
+ } else {
3774
+ return tens_1 - tens_2;
3775
+ }
3776
+ },
3777
+ mul: function(tens_1, tens_2) {
3778
+ var result = Chalkboard.tens.new();
3779
+ if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
3780
+ for(var i = 0; i < tens_1.length; i++) {
3781
+ var subarr = Chalkboard.tens.new();
3782
+ for(var j = 0; j < tens_2.length; j++) {
3783
+ subarr[j] = Chalkboard.tens.mul(tens_1[i], tens_2[j]);
3784
+ }
3785
+ result.push(subarr);
3786
+ }
3787
+ return result;
3788
+ } else {
3789
+ return tens_1 * tens_2;
3790
+ }
3791
+ },
3792
+ toVector: function(tens, type, index) {
3793
+ if(index === undefined) { index = 0; }
3794
+ var arr = Chalkboard.tens.toArray(tens);
3795
+ if(type === "vec2") {
3796
+ return Chalkboard.vec2.new(arr[index], arr[index + 1]);
3797
+ } else if(type === "vec3") {
3798
+ return Chalkboard.vec3.new(arr[index], arr[index + 1], arr[index + 2]);
3799
+ } else if(type === "vec4") {
3800
+ return Chalkboard.vec4.new(arr[index], arr[index + 1], arr[index + 2], arr[index + 3]);
3801
+ } else {
3802
+ return "TypeError: Parameter \"type\" should be \"vec2\", \"vec3\", or \"vec4\".";
3803
+ }
3804
+ },
3805
+ toMatrix: function(tens) {
3806
+ var result = Chalkboard.matr.new();
3807
+ var flatten = function(tens, result) {
3808
+ for(var i = 0; i < tens.length; i++) {
3809
+ if(Array.isArray(tens[i])) {
3810
+ flatten(tens[i], result);
3811
+ } else {
3812
+ result.push(tens[i]);
3813
+ }
3814
+ }
3815
+ }
3816
+ var matr = Chalkboard.matr.new();
3817
+ flatten(tens, matr);
3818
+ var rows = tens.length || 1;
3819
+ for(var j = 0; j < rows; j++) {
3820
+ result.push(matr.slice(j * matr.length / rows, (j + 1) * matr.length / rows));
3821
+ }
3822
+ return result;
3823
+ },
3824
+ toArray: function(tens) {
3825
+ var result = [];
3826
+ var flatten = function(tens) {
3827
+ for(var i = 0; i < tens.length; i++) {
3828
+ if(Array.isArray(tens[i])) {
3829
+ flatten(tens[i]);
3830
+ } else {
3831
+ result.push(tens[i]);
3832
+ }
3833
+ }
3834
+ }
3835
+ flatten(tens);
3836
+ return result;
3837
+ },
3838
+ toObject: function(tens) {
3839
+ if(Array.isArray(tens)) {
3840
+ var result = {};
3841
+ for(var i = 0; i < tens.length; i++) {
3842
+ result["_" + (i + 1)] = Chalkboard.tens.toObject(tens[i]);
3843
+ }
3844
+ return result;
3845
+ } else {
3846
+ return tens;
3847
+ }
3848
+ },
3849
+ toString: function(tens, indentation) {
3850
+ if(indentation === undefined) { indentation = 0; }
3851
+ if(Array.isArray(tens[0])) {
3852
+ var result = "\t".repeat(indentation) + "[\n";
3853
+ for(var i = 0; i < tens.length; i++) {
3854
+ result += Chalkboard.tens.toString(tens[i], indentation + 1);
3855
+ }
3856
+ result += "\t".repeat(indentation) + "]\n";
3857
+ return result;
3858
+ } else {
3859
+ var result = "\t".repeat(indentation) + "[ ";
3860
+ for(var i = 0; i < tens.length; i++) {
3861
+ result += tens[i].toString() + " ";
3862
+ }
3863
+ result += "]\n";
3864
+ return result;
3865
+ }
3866
+ },
3867
+ print: function(tens) {
3868
+ return console.log(Chalkboard.tens.toString(tens));
2854
3869
  }
2855
3870
  },
2856
3871
  calc: {
@@ -2888,6 +3903,9 @@ var Chalkboard = {
2888
3903
  if(func.type === "expl") {
2889
3904
  var f = Chalkboard.real.parse("x => " + func.definition);
2890
3905
  return (f(val + h) - f(val)) / h;
3906
+ } else if(func.type === "inve") {
3907
+ var f = Chalkboard.real.parse("y => " + func.definition);
3908
+ return (f(val + h) - f(val)) / h;
2891
3909
  } else if(func.type === "pola") {
2892
3910
  var r = Chalkboard.real.parse("O => " + func.definition);
2893
3911
  return (r(val + h) - r(val)) / h;
@@ -2903,7 +3921,7 @@ var Chalkboard = {
2903
3921
  return Chalkboard.vec3.new((x(val + h) - x(val)) / h, (y(val + h) - y(val)) / h, (z(val + h) - z(val)) / h);
2904
3922
  }
2905
3923
  } else {
2906
- return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
3924
+ return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
2907
3925
  }
2908
3926
  },
2909
3927
  d2fdx2: function(func, val) {
@@ -2911,6 +3929,9 @@ var Chalkboard = {
2911
3929
  if(func.type === "expl") {
2912
3930
  var f = Chalkboard.real.parse("x => " + func.definition);
2913
3931
  return (f(val + h) - 2 * f(val) + f(val - h)) / (h * h);
3932
+ } else if(func.type === "inve") {
3933
+ var f = Chalkboard.real.parse("y => " + func.definition);
3934
+ return (f(val + h) - 2 * f(val) + f(val - h)) / (h * h);
2914
3935
  } else if(func.type === "pola") {
2915
3936
  var r = Chalkboard.real.parse("O => " + func.definition);
2916
3937
  return (r(val + h) - 2 * r(val) + r(val - h)) / (h * h);
@@ -2926,7 +3947,7 @@ var Chalkboard = {
2926
3947
  return Chalkboard.vec3.new((x(val + h) - 2 * x(val) + x(val - h)) / (h * h), (y(val + h) - 2 * y(val) + y(val - h)) / (h * h), (z(val + h) - 2 * z(val) + z(val - h)) / (h * h));
2927
3948
  }
2928
3949
  } else {
2929
- return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
3950
+ return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
2930
3951
  }
2931
3952
  },
2932
3953
  tangent: function(func, val) {
@@ -3181,7 +4202,7 @@ var Chalkboard = {
3181
4202
  return "TypeError: Parameter \"func\" must be of type \"comp\".";
3182
4203
  }
3183
4204
  },
3184
- df2dz2: function(func, comp) {
4205
+ d2fdz2: function(func, comp) {
3185
4206
  var h = 0.00001;
3186
4207
  if(func.type === "comp") {
3187
4208
  var u = Chalkboard.comp.parse("(a, b) => " + func.definition[0]),
@@ -3195,59 +4216,61 @@ var Chalkboard = {
3195
4216
  return "TypeError: Parameter \"func\" must be of type \"comp\".";
3196
4217
  }
3197
4218
  },
3198
- fxdx: function(func, a, b) {
3199
- if(func.type === "expl" || func.type === "pola") {
4219
+ fxdx: function(func, inf, sup) {
4220
+ if(func.type === "expl" || func.type === "inve" || func.type === "pola") {
3200
4221
  var f;
3201
4222
  if(func.type === "expl") {
3202
4223
  f = Chalkboard.real.parse("x => " + func.definition);
4224
+ } else if(func.type === "inve") {
4225
+ f = Chalkboard.real.parse("y => " + func.definition);
3203
4226
  } else if(func.type === "pola") {
3204
4227
  f = Chalkboard.real.parse("O => " + "((" + func.definition + ") * (" + func.definition + ")) / 2");
3205
4228
  }
3206
- var fx = f(a) + f(b);
3207
- var dx = (b - a) / 1000000;
4229
+ var fx = f(inf) + f(sup);
4230
+ var dx = (sup - inf) / 1000000;
3208
4231
  for(var i = 1; i < 1000000; i++) {
3209
- fx += i % 2 === 0 ? 2 * f(a + i * dx) : 4 * f(a + i * dx);
4232
+ fx += i % 2 === 0 ? 2 * f(inf + i * dx) : 4 * f(inf + i * dx);
3210
4233
  }
3211
4234
  return (fx * dx) / 3;
3212
4235
  } else if(func.type === "curv") {
3213
4236
  if(func.definition.length === 2) {
3214
4237
  var x = Chalkboard.real.parse("t => " + func.definition[0]),
3215
4238
  y = Chalkboard.real.parse("t => " + func.definition[1]);
3216
- var xt = x(a) + x(b),
3217
- yt = y(a) + y(b);
3218
- var dt = (b - a) / 1000000;
4239
+ var xt = x(inf) + x(sup),
4240
+ yt = y(inf) + y(sup);
4241
+ var dt = (sup - inf) / 1000000;
3219
4242
  for(var i = 1; i < 1000000; i++) {
3220
- xt += i % 2 === 0 ? 2 * x(a + i * dt) : 4 * x(a + i * dt);
3221
- yt += i % 2 === 0 ? 2 * y(a + i * dt) : 4 * y(a + i * dt);
4243
+ xt += i % 2 === 0 ? 2 * x(inf + i * dt) : 4 * x(inf + i * dt);
4244
+ yt += i % 2 === 0 ? 2 * y(sup + i * dt) : 4 * y(sup + i * dt);
3222
4245
  }
3223
4246
  return Chalkboard.vec2.new((xt * dt) / 3, (yt * dt) / 3);
3224
4247
  } else if(func.definition.length === 3) {
3225
4248
  var x = Chalkboard.real.parse("t => " + func.definition[0]),
3226
4249
  y = Chalkboard.real.parse("t => " + func.definition[1]),
3227
4250
  z = Chalkboard.real.parse("t => " + func.definition[2]);
3228
- var xt = x(a) + x(b),
3229
- yt = y(a) + y(b),
3230
- zt = z(a) + z(b);
3231
- var dt = (b - a) / 1000000;
4251
+ var xt = x(inf) + x(sup),
4252
+ yt = y(inf) + y(sup),
4253
+ zt = z(inf) + z(sup);
4254
+ var dt = (sup - inf) / 1000000;
3232
4255
  for(var i = 1; i < 1000000; i++) {
3233
- xt += i % 2 === 0 ? 2 * x(a + i * dt) : 4 * x(a + i * dt);
3234
- yt += i % 2 === 0 ? 2 * y(a + i * dt) : 4 * y(a + i * dt);
3235
- zt += i % 2 === 0 ? 2 * z(a + i * dt) : 4 * z(a + i * dt);
4256
+ xt += i % 2 === 0 ? 2 * x(inf + i * dt) : 4 * x(inf + i * dt);
4257
+ yt += i % 2 === 0 ? 2 * y(inf + i * dt) : 4 * y(inf + i * dt);
4258
+ zt += i % 2 === 0 ? 2 * z(inf + i * dt) : 4 * z(inf + i * dt);
3236
4259
  }
3237
4260
  return Chalkboard.vec3.new((xt * dt) / 3, (yt * dt) / 3, (zt * dt) / 3);
3238
4261
  }
3239
4262
  } else {
3240
- return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
4263
+ return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
3241
4264
  }
3242
4265
  },
3243
- fxydxdy: function(func, a, b, c, d) {
4266
+ fxydxdy: function(func, xinf, xsup, yinf, ysup) {
3244
4267
  if(func.type === "mult") {
3245
4268
  var f = Chalkboard.real.parse("(x, y) => " + func.definition);
3246
4269
  var result = 0;
3247
- var dx = (b - a) / 10000,
3248
- dy = (d - c) / 10000;
3249
- for(var x = a; x <= b; x += dx) {
3250
- for(var y = c; y <= d; y += dy) {
4270
+ var dx = (xsup - xinf) / 10000,
4271
+ dy = (ysup - yinf) / 10000;
4272
+ for(var x = xinf; x <= xsup; x += dx) {
4273
+ for(var y = yinf; y <= ysup; y += dy) {
3251
4274
  result += f(x, y);
3252
4275
  }
3253
4276
  }
@@ -3256,29 +4279,29 @@ var Chalkboard = {
3256
4279
  return "TypeError: Parameter \"func\" must be of type \"mult\".";
3257
4280
  }
3258
4281
  },
3259
- fds: function(func, a, b, c, d) {
4282
+ fds: function(func, tinf, tsup, sinf, ssup) {
3260
4283
  var result = 0;
3261
4284
  var drdt, drds;
3262
4285
  if(func.type === "curv") {
3263
- var dt = (b - a) / 10000;
4286
+ var dt = (tsup - tinf) / 10000;
3264
4287
  if(func.definition.length === 2) {
3265
- for(var t = a; t <= b; t += dt) {
4288
+ for(var t = tinf; t <= tsup; t += dt) {
3266
4289
  drdt = Chalkboard.calc.dfdx(func, t);
3267
4290
  result += Chalkboard.vec2.mag(drdt);
3268
4291
  }
3269
4292
  return result * dt;
3270
4293
  } else if(func.definition.length === 3) {
3271
- for(var t = a; t <= b; t += dt) {
4294
+ for(var t = tinf; t <= tsup; t += dt) {
3272
4295
  drdt = Chalkboard.calc.dfdx(func, t);
3273
4296
  result += Chalkboard.vec3.mag(drdt);
3274
4297
  }
3275
4298
  return result * dt;
3276
4299
  }
3277
4300
  } else if(func.type === "surf") {
3278
- var dt = (b - a) / 100,
3279
- ds = (d - c) / 100;
3280
- for(var s = c; s <= d; s += ds) {
3281
- for(var t = a; t <= b; t += dt) {
4301
+ var dt = (tsup - tinf) / 100,
4302
+ ds = (ssup - sinf) / 100;
4303
+ for(var s = sinf; s <= ssup; s += ds) {
4304
+ for(var t = tinf; t <= tsup; t += dt) {
3282
4305
  drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 1);
3283
4306
  drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 2);
3284
4307
  result += Chalkboard.vec3.mag(Chalkboard.vec3.cross(drds, drdt));
@@ -3289,22 +4312,22 @@ var Chalkboard = {
3289
4312
  return "TypeError: Parameter \"func\" must be of type \"curv\" or \"surf\".";
3290
4313
  }
3291
4314
  },
3292
- frds: function(funcORvecfield, func, a, b) {
4315
+ frds: function(funcORvecfield, func, inf, sup) {
3293
4316
  if(func.type === "curv") {
3294
4317
  var result = 0;
3295
- var dt = (b - a) / 10000;
4318
+ var dt = (sup - inf) / 10000;
3296
4319
  if(funcORvecfield.type === "mult") {
3297
- for(var t = a; t <= b; t += dt) {
3298
- result += Chalkboard.real.val(funcORvecfield, Chalkboard.vec2.toArray(Chalkboard.real.val(func, t))) * Chalkboard.vec2.mag(Chalkboard.calc.dfdx(func, t));
4320
+ for(var t = inf; t <= sup; t += dt) {
4321
+ result += Chalkboard.real.val(funcORvecfield, Chalkboard.real.val(func, t)) * Chalkboard.vec2.mag(Chalkboard.calc.dfdx(func, t));
3299
4322
  }
3300
4323
  return result * dt;
3301
4324
  } else if(funcORvecfield.type === "vec2field") {
3302
- for(var t = a; t <= b; t += dt) {
4325
+ for(var t = inf; t <= sup; t += dt) {
3303
4326
  result += Chalkboard.vec2.dot(Chalkboard.vec2.fromField(funcORvecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.dfdx(func, t));
3304
4327
  }
3305
4328
  return result * dt;
3306
4329
  } else if(funcORvecfield.type === "vec3field") {
3307
- for(var t = a; t <= b; t += dt) {
4330
+ for(var t = inf; t <= sup; t += dt) {
3308
4331
  result += Chalkboard.vec3.dot(Chalkboard.vec3.fromField(funcORvecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.dfdx(func, t));
3309
4332
  }
3310
4333
  return result * dt;
@@ -3315,29 +4338,29 @@ var Chalkboard = {
3315
4338
  return "TypeError: Parameter \"func\" must be of type \"curv\".";
3316
4339
  }
3317
4340
  },
3318
- fnds: function(vecfield, func, a, b, c, d) {
4341
+ fnds: function(vecfield, func, tinf, tsup, sinf, ssup) {
3319
4342
  var result = 0;
3320
4343
  var drdt, drds;
3321
4344
  if(func.type === "curv") {
3322
- var dt = (b - a) / 10000;
4345
+ var dt = (tsup - tinf) / 10000;
3323
4346
  if(func.definition.length === 2) {
3324
- for(var t = a; t <= b; t += dt) {
4347
+ for(var t = tinf; t <= tsup; t += dt) {
3325
4348
  drdt = Chalkboard.calc.dfdx(func, t);
3326
4349
  result += Chalkboard.vec2.dot(Chalkboard.vec2.fromField(vecfield, Chalkboard.real.val(func, t)), Chalkboard.vec2.new(-drdt.y, drdt.x)) * Chalkboard.vec2.mag(drdt);
3327
4350
  }
3328
4351
  return result * dt;
3329
4352
  } else if(func.definition.length === 3) {
3330
- for(var t = a; t <= b; t += dt) {
4353
+ for(var t = tinf; t <= tsup; t += dt) {
3331
4354
  drdt = Chalkboard.calc.dfdx(func, t);
3332
4355
  result += Chalkboard.vec3.dot(Chalkboard.vec3.fromField(vecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.normal(func, t)) * Chalkboard.vec3.mag(drdt);
3333
4356
  }
3334
4357
  return result * dt;
3335
4358
  }
3336
4359
  } else if(func.type === "surf") {
3337
- var dt = (b - a) / 100,
3338
- ds = (d - c) / 100;
3339
- for(var s = c; s <= d; s += ds) {
3340
- for(var t = a; t <= b; t += dt) {
4360
+ var dt = (tsup - tinf) / 100,
4361
+ ds = (ssup - sinf) / 100;
4362
+ for(var s = sinf; s <= ssup; s += ds) {
4363
+ for(var t = tinf; t <= tsup; t += dt) {
3341
4364
  drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 1);
3342
4365
  drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 2);
3343
4366
  result += Chalkboard.vec3.scalarTriple(Chalkboard.vec3.fromField(vecfield, Chalkboard.real.val(func, Chalkboard.vec2.new(s, t))), drds, drdt);
@@ -3348,12 +4371,12 @@ var Chalkboard = {
3348
4371
  return "TypeError: Parameter \"func\" must be of type \"curv\" or \"surf\".";
3349
4372
  }
3350
4373
  },
3351
- fzdz: function(func_1, func_2, a, b) {
4374
+ fzdz: function(func_1, func_2, inf, sup) {
3352
4375
  if(func_1.type === "comp") {
3353
4376
  if(func_2.type === "curv") {
3354
4377
  var result = Chalkboard.comp.new(0, 0);
3355
- var dt = (b - a) / 10000;
3356
- for(var t = a; t <= b; t += dt) {
4378
+ var dt = (sup - inf) / 10000;
4379
+ for(var t = inf; t <= sup; t += dt) {
3357
4380
  var fz = Chalkboard.comp.val(func_1, Chalkboard.vec2.toComplex(Chalkboard.real.val(func_2, t)));
3358
4381
  var rt = Chalkboard.calc.dfdx(func_2, t);
3359
4382
  result = Chalkboard.comp.add(result, Chalkboard.comp.new((fz.a * rt.x) - (fz.b * rt.y), (fz.b * rt.x) + (fz.a * rt.y)));