146 lines
3.4 KiB
JavaScript
146 lines
3.4 KiB
JavaScript
|
|
|||
|
// Broadcast array on array
|
|||
|
export function bAr(fun,ar1,ar2) {
|
|||
|
var result = new Array(ar1.length)
|
|||
|
for (var i = 0;i<ar1.length;i++) {
|
|||
|
result[i] = fun(ar1[i],ar2[i])
|
|||
|
}
|
|||
|
return(result)
|
|||
|
}
|
|||
|
|
|||
|
// Broadcast array on a number
|
|||
|
export function b(fun,ar1,val) {
|
|||
|
var result = new Array(ar1.length)
|
|||
|
for (var i = 0;i<ar1.length;i++) {
|
|||
|
result[i] = fun(ar1[i],val)
|
|||
|
}
|
|||
|
return(result)
|
|||
|
}
|
|||
|
|
|||
|
// Broadcast array on a function
|
|||
|
export function bFun(fun,ar1) {
|
|||
|
var result = new Array(ar1.length)
|
|||
|
for (var i = 0;i<ar1.length;i++) {
|
|||
|
result[i] = fun(ar1[i])
|
|||
|
}
|
|||
|
return(result)
|
|||
|
}
|
|||
|
|
|||
|
export function multiply(num1, num2) {
|
|||
|
let result = num1 * num2;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
export function sum(ar) {
|
|||
|
return ar.reduce((a, b) => a + b, 0)
|
|||
|
}
|
|||
|
|
|||
|
export function prod(ar) {
|
|||
|
return ar.reduce((a, b) => a * b, 1)
|
|||
|
}
|
|||
|
|
|||
|
export function mean(ar) {
|
|||
|
return ar.reduce((a, b) => a + b, 0)/ar.length
|
|||
|
}
|
|||
|
|
|||
|
export function median(values){
|
|||
|
if(values.length ===0) throw new Error("No inputs");
|
|||
|
|
|||
|
values.sort(function(a,b){
|
|||
|
return a-b;
|
|||
|
});
|
|||
|
|
|||
|
var half = Math.floor(values.length / 2);
|
|||
|
|
|||
|
if (values.length % 2)
|
|||
|
return values[half];
|
|||
|
|
|||
|
return (values[half - 1] + values[half]) / 2.0;
|
|||
|
}
|
|||
|
|
|||
|
export function range(start,end, step = start<end ? 1 : -1) {
|
|||
|
var arr = []
|
|||
|
if (step>0) {
|
|||
|
for (var i = start; i <= end; i += step) {
|
|||
|
arr.push(i)
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
for (var i = start; i >= end; i += step) {
|
|||
|
arr.push(i)
|
|||
|
}
|
|||
|
}
|
|||
|
return arr
|
|||
|
}
|
|||
|
|
|||
|
export function numericallyIntegrate(f, a, b, dx) {
|
|||
|
|
|||
|
// calculate the number of trapezoids
|
|||
|
let n = (b - a) / dx
|
|||
|
|
|||
|
// define the variable for area
|
|||
|
let Area = 0
|
|||
|
|
|||
|
//loop to calculate the area of each trapezoid and sum.
|
|||
|
for (let i = 1; i <= n; i++) {
|
|||
|
//the x locations of the left and right side of each trapezpoid
|
|||
|
let x0 = a + (i-1)*dx
|
|||
|
let x1 = a + i*dx
|
|||
|
|
|||
|
// the area of each trapezoid
|
|||
|
let Ai = dx * (f(x0) + f(x1))/ 2.
|
|||
|
|
|||
|
// cumulatively sum the areas
|
|||
|
Area = Area + Ai
|
|||
|
|
|||
|
}
|
|||
|
return Area
|
|||
|
}
|
|||
|
|
|||
|
const randomNormals = () => {
|
|||
|
let u1 = 0, u2 = 0;
|
|||
|
//Convert [0,1) to (0,1)
|
|||
|
while (u1 === 0) u1 = Math.random();
|
|||
|
while (u2 === 0) u2 = Math.random();
|
|||
|
const R = Math.sqrt(-2.0 * Math.log(u1));
|
|||
|
const Θ = 2.0 * Math.PI * u2;
|
|||
|
return [R * Math.cos(Θ), R * Math.sin(Θ)];
|
|||
|
};
|
|||
|
|
|||
|
export function randomSkewNormal(ξ, ω, α = 0) {
|
|||
|
const [u0, v] = randomNormals();
|
|||
|
if (α === 0) {
|
|||
|
return ξ + ω * u0;
|
|||
|
}
|
|||
|
const 𝛿 = α / Math.sqrt(1 + α * α);
|
|||
|
const u1 = 𝛿 * u0 + Math.sqrt(1 - 𝛿 * 𝛿) * v;
|
|||
|
const z = u0 >= 0 ? u1 : -u1;
|
|||
|
return ξ + ω * z;
|
|||
|
};
|
|||
|
|
|||
|
export function percentile(arr, p) {
|
|||
|
arr.sort(function(a,b){
|
|||
|
return a-b;
|
|||
|
});
|
|||
|
if (arr.length === 0) return 0;
|
|||
|
if (typeof p !== 'number') throw new TypeError('p must be a number');
|
|||
|
if (p <= 0) return arr[0];
|
|||
|
if (p >= 1) return arr[arr.length - 1];
|
|||
|
|
|||
|
var index = (arr.length - 1) * p,
|
|||
|
lower = Math.floor(index),
|
|||
|
upper = lower + 1,
|
|||
|
weight = index % 1;
|
|||
|
|
|||
|
if (upper >= arr.length) return arr[lower];
|
|||
|
return arr[lower] * (1 - weight) + arr[upper] * weight;
|
|||
|
}
|
|||
|
|
|||
|
export function smooth(ar,window) {
|
|||
|
let windowHalf = window/2
|
|||
|
let windowHalf1 = Math.floor(windowHalf)
|
|||
|
let windowHalf2 = Math.ceil(windowHalf)
|
|||
|
for (let i=windowHalf1;i<ar.length-windowHalf2;i++) {
|
|||
|
ar[i] = mean(ar.slice(i-windowHalf1,i+windowHalf2))
|
|||
|
}
|
|||
|
}
|