The following Examples document was written using Calca. It demonstrates a lot of Calca's capabilities including its rich support for Markdown to annotate calculations.

Examples

Finance

Fixed-rate Mortgage

I'm looking to buy a house. Here in Seattle, you can buy a condo for about `\$250,000`, or you can splurge to get a house on a bit of land for `\$350,000`. Let's splurge...

``````price = \$350,000
down payment = 20% * price => \$70,000
finance amount
= price - down payment
=> \$280,000

interest rate = 3.7%/year
term = 30year

n = term * 12/year => 360
r = interest rate / (12/year) => 0.0031

monthly payment
= r/(1 - (1 + r)^(-n)) * finance amount
=> \$1,288.7924
``````

Looks like if I don't mind dropping `\$70,000`, I can get a nice place for about `\$1,300` a month.

Try editing the price and interest rate to see how much your dream home will cost.

Budget

Here is my budget, how is yours different? Just change any of the numbers to match your life.

``````expenses = rent + car + office + other

rent    = \$750 + utils
utils   = \$200
car     = \$400
office  = \$1,300 + parking
parking = \$120
other   = \$1200

expenses => \$3,970

daily expenses
=  expenses/30day
=> \$132.3333/day
``````

Now let's look at my income. I have a job and do a little gambling on the side:

``````income = (job + gambling) * (100% - income tax rate)

income tax rate = 33%

job = \$100,000/12 => \$8,333.3333
gambling = -\$100

daily income
= income / 30day
=> \$183.8778/day
``````

Let's see how profitable each day has been:

``````daily profit
=  daily income - daily expenses
=> \$51.5444/day
``````

Wow, I'm making money every day. Great! I wonder how long until I'm a millionaire?

``````time til millionaire
=  \$1,000,000/(daily profit * 365day/years)
=> 53.1527years
``````

That's too long... What if I made more money?

``````time til millionaire(job =  \$8,000) => 62.1253years
time til millionaire(job = \$16,000) => 12.2986years
time til millionaire(job = \$32,000) => 4.7229years
time til millionaire(job = \$64,000) => 2.116years
time til millionaire(job =\$128,000) => 1.0057years
``````

So, if I just make `\$128,000` per month, I will be a millionaire in just over a year! Time to start looking!

Mathematics

Pythagorean Theorem

The square of the hypotenuse of a triangle is equal to the sum of the squares of its legs.

``````a^2 + b^2 = c^2
``````

Let's imagine that to get to work I have to drive `5miles` north then `8miles` east to get to work. How far is it as the crow flies?

``````c(a=5miles, b=8miles) => 9.434miles
``````

Arithmetic using Logarithms

Back before Calca, scientists and engineers had to do math using long hand. This is easy enough, but gets quite tedious. Thankfully we have computers now.

These engineers and scientists used a mathematical identity to make their jobs easier.

``````log(x*y, b) => log(x, b) + log(y, b)
log(x/y, b) => log(x, b) - log(y, b)
``````

When they needed to multiply large complicated numbers, they were smart and kept those numbers in the logarithm form. Then they could simply add those numbers. The same trick worked for multiplication.

Let's look at an example. I want to find volume of the earth.

``````volume = 4/3*pi * r^3 => 4.1888r^3

r = 6,378,100
``````

I need to multiple a lot of numbers, `4.18888` and `r` three times to find the volume. Instead we'll use logarithms and addition:

``````log c = log10(4/3*pi) => 0.6221
log r = log10(r)      => 6.8047

log volume = log c + log r + log r + log r => 21.0362

10^log volume => 10.8683e20

volume => 10.8683e20
``````

We were able to calculate `4/3*pi * r^3` using just three additions. Pretty impressive I think!

Solving linear equations using matrices

You can use matrices to solve a set of linear equations. Let's solve the following set of equations:

``````12x + 13y = 163
-2x + 100y = 688
``````

We can solve for x and y by taking the constants on the left hand side and putting them in a matrix:

``````a = [12, 13; -2, 100]
``````

and by putting the right hand side into a vector:

``````b = [163; 688]
``````

Now we can convert our two equations into one and solve for x and y:

``````a * xy = b

xy => [6; 7]
``````

Great! We now know `x = 6` and `y = 7`. We can even solve other linear equations:

``````xy(a=[1,2;3,4],b=[3;2]) => [-4; 3.5]
``````

Imaginary Numbers

Imaginary numbers are written as numbers multiplied by the imaginary unit `i`.

``````5i
``````

They are defined by the property that their squares are negative.

``````i^2 => -1
(5i)^2 => -25

sqrt(-1) => i
sqrt(-16) => 4i
sqrt(i) => 0.7071i + 0.7071
``````

A complex number is an imaginary number added to another number:

``````b*i + a => b*i + a
5i - 1 => 5i - 1
-8i + 100 => -8i + 100
``````

