## Friday, November 27, 2015

1. Properties of the function $x^x$ (Post-Doc Ergo Propter Hoc H/T Dave Richeson). Can you prove:
$\int_{0}^{1} x^{x} = -\sum_{n=1}^{\infty} (-n)^{-n}$
2. Steve Strogatz on Einstein's boyhood proofs (newyorker).
The style of his Pythagorean proof, elegant and seemingly effortless, also portends something of the later scientist. Einstein draws a single line in Step 1, after which the Pythagorean theorem falls out like a ripe avocado. The same spirit of minimalism characterizes all of Einstein’s adult work. Incredibly, in the part of his special-relativity paper where he revolutionized our notions of space and time, he used no math beyond high-school algebra and geometry.
3. Via Twitter,  Sep 17
A strange derivative: let $f(x)=x^2 \sin(1/x^2)$ for $x \ne 0$, and $f(0)=0$. This function has $f'(0)=0$ even though $\lim_{x \rightarrow 0} f'(x),$ does not exist.

## Wednesday, November 25, 2015

### Logical Indexing in Octave/Matlab and Python/Numpy

Octave/Matlab

Consider the following set of operations in Octave or Matlab.

Make an array.

octave:1> x=1:10
x =
1    2    3    4    5    6    7    8    9   10

Which elements of "x" are greater than 5? The result is a logical array.

octave:2> c1 = x > 5
c1 =
0   0   0   0   0   1   1   1   1   1

Which elements are less than 8?

octave:3> c2 = x < 8
c2 =
1   1   1   1   1   1   1   0   0   0

The logical combination of two logical arrays is interpreted pair-wise.

octave:4> c = c1 & c2
c =
0   0   0   0   0   1   1   0   0   0

octave:5> x(c)
ans =
6   7

Python/Numpy

Now consider doing something similar in numpy.

>>> import numpy as np
>>> x=np.arange(1,11)
>>> x
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> c1 = x > 5
>>> c1
array([False, False, False, False, False,  True,  True,  True,  True,  True], dtype=bool)
>>> c2 = x < 8

So far so good. But when I say,

>>> c = c1 and c2
Traceback (most recent call last):
File "", line 1, in
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

The "and" command is good only to compare two bools, not arrays of bools. Therefore numpy suggests using x.any() or x.all() to collapse the vector of logical arguments to a scalar. For example.

>>> c1.all() # are all elements of c1 True?
False
>>> c1.any() # are any elements of c1 True?
True

To do an element-by-element comparison simply use np.logical_and or np.logical_or.

>>> c = np.logical_and(c1, c2)
>>> c
array([False, False, False, False, False,  True,  True, False, False, False], dtype=bool)

>>> x[c]
array([6, 7])

## Thursday, November 12, 2015

### A Moral Argument for Eating Meat

I promised that I would stop eating meat, the year I turned 35.

I failed.

The main arguments for going vegetarian are convincing:
• the greenest thing that an average person could do; nothing else comes close
• the cruelty and inhumanity of factory farming
• something screwed up about raising sentient life for food
I've scoured for arguments that counter the last point. Even if there was a carbon-neutral, perfectly humane way to raise animals, and slaughter them painlessly, would we be justified in raising and killing animals?

So far, none of the arguments seem compelling. The only narrow exception is when the survival of the individual is at stake.

For now, the story I tell to rationalize my choices is that most of my meals are vegetarian. One can't let the perfect be the enemy of the good.

Abstinence is hard, so moderation will have to do.

In a hundred years, our great-great-grandkids might look at our food choices with disgust. They might view us with the same odd combination of outrage and pity that with which we view historical moral crimes (slavery?).