Skip to content

Studio 11

Studio Worksheets

  1. Studio 11 Worksheet
  2. Studio 11 In-class Worksheet

Stream Formulations 🌊

inverse_stream

function inverse_stream(s) {
  // Alternatives:
  // stream_map(x => 1 / x, s);
  return is_null(s)
    ? null
    : pair(1 / head(s), () => inverse_stream(stream_tail(s)));
}

zip_stream

function zip_streams(s1, s2) {
  return is_null(s1)
    ? s2
    : is_null(s2)
    ? s1
    : pair(head(s1), () => zip_streams(s2, stream_tail(s1)));
}

factorial_stream

const factorial_stream = pair(1, () =>
  mul_streams(factorial_stream, integers_from(1))
);

sum_stream

function sum_stream(s) {
  const result_stream = pair(head(s), () =>
    add_streams(result_stream, stream_tail(s))
  );
  return result_stream;
}

Returns a stream where it represents the cumulative sum of the original stream

create_power_series

function create_power_series(x, series) {
  return mul_streams(series, pow_stream(x, integers_from(0)));
}

// 1 + 2(2)+ 2(2^2) + 2(2^3) + ...
create_power_series(2, integers_from(1));

e^x

const ex_coeff_stream = inverse_stream(factorial_stream);
const ex_approx_stream = (x) => create_power_series(x, ex_coeff_stream);

// Returns a stream of the approx value of e^2
// e^2 = 7.38905609893
// sum_stream: list(1, 3, 5, 6.333333333333333, 7, 7.266666666666667, 7.355555555555555 ...
sum_stream(ex_approx_stream(2));

cos(x)

const cos_coeff_stream = mul_streams(
  inverse_stream(factorial_stream),
  zip_streams(alt_ones, zeros)
);
const cos_approx_stream = (x) => create_power_series(x, cos_coeff_stream);

// Returns a stream of the approx value of cos(pi/6)
// cos(pi/6) = 3^0.5 / 2
// sum_stream: list(1, 1, 0.8629221610959812, 0.8629221610959812, 0.8660538834157472 ...
sum_stream(cos_approx_stream(math_PI / 6));

sin(x)

const sin_coeff_stream = mul_streams(
  inverse_stream(factorial_stream),
  zip_streams(zeros, alt_ones)
);
const sin_approx_stream = (x) => create_power_series(x, sin_coeff_stream);

// Returns a stream of the approx value of sin(pi/6)
// sin(pi/6) = 1/2
// sum_stream: list(0, 0.5235987755982988, 0.5235987755982988, 0.49967417939436376, 0.49967417939436376 ...
sum_stream(sin_approx_stream(math_PI / 6));