The complex conjugate negates the imaginary part of a complex number:

``````conj(5i - 1) => -5i - 1
conj(-8i + 100) => 8i + 100
``````

You can extract the real and imaginary parts of a complex number using these very clever functions:

``````im(z) = 1/2i*(z - conj(z))
re(z) = 1/2*(z + conj(z))

im(-8i + 100) => -8
re(-8i + 100) => 100
``````

Information Theory

Normal Distribution

The normal distribution gives the probability of a value `x` occurring based on an average of all possible values called the `mean` and a standard deviation `stddev` of those values around that mean.

``````f(x) = 1/(stddev*sqrt(2*pi)) *
e^-((x-mean)^2/(2*stddev^2))

f(90, mean=100, stddev=10) => 0.0242
f(100, mean=100, stddev=10) => 0.0399
f(110, mean=100, stddev=10) => 0.0242
``````

Let's look at some data to model. Here is my population in Seattle of people's ages (not really):

``````ages = [28, 45, 30, 40, 34, 30, 24]
n = sum(1, ages) => 7

mean = reduce(x + y, ages)/n => 33

stddev = sqrt(sum((a - mean)^2, ages)/n) => 6.7401
``````

This means that `68%` (one standard deviation) of people in Seattle are `33` years old, plus or minus about `7` years.

So what's the probability on an 18 year old living in Seattle?

``````population of seattle = 620,778 #googled

population given age = f(age) * population of seattle

population given age(18) => 3,088.0792
population given age(30) => 33,278.3747
``````

Hmm, there are only `3,000` 18 year olds in Seattle - given my completely made up statistics above.

Why not modify those stats to match your home town?

Shannon's Entropy

Entropy of a variable is a measure of the uncertainty of its value.

``````H(X) = -sum(p(x)*ln(p(x)), x=X)
``````

This function takes a set of values or messages `X` and produces the entropy of that set. To do this, it needs to know the probability of a message being in `X`; this information is provided by the `p` function.

The `p` function must sum to `1` for all the possible messages.

``````data = [A, B, C]

# Maximum entropy
pmax(x) = 1/3
sum(pmax, data) => 1

# NOT a good value of p because it sums to 0.75

# Here is a modeled p function
pmodel(x) = if x == B then 0.6 else 0.2
sum(pmodel, data) => 1
``````

We can now calculate the entropy of the data given the various probabilities of messages:

``````H(data, p = pmax) => 1.0986

H(data, p = pmodel) => 0.9657
``````

When the messages are most uncertain - they each have the same probability - the entropy is maxed out at about `1.1`. If we make the number `11` most probable - `60%` likelihood - then the entropy is only `0.95`.

If we designate one of the messages as very likely to occur then the entropy should go down since there is very little uncertainty.

``````# Here is a modeled p function
pcertain(x) = if x == B then 0.9999 else 0.00005
sum(pcertain, data) => 1

H(data, p = pcertain) => 0.00149
``````

Yep! H is very small now because `9,999` out of `10,000` messages will be `B` - the world is certain!

Health

Target Heart Rate

The Karvonen Method is a way to calculate your target heart rate given the intensity of a work out. It depends upon your resting and maximum heart rates.

``````HR =
((Maximum HR - Resting HR) * Intensity)
+ Resting HR

Resting HR = 60bpm
Maximum HR = 200bpm

HR(Intensity = 80%) => 172bpm
``````

If we know our heart rate already, we can calculate the intensity of the workout:

``````Intensity(HR = 120bpm) => 0.4286
``````

Physics

Projectile Motion

Here is a classic equation for the motion of an object that is influenced by a uniform acceleration a, an initial velocity v0 and an initial position x0.

``````x(t) = 1/2 * a * t^2 + v0*t + x0
``````

We're going to define the parameters of this model using units. That way we can make sure we're calculating everything correctly.

``````a = -9.8m/s/s
v0 = 100m/s
x0 = 490m

x => -4.9m*t^2/s^2 + 100m*t/s + 490m
``````

Let's see what it looks like over a 30 second period:

``````x(1s)    => 585.1m
x(10s)    => 1000m
x(20s)    => 530m
x(30s)    => -920m
``````

We need to make sure to specify the time with the units `s`, otherwise we'll get a bad result:

``````x(1) => -4.9m/s^2 + 100m/s + 490m
``````

Units of Motion and Power

The velocity of an object is measured in meters `m` per second `s`.

``````velocity units = m / s
``````

Its acceleration is the change in velocity over time:

``````accel units = velocity units / s
``````

Isaac Newton tells us that all objects have a constant velocity (`a = 0`) unless acted upon by a force. This force is measured by multiplying the mass of the moving object (in kg) by the acceleration caused by the force. It's measured in, appropriately enough, Newtons:

``````N = kg * accel units => kg*m/s^2
``````

If we apply a force over a distance (imagine pushing your car), then are said to have done work (so long as the object accelerates in the direction we're pushing!). Work is measured in Joules:

``````J = N*m => kg*m^2/s^2
``````

There is another quantity called energy that is measured in Joules. Energy is the capacity for doing work. In every day speech, we use energy instead of work since work has a lot of real world connotations that are best left ignored.

The change in energy over time is called power and is measured in Watts.

``````W = J/s => kg*m^2/s^3
``````

Voltage and Current:

``````V = J/C => kg*m^2/(s^2*C)
A = C/s => C/s

V*A => kg*m^2/s^3
``````

Gravity

``````force = mass * accel
``````

When I'm standing on earth, it is constantly accelerating me so that I stay glued to the ground. That acceleration is called standard gravity.

``````g = 9.80665 m/s^2
``````

Now some personal info:

``````weight = 165lbs

kg per pound = 0.453592kg/lbs #googled
weight in kg = weight * kg per pound
=> 74.84268kg
``````

With that out of the way, we can measure the force that the earth exerts on me:

``````earth force = force(weight in kg, g)
=> 733.955968kg*m/s^2
``````

That was fun! We now know that the earth exerts `734 N` of force on me. All the time. But we love her anyway.

Change the values in blue above to find out how much she exerts on you!

Newton's Universal Gravitation

Previously, we used the fact that the earth constantly accelerates us at the rate `g` to keep us on the ground.

``````g => 9.80665m/s^2
``````

But where did this number come from? We can use Newton's Law of Universal Gravitation to calculate it. Here's that law:

``````force of gravity = G*(mass * other mass)/dist^2
``````

It states that the force due to gravity is proportional to the masses of two objects and inversely proportional to the squared distance between them.

The constant of proportionality is `G` - a very different number from the `g` we knew before. It is:

``````G = 6.67384e-11 m^3/kg/s^2 #gravitational constant
``````

Let's now use the law to calculate that value of `g = 9.8m/s^2` from above. We'll do it by using the mass of the earth and the ma

``````mass of earth = 5.972e24 kg #googled

earth gravity = force of gravity(
other mass = mass of earth,
=> 9.79745m*mass/s^2
``````

And there it is! Well it's not quite `9.81m/s` but that's just because our input numbers for earth's mass and radius weren't exactly what is used to calculate standard gravity, but it's darn close!

How close is it? Well let's give it our mass and see how close to `734 N` it gets:

``````earth gravity(mass = weight in kg)
=> 733.267222m*kg/s^2
``````

So close! It calculated `733 N`.

Why not try changing the numbers to see how much gravity would affect you if you lived on mars?

Electronics

Ohm's law

Ohm's law is fundamental to understanding electronics. It states that the current `i` through a conductor is proportional to the voltage `v` across it.

``````v = i * r

i => v/r
``````

We can use it directly to measure that voltage:

``````v(i = 2A, r = 100Ohm) => 200A*Ohm
``````

Oops, it would be better if we told Calca about Amperes:

``````A = V/Ohm

v(i = 2A, r = 100Ohm) => 200V
``````

We can use Ohm's Law to solve for any of three variables using any of the other two:

``````v(i = 2A, r = 100Ohm) => 200V
i(v = 200V, r = 100Ohm) => 2V/Ohm
r(v = 200V, i = 2A) => 100Ohm
``````

Capacitors

The current through a capacitor is proportional to the rate of change of the voltage across it:

``````ic(t) = C*der(v(t), t)
``````

We can see the common property that the capacitor causes a 90 degree phase shift in current when its voltage is AC:

``````ic(t, v=sin(t)) => C*cos(t)
``````

Logic Programming

Now you can define logic functions, here is an implementation of exclusive or:

``````xor(a, b) = if a then !b else b

xor(0, 0) => 0
xor(1, 0) => 1
xor(0, 1) => 1
xor(1, 1) => 0

half adder(a, b) = [xor(a,b), a && b]

half adder(0, 0) => [0, 0]
half adder(0, 1) => [1, 0]
half adder(1, 0) => [1, 0]
half adder(1, 1) => [0, 1]
``````

Those are pretty cool, huh? We can use them to create a full adder.

``````adder(a, b, c) =
let ab = half adder(a, b) in
let abc = half adder(ab[0], c) in
[abc[0], abc[1] || ab[1]]

adder(0, 0, 0) => [0, 0]
adder(0, 0, 1) => [1, 0]
adder(0, 1, 0) => [1, 0]
adder(0, 1, 1) => [0, 1]
adder(1, 0, 0) => [1, 0]
adder(1, 0, 1) => [0, 1]
adder(1, 1, 0) => [0, 1]
adder(1, 1, 1) => [1, 1]
``````