diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/.DS_Store differ
diff --git a/0-pre-requisitos/1-python/Aula_01.ipynb b/0-pre-requisitos/1-python/Aula_01.ipynb
index f21b5d7..7ab6a72 100644
--- a/0-pre-requisitos/1-python/Aula_01.ipynb
+++ b/0-pre-requisitos/1-python/Aula_01.ipynb
@@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Aula 1: Data Types\n",
+ "# Aula 1: Data Types - Tipos de Dados\n",
"**02/08/2017**"
]
},
@@ -12,19 +12,37 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Objects in Python, like in many other languages, are organized in types, called __classes__. By belonging to a class, objects can be modified by functions (called __methods__) that are defined for objetcs of that class. Later in the course we will learn how to create our own classes and define methods that apply to objetcs that belong to them. For the time being, let us go through some standard classes that will already take us a long way towards solving problems."
+ "Objetivos:\n",
+ "- Tipos de dados e operações com os dados.\n",
+ "- Números (int/float/complex).\n",
+ "- Textos (list)\n",
+ "- Tuplas (tuple)\n",
+ "- Dicionários (dict)\n",
+ "- Conjuntos set loops\n",
+ "- Conversão de tipos"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Objetos em Python, assim como em várias outras linguagens de programação, são organizados em tipos, chamados __classes__. Pertencendo a uma classe esses objetos podem ser modificados por funções (chamadas __métodos__) definidas para cada classe.\n",
+ "Mais tarde neste curso vamos aprender como criar suas próprias classes e definir métodos que podem ser aplicados aos objetos que pertencem a essa nova classe.\n",
+ "Enquanto isso vamos passar por algumas classes padrão que já nos ajudarão a resolver vários problemas.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Python 3.5.4 :: Anaconda custom (64-bit)\r\n"
+ "Python 3.6.8 :: Anaconda, Inc.\n"
]
}
],
@@ -36,19 +54,22 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Numbers"
+ "# Numbers - Números"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "There are three basic types of numeric objects in Python. One of then is int (for integers), such as -1, 0, 1, 2, and so on."
+ "Existem três tipos básicos de objetos numéricos no Python.\n",
+ "O primeiro deles é o int (para inteiros), como -1, 0, 1, 2 e assim por diante.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {},
"outputs": [
{
@@ -57,7 +78,7 @@
"int"
]
},
- "execution_count": 2,
+ "execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@@ -71,13 +92,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The other type of numeric object is float, that stores real numbers.\n",
- "For more information on how Python handles floating point arithmetic, see [this](https://docs.python.org/3/tutorial/floatingpoint.html)."
+ "Outro tipo é o float, que guarda números reais.\n",
+ "Você consegue encontrar mais informações sobre como o Python trata o número de casas decimais na [documentação do Python](https://docs.python.org/3/tutorial/floatingpoint.html) (em Inglês).\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -86,7 +110,7 @@
"53"
]
},
- "execution_count": 3,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -98,7 +122,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -107,7 +131,7 @@
"float"
]
},
- "execution_count": 4,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -120,12 +144,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "One can also represent complex numbers (complex). A quick refresher on complex numbers can be found [here](https://en.wikipedia.org/wiki/Complex_number) and [here](http://mathworld.wolfram.com/ComplexNumber.html)."
+ "E por último complex que representa os números complexos. Entenda os números complexos e suas opeções nesta sequencia de vídeos: [Números complexos em pt_br](https://youtu.be/nprqf6DKeyI)\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -134,7 +160,7 @@
"complex"
]
},
- "execution_count": 5,
+ "execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -145,7 +171,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -154,7 +180,7 @@
"complex"
]
},
- "execution_count": 6,
+ "execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@@ -167,21 +193,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Notice that although the int 3, the float 3.0, and the complex 3.0+0j represent the same quantity, Python will treat them as different objetcs."
+ "Note que mesmo int 3, float 3.0, e complex 3.0+0j representem a mesma quantidade, o Python vai tratá-los como objetos diferente.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "94708970930304\n",
- "139738084184280\n",
- "139738084123920\n"
+ "4402206192\n",
+ "4440060840\n",
+ "4440441680\n"
]
}
],
@@ -196,12 +224,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Some operations that we can perform with numbers:"
+ "Algumas operações que podemos fazer com números:\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
@@ -225,12 +255,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Notice that adding two ints will return an int. But adding an int to a float will return a float (even though the float has no decimals). Finally, adding an int or a float to a complex will result in a complex object. This rule applies to other operations in Python involving numbers."
+ "Note que adicionar dois int vai retornar um int, mas adicionar um int e um float vai retornar um float mesmo que o float não tenha casas decimais.\n",
+ "Finalmente, adicionar um int ou float a um complex vai resultar sempre em um objeto complex. Essas mesmas regras se aplicam a outras operações envolvendo núnmeros no Python.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -252,7 +285,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -272,7 +305,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
@@ -281,7 +314,7 @@
"2"
]
},
- "execution_count": 11,
+ "execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
@@ -293,7 +326,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": 13,
"metadata": {},
"outputs": [
{
@@ -302,7 +335,7 @@
"1"
]
},
- "execution_count": 12,
+ "execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
@@ -314,7 +347,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 14,
"metadata": {},
"outputs": [
{
@@ -340,12 +373,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Sometimes it is convenient to assign an object to a **variable**. The variable inherits several properties of the object itself, but can have its values changed later on. In several programming languages, the variable and the type of data it can store have to be declared at the outset. Python does not require such declaration, and the type of variable can change throughout the code."
+ "Algumas vezes é conveniente colocar um objeto dentro de uma **variável** que herda várias propriedades do objeto, mas pode ter seu valor alterado posteriormente.\n",
+ "Em várias linguagens de programação, a variável e o tipo de objeto devem ser declarados no início, mas o Python não requer esse tipo de declaração. Além disso o tipo da variável pode alterar ao longo do seu código.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 15,
"metadata": {},
"outputs": [
{
@@ -354,7 +390,7 @@
"8"
]
},
- "execution_count": 14,
+ "execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
@@ -368,15 +404,21 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "**Variables naming rules**\n",
+ "**Regras para nomes de variáveis**\n",
+ "\n",
+ "* Os nomes das variáveis devem começar com um letra ou \"_\" (*underscore*).\n",
+ "* O restante do nome pode conter letras, números e underscores.\n",
+ "* Nomes de variáveis no Python são diferentes se escritas em caixa alta ou baixa.\n",
+ "\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 16,
"metadata": {},
"outputs": [
{
@@ -397,7 +439,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": 17,
"metadata": {},
"outputs": [
{
@@ -422,12 +464,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Another way to perform basic arithmetic operations:"
+ "Outra forma de utilizar operações aritiméticas:\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": 18,
"metadata": {},
"outputs": [
{
@@ -447,7 +490,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 19,
"metadata": {},
"outputs": [
{
@@ -469,12 +512,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Other useful functions (methods) that apply to numbers:"
+ "Outras funções (métodos) úteis que se aplicam a números:\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": 20,
"metadata": {},
"outputs": [
{
@@ -496,7 +540,7 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": 21,
"metadata": {},
"outputs": [
{
@@ -514,7 +558,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 22,
"metadata": {},
"outputs": [
{
@@ -532,7 +576,7 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 23,
"metadata": {},
"outputs": [
{
@@ -553,19 +597,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "What are the methods in a numerical object?"
+ "Quais são os métodos em um objeto numérico?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']\n"
+ "['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']\n"
]
}
],
@@ -576,7 +621,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": 25,
"metadata": {},
"outputs": [
{
@@ -597,12 +642,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "A rule about assignment to a number:"
+ "Uma regra sobre atribuição a um número:\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": 26,
"metadata": {},
"outputs": [
{
@@ -623,7 +669,7 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": 27,
"metadata": {},
"outputs": [
{
@@ -645,19 +691,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Strings"
+ "# Strings - Textos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "A string (str) is Pyhton is a sequence of characters."
+ "Um texto ou *string* (str) em Python é uma sequência de caracteres.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 28,
"metadata": {},
"outputs": [
{
@@ -666,7 +713,7 @@
"str"
]
},
- "execution_count": 27,
+ "execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
@@ -679,20 +726,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Strings can be created by enclosing a sequence of characters in single or double quotes.\n",
- "'string\" is NOT valid! 'string'=\"string\"."
+ "Textos podem ser criados colocando a sequência de caracteres dentro de aspas simples ou duplas.\n",
+ "'texto\" não é válido! 'texto\" = \"texto\".\n",
+ ""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "What is the size of a string?"
+ "Qual o tamanho de um texto?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": 29,
"metadata": {},
"outputs": [
{
@@ -701,7 +751,7 @@
"9"
]
},
- "execution_count": 28,
+ "execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
@@ -712,7 +762,7 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 30,
"metadata": {},
"outputs": [
{
@@ -733,7 +783,7 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 31,
"metadata": {},
"outputs": [
{
@@ -754,12 +804,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Numbers cannot be merged to strings on the fly. To do so, one has to convert the number to a string before."
+ "Números não podem ser fundidos/adicionados com textos em tempo de execução. Para fazer isso, antes é necessário converter o número para texto.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 32,
"metadata": {},
"outputs": [
{
@@ -768,7 +819,7 @@
"'number two: 2'"
]
},
- "execution_count": 31,
+ "execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
@@ -782,12 +833,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There are methods to extract only a portion of a string."
+ "Existem métodos para extrair apenas parte de um texto.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 33,
"metadata": {},
"outputs": [
{
@@ -818,19 +870,21 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Although one can access the element in position *i* this way, it is not possible to modify the string directly. s[3] = \"v\" would return an error."
+ "Mesmo sendo possível acessar o caracter na posição *i*, não é possível alterá-lo diretamente no texto. s[3] = \"v\" vai retornar um erro.\n",
+ ""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Triple quotes (''') interprets literally whatever is between then, including line brakes. "
+ "Aspas triplas (''') fazem o Python interpretar literlamente qualquer coisa que estiver entre as aspas triplas. Isso incluí quebras de linhas.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 34,
"metadata": {},
"outputs": [
{
@@ -851,12 +905,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There are more elegant ways to insert line breaks and other control characters."
+ "Existem formas mais elegantes de se adicionar quebras de linha e outros caracteres de controle.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 35,
"metadata": {},
"outputs": [
{
@@ -876,12 +931,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Expressions inside a string that are preceeded by a backslash (\\) are referred to as escape sequences, and are used - among other things - to insert non-printable and especial characters, such as linebreak (\\n), tab (\\t), or a single space (\\s). "
+ "Expressões dentro de um texto que tenham o prefixo de uma barra invertida \\ são utilizadas para imprimir sequências, caracteres especiais entre outras coisas. Para inserir um caracter especial ou de controle como uma quebra de linha \\n, espaçamentos \\t, ou um espaço \\s.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 36,
"metadata": {},
"outputs": [
{
@@ -900,12 +956,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Strings can be 'multiplied' too."
+ "Textos também podem ser multiplicados.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": 37,
"metadata": {},
"outputs": [
{
@@ -927,12 +984,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Here is a safer, more flexible way to merge strings, using the format method."
+ "Aqui um exemplo mais seguro e flexível para fundir textos usando o método format.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 37,
+ "execution_count": 38,
"metadata": {},
"outputs": [
{
@@ -941,7 +999,7 @@
"'Corinthias é campeão'"
]
},
- "execution_count": 37,
+ "execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
@@ -959,7 +1017,7 @@
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": 39,
"metadata": {},
"outputs": [
{
@@ -982,7 +1040,7 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": 40,
"metadata": {},
"outputs": [
{
@@ -1005,7 +1063,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": 41,
"metadata": {},
"outputs": [
{
@@ -1014,7 +1072,7 @@
"'TIMAO, EO! '"
]
},
- "execution_count": 40,
+ "execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
@@ -1025,7 +1083,7 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": 42,
"metadata": {},
"outputs": [
{
@@ -1034,7 +1092,7 @@
"'timao, eo! '"
]
},
- "execution_count": 41,
+ "execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
@@ -1045,7 +1103,7 @@
},
{
"cell_type": "code",
- "execution_count": 42,
+ "execution_count": 43,
"metadata": {},
"outputs": [
{
@@ -1054,7 +1112,7 @@
"'(6+9j)'"
]
},
- "execution_count": 42,
+ "execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
@@ -1065,7 +1123,7 @@
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": 44,
"metadata": {},
"outputs": [
{
@@ -1074,7 +1132,7 @@
"['Timao,', 'eo!']"
]
},
- "execution_count": 43,
+ "execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
@@ -1085,7 +1143,7 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": 45,
"metadata": {},
"outputs": [
{
@@ -1104,7 +1162,7 @@
},
{
"cell_type": "code",
- "execution_count": 45,
+ "execution_count": 46,
"metadata": {},
"outputs": [
{
@@ -1121,7 +1179,7 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": 47,
"metadata": {
"scrolled": true
},
@@ -1132,7 +1190,7 @@
"2"
]
},
- "execution_count": 46,
+ "execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
@@ -1143,7 +1201,7 @@
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": 48,
"metadata": {},
"outputs": [
{
@@ -1152,7 +1210,7 @@
"-1"
]
},
- "execution_count": 47,
+ "execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
@@ -1163,7 +1221,7 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": 49,
"metadata": {},
"outputs": [
{
@@ -1172,7 +1230,7 @@
"2"
]
},
- "execution_count": 48,
+ "execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
@@ -1185,19 +1243,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Other string methods:"
+ "Outros métodos para textos (string):\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']\n"
+ "['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']\n"
]
}
],
@@ -1208,7 +1267,7 @@
},
{
"cell_type": "code",
- "execution_count": 50,
+ "execution_count": 51,
"metadata": {
"scrolled": true
},
@@ -1232,7 +1291,7 @@
},
{
"cell_type": "code",
- "execution_count": 51,
+ "execution_count": 52,
"metadata": {},
"outputs": [
{
@@ -1253,23 +1312,22 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "# Lists"
+ "# Lists - Listas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "A list is an ordered collection of elements. Each element has two attributes: index (the position it is in, *starting from zero*) and value."
+ "Uma lista (list) é uma coleção ordenada de elementos. Cada elemento tem 2 atributos: index (a posição em que ele se encontra, começão do 0) e o valor.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 52,
+ "execution_count": 53,
"metadata": {},
"outputs": [
{
@@ -1291,12 +1349,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The element of a list can be accessed by calling its index."
+ "O elemento da lista pode ser acessado chamando o *index* dele.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 53,
+ "execution_count": 54,
"metadata": {},
"outputs": [
{
@@ -1305,7 +1364,7 @@
"'Fernando'"
]
},
- "execution_count": 53,
+ "execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
@@ -1316,7 +1375,7 @@
},
{
"cell_type": "code",
- "execution_count": 54,
+ "execution_count": 55,
"metadata": {},
"outputs": [
{
@@ -1343,12 +1402,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "What is the size of our list?"
+ "Qual é o tamanho da nossa lista?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 55,
+ "execution_count": 56,
"metadata": {},
"outputs": [
{
@@ -1357,7 +1417,7 @@
"5"
]
},
- "execution_count": 55,
+ "execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
@@ -1371,12 +1431,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The list can be sorted (if all elements can be compared! More about this later in this section). Notice that the indexes associated with each element will change."
+ "Uma lista pode ser ordenada (se todos os elementos puderem ser comparados! Vamos ver mais sobre isso nessa sessão. Note que o *index* associado com cada elemento vai ser alterado.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 56,
+ "execution_count": 57,
"metadata": {},
"outputs": [
{
@@ -1402,12 +1463,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The order of the elements can also be reversed.\n"
+ "A ordem dos elementos também pode ser revertida.\n",
+ "\n"
]
},
{
"cell_type": "code",
- "execution_count": 57,
+ "execution_count": 58,
"metadata": {},
"outputs": [
{
@@ -1429,12 +1491,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There are two ways to add an element to a list. The method append will add the element to the last position."
+ "Existem duas formas de adicionar um elemnto a uma lista. O método append que vai adicionar o elemento na última posição da lista.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 58,
+ "execution_count": 59,
"metadata": {},
"outputs": [
{
@@ -1456,12 +1519,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "A value can also be added in a specific position. In this scenario, the other indexes may also change."
+ "Ou adicionar o elemento em uma posição especifica na lista. Neste caso os outros inedx também podem ser alterados.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 59,
+ "execution_count": 60,
"metadata": {},
"outputs": [
{
@@ -1481,16 +1545,15 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "Elements of a list can be modified."
+ "Elementos de uma lista também podem ser modificados.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 60,
+ "execution_count": 61,
"metadata": {},
"outputs": [
{
@@ -1512,12 +1575,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Elements can be removed from the list depende on the value they have. The method p.remove(v) will remove all the elements whose value is v. Indexes will change."
+ "Elementos podem ser removidos da lista dependendo do valor ques eles possuem. O método p.remove(v) vai remover todos os elementos da lista que tiverem o valor igual a v. Os indexes serão alterados nos elementos remanecentes.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 61,
+ "execution_count": 62,
"metadata": {},
"outputs": [
{
@@ -1543,12 +1607,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "What is the index of \"Luis\"?"
+ "Qual o index do elemento \"Luis\"?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 62,
+ "execution_count": 63,
"metadata": {},
"outputs": [
{
@@ -1557,7 +1622,7 @@
"3"
]
},
- "execution_count": 62,
+ "execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
@@ -1570,12 +1635,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Also possible to remove element according to its index. Remember that the index is the position of the element in the list."
+ "Também é possível remover um elemento de acordo com seu index. Lembre-se o index é a posição do elemento na lista e ao removê-lo, você pode alterar a posição de outros elementos.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 63,
+ "execution_count": 64,
"metadata": {},
"outputs": [
{
@@ -1600,26 +1666,28 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "list.pop() removes the last element of a list (the one with the highest index)."
+ "O método list.pop() remove o último elemento da lista (o que tiver o maior index).\n",
+ ""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Other list methods:"
+ "Outros métodos das listas (list):\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": 65,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n"
+ "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n"
]
}
],
@@ -1631,12 +1699,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "A trick that you should remember. It is true for lists and for other **mutable** objetcs."
+ "Um truque que você deve se lembrar e que é verdade para listas e outros objetos **mutáveis**.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 65,
+ "execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
@@ -1645,7 +1714,7 @@
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": 67,
"metadata": {},
"outputs": [
{
@@ -1667,20 +1736,21 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "a and b are pointing to the same object in memory."
+ "a e b estão apontando para o mesmo objeto na memória, se um muda o outro também vai ser alterado.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "id(a) = 139738083628936\n",
- "id(b) = 139738083628936\n"
+ "id(a) = 4441100744\n",
+ "id(b) = 4441100744\n"
]
}
],
@@ -1691,16 +1761,15 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "Let us modify b"
+ "Vamos modificar b\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 68,
+ "execution_count": 69,
"metadata": {},
"outputs": [
{
@@ -1720,12 +1789,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "a was also modified."
+ "a também foi alterado.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 69,
+ "execution_count": 70,
"metadata": {},
"outputs": [
{
@@ -1742,7 +1812,7 @@
},
{
"cell_type": "code",
- "execution_count": 70,
+ "execution_count": 71,
"metadata": {},
"outputs": [],
"source": [
@@ -1751,15 +1821,15 @@
},
{
"cell_type": "code",
- "execution_count": 71,
+ "execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "id(a) = 139738083628936\n",
- "id(b) = 139738083627208\n"
+ "id(a) = 4441100744\n",
+ "id(b) = 4441102408\n"
]
}
],
@@ -1772,12 +1842,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Lists can store more than one type of data."
+ "Listas podem guardar mais do que um tipo de dados.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": 73,
"metadata": {},
"outputs": [
{
@@ -1797,12 +1868,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "How to merge/combine lists?"
+ "Como fundir/juntar/combinar listas?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 55,
+ "execution_count": 74,
"metadata": {},
"outputs": [
{
@@ -1829,16 +1901,23 @@
},
{
"cell_type": "code",
- "execution_count": 72,
+ "execution_count": 75,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "['Ulisses', 'Roberto', 'Luis', 'Fernando', 'Leonel']"
+ "['Ulisses',\n",
+ " 'Roberto',\n",
+ " 'Luis',\n",
+ " 'Fernando',\n",
+ " 'Leonel',\n",
+ " 'Eneas',\n",
+ " 'Marronzinho',\n",
+ " 'Correa']"
]
},
- "execution_count": 72,
+ "execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
@@ -1856,7 +1935,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "['Ulisses', 'Roberto', 'Luis', 'Leonel', 'Fernando']\n"
+ "['Ulisses', 'Roberto', 'Marronzinho', 'Luis', 'Leonel', 'Fernando', 'Eneas', 'Correa']\n"
]
}
],
@@ -1866,7 +1945,7 @@
},
{
"cell_type": "code",
- "execution_count": 80,
+ "execution_count": 77,
"metadata": {},
"outputs": [],
"source": [
@@ -1875,16 +1954,23 @@
},
{
"cell_type": "code",
- "execution_count": 81,
+ "execution_count": 78,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "['Fernando', 'Leonel', 'Luis', 'Roberto', 'Ulisses']"
+ "['Correa',\n",
+ " 'Eneas',\n",
+ " 'Fernando',\n",
+ " 'Leonel',\n",
+ " 'Luis',\n",
+ " 'Marronzinho',\n",
+ " 'Roberto',\n",
+ " 'Ulisses']"
]
},
- "execution_count": 81,
+ "execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
@@ -1895,7 +1981,7 @@
},
{
"cell_type": "code",
- "execution_count": 82,
+ "execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
@@ -1904,16 +1990,23 @@
},
{
"cell_type": "code",
- "execution_count": 83,
+ "execution_count": 80,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "['Fernando', 'Mário', 'Luis', 'Roberto', 'Ulisses']"
+ "['Correa',\n",
+ " 'Mário',\n",
+ " 'Fernando',\n",
+ " 'Leonel',\n",
+ " 'Luis',\n",
+ " 'Marronzinho',\n",
+ " 'Roberto',\n",
+ " 'Ulisses']"
]
},
- "execution_count": 83,
+ "execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
@@ -1926,19 +2019,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Tuples"
+ "# Tuples - Tuplas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "A tuple is a sequence of **immutable** Python objects. Unlike lists, once are created, they cannot be modified."
+ "Uma tupla nada mais é do que uma sequência de objetos em Python que são **imutáveis**. Diferente das listas, assim que criados, não modem ser modificados.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 84,
+ "execution_count": 81,
"metadata": {},
"outputs": [
{
@@ -1958,12 +2052,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Since tuples are immutable, they have only a subset of the methods available for strings."
+ "Como as tuplas são imutáveis, elas tem apenas um pequeno set de métodos disponíveis para strings.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 92,
+ "execution_count": 82,
"metadata": {},
"outputs": [
{
@@ -1973,7 +2068,7 @@
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"rugby\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"rugby\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: 'tuple' object does not support item assignment"
]
}
@@ -1984,14 +2079,14 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 83,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']\n"
+ "['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']\n"
]
}
],
@@ -2001,7 +2096,7 @@
},
{
"cell_type": "code",
- "execution_count": 86,
+ "execution_count": 84,
"metadata": {},
"outputs": [
{
@@ -2010,7 +2105,7 @@
"3"
]
},
- "execution_count": 86,
+ "execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
@@ -2021,7 +2116,7 @@
},
{
"cell_type": "code",
- "execution_count": 88,
+ "execution_count": 85,
"metadata": {},
"outputs": [
{
@@ -2030,7 +2125,7 @@
"1"
]
},
- "execution_count": 88,
+ "execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
@@ -2044,19 +2139,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Dictionaries"
+ "# Dictionaries - Dicionários"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Dictionaries (or hashes) are associative tables, in which indexes are associated with values."
+ "Dicionários (ou hashes) são tabelas associativas, nas quais indexes são associados com valores.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 97,
+ "execution_count": 86,
"metadata": {},
"outputs": [
{
@@ -2074,16 +2170,15 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "Dictionary elements can be accessed like we do with lists and tuples. The keys must be unique and immutable. strings, numbers or tuples will work as dictionary keys."
+ "Elementos em Dicionários, podem ser acessados da mesma forma que fazemos com listas e tuplas. A chave (key) deve ser única e imutável. Chaves podem ser textos, tuplas ou números.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 98,
+ "execution_count": 87,
"metadata": {},
"outputs": [
{
@@ -2092,7 +2187,7 @@
"'Maluf'"
]
},
- "execution_count": 98,
+ "execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
@@ -2103,7 +2198,7 @@
},
{
"cell_type": "code",
- "execution_count": 99,
+ "execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
@@ -2112,21 +2207,21 @@
},
{
"cell_type": "code",
- "execution_count": 102,
+ "execution_count": 89,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "{11: 'Maluf',\n",
- " 12: 'Brizola',\n",
- " 13: 'Lula',\n",
+ "{13: 'Lula',\n",
" 15: 'Ulisses',\n",
- " 18: 'Afif',\n",
- " 20: 'Collor'}"
+ " 11: 'Maluf',\n",
+ " 12: 'Brizola',\n",
+ " 20: 'Collor',\n",
+ " 18: 'Afif'}"
]
},
- "execution_count": 102,
+ "execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
@@ -2137,7 +2232,7 @@
},
{
"cell_type": "code",
- "execution_count": 101,
+ "execution_count": 90,
"metadata": {},
"outputs": [],
"source": [
@@ -2146,7 +2241,7 @@
},
{
"cell_type": "code",
- "execution_count": 103,
+ "execution_count": 91,
"metadata": {},
"outputs": [],
"source": [
@@ -2155,21 +2250,21 @@
},
{
"cell_type": "code",
- "execution_count": 104,
+ "execution_count": 92,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "{11: ' Afif',\n",
- " 12: 'Brizola',\n",
- " 13: 'Lula',\n",
+ "{13: 'Lula',\n",
" 15: 'Ulisses',\n",
- " 18: 'Afif',\n",
- " 20: 'Collor'}"
+ " 11: ' Afif',\n",
+ " 12: 'Brizola',\n",
+ " 20: 'Collor',\n",
+ " 18: 'Afif'}"
]
},
- "execution_count": 104,
+ "execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
@@ -2182,12 +2277,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There are dict methods that allow us to access the keys and values of the dictionary."
+ "Existem métodos dict que permitem acessar as chaves e valores do dicionário.\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 105,
+ "execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
@@ -2196,7 +2292,7 @@
},
{
"cell_type": "code",
- "execution_count": 107,
+ "execution_count": 94,
"metadata": {},
"outputs": [],
"source": [
@@ -2205,7 +2301,7 @@
},
{
"cell_type": "code",
- "execution_count": 109,
+ "execution_count": 95,
"metadata": {},
"outputs": [],
"source": [
@@ -2214,17 +2310,17 @@
},
{
"cell_type": "code",
- "execution_count": 110,
+ "execution_count": 96,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "{9321936: {'esporte': 'volei', 'idade': 21, 'nome': 'João'},\n",
- " 9625728: {'esporte': 'Sporti', 'idade': 22, 'nome': 'Gabriel'}}"
+ "{9321936: {'nome': 'João', 'idade': 21, 'esporte': 'volei'},\n",
+ " 9625728: {'nome': 'Gabriel', 'idade': 22, 'esporte': 'Sporti'}}"
]
},
- "execution_count": 110,
+ "execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
@@ -2235,7 +2331,7 @@
},
{
"cell_type": "code",
- "execution_count": 111,
+ "execution_count": 97,
"metadata": {},
"outputs": [
{
@@ -2244,7 +2340,7 @@
"43"
]
},
- "execution_count": 111,
+ "execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
@@ -2255,7 +2351,7 @@
},
{
"cell_type": "code",
- "execution_count": 112,
+ "execution_count": 98,
"metadata": {},
"outputs": [
{
@@ -2263,7 +2359,7 @@
"output_type": "stream",
"text": [
"keys: dict_keys([9321936, 9625728])\n",
- "values: dict_values([{'idade': 21, 'esporte': 'volei', 'nome': 'João'}, {'idade': 22, 'esporte': 'Sporti', 'nome': 'Gabriel'}])\n"
+ "values: dict_values([{'nome': 'João', 'idade': 21, 'esporte': 'volei'}, {'nome': 'Gabriel', 'idade': 22, 'esporte': 'Sporti'}])\n"
]
}
],
@@ -2274,7 +2370,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": 99,
"metadata": {},
"outputs": [
{
@@ -2291,14 +2387,14 @@
},
{
"cell_type": "code",
- "execution_count": 71,
+ "execution_count": 100,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "dict_items([(20, 'Collor'), (12, 'Brizola'), (13, 'Lula'), (15, 'Ulisses')])\n"
+ "dict_items([(13, 'Lula'), (15, 'Ulisses'), (11, ' Afif'), (12, 'Brizola'), (20, 'Collor'), (18, 'Afif')])\n"
]
}
],
@@ -2308,14 +2404,14 @@
},
{
"cell_type": "code",
- "execution_count": 69,
+ "execution_count": 101,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']\n"
+ "['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']\n"
]
}
],
@@ -2327,26 +2423,28 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Dictionaries are mutable, and can be modified pretty much the same we did for lists. This is not true for strings and tuples, which are immutable."
+ "Dicionários, são mutáveis e podem ser alterados basicamente da mesma forma que fizemos com as listas. Isso não se aplica a strings e tuples que são imutáveis.\n",
+ ""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "How to delete one of the entries?"
+ "Como deletar entradas no dicionário?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 70,
+ "execution_count": 102,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "{20: 'Collor', 12: 'Brizola', 13: 'Lula', 15: 'Ulisses'}\n"
+ "{13: 'Lula', 15: 'Ulisses', 12: 'Brizola', 20: 'Collor', 18: 'Afif'}\n"
]
}
],
@@ -2359,19 +2457,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Combining two dictionaries:"
+ "Combinando dois dicionários:\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 73,
+ "execution_count": 103,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "{33: 'Brant', 20: 'Collor', 22: 'Afif', 43: 'Gabeira', 12: 'Brizola', 13: 'Lula', 15: 'Ulisses'}\n"
+ "{13: 'Lula', 15: 'Ulisses', 12: 'Brizola', 20: 'Collor', 18: 'Afif', 43: 'Gabeira', 33: 'Brant', 22: 'Afif'}\n"
]
}
],
@@ -2385,12 +2484,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "What if one tries to access an index that does not exist?"
+ "E se tentarmos acessar um index que não existe?\n",
+ ""
]
},
{
"cell_type": "code",
- "execution_count": 76,
+ "execution_count": 104,
"metadata": {},
"outputs": [
{
@@ -2411,12 +2511,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Sets"
+ "# Sets - Conjuntos"
]
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 117,
"metadata": {},
"outputs": [
{
@@ -2424,7 +2524,8 @@
"output_type": "stream",
"text": [
"list l = [1, 2, 3, 1, 3, 3, 2]\n",
- "set(l) = {1, 2, 3}\n"
+ "set(l) = {1, 2, 3}\n",
+ "\n"
]
}
],
@@ -2432,12 +2533,13 @@
"l = [1, 2, 3, 1, 3, 3, 2]\n",
"print(\"list l = \" + str(l))\n",
"sl = set(l)\n",
- "print(\"set(l) = \" + str(sl))"
+ "print(\"set(l) = \" + str(sl))\n",
+ "print(type(sl))"
]
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": 106,
"metadata": {},
"outputs": [
{
@@ -2457,6 +2559,7 @@
" '__hash__',\n",
" '__iand__',\n",
" '__init__',\n",
+ " '__init_subclass__',\n",
" '__ior__',\n",
" '__isub__',\n",
" '__iter__',\n",
@@ -2499,7 +2602,7 @@
" 'update']"
]
},
- "execution_count": 36,
+ "execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
@@ -2512,12 +2615,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Converting between types"
+ "# Converting between types - Convertendo entre os tipos de dados"
]
},
{
"cell_type": "code",
- "execution_count": 114,
+ "execution_count": 107,
"metadata": {},
"outputs": [
{
@@ -2526,7 +2629,7 @@
"tuple"
]
},
- "execution_count": 114,
+ "execution_count": 107,
"metadata": {},
"output_type": "execute_result"
}
@@ -2538,7 +2641,7 @@
},
{
"cell_type": "code",
- "execution_count": 115,
+ "execution_count": 108,
"metadata": {},
"outputs": [],
"source": [
@@ -2547,7 +2650,7 @@
},
{
"cell_type": "code",
- "execution_count": 116,
+ "execution_count": 109,
"metadata": {},
"outputs": [
{
@@ -2564,7 +2667,7 @@
},
{
"cell_type": "code",
- "execution_count": 117,
+ "execution_count": 110,
"metadata": {},
"outputs": [
{
@@ -2582,7 +2685,7 @@
},
{
"cell_type": "code",
- "execution_count": 118,
+ "execution_count": 111,
"metadata": {},
"outputs": [
{
@@ -2591,7 +2694,7 @@
"['a', 'b', 'c', 'd', 'e']"
]
},
- "execution_count": 118,
+ "execution_count": 111,
"metadata": {},
"output_type": "execute_result"
}
@@ -2602,7 +2705,7 @@
},
{
"cell_type": "code",
- "execution_count": 119,
+ "execution_count": 112,
"metadata": {},
"outputs": [
{
@@ -2611,7 +2714,7 @@
"[1, 2, 3]"
]
},
- "execution_count": 119,
+ "execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
@@ -2622,7 +2725,7 @@
},
{
"cell_type": "code",
- "execution_count": 121,
+ "execution_count": 113,
"metadata": {},
"outputs": [],
"source": [
@@ -2631,7 +2734,7 @@
},
{
"cell_type": "code",
- "execution_count": 122,
+ "execution_count": 114,
"metadata": {},
"outputs": [
{
@@ -2640,7 +2743,7 @@
"[1, 2, 3]"
]
},
- "execution_count": 122,
+ "execution_count": 114,
"metadata": {},
"output_type": "execute_result"
}
@@ -2651,7 +2754,7 @@
},
{
"cell_type": "code",
- "execution_count": 123,
+ "execution_count": 115,
"metadata": {},
"outputs": [
{
@@ -2669,7 +2772,7 @@
},
{
"cell_type": "code",
- "execution_count": 124,
+ "execution_count": 116,
"metadata": {},
"outputs": [
{
@@ -2678,7 +2781,7 @@
"[1, 2, 3]"
]
},
- "execution_count": 124,
+ "execution_count": 116,
"metadata": {},
"output_type": "execute_result"
}
@@ -2704,7 +2807,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.5.4"
+ "version": "3.6.8"
}
},
"nbformat": 4,
diff --git a/0-pre-requisitos/1-python/Aula_02.ipynb b/0-pre-requisitos/1-python/Aula_02.ipynb
index 082c74e..a82842d 100644
--- a/0-pre-requisitos/1-python/Aula_02.ipynb
+++ b/0-pre-requisitos/1-python/Aula_02.ipynb
@@ -1,882 +1,1365 @@
{
- "cells": [
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "# Aula 2: Program Flow and Control Structures\n**06/08/2017**\n"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Objectives:\n- Conditional (if/else) statements\n- for loops\n- while loops\n- functions"
- },
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "# Conditional"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "A boolean variable stores True or False."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "type(True)",
- "execution_count": 1,
- "outputs": [
- {
- "data": {
- "text/plain": "bool"
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = (4>3)\nprint(\"x = {0}\".format(x))",
- "execution_count": 2,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "x = True\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "y = 2==4\nprint(\"y = {0}\".format(y))",
- "execution_count": 3,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "y = False\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x or y",
- "execution_count": 4,
- "outputs": [
- {
- "data": {
- "text/plain": "True"
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x and y",
- "execution_count": 5,
- "outputs": [
- {
- "data": {
- "text/plain": "False"
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "not x",
- "execution_count": 6,
- "outputs": [
- {
- "data": {
- "text/plain": "False"
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "True and False behave like 1 and 0, respectively."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x+y",
- "execution_count": 7,
- "outputs": [
- {
- "data": {
- "text/plain": "1"
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x*y",
- "execution_count": 8,
- "outputs": [
- {
- "data": {
- "text/plain": "0"
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "The example below shows the most basic sintax of a decision structure:"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = 5\ny = 4\nt = x>y\nif t:\n print(\"{0} is greater than {1}\".format(x, y))",
- "execution_count": 9,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "5 is greater than 4\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "If the condition (or set of conditions) is satisfied, the indented code below is executed. Indentation in Python is made up of four simple spaces, and is used to determine the end of the structure. Python is very strict about indentation, and programmers should be too.\n\nNotice that something happens (code is execute) only if the condition is True. In some scenarios, one wants something to happen if the condition is False. The else clauses comes in handy in this case."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = 4\ny = 5\nif (x>y):\n print(\"{0} is greater than {1}\".format(x, y))\nelse:\n print(\"{0} is *NOT* greater than {1}\".format(x, y))",
- "execution_count": 10,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "4 is *NOT* greater than 5\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "The elif allows to test multiple conditions."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = 5\ny = 4\nif (x>y):\n print(\"{0} is greater than {1}\".format(x, y))\nelif (x==y):\n print(\"{0} is equal to {1}\".format(x, y))\nelse:\n print(\"{0} is smaller than {1}\".format(x, y))",
- "execution_count": 11,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "5 is greater than 4\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Python will execute the instruction *first* condition that is true."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = 5\ny = 5\nif (x>=y):\n print(\"{0} is greater than or equal to {1}\".format(x, y))\nelif (x==y):\n print(\"{0} is equal to {1}\".format(x, y))\nelse:\n print(\"{0} is smaller than {1}\".format(x, y))",
- "execution_count": 12,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "5 is greater than or equal to 5\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "colors = {0: 'green', 1: 'violet', 2: 'blue', 3: ' yellow'}",
- "execution_count": 13,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "c = 0\nif c == 0:\n print(colors[0])\nelif c == 0:\n print(colors[1])\nelif c == 2:\n print(colors[2])\nelif c == 3:\n print(colors[3])\nelse:\n print('I dont know.')",
- "execution_count": 14,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "green\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "if conditions can be nested within each other."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = 7\ny = 5\nif (x>y):\n if abs(x-y)<1:\n print(\"{0} is greater than {1}\".format(x, y))\n else:\n print(\"{0} is MUCH greater than {1}\".format(x, y))\nelif (x==y):\n print(\"{0} is equal to {1}\".format(x, y))\nelse:\n print(\"{0} is smaller than {1}\".format(x, y))",
- "execution_count": 15,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "7 is MUCH greater than 5\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# `for` loops"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Loops in Python, as in other programming languages, allows on to perform operations multiple times."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "print(list(range(10)))",
- "execution_count": 16,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# sum of the first 10 whole numbers\n\ngauss = 0 # the scalar 'gauss' will store the value of the running sum\nparcelas = [] # the list parcelas will store the value of the running sum at each step\n\nfor i in range(11):\n\n gauss += i\nprint(gauss)\n \nprint(\"1+2+3+...+10 = \" + str(gauss))",
- "execution_count": 19,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "55\n1+2+3+...+10 = 55\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# parsing a list\nl = [\"Macro\", \"Micro\", \"Econometria\", 537]\nfor i, v in enumerate(l):\n # the index at each step is assigned to 'i' \n # the value at each stpe is assigned to 'v'\n # both 'i' and 'v' are local, and cannot be accessed outside of the loop\n print(\"{0}: {1}\".format(i, v))\n print(\"---\")",
- "execution_count": 28,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "0: Macro\n---\n1: Micro\n---\n2: Econometria\n---\n3: 537\n---\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# if you want to access only the values\nfor v in l:\n print(v)",
- "execution_count": 24,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "Macro\nMicro\nEconometria\n537\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# parsing a list\nd = { \"Macro\": [\"eae302\",20], \"Micro\": [\"eae301\",25], \"Econometria\": [\"eae303\",40] }\nfor key, value in d.items():\n print(\"{0}: {1} alunos\".format(key, value[1]))",
- "execution_count": 31,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "Macro: 20 alunos\nEconometria: 40 alunos\nMicro: 25 alunos\n"
- }
- ]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# parsing a string\ns = \"Barcelona\"\nfor x in s:\n print(x)",
- "execution_count": 33,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "B\na\nr\nc\ne\nl\no\nn\na\n"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# while loops"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Similar to for. Executes a chunck of code until a certain condition is met."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "gauss = 0\ni = 1\n\nwhile i<=100:\n gauss += i\n i += 1\n\nprint(gauss)",
- "execution_count": 34,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "5050\n"
- }
- ]
- },
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "We know that $lim_{n\\rightarrow +\\infty} \\sum_{i=1}^{n}{\\frac{1}{i}} = +\\infty$. That means that for any positive real $S$, one can find an integer $n$ such that $\\sum_{i=1}^{n}{\\frac{1}{i}} > n$. In the code below, we will find one such $n$ for $S=10$."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "S = 15 # target value for the sum\ns = 0 # variable that will store the value of the running (partial) sum\ni = 1\n\nwhile (sif/else) statements\n",
+ "- for loops\n",
+ "- while loops\n",
+ "- functions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Assim como em outras linguagens de programação o Python tem várias funções de controle de fluxo e estruturas para os programas/scripts desenvolvidos."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Conditional - Condicional"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Uma variável boleana (bool) guarda valores Verdadeiro (True) ou Falso (False).\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "bool"
]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# Example 3: sum of infinite series (see problem above)\ndef limit(S):\n\n s = 0\n i = 0\n\n while (s3)\n",
+ "print(\"x = {0}\".format(x))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "y = False\n"
+ ]
+ }
+ ],
+ "source": [
+ "y = 2==4\n",
+ "print(\"y = {0}\".format(y))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# Example 4: evaluating a polynomial\ndef p(x, coef):\n return sum([c * x**i for i, c in enumerate(coef)])\n\nprint(p(2,(2,1,3)))",
- "execution_count": 64,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": "16\n"
- }
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x or y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "coef = (2, 1, 3)\nx = 2",
- "execution_count": 56,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "parcelas = [jp*(x**i) for i, jp in enumerate(coef)]\nparcelas",
- "execution_count": 60,
- "outputs": [
- {
- "data": {
- "text/plain": "[2, 2, 12]"
- },
- "execution_count": 60,
- "metadata": {},
- "output_type": "execute_result"
- }
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x and y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
]
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "sum(parcelas)",
- "execution_count": 61,
- "outputs": [
- {
- "data": {
- "text/plain": "16"
- },
- "execution_count": 61,
- "metadata": {},
- "output_type": "execute_result"
- }
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "not x"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Verdadeiro (True) e Falso (False) se comportam como 1 e 0 respectivamente.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "n! = n * (n-1)!, if n > 1 and f(1) = 1 "
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "# Example 5: Recursion\ndef factorial(n):\n if n == 1:\n return 1\n else:\n return n * factorial(n-1)",
- "execution_count": 34,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "factorial(4)",
- "execution_count": 29,
- "outputs": [
- {
- "data": {
- "text/plain": "24"
- },
- "execution_count": 29,
- "metadata": {},
- "output_type": "execute_result"
- }
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x+y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "https://realpython.com/python-thinking-recursively/"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Exercícios"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "**1.** Da coluna de Marcelo Viana (IMPA) na Falha de São Paulo em 12/08/2018: \n*Funciona assim: considere um inteiro positivo N qualquer. Se for par, divida por 2. Se for ímpar, multiplique por 3 e some 1. Substitua N pelo resultado obtido e siga repetindo esse procedimento. Por exemplo, se começar com N=7 obterá, sucessivamente, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 e, a partir daí, a sequência só repete os números 4, 2, 1, ciclicamente.*"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def par(x):\n if (x%2 == 0):\n return True\n else:\n return False",
- "execution_count": 1,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def Marcelo_Viana(x):\n c = 0\n while x != 1:\n if par(x):\n x = x/2\n else:\n x = 3*x+1\n c += 1\n \n return c",
- "execution_count": 7,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "for x in range(1, 15):\n print(\"{0}: {1}\".format(x, Marcelo_Viana(x)))",
- "execution_count": 8,
- "outputs": [
- {
- "output_type": "stream",
- "text": "1: 0\n2: 1\n3: 7\n4: 2\n5: 5\n6: 8\n7: 16\n8: 3\n9: 19\n10: 6\n11: 14\n12: 9\n13: 9\n14: 17\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x*y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "O exemplo abaixo mostra a sintaxe mais básica de uma estrutura de decisão:\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5 is greater than 4\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 5\n",
+ "y = 4\n",
+ "t = x>y\n",
+ "if t:\n",
+ " print(\"{0} is greater than {1}\".format(x, y))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Se a condição ou uma série de condições for satisfeita, o códico identado abaixo é executado, caso contrário não. A identação no Python é feita com quatro (4) espaços simples, e utilizada para determinar o fim da estrutura. O Python é bem rigido com relação a identação do código e os programadores deveriam ser também (LEMBRE-SE: além de um código funcional somos responsáveis por comunicar descobertas e um código limpo e explicado ajuda a comunicação e trabalho em equipe).\n",
+ "\n",
+ "Note que algo acontece (o código é executado) somente se a condição for True. Em alguns casos, queremos que outra coisa acontece se a condição for False, nestes casos usamos as cláusulas \"se não\" (else) ou \"então se\" (elif).\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "4 is *NOT* greater than 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 4\n",
+ "y = 5\n",
+ "if (x>y):\n",
+ " print(\"{0} is greater than {1}\".format(x, y))\n",
+ "else:\n",
+ " print(\"{0} is *NOT* greater than {1}\".format(x, y))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "O elif permite o teste de multiplas condições.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5 is greater than 4\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 5\n",
+ "y = 4\n",
+ "if (x>y):\n",
+ " print(\"{0} is greater than {1}\".format(x, y))\n",
+ "elif (x==y):\n",
+ " print(\"{0} is equal to {1}\".format(x, y))\n",
+ "else:\n",
+ " print(\"{0} is smaller than {1}\".format(x, y))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "O Python vai sempre executar as instruções apenas da **primeira** condição que for verdadeira.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5 is greater than or equal to 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 5\n",
+ "y = 5\n",
+ "if (x>=y):\n",
+ " print(\"{0} is greater than or equal to {1}\".format(x, y))\n",
+ "elif (x==y):\n",
+ " print(\"{0} is equal to {1}\".format(x, y))\n",
+ "else:\n",
+ " print(\"{0} is smaller than {1}\".format(x, y))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "colors = {0: 'green', 1: 'violet', 2: 'blue', 3: ' yellow'}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "green\n"
+ ]
+ }
+ ],
+ "source": [
+ "c = 0\n",
+ "if c == 0:\n",
+ " print(colors[0])\n",
+ "elif c == 0:\n",
+ " print(colors[1])\n",
+ "elif c == 2:\n",
+ " print(colors[2])\n",
+ "elif c == 3:\n",
+ " print(colors[3])\n",
+ "else:\n",
+ " print('I dont know.')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As condições if, podem ser agrupadas uma dentro da outra.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "7 is MUCH greater than 5\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 7\n",
+ "y = 5\n",
+ "if (x>y):\n",
+ " if abs(x-y)<1:\n",
+ " print(\"{0} is greater than {1}\".format(x, y))\n",
+ " else:\n",
+ " print(\"{0} is MUCH greater than {1}\".format(x, y))\n",
+ "elif (x==y):\n",
+ " print(\"{0} is equal to {1}\".format(x, y))\n",
+ "else:\n",
+ " print(\"{0} is smaller than {1}\".format(x, y))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# `for` loops - Ciclos condicionais `for`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Loops in Python, as in other programming languages, allows on to perform operations multiple times."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(list(range(10)))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "55\n",
+ "1+2+3+...+10 = 55\n"
+ ]
+ }
+ ],
+ "source": [
+ "# sum of the first 10 whole numbers\n",
+ "\n",
+ "gauss = 0 # the scalar 'gauss' will store the value of the running sum\n",
+ "parcelas = [] # the list parcelas will store the value of the running sum at each step\n",
+ "\n",
+ "for i in range(11):\n",
+ "\n",
+ " gauss += i\n",
+ "print(gauss)\n",
+ " \n",
+ "print(\"1+2+3+...+10 = \" + str(gauss))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0: Macro\n",
+ "---\n",
+ "1: Micro\n",
+ "---\n",
+ "2: Econometria\n",
+ "---\n",
+ "3: 537\n",
+ "---\n"
+ ]
+ }
+ ],
+ "source": [
+ "# parsing a list\n",
+ "l = [\"Macro\", \"Micro\", \"Econometria\", 537]\n",
+ "for i, v in enumerate(l):\n",
+ " # the index at each step is assigned to 'i' \n",
+ " # the value at each stpe is assigned to 'v'\n",
+ " # both 'i' and 'v' are local, and cannot be accessed outside of the loop\n",
+ " print(\"{0}: {1}\".format(i, v))\n",
+ " print(\"---\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Macro\n",
+ "Micro\n",
+ "Econometria\n",
+ "537\n"
+ ]
+ }
+ ],
+ "source": [
+ "# if you want to access only the values\n",
+ "for v in l:\n",
+ " print(v)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Macro: 20 alunos\n",
+ "Micro: 25 alunos\n",
+ "Econometria: 40 alunos\n"
+ ]
+ }
+ ],
+ "source": [
+ "# parsing a list\n",
+ "d = { \"Macro\": [\"eae302\",20], \"Micro\": [\"eae301\",25], \"Econometria\": [\"eae303\",40] }\n",
+ "for key, value in d.items():\n",
+ " print(\"{0}: {1} alunos\".format(key, value[1]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "B\n",
+ "a\n",
+ "r\n",
+ "c\n",
+ "e\n",
+ "l\n",
+ "o\n",
+ "n\n",
+ "a\n"
+ ]
+ }
+ ],
+ "source": [
+ "# parsing a string\n",
+ "s = \"Barcelona\"\n",
+ "for x in s:\n",
+ " print(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# `while` loops - Ciclos condicionais `while`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "De forma parecida com o for, o while executa o código enquanto uma condição for atendida.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "5050\n"
+ ]
+ }
+ ],
+ "source": [
+ "gauss = 0\n",
+ "i = 1\n",
+ "\n",
+ "while i<=100:\n",
+ " gauss += i\n",
+ " i += 1\n",
+ "\n",
+ "print(gauss)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Nós sabemos que $lim_{n\\rightarrow +\\infty} \\sum_{i=1}^{n}{\\frac{1}{i}} = +\\infty$. Que significa que para qualquer positivo real $S$, podemos encontrar um inteiro $n$ de tal modo que $\\sum_{i=1}^{n}{\\frac{1}{i}} > n$. No código abaixo, vamos encontrar um tal $n$ para $S=10$.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "n = 1835422\n"
+ ]
+ }
+ ],
+ "source": [
+ "S = 15 # target value for the sum\n",
+ "s = 0 # variable that will store the value of the running (partial) sum\n",
+ "i = 1\n",
+ "\n",
+ "while (s"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Example 1 (trivial): a function that takes as arguments two real numbers and returns their sum\n",
+ "def my_sum(x, y):\n",
+ " return x+y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "3\n"
+ ]
+ }
+ ],
+ "source": [
+ "# testing my_sum\n",
+ "print(my_sum(2, 1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Example 2: improving my_sum\n",
+ "def my_sum(x, y=0):\n",
+ " \"\"\"\n",
+ " my_sum(x, y=0): takes two integers (x and y) and returns their sum\n",
+ " \"\"\"\n",
+ " \n",
+ " if isinstance(x, (int, float)) and isinstance(y, (int, float)):\n",
+ " return (x+y, \"{0} + {1} = {2}\".format(x, y, x+y))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(2, '2 + 0 = 2')\n"
+ ]
+ }
+ ],
+ "source": [
+ "# testing my_sum\n",
+ "s = my_sum(1, 2)\n",
+ "#print(type(s))\n",
+ "#print(s[0])\n",
+ "#print(s[1])\n",
+ "\n",
+ "#print(my_sum.__doc__)\n",
+ "print(my_sum(2))\n",
+ "#print(my_sum(2, \"Egídio\"))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'1 + 2 = 3'"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "**2.** Write a Python program to find those numbers which are divisible by 7 and multiple of 5, between 1500 and 2700 (both included)."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def div7(x):\n if (x%7 == 0):\n return True\n else:\n return False\n \ndef div5(x):\n if (x%5 == 0):\n return True\n else:\n return False\n\nJ = []\nfor x in range(1500, 2700+1):\n if div7(x) and div5(x):\n print(x)\n J.append(x)",
- "execution_count": 9,
- "outputs": [
- {
- "output_type": "stream",
- "text": "1505\n1540\n1575\n1610\n1645\n1680\n1715\n1750\n1785\n1820\n1855\n1890\n1925\n1960\n1995\n2030\n2065\n2100\n2135\n2170\n2205\n2240\n2275\n2310\n2345\n2380\n2415\n2450\n2485\n2520\n2555\n2590\n2625\n2660\n2695\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "s[1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Example 3: sum of infinite series (see problem above)\n",
+ "def limit(S):\n",
+ "\n",
+ " s = 0\n",
+ " i = 0\n",
+ "\n",
+ " while (s 1 and f(1) = 1 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Example 5: Recursion\n",
+ "def factorial(n):\n",
+ " if n == 1:\n",
+ " return 1\n",
+ " else:\n",
+ " return n * factorial(n-1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "24"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "**6.** Write a Python program to construct the following pattern, using a nested loop number: \n1 \n22 \n333 \n4444 \n55555 \n666666 \n7777777 \n88888888 \n999999999"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Jeito errado\nfor i in range(1, 10):\n print(str(i)*i)",
- "execution_count": 30,
- "outputs": [
- {
- "output_type": "stream",
- "text": "1\n22\n333\n4444\n55555\n666666\n7777777\n88888888\n999999999\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "factorial(4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Veja esse exemplo (artigo em inglês) de como pensar de forma recursiva usando Python.\n",
+ "Nele o autor Abhirag Awasthi, mostra como o Papai Noel programaria seus elfos para entregar os presentes de natal em cada casa sem ter de passar as instruções novamente para cada uma das casas ao redor do mundo.\n",
+ "https://realpython.com/python-thinking-recursively/"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercícios"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**1.** Da coluna de Marcelo Viana (IMPA) na Folha de São Paulo em 12/08/2018: \n",
+ "*Funciona assim: considere um inteiro positivo N qualquer.*\n",
+ "- Se for par, divida por 2.\n",
+ "- Se for ímpar, multiplique por 3 e some 1.\n",
+ "- Substitua N pelo resultado obtido e siga repetindo esse procedimento.\n",
+ "\n",
+ "*Por exemplo, se começar com N=7 obterá, sucessivamente, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 e, a partir daí, a sequência só repete os números 4, 2, 1, ciclicamente.*"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def par(x):\n",
+ " if (x%2 == 0):\n",
+ " return True\n",
+ " else:\n",
+ " return False"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def Marcelo_Viana(x):\n",
+ " c = 0\n",
+ " while x != 1:\n",
+ " if par(x):\n",
+ " x = x/2\n",
+ " else:\n",
+ " x = 3*x+1\n",
+ " c += 1\n",
+ " \n",
+ " return c"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1: 0\n",
+ "2: 1\n",
+ "3: 7\n",
+ "4: 2\n",
+ "5: 5\n",
+ "6: 8\n",
+ "7: 16\n",
+ "8: 3\n",
+ "9: 19\n",
+ "10: 6\n",
+ "11: 14\n",
+ "12: 9\n",
+ "13: 9\n",
+ "14: 17\n"
+ ]
+ }
+ ],
+ "source": [
+ "for x in range(1, 15):\n",
+ " print(\"{0}: {1}\".format(x, Marcelo_Viana(x)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**2.** Escreva um script em Python para encontrar os números divisíveis por 7 e multiplos de 5, estes devem estar entre 1500 e 2700 (incluindo os dois).\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1505\n",
+ "1540\n",
+ "1575\n",
+ "1610\n",
+ "1645\n",
+ "1680\n",
+ "1715\n",
+ "1750\n",
+ "1785\n",
+ "1820\n",
+ "1855\n",
+ "1890\n",
+ "1925\n",
+ "1960\n",
+ "1995\n",
+ "2030\n",
+ "2065\n",
+ "2100\n",
+ "2135\n",
+ "2170\n",
+ "2205\n",
+ "2240\n",
+ "2275\n",
+ "2310\n",
+ "2345\n",
+ "2380\n",
+ "2415\n",
+ "2450\n",
+ "2485\n",
+ "2520\n",
+ "2555\n",
+ "2590\n",
+ "2625\n",
+ "2660\n",
+ "2695\n"
+ ]
+ }
+ ],
+ "source": [
+ "def div7(x):\n",
+ " if (x%7 == 0):\n",
+ " return True\n",
+ " else:\n",
+ " return False\n",
+ " \n",
+ "def div5(x):\n",
+ " if (x%5 == 0):\n",
+ " return True\n",
+ " else:\n",
+ " return False\n",
+ "\n",
+ "J = []\n",
+ "for x in range(1500, 2700+1):\n",
+ " if div7(x) and div5(x):\n",
+ " print(x)\n",
+ " J.append(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**3.** Escreva um código em Python para checar se um triângulo é equilátero, isósceles ou escaleno.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**4.** Escreva um programa em Python para encontrar a mediana dos valores 3,2 e 1.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def mediana(x, y, z):\n",
+ " l = [x, y, z]\n",
+ " l.sort()\n",
+ " return l[1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Jeito certo\nfor i in range(1, 10):\n for j in range(i):\n print(i, end=\"\")\n print(\"\\n\", end=\"\")",
- "execution_count": 36,
- "outputs": [
- {
- "output_type": "stream",
- "text": "1\n22\n333\n4444\n55555\n666666\n7777777\n88888888\n999999999\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mediana(3, 1, 2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**5.** Escreva um programa em Python para calcular a soma e a média de números inteiros (input do usuário). Se o usuário digitar 0, termine o programa.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def sumario():\n",
+ " \n",
+ " n = int(input(\"digite um número natural: \"))\n",
+ "\n",
+ " s = 0\n",
+ " for i in range(n):\n",
+ " x = float(input(\"digite um número: \"))\n",
+ " s += x\n",
+ " \n",
+ " return (s, s/n)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdin",
+ "output_type": "stream",
+ "text": [
+ "digite um número natural: 2\n",
+ "digite um número: 53\n",
+ "digite um número: 22\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "(75.0, 37.5)"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "**7.** Write a Python program to check the validity of password input by users.
\nValidation :
\n\nAt least 1 letter between [a-z] and 1 letter between [A-Z]. \nAt least 1 number between [0-9]. \nAt least 1 character from [$#@]. \nMinimum length 6 characters. \nMaximum length 16 characters."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# At least 1 character from [$#@]. \ndef cond_0(s):\n r = {\"$\", \"#\", \"@\"}\n if r.intersection(set(s)) == set():\n return False\n else:\n return True",
- "execution_count": 51,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Minimum length 6 characters & Maximum length 16 characters.\ndef cond_1(s):\n if len(s) >= 6 and len(s) <= 16:\n return True\n else:\n return False",
- "execution_count": 57,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# At least 1 letter between [a-z] and 1 letter between [A-Z]. \ndef cond_2(s):\n if s.lower() == s:\n return False\n elif s.upper() == s:\n return False\n else:\n return True",
- "execution_count": 3,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# At least 1 number between [0-9]\ndef cond_3(s):\n for i in range(0, 10):\n if str(i) in s:\n return True\n return False",
- "execution_count": 19,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def password(s):\n if cond_0(s) and cond_1(s) and cond_2(s) and cond_3(s):\n return True\n else:\n return False",
- "execution_count": 23,
- "outputs": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.4",
- "file_extension": ".py",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sumario()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**6.** Escreva um programa em Python que construa o resultado abaixo, usando ciclos condicionais agrupados: \n",
+ "1 \n",
+ "22 \n",
+ "333 \n",
+ "4444 \n",
+ "55555 \n",
+ "666666 \n",
+ "7777777 \n",
+ "88888888 \n",
+ "999999999"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1\n",
+ "22\n",
+ "333\n",
+ "4444\n",
+ "55555\n",
+ "666666\n",
+ "7777777\n",
+ "88888888\n",
+ "999999999\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Jeito errado\n",
+ "for i in range(1, 10):\n",
+ " print(str(i)*i)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1\n",
+ "22\n",
+ "333\n",
+ "4444\n",
+ "55555\n",
+ "666666\n",
+ "7777777\n",
+ "88888888\n",
+ "999999999\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Jeito certo\n",
+ "for i in range(1, 10):\n",
+ " for j in range(i):\n",
+ " print(i, end=\"\")\n",
+ " print(\"\\n\", end=\"\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**7.** Escreva um programa em Python para validar uma senha inserida pelo usuário.
\n",
+ "A senha deve conter: \n",
+ "\n",
+ "Pelo menos 1 letra entre [a-z] e 1 letra entre [A-Z]. \n",
+ "Pelo menos 1 número entre [0-9]. \n",
+ "Pelo menos 1 destes caracteres especiais [$#@]. \n",
+ "Mínimo de 6 caracters. \n",
+ "Máximo de 16 caracters.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# At least 1 character from [$#@]. \n",
+ "def cond_0(s):\n",
+ " r = {\"$\", \"#\", \"@\"}\n",
+ " if r.intersection(set(s)) == set():\n",
+ " return False\n",
+ " else:\n",
+ " return True"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Minimum length 6 characters & Maximum length 16 characters.\n",
+ "def cond_1(s):\n",
+ " if len(s) >= 6 and len(s) <= 16:\n",
+ " return True\n",
+ " else:\n",
+ " return False"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# At least 1 letter between [a-z] and 1 letter between [A-Z]. \n",
+ "def cond_2(s):\n",
+ " if s.lower() == s:\n",
+ " return False\n",
+ " elif s.upper() == s:\n",
+ " return False\n",
+ " else:\n",
+ " return True"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# At least 1 number between [0-9]\n",
+ "def cond_3(s):\n",
+ " for i in range(0, 10):\n",
+ " if str(i) in s:\n",
+ " return True\n",
+ " return False"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def password(s):\n",
+ " if cond_0(s) and cond_1(s) and cond_2(s) and cond_3(s):\n",
+ " return True\n",
+ " else:\n",
+ " return False"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/0-pre-requisitos/2-math/algebra_linear_com_numpy.ipynb b/0-pre-requisitos/2-math/algebra_linear_com_numpy.ipynb
old mode 100644
new mode 100755
index 4d8eb7c..54dc2d4
--- a/0-pre-requisitos/2-math/algebra_linear_com_numpy.ipynb
+++ b/0-pre-requisitos/2-math/algebra_linear_com_numpy.ipynb
@@ -1,1945 +1,3546 @@
{
- "cells": [
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# Numpy"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import numpy as np",
- "execution_count": 33,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Why `numpy`?"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import timeit",
- "execution_count": 2,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "l = range(1000)\n%timeit [i**2 for i in l]",
- "execution_count": 3,
- "outputs": [
- {
- "output_type": "stream",
- "text": "311 µs ± 6.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
- "name": "stdout"
- }
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Algebra Linear"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Conceitos de algebra linear https://youtu.be/Y0ZyUhi0khY ou https://youtu.be/D4ewzYFM8LY"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Biblioteca Numpy"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Porque usar `numpy`? \n",
+ "\n",
+ "Utilizando a biblioteca timeit conseguimos ver o tempo de processamento para o código Python criado e isso deixa claro o aumento de performance quando estamos usando a biblioteca Numpy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import timeit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "379 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "l = range(1000)\n",
+ "%timeit [i**2 for i in l]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "1.69 µs ± 37.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "a = np.arange(1000)\n",
+ "%timeit a**2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Arrays - Matrizes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Um `ndarray` é um contêiner multidimensional (geralmente de tamanho fixo) de itens do mesmo tipo e tamanho. O número de dimensões e itens em uma matriz é definido por sua forma, que é uma tupla de N inteiros positivos que especificam os tamanhos de cada dimensão. O tipo de itens na matriz é especificado por um objeto de tipo de dados separado (`dtype`), um dos quais está associado a cada ndarray.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "numpy.ndarray"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "a = np.arange(1000)\n%timeit a**2",
- "execution_count": 4,
- "outputs": [
- {
- "output_type": "stream",
- "text": "1.66 µs ± 47.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = np.ndarray(shape = (1, 4))\n",
+ "type(y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Criando uma matriz a partir de uma lista:\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [4, 5, 6]])"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Arrays"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "An `ndarray` is a (usually fixed-size) multidimensional container of items of the same type and size. The number of dimensions and items in an array is defined by its `shape`, which is a tuple of N positive integers that specify the sizes of each dimension. The type of items in the array is specified by a separate data-type object (`dtype`), one of which is associated with each ndarray."
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "y = np.ndarray(shape = (1, 4))\ntype(y)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Creating an array from a list:"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = np.array([[1, 2, 3], [4, 5, 6]], np.int)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "type(x)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.ndim",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.dtype",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Example of a 3-dimensional array"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "z = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]], np.int)\nz",
- "execution_count": 5,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 5,
- "data": {
- "text/plain": "array([[[ 1, 2, 3],\n [ 4, 5, 6]],\n\n [[ 7, 8, 9],\n [10, 11, 12]]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = np.array([[1, 2, 3], [4, 5, 6]], np.int)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "numpy.ndarray"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "print(\"Array has {0} dimensions:\".format(z.ndim))\nfor d, s in enumerate(z.shape):\n print(\"-dimension {0} has size {1}.\".format(d, s))",
- "execution_count": 6,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Array has 3 dimensions:\n-dimension 0 has size 2.\n-dimension 1 has size 2.\n-dimension 2 has size 3.\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2, 3)"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Changing size (or shape)"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.reshape(3, 2)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.resize(3, 2)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "type(x.shape)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.array([1, 2, 3, 4, 5, 6]).reshape((2, 3))\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Creating arrays"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### `np.empty`"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = np.empty(5)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.resize((5, 1))\nprint(x.shape)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "y = np.empty((5, 1))\ny",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### `np.linspace`\n"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = np.linspace(2, 10, 3)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "x.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### `np.identity`"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.identity(3)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "`np.eye(3)` would produce the same outcome."
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### `np.ones`"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.ones(3)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.ones(3, dtype=int)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "d = np.array([0, 1, 1, 0, 0], dtype=bool)\nd",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Accessing elements of an array"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.linspace(1, 9, 9)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[0]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[-1]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[2:6]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = z.reshape(3, 3)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[0:1, :]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[0:1]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[1:, 1:]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "rows = [0, 1]\nz[rows, :]",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z[:] = 10\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Array Methods"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.array([2, 1, 4, 3], dtype=float)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "print(dir(z))",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.clip(1, 2)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.array([[1, 2], [3, 4], [5, 6]])",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "a.compress([False, True, True], axis=0)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "help(np.where)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "help(np.size)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### sorting"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.argsort()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.sort()\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### statistics"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.sum()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.mean()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.var()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.std()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.max()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.argmax()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.cumsum()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.cumprod()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.shape = (2, 2)\nz",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z.T",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.searchsorted([2,3,1,4,5], 2.5)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.searchsorted([1,2,3,4,5], 3, side='right')",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.array([1, 2, 3, 4])\nb = np.array([5, 6, 7, 8])\na + b",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a * b",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a + 10",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a * 10",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A = np.ones((2, 2))\nB = np.ones((2, 2))\nA + B",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A + 10",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "B",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A * B",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A @ B",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A = np.array((1, 2))\nA",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A.shape",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "B = np.array((10, 20))\nA @ B",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A = np.array(((1, 2), (3, 4)))\nA",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "A @ (0, 1)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.dot(a, b)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.array([42, 44])\na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a[-1] = 0\na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### *Broadcasting*"
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) \na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b = np.array([1.0,2.0,3.0])\nb",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a+b",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "* Arrays have exactly the same shape.\n\n* Arrays have the same number of dimensions and the length of each dimension is either a common length or 1.\n\n* Array having too few dimensions can have its shape prepended with a dimension of length 1, so that the above stated property is true."
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.random.randn(3)\na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b = a",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b[0] = 0.0\na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a = np.random.randn(3)\na",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b = np.copy(a)\nb",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b[:] = 1\nb",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "a",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.array([1, 2, 3])\nnp.sin(z)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "n = len(z)\ny = np.empty(n)\nfor i in range(n):\n y[i] = np.sin(z[i])",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "y",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "(1 / np.sqrt(2 * np.pi)) * np.exp(- 0.5 * z**2)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "x = np.random.randn(4)\nx",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.where(x > 0, 1, 0)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "def f(x): return 1 if x > 0 else 0\n\nf = np.vectorize(f)\nf(x)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z = np.array([2, 3])\ny = np.array([2, 3])\nz == y",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "y[0] = 5\nz == y",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z != y",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "z > 3",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true,
- "trusted": false
- },
- "cell_type": "code",
- "source": "b = z > 3\nb",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Matrix Algebra ( `linalg`)"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "from numpy import linalg as lg",
- "execution_count": 8,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A = np.array([[1, 2], [3, 4]])",
- "execution_count": 9,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "a = np.array([[1,2],[3,4]]) \nb = np.array([[5,6],[7,8]])",
- "execution_count": 10,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "print(a)\nprint(b)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.concatenate((a,b))",
- "execution_count": 11,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 11,
- "data": {
- "text/plain": "array([[1, 2],\n [3, 4],\n [5, 6],\n [7, 8]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.ndim"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "dtype('int64')"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.dtype"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Exemplo de uma matriz tridimencional:\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[[ 1, 2, 3],\n",
+ " [ 4, 5, 6]],\n",
+ "\n",
+ " [[ 7, 8, 9],\n",
+ " [10, 11, 12]]])"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]], np.int)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Array has 3 dimensions:\n",
+ "-dimension 0 has size 2.\n",
+ "-dimension 1 has size 2.\n",
+ "-dimension 2 has size 3.\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Array has {0} dimensions:\".format(z.ndim))\n",
+ "for d, s in enumerate(z.shape):\n",
+ " print(\"-dimension {0} has size {1}.\".format(d, s))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Changing size (or shape) - Mudando o tamanho ou forma da matriz"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [4, 5, 6]])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2],\n",
+ " [3, 4],\n",
+ " [5, 6]])"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.reshape(3, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [4, 5, 6]])"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2],\n",
+ " [3, 4],\n",
+ " [5, 6]])"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.resize(3, 2)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tuple"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(x.shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [4, 5, 6]])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.array([1, 2, 3, 4, 5, 6]).reshape((2, 3))\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Creating arrays - Criando Matrizes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### `np.empty`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0., 0., 0., 0., 0.])"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = np.empty(5)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(5,)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(5, 1)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.],\n",
+ " [0.],\n",
+ " [0.],\n",
+ " [0.],\n",
+ " [0.]])"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.resize((5, 1))\n",
+ "print(x.shape)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.],\n",
+ " [0.],\n",
+ " [0.],\n",
+ " [0.],\n",
+ " [0.]])"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y = np.empty((5, 1))\n",
+ "y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### `np.linspace`\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 2., 6., 10.])"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = np.linspace(2, 10, 3)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(3,)"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### `np.identity`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 0., 0.],\n",
+ " [0., 1., 0.],\n",
+ " [0., 0., 1.]])"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.identity(3)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "`np.eye(3)` would produce the same outcome."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### `np.ones`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 1., 1.])"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.ones(3)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(3,)"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 1, 1])"
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.ones(3, dtype=int)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([False, True, True, False, False])"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "d = np.array([0, 1, 1, 0, 0], dtype=bool)\n",
+ "d"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Accessing elements of an array - Acessando elementos da matriz"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 2., 3., 4., 5., 6., 7., 8., 9.])"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.linspace(1, 9, 9)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(9,)"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.0"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "9.0"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[-1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([3., 4., 5., 6.])"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[2:6]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 2., 3.],\n",
+ " [4., 5., 6.],\n",
+ " [7., 8., 9.]])"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = z.reshape(3, 3)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(3, 3)"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 2., 3.]])"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[0:1, :]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 2., 3.]])"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[0:1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[5., 6.],\n",
+ " [8., 9.]])"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[1:, 1:]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 2., 3.],\n",
+ " [4., 5., 6.]])"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rows = [0, 1]\n",
+ "z[rows, :]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[10., 10., 10.],\n",
+ " [10., 10., 10.],\n",
+ " [10., 10., 10.]])"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z[:] = 10\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Array Methods - Métodos para Matrizes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2., 1., 4., 3.])"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.array([2, 1, 4, 3], dtype=float)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['T', '__abs__', '__add__', '__and__', '__array__', '__array_finalize__', '__array_interface__', '__array_prepare__', '__array_priority__', '__array_struct__', '__array_ufunc__', '__array_wrap__', '__bool__', '__class__', '__complex__', '__contains__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__iand__', '__ifloordiv__', '__ilshift__', '__imatmul__', '__imod__', '__imul__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__', '__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', '__lshift__', '__lt__', '__matmul__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmatmul__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__setitem__', '__setstate__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__xor__', 'all', 'any', 'argmax', 'argmin', 'argpartition', 'argsort', 'astype', 'base', 'byteswap', 'choose', 'clip', 'compress', 'conj', 'conjugate', 'copy', 'ctypes', 'cumprod', 'cumsum', 'data', 'diagonal', 'dot', 'dtype', 'dump', 'dumps', 'fill', 'flags', 'flat', 'flatten', 'getfield', 'imag', 'item', 'itemset', 'itemsize', 'max', 'mean', 'min', 'nbytes', 'ndim', 'newbyteorder', 'nonzero', 'partition', 'prod', 'ptp', 'put', 'ravel', 'real', 'repeat', 'reshape', 'resize', 'round', 'searchsorted', 'setfield', 'setflags', 'shape', 'size', 'sort', 'squeeze', 'std', 'strides', 'sum', 'swapaxes', 'take', 'tobytes', 'tofile', 'tolist', 'tostring', 'trace', 'transpose', 'var', 'view']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(dir(z))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2., 1., 2., 2.])"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.clip(1, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = np.array([[1, 2], [3, 4], [5, 6]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[3, 4],\n",
+ " [5, 6]])"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a.compress([False, True, True], axis=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on built-in function where in module numpy.core.multiarray:\n",
+ "\n",
+ "where(...)\n",
+ " where(condition, [x, y])\n",
+ " \n",
+ " Return elements, either from `x` or `y`, depending on `condition`.\n",
+ " \n",
+ " If only `condition` is given, return ``condition.nonzero()``.\n",
+ " \n",
+ " Parameters\n",
+ " ----------\n",
+ " condition : array_like, bool\n",
+ " When True, yield `x`, otherwise yield `y`.\n",
+ " x, y : array_like, optional\n",
+ " Values from which to choose. `x`, `y` and `condition` need to be\n",
+ " broadcastable to some shape.\n",
+ " \n",
+ " Returns\n",
+ " -------\n",
+ " out : ndarray or tuple of ndarrays\n",
+ " If both `x` and `y` are specified, the output array contains\n",
+ " elements of `x` where `condition` is True, and elements from\n",
+ " `y` elsewhere.\n",
+ " \n",
+ " If only `condition` is given, return the tuple\n",
+ " ``condition.nonzero()``, the indices where `condition` is True.\n",
+ " \n",
+ " See Also\n",
+ " --------\n",
+ " nonzero, choose\n",
+ " \n",
+ " Notes\n",
+ " -----\n",
+ " If `x` and `y` are given and input arrays are 1-D, `where` is\n",
+ " equivalent to::\n",
+ " \n",
+ " [xv if c else yv for (c,xv,yv) in zip(condition,x,y)]\n",
+ " \n",
+ " Examples\n",
+ " --------\n",
+ " >>> np.where([[True, False], [True, True]],\n",
+ " ... [[1, 2], [3, 4]],\n",
+ " ... [[9, 8], [7, 6]])\n",
+ " array([[1, 8],\n",
+ " [3, 4]])\n",
+ " \n",
+ " >>> np.where([[0, 1], [1, 0]])\n",
+ " (array([0, 1]), array([1, 0]))\n",
+ " \n",
+ " >>> x = np.arange(9.).reshape(3, 3)\n",
+ " >>> np.where( x > 5 )\n",
+ " (array([2, 2, 2]), array([0, 1, 2]))\n",
+ " >>> x[np.where( x > 3.0 )] # Note: result is 1D.\n",
+ " array([ 4., 5., 6., 7., 8.])\n",
+ " >>> np.where(x < 5, x, -1) # Note: broadcasting.\n",
+ " array([[ 0., 1., 2.],\n",
+ " [ 3., 4., -1.],\n",
+ " [-1., -1., -1.]])\n",
+ " \n",
+ " Find the indices of elements of `x` that are in `goodvalues`.\n",
+ " \n",
+ " >>> goodvalues = [3, 4, 7]\n",
+ " >>> ix = np.isin(x, goodvalues)\n",
+ " >>> ix\n",
+ " array([[False, False, False],\n",
+ " [ True, True, False],\n",
+ " [False, True, False]])\n",
+ " >>> np.where(ix)\n",
+ " (array([1, 1, 2]), array([0, 1, 1]))\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(np.where)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function size in module numpy.core.fromnumeric:\n",
+ "\n",
+ "size(a, axis=None)\n",
+ " Return the number of elements along a given axis.\n",
+ " \n",
+ " Parameters\n",
+ " ----------\n",
+ " a : array_like\n",
+ " Input data.\n",
+ " axis : int, optional\n",
+ " Axis along which the elements are counted. By default, give\n",
+ " the total number of elements.\n",
+ " \n",
+ " Returns\n",
+ " -------\n",
+ " element_count : int\n",
+ " Number of elements along the specified axis.\n",
+ " \n",
+ " See Also\n",
+ " --------\n",
+ " shape : dimensions of array\n",
+ " ndarray.shape : dimensions of array\n",
+ " ndarray.size : number of elements in array\n",
+ " \n",
+ " Examples\n",
+ " --------\n",
+ " >>> a = np.array([[1,2,3],[4,5,6]])\n",
+ " >>> np.size(a)\n",
+ " 6\n",
+ " >>> np.size(a,1)\n",
+ " 3\n",
+ " >>> np.size(a,0)\n",
+ " 2\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "help(np.size)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### sorting - ordenação"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 0, 3, 2])"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.argsort()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 2., 3., 4.])"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.sort()\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### statistics - estatísticos"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10.0"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.5"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.mean()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.25"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.var()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.118033988749895"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.std()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "4.0"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.max()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 2., 3., 4.])"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.argmax()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 1., 3., 6., 10.])"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.cumsum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 1., 2., 6., 24.])"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.cumprod()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 2.],\n",
+ " [3., 4.]])"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.shape = (2, 2)\n",
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 3.],\n",
+ " [2., 4.]])"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z.T"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.searchsorted([2,3,1,4,5], 2.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.searchsorted([1,2,3,4,5], 3, side='right')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 5, 1, 2])"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 6, 8, 10, 12])"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.array([1, 2, 3, 4])\n",
+ "b = np.array([5, 6, 7, 8])\n",
+ "a + b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 5, 12, 21, 32])"
+ ]
+ },
+ "execution_count": 67,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a * b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([11, 12, 13, 14])"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a + 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([10, 20, 30, 40])"
+ ]
+ },
+ "execution_count": 69,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a * 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[2., 2.],\n",
+ " [2., 2.]])"
+ ]
+ },
+ "execution_count": 70,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.ones((2, 2))\n",
+ "B = np.ones((2, 2))\n",
+ "A + B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[11., 11.],\n",
+ " [11., 11.]])"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A + 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 1.],\n",
+ " [1., 1.]])"
+ ]
+ },
+ "execution_count": 72,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 1.],\n",
+ " [1., 1.]])"
+ ]
+ },
+ "execution_count": 73,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1., 1.],\n",
+ " [1., 1.]])"
+ ]
+ },
+ "execution_count": 74,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A * B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[2., 2.],\n",
+ " [2., 2.]])"
+ ]
+ },
+ "execution_count": 75,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A @ B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 2])"
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.array((1, 2))\n",
+ "A"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2,)"
+ ]
+ },
+ "execution_count": 77,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "50"
+ ]
+ },
+ "execution_count": 78,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "B = np.array((10, 20))\n",
+ "A @ B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2],\n",
+ " [3, 4]])"
+ ]
+ },
+ "execution_count": 79,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.array(((1, 2), (3, 4)))\n",
+ "A"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2, 4])"
+ ]
+ },
+ "execution_count": 80,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A @ (0, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "70"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.dot(a, b)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([42, 44])"
+ ]
+ },
+ "execution_count": 82,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.array([42, 44])\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([42, 0])"
+ ]
+ },
+ "execution_count": 83,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a[-1] = 0\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### *Broadcasting*"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 84,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 0., 0., 0.],\n",
+ " [10., 10., 10.],\n",
+ " [20., 20., 20.],\n",
+ " [30., 30., 30.]])"
+ ]
+ },
+ "execution_count": 84,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) \n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 85,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 2., 3.])"
+ ]
+ },
+ "execution_count": 85,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b = np.array([1.0,2.0,3.0])\n",
+ "b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 86,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 1., 2., 3.],\n",
+ " [11., 12., 13.],\n",
+ " [21., 22., 23.],\n",
+ " [31., 32., 33.]])"
+ ]
+ },
+ "execution_count": 86,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a+b"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "* Matrizes têm exatamente a mesma forma.\n",
+ "\n",
+ "* Matrizes têm o mesmo número de dimensões e o comprimento de cada dimensão é um comprimento comum ou 1.\n",
+ "\n",
+ "* Matriz com poucas dimensões pode ter sua forma prefixada com uma dimensão de comprimento 1, de modo que a propriedade declarada acima seja verdadeira.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 87,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0.20676523, -0.33305647, -1.72249529])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.concatenate((a,b), axis = 1)",
- "execution_count": 12,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 12,
- "data": {
- "text/plain": "array([[1, 2, 5, 6],\n [3, 4, 7, 8]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 87,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.random.randn(3)\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 88,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "b = a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 89,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0.20676523, -0.33305647, -1.72249529])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.det(A)",
- "execution_count": 13,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 13,
- "data": {
- "text/plain": "-2.0000000000000004"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 89,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 90,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0. , -0.33305647, -1.72249529])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.inv(A)",
- "execution_count": 14,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 14,
- "data": {
- "text/plain": "array([[-2. , 1. ],\n [ 1.5, -0.5]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 90,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b[0] = 0.0\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 91,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.2052576 , 0.5882943 , -0.94636507])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.matrix_rank(A)",
- "execution_count": 15,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 15,
- "data": {
- "text/plain": "2"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 91,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.random.randn(3)\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 92,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.2052576 , 0.5882943 , -0.94636507])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "B = np.array([[1, 2, 3], [4, 5, 6]])\nB",
- "execution_count": 19,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 19,
- "data": {
- "text/plain": "array([[1, 2, 3],\n [4, 5, 6]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 92,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b = np.copy(a)\n",
+ "b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 93,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1., 1., 1.])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.matrix_rank(B)",
- "execution_count": 21,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 21,
- "data": {
- "text/plain": "2"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 93,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b[:] = 1\n",
+ "b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.2052576 , 0.5882943 , -0.94636507])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A = np.array([1, 2, 4, 5]).reshape(2, 2)\nb = np.array([3, 6]).reshape(2, 1)\nlg.inv(A) @ b",
- "execution_count": 26,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 26,
- "data": {
- "text/plain": "array([[-1.],\n [ 2.]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 95,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0.84147098, 0.90929743, 0.14112001])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.solve(A, b)",
- "execution_count": 33,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 33,
- "data": {
- "text/plain": "array([[-1.],\n [ 2.]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 95,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.array([1, 2, 3])\n",
+ "np.sin(z)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 96,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "n = len(z)\n",
+ "y = np.empty(n)\n",
+ "for i in range(n):\n",
+ " y[i] = np.sin(z[i])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 97,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0.84147098, 0.90929743, 0.14112001])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "print(dir(lg))",
- "execution_count": 31,
- "outputs": [
- {
- "output_type": "stream",
- "text": "['LinAlgError', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_umath_linalg', 'absolute_import', 'cholesky', 'cond', 'det', 'division', 'eig', 'eigh', 'eigvals', 'eigvalsh', 'info', 'inv', 'lapack_lite', 'linalg', 'lstsq', 'matrix_power', 'matrix_rank', 'multi_dot', 'norm', 'pinv', 'print_function', 'qr', 'slogdet', 'solve', 'svd', 'tensorinv', 'tensorsolve', 'test']\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 97,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 98,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([1, 2, 3])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.norm(A)",
- "execution_count": 34,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 34,
- "data": {
- "text/plain": "6.782329983125268"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 98,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0.24197072, 0.05399097, 0.00443185])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "lg.norm((3, 4))",
- "execution_count": 35,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 35,
- "data": {
- "text/plain": "5.0"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 99,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(1 / np.sqrt(2 * np.pi)) * np.exp(- 0.5 * z**2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 100,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-1.27999742, -0.18235141, 0.66829548, 0.41627219])"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### Exercício 0: Input-Output Matrix"
- },
- {
- "metadata": {
- "trusted": true,
- "scrolled": true
- },
- "cell_type": "code",
- "source": "ls /home/nbuser/library",
- "execution_count": 19,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Aula_01.ipynb Aula_03.ipynb \u001b[0m\u001b[01;34mdata\u001b[0m/\r\nAula_02.ipynb Aula_04.ipynb sorteio.ipynb\r\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 100,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = np.random.randn(4)\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 1, 1])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "ls /home/nbuser/library/data",
- "execution_count": 20,
- "outputs": [
- {
- "output_type": "stream",
- "text": "alunos.csv tech_coef.csv\r\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 101,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.where(x > 0, 1, 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([0, 0, 1, 1])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A = np.loadtxt('/home/nbuser/library/data/tech_coef.csv')",
- "execution_count": 21,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A.shape",
- "execution_count": 22,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 22,
- "data": {
- "text/plain": "(12, 12)"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 102,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def f(x): return 1 if x > 0 else 0\n",
+ "\n",
+ "f = np.vectorize(f)\n",
+ "f(x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ True, True])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "sectors = { \"Agropecuária\": 0,\n \"Indústria extrativa\": 1,\n \"Indústria de transformação\": 2,\n \"Utilidades\": 3,\n \"Construção civil\": 4,\n \"Comércio\": 5,\n \"Transporte\": 6,\n \"Serviços de informação\": 7,\n \"Intermediação financeira\": 8,\n \"Atividades imobiliárias\": 9,\n \"Outros serviços\": 10,\n \"Administração pública\": 11 }",
- "execution_count": 27,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "impact = []\nsec = []\nfor sector, id in sectors.items():\n i = \"{0:0.4f}\".format(A[:,id].sum())\n print(sector, \": \", i, sep='')\n impact.append(i)\n sec.append(sector)",
- "execution_count": 26,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Indústria de transformação: 0.6058\nComércio: 0.3078\nAtividades imobiliárias: 0.0580\nServiços de informação: 0.4191\nUtilidades: 0.4452\nTransporte: 0.4553\nOutros serviços: 0.3284\nConstrução civil: 0.4399\nAgropecuária: 0.3520\nAdministração pública: 0.2490\nIndústria extrativa: 0.3419\nIntermediação financeira: 0.3296\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 103,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z = np.array([2, 3])\n",
+ "y = np.array([2, 3])\n",
+ "z == y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([False, True])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import matplotlib.pyplot as plt\npos = np.arange(12)\n\nplt.barh(pos, impact, align='center', height=.8, color='r')\nplt.yticks(pos, sec)\nplt.xlim((0, .7))\nfor i, v in enumerate(impact):\n l = \"{0:.2f}\".format(float(v))\n plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\nplt.show()",
- "execution_count": 32,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {}
- }
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "y[0] = 5\n",
+ "z == y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ True, False])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "L = np.linalg.inv(np.eye(len(sectors))-A)\nd = np.zeros(12).reshape(12, 1)\nd[2, 0] = 1\n\nimpact = L@d\npos = np.arange(12)\n\nplt.barh(pos, impact, align='center', height=.8, color='r')\nplt.yticks(pos, sec)\nplt.xlim((0,1.7))\nfor i, v in enumerate(impact):\n l = \"{0:.2f}\".format(float(v))\n plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\nplt.show()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "impact = []\nsec = []\nfor sector, id in sectors.items():\n i = \"{0:0.4f}\".format(L[:,id].sum())\n print(sector, \": \", i, sep='')\n impact.append(i)\n sec.append(sector)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "pos = np.arange(12)\n\nplt.barh(pos, impact, align='center', height=.8, color='r')\nplt.yticks(pos, sec)\nplt.xlim((0,2.3))\nfor i, v in enumerate(impact):\n l = \"{0:.2f}\".format(float(v))\n plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\nplt.show()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Random arrays (`random`)"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "from numpy import random as rd",
- "execution_count": 34,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.rand(3, 2)",
- "execution_count": 37,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 37,
- "data": {
- "text/plain": "array([[0.41275145, 0.92513523],\n [0.147698 , 0.79403711],\n [0.86205034, 0.75643253]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 105,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z != y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([False, False])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.random.rand(3, 2)",
- "execution_count": 38,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 38,
- "data": {
- "text/plain": "array([[0.42902137, 0.17576067],\n [0.5861823 , 0.55467978],\n [0.14108171, 0.39161468]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 106,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "z > 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([False, False])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.seed(1910)\nnp.random.rand(3, 2)",
- "execution_count": 39,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 39,
- "data": {
- "text/plain": "array([[0.0504399 , 0.21857161],\n [0.18244948, 0.23708749],\n [0.2995859 , 0.56284799]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 107,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "b = z > 3\n",
+ "b"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Matrix Algebra ( `linalg`) - Algebra Matricial"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from numpy import linalg as lg"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 109,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "A = np.array([[1, 2], [3, 4]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = np.array([[1,2],[3,4]]) \n",
+ "b = np.array([[5,6],[7,8]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 111,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[[1 2]\n",
+ " [3 4]]\n",
+ "[[5 6]\n",
+ " [7 8]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(a)\n",
+ "print(b)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 112,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2],\n",
+ " [3, 4],\n",
+ " [5, 6],\n",
+ " [7, 8]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.seed(1910)\nnp.random.rand(3, 2)",
- "execution_count": 40,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 40,
- "data": {
- "text/plain": "array([[0.0504399 , 0.21857161],\n [0.18244948, 0.23708749],\n [0.2995859 , 0.56284799]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 112,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.concatenate((a,b))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 113,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 5, 6],\n",
+ " [3, 4, 7, 8]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.randn(2, 1)",
- "execution_count": 41,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 41,
- "data": {
- "text/plain": "array([[ 1.54773602],\n [-2.05072622]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 113,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.concatenate((a,b), axis = 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 114,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-2.0000000000000004"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.randint(10, 20, size=5, dtype=np.int)",
- "execution_count": 42,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 42,
- "data": {
- "text/plain": "array([15, 19, 18, 16, 12])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 114,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.det(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 115,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-2. , 1. ],\n",
+ " [ 1.5, -0.5]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "pop = np.linspace(0, 99, 100)",
- "execution_count": 44,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "pop",
- "execution_count": 45,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 45,
- "data": {
- "text/plain": "array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,\n 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,\n 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,\n 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51.,\n 52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62., 63., 64.,\n 65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77.,\n 78., 79., 80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90.,\n 91., 92., 93., 94., 95., 96., 97., 98., 99.])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 115,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.inv(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 116,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.arange(100)",
- "execution_count": 46,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 46,
- "data": {
- "text/plain": "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,\n 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,\n 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 116,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.matrix_rank(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 117,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [4, 5, 6]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.choice(pop, size=(10, 1), replace=False)",
- "execution_count": 48,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 48,
- "data": {
- "text/plain": "array([[42.],\n [53.],\n [68.],\n [82.],\n [45.],\n [27.],\n [79.],\n [56.],\n [52.],\n [31.]])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 117,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "B = np.array([[1, 2, 3], [4, 5, 6]])\n",
+ "B"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 118,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.shuffle(pop)\npop",
- "execution_count": 49,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 49,
- "data": {
- "text/plain": "array([75., 66., 17., 56., 11., 54., 63., 40., 35., 36., 20., 48., 21.,\n 42., 84., 72., 14., 67., 65., 94., 26., 80., 13., 3., 73., 88.,\n 9., 85., 96., 77., 62., 24., 70., 61., 33., 43., 23., 38., 31.,\n 59., 4., 60., 78., 7., 15., 30., 82., 37., 90., 34., 76., 41.,\n 81., 58., 87., 32., 5., 74., 92., 64., 45., 25., 6., 69., 91.,\n 46., 51., 86., 55., 95., 47., 28., 12., 19., 83., 93., 10., 44.,\n 29., 39., 52., 89., 53., 2., 18., 79., 16., 1., 49., 27., 71.,\n 57., 0., 98., 22., 50., 68., 97., 99., 8.])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 118,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.matrix_rank(B)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 119,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-1.],\n",
+ " [ 2.]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "rd.permutation(pop)",
- "execution_count": 50,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 50,
- "data": {
- "text/plain": "array([71., 8., 43., 70., 64., 4., 16., 67., 13., 79., 41., 86., 5.,\n 73., 27., 60., 39., 40., 65., 1., 35., 51., 45., 80., 7., 26.,\n 81., 33., 63., 38., 28., 74., 76., 94., 50., 99., 59., 69., 34.,\n 25., 62., 15., 31., 19., 78., 95., 84., 44., 96., 91., 85., 23.,\n 83., 36., 75., 21., 66., 98., 72., 90., 56., 93., 22., 55., 54.,\n 97., 42., 29., 48., 14., 11., 17., 12., 18., 32., 68., 77., 6.,\n 3., 53., 30., 61., 37., 88., 0., 46., 87., 9., 52., 20., 49.,\n 24., 58., 57., 89., 82., 47., 92., 2., 10.])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 119,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.array([1, 2, 4, 5]).reshape(2, 2)\n",
+ "b = np.array([3, 6]).reshape(2, 1)\n",
+ "lg.inv(A) @ b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-1.],\n",
+ " [ 2.]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "pop",
- "execution_count": 51,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 51,
- "data": {
- "text/plain": "array([75., 66., 17., 56., 11., 54., 63., 40., 35., 36., 20., 48., 21.,\n 42., 84., 72., 14., 67., 65., 94., 26., 80., 13., 3., 73., 88.,\n 9., 85., 96., 77., 62., 24., 70., 61., 33., 43., 23., 38., 31.,\n 59., 4., 60., 78., 7., 15., 30., 82., 37., 90., 34., 76., 41.,\n 81., 58., 87., 32., 5., 74., 92., 64., 45., 25., 6., 69., 91.,\n 46., 51., 86., 55., 95., 47., 28., 12., 19., 83., 93., 10., 44.,\n 29., 39., 52., 89., 53., 2., 18., 79., 16., 1., 49., 27., 71.,\n 57., 0., 98., 22., 50., 68., 97., 99., 8.])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 120,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.solve(A, b)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 121,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['LinAlgError', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_numpy_tester', '_umath_linalg', 'absolute_import', 'bench', 'cholesky', 'cond', 'det', 'division', 'eig', 'eigh', 'eigvals', 'eigvalsh', 'info', 'inv', 'lapack_lite', 'linalg', 'lstsq', 'matrix_power', 'matrix_rank', 'multi_dot', 'norm', 'pinv', 'print_function', 'qr', 'slogdet', 'solve', 'svd', 'tensorinv', 'tensorsolve', 'test']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(dir(lg))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 122,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "6.782329983125268"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "print(dir(rd))",
- "execution_count": 52,
- "outputs": [
- {
- "output_type": "stream",
- "text": "['Lock', 'RandomState', '__RandomState_ctor', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'absolute_import', 'beta', 'binomial', 'bytes', 'chisquare', 'choice', 'dirichlet', 'division', 'exponential', 'f', 'gamma', 'geometric', 'get_state', 'gumbel', 'hypergeometric', 'info', 'laplace', 'logistic', 'lognormal', 'logseries', 'mtrand', 'multinomial', 'multivariate_normal', 'negative_binomial', 'noncentral_chisquare', 'noncentral_f', 'normal', 'np', 'operator', 'pareto', 'permutation', 'poisson', 'power', 'print_function', 'rand', 'randint', 'randn', 'random', 'random_integers', 'random_sample', 'ranf', 'rayleigh', 'sample', 'seed', 'set_state', 'shuffle', 'standard_cauchy', 'standard_exponential', 'standard_gamma', 'standard_normal', 'standard_t', 'test', 'triangular', 'uniform', 'vonmises', 'wald', 'warnings', 'weibull', 'zipf']\n",
- "name": "stdout"
- }
+ },
+ "execution_count": 122,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.norm(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5.0"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### Exercise 1"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "mu = 4\nsigma = 12\nn = 50\nN = int(1e5)",
- "execution_count": 35,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A = rd.normal(loc=mu, scale=sigma, size=(n, N))",
- "execution_count": 36,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "avg = np.mean(A, axis=0)",
- "execution_count": 37,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "avg.shape",
- "execution_count": 38,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 38,
- "data": {
- "text/plain": "(100000,)"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 123,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lg.norm((3, 4))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Exercício 0: Input-Output Matrix"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 131,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "ls: /home/nbuser/library: No such file or directory\n"
+ ]
+ }
+ ],
+ "source": [
+ "ls /home/nbuser/library"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "A = np.loadtxt('/Users/marcelocolonno/Desktop/git/datascience_course/0-pre-requisitos/2-math/data/tech_coef.csv')\n",
+ "#/Users/marcelocolonno/Desktop/git/datascience_course/0-pre-requisitos/2-math/data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 125,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(12, 12)"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.var(avg)",
- "execution_count": 39,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 39,
- "data": {
- "text/plain": "2.8750101224970765"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 125,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 134,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sectors = { \"Agropecuária\": 0,\n",
+ " \"Indústria extrativa\": 1,\n",
+ " \"Indústria de transformação\": 2,\n",
+ " \"Utilidades\": 3,\n",
+ " \"Construção civil\": 4,\n",
+ " \"Comércio\": 5,\n",
+ " \"Transporte\": 6,\n",
+ " \"Serviços de informação\": 7,\n",
+ " \"Intermediação financeira\": 8,\n",
+ " \"Atividades imobiliárias\": 9,\n",
+ " \"Outros serviços\": 10,\n",
+ " \"Administração pública\": 11 }"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Agropecuária: 0.3520\n",
+ "Indústria extrativa: 0.3419\n",
+ "Indústria de transformação: 0.6058\n",
+ "Utilidades: 0.4452\n",
+ "Construção civil: 0.4399\n",
+ "Comércio: 0.3078\n",
+ "Transporte: 0.4553\n",
+ "Serviços de informação: 0.4191\n",
+ "Intermediação financeira: 0.3296\n",
+ "Atividades imobiliárias: 0.0580\n",
+ "Outros serviços: 0.3284\n",
+ "Administração pública: 0.2490\n"
+ ]
+ }
+ ],
+ "source": [
+ "impact = []\n",
+ "sec = []\n",
+ "for sector, id in sectors.items():\n",
+ " i = \"{0:0.4f}\".format(A[:,id].sum())\n",
+ " print(sector, \": \", i, sep='')\n",
+ " impact.append(i)\n",
+ " sec.append(sector)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 179,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "sigma**2/n",
- "execution_count": 40,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 40,
- "data": {
- "text/plain": "2.88"
- },
- "metadata": {}
- }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "pos = np.arange(12)\n",
+ "\n",
+ "for i in range(12):\n",
+ " plt.barh(pos[i], impact[i], align='center', height=.8, color='r')\n",
+ " plt.yticks(pos, sec)\n",
+ " plt.xlim((0, 2.0))\n",
+ "\n",
+ "for i, v in enumerate(impact):\n",
+ " l = \"{0:.2f}\".format(float(v))\n",
+ " plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "markdown",
- "source": "#### Exercise 2: Law of Large Numbers\nAs the number of identically distributed, randomly generated variables increases, their sample mean (average) approaches their theoretical mean."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x = np.linspace(0, 4, 5)\nsize = np.logspace(0, 4, 5)\ndraws = 100\nmu = 0\nsigma = 1\n\nDATA = []\n\nfor s in size:\n d = np.random.normal(loc=mu, scale=sigma, size=(draws, int(s)))\n DATA.append(d.mean(axis=1))",
- "execution_count": 41,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import matplotlib.pyplot as plt\nplt.boxplot(DATA)\nplt.xticks([1, 2, 3, 4, 5], ['$10^0$', '$10^1$', '$10^2$', '$10^3$', '$10^4$'])\nplt.xlabel('sample size')\nplt.title(\"Distribution of the mean\\n{0} replications for each sample size\".format(draws))\nplt.show()",
- "execution_count": 43,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {}
- }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "L = np.linalg.inv(np.eye(len(sectors))-A)\n",
+ "d = np.zeros(12).reshape(12, 1)\n",
+ "d[2, 0] = 1\n",
+ "\n",
+ "impact = L@d\n",
+ "pos = np.arange(12)\n",
+ "\n",
+ "for i in range(12):\n",
+ " plt.barh(pos[i], impact[i], align='center', height=.8, color='r')\n",
+ " plt.yticks(pos, sec)\n",
+ " plt.xlim((0,1.7))\n",
+ " \n",
+ "for i, v in enumerate(impact):\n",
+ " l = \"{0:.2f}\".format(float(v))\n",
+ " plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 182,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Agropecuária: 1.6731\n",
+ "Indústria extrativa: 1.6181\n",
+ "Indústria de transformação: 2.1342\n",
+ "Utilidades: 1.7976\n",
+ "Construção civil: 1.8425\n",
+ "Comércio: 1.5198\n",
+ "Transporte: 1.8479\n",
+ "Serviços de informação: 1.6966\n",
+ "Intermediação financeira: 1.5236\n",
+ "Atividades imobiliárias: 1.0954\n",
+ "Outros serviços: 1.5636\n",
+ "Administração pública: 1.4200\n"
+ ]
+ }
+ ],
+ "source": [
+ "impact = []\n",
+ "sec = []\n",
+ "for sector, id in sectors.items():\n",
+ " i = \"{0:0.4f}\".format(L[:,id].sum())\n",
+ " print(sector, \": \", i, sep='')\n",
+ " impact.append(i)\n",
+ " sec.append(sector)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "#### Exercise 3: Central Limit Theorem\nsource: Wolfram MathWorld"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import math\n\nn_bins = 50\ndraws = int(1e4)\n\nk = 0.5\ntheta = 1.0\nmu = k*theta\nsigma = math.sqrt(k)*theta\n\nS = [10, 30, 50, 100]\n\nfig, axes = plt.subplots(nrows=2, ncols=2)\nax = axes.flatten()\n\n# normal pdf\nnormpdf = lambda x: (1/math.sqrt(2*math.pi))*math.exp(-x**2/2)\nt = np.linspace(-4,4,50)\ny = [y for y in map(normpdf, t)]\n\nfor i, x in enumerate(ax):\n n = S[i]\n s = np.random.gamma(shape = k, scale = theta, size = (draws, n))\n s = (np.mean(s, axis=1)-mu)/(sigma/math.sqrt(n))\n x.hist(s, n_bins, range = (-4, 4), normed=1, histtype='stepfilled', color = 'gray')\n x.plot(t, y, 'r', linewidth=3)\n x.set_yticklabels([])\n x.set_title('n = {0}'.format(n))\n\nfig.tight_layout()\nplt.show()",
- "execution_count": 11,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {}
- }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pos = np.arange(12)\n",
+ "\n",
+ "for i in range(12):\n",
+ " plt.barh(pos[i], impact[i], align='edge', height=.8, color='r')\n",
+ " plt.yticks(pos, sec)\n",
+ " plt.xlim((0,2.3))\n",
+ " \n",
+ "for i, v in enumerate(impact):\n",
+ " l = \"{0:.2f}\".format(float(v))\n",
+ " plt.text(float(v)+.01, i-.25, \"{0:.2f}\".format(float(v)), color='black', fontweight='bold')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Random arrays (`random`) - Matrizes Randomicas"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from numpy import random as rd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.33504551, 0.44071867],\n",
+ " [0.8455523 , 0.57913819],\n",
+ " [0.68006321, 0.60939797]])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "",
- "execution_count": null,
- "outputs": []
- }
- ],
- "metadata": {
- "anaconda-cloud": {},
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "file_extension": ".py",
- "version": "3.5.4",
- "pygments_lexer": "ipython3",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ },
+ "execution_count": 188,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.rand(3, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.41042948, 0.31241154],\n",
+ " [0.93695509, 0.27320886],\n",
+ " [0.12268868, 0.87671031]])"
+ ]
+ },
+ "execution_count": 189,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.random.rand(3, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 190,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.0504399 , 0.21857161],\n",
+ " [0.18244948, 0.23708749],\n",
+ " [0.2995859 , 0.56284799]])"
+ ]
+ },
+ "execution_count": 190,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.seed(1910)\n",
+ "np.random.rand(3, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 191,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[0.0504399 , 0.21857161],\n",
+ " [0.18244948, 0.23708749],\n",
+ " [0.2995859 , 0.56284799]])"
+ ]
+ },
+ "execution_count": 191,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.seed(1910)\n",
+ "np.random.rand(3, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 1.54773602],\n",
+ " [-2.05072622]])"
+ ]
+ },
+ "execution_count": 192,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.randn(2, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([15, 19, 18, 16, 12])"
+ ]
+ },
+ "execution_count": 193,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.randint(10, 20, size=5, dtype=np.int)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 194,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pop = np.linspace(0, 99, 100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,\n",
+ " 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,\n",
+ " 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,\n",
+ " 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51.,\n",
+ " 52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62., 63., 64.,\n",
+ " 65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77.,\n",
+ " 78., 79., 80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90.,\n",
+ " 91., 92., 93., 94., 95., 96., 97., 98., 99.])"
+ ]
+ },
+ "execution_count": 195,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pop"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 196,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n",
+ " 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n",
+ " 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n",
+ " 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,\n",
+ " 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,\n",
+ " 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])"
+ ]
+ },
+ "execution_count": 196,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.arange(100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 197,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[41.],\n",
+ " [92.],\n",
+ " [ 7.],\n",
+ " [37.],\n",
+ " [68.],\n",
+ " [27.],\n",
+ " [61.],\n",
+ " [40.],\n",
+ " [74.],\n",
+ " [46.]])"
+ ]
+ },
+ "execution_count": 197,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.choice(pop, size=(10, 1), replace=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 198,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([24., 26., 41., 31., 82., 36., 48., 76., 20., 90., 3., 69., 9.,\n",
+ " 79., 67., 62., 74., 40., 54., 96., 13., 56., 33., 23., 85., 92.,\n",
+ " 4., 14., 11., 21., 35., 58., 94., 7., 15., 30., 42., 37., 63.,\n",
+ " 97., 60., 73., 61., 78., 91., 93., 66., 83., 45., 25., 6., 59.,\n",
+ " 46., 51., 43., 95., 64., 38., 55., 86., 98., 47., 81., 28., 12.,\n",
+ " 19., 75., 84., 10., 44., 29., 39., 52., 80., 53., 2., 18., 16.,\n",
+ " 1., 49., 27., 71., 57., 0., 88., 22., 50., 68., 89., 8., 17.,\n",
+ " 32., 72., 99., 70., 77., 65., 34., 87., 5.])"
+ ]
+ },
+ "execution_count": 198,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.shuffle(pop)\n",
+ "pop"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 199,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([88., 76., 72., 27., 44., 65., 25., 35., 40., 13., 38., 94., 85.,\n",
+ " 63., 98., 97., 96., 61., 53., 75., 56., 48., 73., 16., 59., 2.,\n",
+ " 67., 47., 11., 78., 14., 60., 99., 90., 87., 9., 68., 1., 45.,\n",
+ " 32., 64., 71., 8., 36., 31., 15., 57., 54., 12., 10., 79., 52.,\n",
+ " 84., 69., 74., 22., 82., 41., 20., 91., 33., 50., 37., 80., 95.,\n",
+ " 21., 81., 23., 39., 93., 7., 77., 92., 49., 19., 43., 4., 3.,\n",
+ " 58., 51., 66., 29., 89., 0., 18., 34., 42., 17., 55., 5., 26.,\n",
+ " 70., 46., 30., 86., 83., 6., 62., 24., 28.])"
+ ]
+ },
+ "execution_count": 199,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rd.permutation(pop)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 200,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([24., 26., 41., 31., 82., 36., 48., 76., 20., 90., 3., 69., 9.,\n",
+ " 79., 67., 62., 74., 40., 54., 96., 13., 56., 33., 23., 85., 92.,\n",
+ " 4., 14., 11., 21., 35., 58., 94., 7., 15., 30., 42., 37., 63.,\n",
+ " 97., 60., 73., 61., 78., 91., 93., 66., 83., 45., 25., 6., 59.,\n",
+ " 46., 51., 43., 95., 64., 38., 55., 86., 98., 47., 81., 28., 12.,\n",
+ " 19., 75., 84., 10., 44., 29., 39., 52., 80., 53., 2., 18., 16.,\n",
+ " 1., 49., 27., 71., 57., 0., 88., 22., 50., 68., 89., 8., 17.,\n",
+ " 32., 72., 99., 70., 77., 65., 34., 87., 5.])"
+ ]
+ },
+ "execution_count": 200,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pop"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 201,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Lock', 'RandomState', '__RandomState_ctor', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_numpy_tester', 'absolute_import', 'bench', 'beta', 'binomial', 'bytes', 'chisquare', 'choice', 'dirichlet', 'division', 'exponential', 'f', 'gamma', 'geometric', 'get_state', 'gumbel', 'hypergeometric', 'info', 'laplace', 'logistic', 'lognormal', 'logseries', 'mtrand', 'multinomial', 'multivariate_normal', 'negative_binomial', 'noncentral_chisquare', 'noncentral_f', 'normal', 'np', 'operator', 'pareto', 'permutation', 'poisson', 'power', 'print_function', 'rand', 'randint', 'randn', 'random', 'random_integers', 'random_sample', 'ranf', 'rayleigh', 'sample', 'seed', 'set_state', 'shuffle', 'standard_cauchy', 'standard_exponential', 'standard_gamma', 'standard_normal', 'standard_t', 'test', 'triangular', 'uniform', 'vonmises', 'wald', 'warnings', 'weibull', 'zipf']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(dir(rd))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Exercício 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 202,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mu = 4\n",
+ "sigma = 12\n",
+ "n = 50\n",
+ "N = int(1e5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 203,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "A = rd.normal(loc=mu, scale=sigma, size=(n, N))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 204,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "avg = np.mean(A, axis=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 205,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(100000,)"
+ ]
+ },
+ "execution_count": 205,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "avg.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 206,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.9066983895805354"
+ ]
+ },
+ "execution_count": 206,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.var(avg)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 207,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.88"
+ ]
+ },
+ "execution_count": 207,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sigma**2/n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Exercício 2: Law of Large Numbers - Lei dos grandes números\n",
+ "À medida que o número de variáveis geradas aleatoriamente distribuídas de forma idêntica aumenta, a média da amostra (média) aproxima-se da média teórica. (inglês)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 208,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x = np.linspace(0, 4, 5)\n",
+ "size = np.logspace(0, 4, 5)\n",
+ "draws = 100\n",
+ "mu = 0\n",
+ "sigma = 1\n",
+ "\n",
+ "DATA = []\n",
+ "\n",
+ "for s in size:\n",
+ " d = np.random.normal(loc=mu, scale=sigma, size=(draws, int(s)))\n",
+ " DATA.append(d.mean(axis=1))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 209,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.boxplot(DATA)\n",
+ "plt.xticks([1, 2, 3, 4, 5], ['$10^0$', '$10^1$', '$10^2$', '$10^3$', '$10^4$'])\n",
+ "plt.xlabel('sample size')\n",
+ "plt.title(\"Distribution of the mean\\n{0} replications for each sample size\".format(draws))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Exercício 3: Central Limit Theorem - Teorema do Limite Central\n",
+ "source: Wolfram MathWorld"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 211,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import warnings\n",
+ "warnings.filterwarnings('ignore')\n",
+ "\n",
+ "import math\n",
+ "\n",
+ "n_bins = 50\n",
+ "draws = int(1e4)\n",
+ "\n",
+ "k = 0.5\n",
+ "theta = 1.0\n",
+ "mu = k*theta\n",
+ "sigma = math.sqrt(k)*theta\n",
+ "\n",
+ "S = [10, 30, 50, 100]\n",
+ "\n",
+ "fig, axes = plt.subplots(nrows=2, ncols=2)\n",
+ "ax = axes.flatten()\n",
+ "\n",
+ "# normal pdf\n",
+ "normpdf = lambda x: (1/math.sqrt(2*math.pi))*math.exp(-x**2/2)\n",
+ "t = np.linspace(-4,4,50)\n",
+ "y = [y for y in map(normpdf, t)]\n",
+ "\n",
+ "for i, x in enumerate(ax):\n",
+ " n = S[i]\n",
+ " s = np.random.gamma(shape = k, scale = theta, size = (draws, n))\n",
+ " s = (np.mean(s, axis=1)-mu)/(sigma/math.sqrt(n))\n",
+ " x.hist(s, n_bins, range = (-4, 4), normed=1, histtype='stepfilled', color = 'gray')\n",
+ " x.plot(t, y, 'r', linewidth=3)\n",
+ " x.set_yticklabels([])\n",
+ " x.set_title('n = {0}'.format(n))\n",
+ "\n",
+ "fig.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/0-pre-requisitos/2-math/calculo_num\303\251rico.ipynb" "b/0-pre-requisitos/2-math/calculo_num\303\251rico.ipynb"
old mode 100644
new mode 100755
index a66ec4d..53d9f22
--- "a/0-pre-requisitos/2-math/calculo_num\303\251rico.ipynb"
+++ "b/0-pre-requisitos/2-math/calculo_num\303\251rico.ipynb"
@@ -1,429 +1,668 @@
{
- "cells": [
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# Roots and Integration of real-valued functions\n\nDiscuss the relevant concepts and the computational implementation of methods to find roots of real-valued functions: \n- Bisection\n- Newton's Method (or Newton-Raphson)\n- Quasi-Newton (Secant)"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import matplotlib.pyplot as plt\nx = [x/10 for x in range(0, 21)]\ny = [x**3-1 for x in x]\nplt.plot(x, y, 'b')\nplt.axhline(y=0, linewidth=.5, color='k', marker='.')\nplt.show()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import numpy as np\nimport matplotlib.pyplot as plt\nx = np.linspace(-3, 3)\ny = [x**3-1-3*x+1 for x in x]\nplt.plot(x, y, 'b')\nplt.axhline(y=0, linewidth=.5, color='k', marker='.')\nplt.show()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Bracketing\n### Bisection"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def bisection(f, a, b, delta=1e-5, eps=1e-7):\n\n # f: a function\n # a: lower limit\n # b: upper limit\n \n if f(a)*f(b) <= 0:\n \n x_low = a\n x_high = b\n e = 1 # abs(x_high - x_low)\n d = 1 # f(M)\n i = 0\n #print(\"{joao:2d}: [{x_low:0.8f}, {x_high:0.8f}]\".format(joao = i, x_low = x_low, x_high = x_high))\n \n while abs(e)>eps*(1+abs(x_low)+abs(x_high)) or abs(d)>delta:\n \n i += 1\n \n midpoint = (x_low+x_high)/2\n if f(x_low)*f(midpoint)<0:\n x_high = midpoint\n else:\n x_low = midpoint\n \n midpoint = (x_low+x_high)/2\n e = x_high-x_low\n d = f(midpoint)\n #print(\"{i:2d}: [{x_low:0.12f}, {x_high:0.12f}]\".format(i = i, x_low = x_low, x_high = x_high))\n \n return midpoint",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def func(x):\n return x**3-1",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time bisection(func, .4, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# testing\n%time bisection(lambda x: x**3-1, .4, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "## Newton's Method"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "http://mathworld.wolfram.com/NewtonsMethod.html \nhttp://tutorial.math.lamar.edu/Classes/CalcI/NewtonsMethod.aspx"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# derive\ndef derive(func, x, eps=1e-6):\n \"derive: calculates the derivative of a real-valued function at a certain point of its domain.\"\n if func(x) or func(x) == 0:\n return (func(x+eps)-func(x-eps))/(2*eps)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# newton\ndef newton(func, x, eps=10**(-5), delta=10**(-7)):\n \"newton: finds a root of a real-valued function using Newton's method.\"\n \n e = 1\n d = abs(func(x))\n i = 0\n \n x0 = x\n \n while e>eps or d>delta:\n \n i = i+1\n x1 = x0-(func(x0)/derive(func, x0))\n e = abs(x1-x0)\n d = abs(func(x1))\n print(\"interaction: \", i)\n print(\"{0:.6f} -> {1:.6f}\".format(x0,x1))\n print(\"e={0:.6f} d={1:.6f}\".format(e,d))\n print(\"---------------------------------\")\n x0 = x1\n \n return (x0, i)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time newton(lambda w: w**3-1, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Quasi-Newton"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Secant Method\nhttp://mathworld.wolfram.com/SecantMethod.html"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# quasi-newton (secant)\ndef secant(func, x0, x1, eps=10**(-5), delta=10**(-7)):\n \"quasi-newton (secant): finds a root of a real-valued function using the secant method.\"\n \n e = 1\n d = abs(func(x1))\n i = 0\n \n while e>eps or d>delta:\n \n i = i+1\n x2 = x1-(func(x1)*(x1-x0)/(func(x1)-func(x0)))\n e = abs(x2-x1)\n d = abs(func(x2))\n print(\"interaction: \", i)\n print(\"{0:.6f} -> {1:.6f}\".format(x1, x2))\n print(\"e={0:.6f} d={1:.6f}\".format(e, d))\n print(\"---------------------------------\")\n x0 = x1\n x1 = x2\n \n return (x2, i)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time secant(lambda w: w**3-1, 4, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## using `scipy.optimize`"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "from scipy import optimize as opt",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time opt.bisect(lambda w: w**3-1, .4, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time opt.newton(lambda w: w**3-1, 3)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%time opt.newton(lambda w: w**3-1, 3, fprime=lambda w: 3*(w**2))",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "markdown",
- "source": "## Application: Internal Rate of Return"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import matplotlib.pyplot as plt\n\nv = [-1000, 500, 500, 500, -200]\ndef vpl(v, r):\n return sum([value*(1+r)**(-period) for period, value in enumerate(v)])\n\nx = [x/400 for x in range(101)]\ny = [vpl(v, r) for r in x]\nplt.plot(x, y, 'b')\nplt.axhline(y=0, linewidth=.5, color='k', marker='.')\nplt.xlim((0,.3))\nplt.show()",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "from scipy import optimize as opt\ndef irr(v, r0):\n \n def vpl(r):\n return sum([value*(1+r)**(-t) for t,value in enumerate(v)])\n \n return opt.newton(vpl, r0)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# testing\nv = [-1000, 500, 500, 500, -200]\nirr(v, 0.05)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Integration"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import math",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "print(dir(math))",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "math.e",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "math.exp(2)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "math.pi",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "math.nan",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Rectangle method\n$\\int_{a}^{b}{f(x)dx} \\approx \\Delta x\\,\\sum_{i=1}^{n}{f(m_i)}$ where $\\Delta x = \\frac{b-a}{n}$ and $m_{i} = a + \\frac{\\Delta x}{2} i$"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def rectangle(f, a, b, n):\n \n step = (b-a)/n\n I = 0\n \n for i in range(int(n)):\n I += f(a+(2*i+1)*step/2)\n \n return I*step",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "1e5",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test 1\nrectangle(lambda x: x**2, 0, 12, 1e5)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test 1\nrectangle(lambda x: math.exp(x), 0, 1, 10)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Trapezoid rule\n$\\int_{a}^{b}{f(x)dx} \\approx \\frac{\\Delta x}{2}\\,\\sum_{i=1}^{n}{[f(x_{i-1})+f(x_{i})]} = \\frac{\\Delta x}{2}\\,\\left[f(x_{0})+2\\,f(x_{1})+2\\,f(x_{1})+...+2\\,f(x_{n-1})+f(x_{n})\\right]$ where $\\Delta x = \\frac{b-a}{n}$ and $x_{i} = a + \\Delta x\\,i$"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def trapezoid(f, a, b, n):\n \n step = (b - a)/n\n I = f(a) + f(b)\n \n for i in range(1, int(n), 1):\n I += 2*f(a+i*step)\n \n return I*step/2",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test\ntrapezoid(lambda x: x**2, 0, 12, 1000)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test\ntrapezoid(lambda x: math.exp(x), 0, 1, 10)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Simpson's rule\n[Reference from Wolfran's MathWorld](http://mathworld.wolfram.com/SimpsonsRule.html)\n\n$\\int_{a}^{b}{f(x)dx} \\approx \\frac{\\Delta x}{3}\\,\\left[f(x_{0})+4\\,f(x_{1})+2\\,f(x_{2})+4\\,f(x_{3})+2\\,f(x_{4})+...+2\\,f(x_{n-2})+4\\,f(x_{n-1})+f(x_{n})\\right]$ where $\\Delta x = \\frac{b-a}{n}$."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def simpson(f, a, b, n):\n \n step = (b-a)/n\n I = f(a)+f(b)\n \n for i in range(1, int(n), 2):\n I += 4*f(a+i*step)\n \n for i in range(2, int(n-1), 2):\n I += 2*f(a+i*step)\n \n return I*step/3",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test\nsimpson(lambda x: x**2, 0, 12, 1e5)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# test\nsimpson(lambda x: math.exp(x), 0, 1, 10)",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "from scipy import integrate\n# help(integrate)",
- "execution_count": 47,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "help(integrate.trapz)",
- "execution_count": 50,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Help on function trapz in module numpy.lib.function_base:\n\ntrapz(y, x=None, dx=1.0, axis=-1)\n Integrate along the given axis using the composite trapezoidal rule.\n \n Integrate `y` (`x`) along given axis.\n \n Parameters\n ----------\n y : array_like\n Input array to integrate.\n x : array_like, optional\n The sample points corresponding to the `y` values. If `x` is None,\n the sample points are assumed to be evenly spaced `dx` apart. The\n default is None.\n dx : scalar, optional\n The spacing between sample points when `x` is None. The default is 1.\n axis : int, optional\n The axis along which to integrate.\n \n Returns\n -------\n trapz : float\n Definite integral as approximated by trapezoidal rule.\n \n See Also\n --------\n sum, cumsum\n \n Notes\n -----\n Image [2]_ illustrates trapezoidal rule -- y-axis locations of points\n will be taken from `y` array, by default x-axis distances between\n points will be 1.0, alternatively they can be provided with `x` array\n or with `dx` scalar. Return value will be equal to combined area under\n the red lines.\n \n \n References\n ----------\n .. [1] Wikipedia page: http://en.wikipedia.org/wiki/Trapezoidal_rule\n \n .. [2] Illustration image:\n http://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png\n \n Examples\n --------\n >>> np.trapz([1,2,3])\n 4.0\n >>> np.trapz([1,2,3], x=[4,6,8])\n 8.0\n >>> np.trapz([1,2,3], dx=2)\n 8.0\n >>> a = np.arange(6).reshape(2, 3)\n >>> a\n array([[0, 1, 2],\n [3, 4, 5]])\n >>> np.trapz(a, axis=0)\n array([ 1.5, 2.5, 3.5])\n >>> np.trapz(a, axis=1)\n array([ 2., 8.])\n\n",
- "name": "stdout"
- }
- ]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "",
- "execution_count": null,
- "outputs": []
- }
- ],
- "metadata": {
- "anaconda-cloud": {},
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.4",
- "file_extension": ".py",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Roots and Integration of real-valued functions\n",
+ "\n",
+ "Discussão sobre a implementação computacional e conceitos relevantes de métodos para encontrar a raíz de funções com valor real:\n",
+ "\n",
+ "Discuss the relevant concepts and the computational implementation of methods to find roots of real-valued functions: \n",
+ "- Bisection - Método da Bissecção\n",
+ "- Newton's Method (or Newton-Raphson) - Método de Newton-Raphson\n",
+ "- Quasi-Newton (Secant) - Método da Secante"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "x = [x/10 for x in range(0, 21)]\n",
+ "y = [x**3-1 for x in x]\n",
+ "plt.plot(x, y, 'b')\n",
+ "plt.axhline(y=0, linewidth=.5, color='k', marker='.')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "x = np.linspace(-3, 3)\n",
+ "y = [x**3-1-3*x+1 for x in x]\n",
+ "plt.plot(x, y, 'b')\n",
+ "plt.axhline(y=0, linewidth=.5, color='k', marker='.')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Bracketing\n",
+ "### Bisection - Bissecsção"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def bisection(f, a, b, delta=1e-5, eps=1e-7):\n",
+ "\n",
+ " # f: a function\n",
+ " # a: lower limit\n",
+ " # b: upper limit\n",
+ " \n",
+ " if f(a)*f(b) <= 0:\n",
+ " \n",
+ " x_low = a\n",
+ " x_high = b\n",
+ " e = 1 # abs(x_high - x_low)\n",
+ " d = 1 # f(M)\n",
+ " i = 0\n",
+ " #print(\"{joao:2d}: [{x_low:0.8f}, {x_high:0.8f}]\".format(joao = i, x_low = x_low, x_high = x_high))\n",
+ " \n",
+ " while abs(e)>eps*(1+abs(x_low)+abs(x_high)) or abs(d)>delta:\n",
+ " \n",
+ " i += 1\n",
+ " \n",
+ " midpoint = (x_low+x_high)/2\n",
+ " if f(x_low)*f(midpoint)<0:\n",
+ " x_high = midpoint\n",
+ " else:\n",
+ " x_low = midpoint\n",
+ " \n",
+ " midpoint = (x_low+x_high)/2\n",
+ " e = x_high-x_low\n",
+ " d = f(midpoint)\n",
+ " #print(\"{i:2d}: [{x_low:0.12f}, {x_high:0.12f}]\".format(i = i, x_low = x_low, x_high = x_high))\n",
+ " \n",
+ " return midpoint"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def func(x):\n",
+ " return x**3-1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time bisection(func, .4, 3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# testing\n",
+ "%time bisection(lambda x: x**3-1, .4, 3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Newton's Method - Método de Newton"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "http://mathworld.wolfram.com/NewtonsMethod.html \n",
+ "http://tutorial.math.lamar.edu/Classes/CalcI/NewtonsMethod.aspx"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# derive\n",
+ "def derive(func, x, eps=1e-6):\n",
+ " \"derive: calculates the derivative of a real-valued function at a certain point of its domain.\"\n",
+ " if func(x) or func(x) == 0:\n",
+ " return (func(x+eps)-func(x-eps))/(2*eps)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# newton\n",
+ "def newton(func, x, eps=10**(-5), delta=10**(-7)):\n",
+ " \"newton: finds a root of a real-valued function using Newton's method.\"\n",
+ " \n",
+ " e = 1\n",
+ " d = abs(func(x))\n",
+ " i = 0\n",
+ " \n",
+ " x0 = x\n",
+ " \n",
+ " while e>eps or d>delta:\n",
+ " \n",
+ " i = i+1\n",
+ " x1 = x0-(func(x0)/derive(func, x0))\n",
+ " e = abs(x1-x0)\n",
+ " d = abs(func(x1))\n",
+ " print(\"interaction: \", i)\n",
+ " print(\"{0:.6f} -> {1:.6f}\".format(x0,x1))\n",
+ " print(\"e={0:.6f} d={1:.6f}\".format(e,d))\n",
+ " print(\"---------------------------------\")\n",
+ " x0 = x1\n",
+ " \n",
+ " return (x0, i)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time newton(lambda w: w**3-1, 3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Quasi-Newton"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Secant Method - Método Secante\n",
+ "http://mathworld.wolfram.com/SecantMethod.html"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# quasi-newton (secant)\n",
+ "def secant(func, x0, x1, eps=10**(-5), delta=10**(-7)):\n",
+ " \"quasi-newton (secant): finds a root of a real-valued function using the secant method.\"\n",
+ " \n",
+ " e = 1\n",
+ " d = abs(func(x1))\n",
+ " i = 0\n",
+ " \n",
+ " while e>eps or d>delta:\n",
+ " \n",
+ " i = i+1\n",
+ " x2 = x1-(func(x1)*(x1-x0)/(func(x1)-func(x0)))\n",
+ " e = abs(x2-x1)\n",
+ " d = abs(func(x2))\n",
+ " print(\"interaction: \", i)\n",
+ " print(\"{0:.6f} -> {1:.6f}\".format(x1, x2))\n",
+ " print(\"e={0:.6f} d={1:.6f}\".format(e, d))\n",
+ " print(\"---------------------------------\")\n",
+ " x0 = x1\n",
+ " x1 = x2\n",
+ " \n",
+ " return (x2, i)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time secant(lambda w: w**3-1, 4, 3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## using `scipy.optimize`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from scipy import optimize as opt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time opt.bisect(lambda w: w**3-1, .4, 3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time opt.newton(lambda w: w**3-1, 3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%time opt.newton(lambda w: w**3-1, 3, fprime=lambda w: 3*(w**2))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Application: Internal Rate of Return"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "v = [-1000, 500, 500, 500, -200]\n",
+ "def vpl(v, r):\n",
+ " return sum([value*(1+r)**(-period) for period, value in enumerate(v)])\n",
+ "\n",
+ "x = [x/400 for x in range(101)]\n",
+ "y = [vpl(v, r) for r in x]\n",
+ "plt.plot(x, y, 'b')\n",
+ "plt.axhline(y=0, linewidth=.5, color='k', marker='.')\n",
+ "plt.xlim((0,.3))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from scipy import optimize as opt\n",
+ "def irr(v, r0):\n",
+ " \n",
+ " def vpl(r):\n",
+ " return sum([value*(1+r)**(-t) for t,value in enumerate(v)])\n",
+ " \n",
+ " return opt.newton(vpl, r0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# testing\n",
+ "v = [-1000, 500, 500, 500, -200]\n",
+ "irr(v, 0.05)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Integration"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(dir(math))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "math.e"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "math.exp(2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "math.pi"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "math.nan"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Rectangle method\n",
+ "$\\int_{a}^{b}{f(x)dx} \\approx \\Delta x\\,\\sum_{i=1}^{n}{f(m_i)}$ where $\\Delta x = \\frac{b-a}{n}$ and $m_{i} = a + \\frac{\\Delta x}{2} i$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def rectangle(f, a, b, n):\n",
+ " \n",
+ " step = (b-a)/n\n",
+ " I = 0\n",
+ " \n",
+ " for i in range(int(n)):\n",
+ " I += f(a+(2*i+1)*step/2)\n",
+ " \n",
+ " return I*step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "1e5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test 1\n",
+ "rectangle(lambda x: x**2, 0, 12, 1e5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test 1\n",
+ "rectangle(lambda x: math.exp(x), 0, 1, 10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Trapezoid rule\n",
+ "$\\int_{a}^{b}{f(x)dx} \\approx \\frac{\\Delta x}{2}\\,\\sum_{i=1}^{n}{[f(x_{i-1})+f(x_{i})]} = \\frac{\\Delta x}{2}\\,\\left[f(x_{0})+2\\,f(x_{1})+2\\,f(x_{1})+...+2\\,f(x_{n-1})+f(x_{n})\\right]$ where $\\Delta x = \\frac{b-a}{n}$ and $x_{i} = a + \\Delta x\\,i$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def trapezoid(f, a, b, n):\n",
+ " \n",
+ " step = (b - a)/n\n",
+ " I = f(a) + f(b)\n",
+ " \n",
+ " for i in range(1, int(n), 1):\n",
+ " I += 2*f(a+i*step)\n",
+ " \n",
+ " return I*step/2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test\n",
+ "trapezoid(lambda x: x**2, 0, 12, 1000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test\n",
+ "trapezoid(lambda x: math.exp(x), 0, 1, 10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Simpson's rule\n",
+ "[Reference from Wolfran's MathWorld](http://mathworld.wolfram.com/SimpsonsRule.html)\n",
+ "\n",
+ "$\\int_{a}^{b}{f(x)dx} \\approx \\frac{\\Delta x}{3}\\,\\left[f(x_{0})+4\\,f(x_{1})+2\\,f(x_{2})+4\\,f(x_{3})+2\\,f(x_{4})+...+2\\,f(x_{n-2})+4\\,f(x_{n-1})+f(x_{n})\\right]$ where $\\Delta x = \\frac{b-a}{n}$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def simpson(f, a, b, n):\n",
+ " \n",
+ " step = (b-a)/n\n",
+ " I = f(a)+f(b)\n",
+ " \n",
+ " for i in range(1, int(n), 2):\n",
+ " I += 4*f(a+i*step)\n",
+ " \n",
+ " for i in range(2, int(n-1), 2):\n",
+ " I += 2*f(a+i*step)\n",
+ " \n",
+ " return I*step/3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test\n",
+ "simpson(lambda x: x**2, 0, 12, 1e5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test\n",
+ "simpson(lambda x: math.exp(x), 0, 1, 10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from scipy import integrate\n",
+ "# help(integrate)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Help on function trapz in module numpy.lib.function_base:\n",
+ "\n",
+ "trapz(y, x=None, dx=1.0, axis=-1)\n",
+ " Integrate along the given axis using the composite trapezoidal rule.\n",
+ " \n",
+ " Integrate `y` (`x`) along given axis.\n",
+ " \n",
+ " Parameters\n",
+ " ----------\n",
+ " y : array_like\n",
+ " Input array to integrate.\n",
+ " x : array_like, optional\n",
+ " The sample points corresponding to the `y` values. If `x` is None,\n",
+ " the sample points are assumed to be evenly spaced `dx` apart. The\n",
+ " default is None.\n",
+ " dx : scalar, optional\n",
+ " The spacing between sample points when `x` is None. The default is 1.\n",
+ " axis : int, optional\n",
+ " The axis along which to integrate.\n",
+ " \n",
+ " Returns\n",
+ " -------\n",
+ " trapz : float\n",
+ " Definite integral as approximated by trapezoidal rule.\n",
+ " \n",
+ " See Also\n",
+ " --------\n",
+ " sum, cumsum\n",
+ " \n",
+ " Notes\n",
+ " -----\n",
+ " Image [2]_ illustrates trapezoidal rule -- y-axis locations of points\n",
+ " will be taken from `y` array, by default x-axis distances between\n",
+ " points will be 1.0, alternatively they can be provided with `x` array\n",
+ " or with `dx` scalar. Return value will be equal to combined area under\n",
+ " the red lines.\n",
+ " \n",
+ " \n",
+ " References\n",
+ " ----------\n",
+ " .. [1] Wikipedia page: http://en.wikipedia.org/wiki/Trapezoidal_rule\n",
+ " \n",
+ " .. [2] Illustration image:\n",
+ " http://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png\n",
+ " \n",
+ " Examples\n",
+ " --------\n",
+ " >>> np.trapz([1,2,3])\n",
+ " 4.0\n",
+ " >>> np.trapz([1,2,3], x=[4,6,8])\n",
+ " 8.0\n",
+ " >>> np.trapz([1,2,3], dx=2)\n",
+ " 8.0\n",
+ " >>> a = np.arange(6).reshape(2, 3)\n",
+ " >>> a\n",
+ " array([[0, 1, 2],\n",
+ " [3, 4, 5]])\n",
+ " >>> np.trapz(a, axis=0)\n",
+ " array([ 1.5, 2.5, 3.5])\n",
+ " >>> np.trapz(a, axis=1)\n",
+ " array([ 2., 8.])\n",
+ "\n"
+ ]
}
+ ],
+ "source": [
+ "help(integrate.trapz)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/0-pre-requisitos/2-math/data/regression.csv b/0-pre-requisitos/2-math/data/regression.csv
old mode 100644
new mode 100755
diff --git a/0-pre-requisitos/2-math/data/tech_coef.csv b/0-pre-requisitos/2-math/data/tech_coef.csv
old mode 100644
new mode 100755
diff --git a/0-pre-requisitos/2-math/linear_algebra.ipynb b/0-pre-requisitos/2-math/linear_algebra.ipynb
new file mode 100755
index 0000000..6e0c8f1
--- /dev/null
+++ b/0-pre-requisitos/2-math/linear_algebra.ipynb
@@ -0,0 +1,2035 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Linear Algebra\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Contents\n",
+ "\n",
+ "- [Linear Algebra](#Linear-Algebra) \n",
+ " - [Overview](#Overview) \n",
+ " - [Vectors](#Vectors) \n",
+ " - [Matrices](#Matrices) \n",
+ " - [Solving Systems of Equations](#Solving-Systems-of-Equations) \n",
+ " - [Eigenvalues and Eigenvectors](#Eigenvalues-and-Eigenvectors) \n",
+ " - [Further Topics](#Further-Topics) \n",
+ " - [Exercises](#Exercises) \n",
+ " - [Solutions](#Solutions) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Overview\n",
+ "\n",
+ "Linear algebra is one of the most useful branches of applied mathematics for economists to invest in\n",
+ "\n",
+ "For example, many applied problems in economics and finance require the solution of a linear system of equations, such as\n",
+ "\n",
+ "$$\n",
+ "\\begin{array}{c}\n",
+ " y_1 = a x_1 + b x_2 \\\\\n",
+ " y_2 = c x_1 + d x_2\n",
+ "\\end{array}\n",
+ "$$\n",
+ "\n",
+ "or, more generally,\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "\\begin{array}{c}\n",
+ " y_1 = a_{11} x_1 + a_{12} x_2 + \\cdots + a_{1k} x_k \\\\\n",
+ " \\vdots \\\\\n",
+ " y_n = a_{n1} x_1 + a_{n2} x_2 + \\cdots + a_{nk} x_k\n",
+ "\\end{array} \\tag{1}\n",
+ "$$\n",
+ "\n",
+ "The objective here is to solve for the “unknowns” $ x_1, \\ldots, x_k $ given $ a_{11}, \\ldots, a_{nk} $ and $ y_1, \\ldots, y_n $\n",
+ "\n",
+ "When considering such problems, it is essential that we first consider at least some of the following questions\n",
+ "\n",
+ "- Does a solution actually exist? \n",
+ "- Are there in fact many solutions, and if so how should we interpret them? \n",
+ "- If no solution exists, is there a best “approximate” solution? \n",
+ "- If a solution exists, how should we compute it? \n",
+ "\n",
+ "\n",
+ "These are the kinds of topics addressed by linear algebra\n",
+ "\n",
+ "In this lecture we will cover the basics of linear and matrix algebra, treating both theory and computation\n",
+ "\n",
+ "We admit some overlap with [this lecture](https://lectures.quantecon.org/py/numpy.html), where operations on NumPy arrays were first explained\n",
+ "\n",
+ "Note that this lecture is more theoretical than most, and contains background\n",
+ "material that will be used in applications as we go along"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Vectors\n",
+ "\n",
+ "\n",
+ "\n",
+ "A *vector* of length $ n $ is just a sequence (or array, or tuple) of $ n $ numbers, which we write as $ x = (x_1, \\ldots, x_n) $ or $ x = [x_1, \\ldots, x_n] $\n",
+ "\n",
+ "We will write these sequences either horizontally or vertically as we please\n",
+ "\n",
+ "(Later, when we wish to perform certain matrix operations, it will become necessary to distinguish between the two)\n",
+ "\n",
+ "The set of all $ n $-vectors is denoted by $ \\mathbb R^n $\n",
+ "\n",
+ "For example, $ \\mathbb R ^2 $ is the plane, and a vector in $ \\mathbb R^2 $ is just a point in the plane\n",
+ "\n",
+ "Traditionally, vectors are represented visually as arrows from the origin to\n",
+ "the point\n",
+ "\n",
+ "The following figure represents three vectors in this manner"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(10, 8))\n",
+ "# Set the axes through the origin\n",
+ "for spine in ['left', 'bottom']:\n",
+ " ax.spines[spine].set_position('zero')\n",
+ "for spine in ['right', 'top']:\n",
+ " ax.spines[spine].set_color('none')\n",
+ "\n",
+ "ax.set(xlim=(-5, 5), ylim=(-5, 5))\n",
+ "ax.grid()\n",
+ "vecs = ((2, 4), (-3, 3), (-4, -3.5))\n",
+ "for v in vecs:\n",
+ " ax.annotate('', xy=v, xytext=(0, 0),\n",
+ " arrowprops=dict(facecolor='blue',\n",
+ " shrink=0,\n",
+ " alpha=0.7,\n",
+ " width=0.5))\n",
+ " ax.text(1.1 * v[0], 1.1 * v[1], str(v))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Vector Operations\n",
+ "\n",
+ "\n",
+ "\n",
+ "The two most common operators for vectors are addition and scalar multiplication, which we now describe\n",
+ "\n",
+ "As a matter of definition, when we add two vectors, we add them element by element\n",
+ "\n",
+ "$$\n",
+ "x + y =\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " x_1 \\\\\n",
+ " x_2 \\\\\n",
+ " \\vdots \\\\\n",
+ " x_n\n",
+ "\\end{array}\n",
+ "\\right] +\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " y_1 \\\\\n",
+ " y_2 \\\\\n",
+ " \\vdots \\\\\n",
+ " y_n\n",
+ "\\end{array}\n",
+ "\\right] :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " x_1 + y_1 \\\\\n",
+ " x_2 + y_2 \\\\\n",
+ " \\vdots \\\\\n",
+ " x_n + y_n\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "Scalar multiplication is an operation that takes a number $ \\gamma $ and a\n",
+ "vector $ x $ and produces\n",
+ "\n",
+ "$$\n",
+ "\\gamma x :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " \\gamma x_1 \\\\\n",
+ " \\gamma x_2 \\\\\n",
+ " \\vdots \\\\\n",
+ " \\gamma x_n\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "Scalar multiplication is illustrated in the next figure"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "hide-output": false,
+ "html-class": "collapse"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAHICAYAAABNpu4dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3XmczfXix/H3mDGYTWM3pkHWsS9jTSFbJEtERekWsrRo0cJFZrOXNVKRH6JoISayC1kGWaIk68zYhmFmjNnO+f7+uF2PupHBzPmec76v5+PR43Gb+U7zvncuXp3v+ZzjYRiGAAAArCqf2QMAAADMRAwBAABLI4YAAIClEUMAAMDSiCEAAGBpxBAAALA0YggAAFgaMQQAACyNGAIAAJbmdZvX83LVAHLdww8/rFWrVpk9A4D78cjJRTwyBMB0iYmJZk8AYGHEEAAAsDRiCAAAWBoxBAAALI0YAgAAlkYMAQAASyOGAACApRFDAADA0oghAABgacQQAACwNGIIAABYGjEEAAAsjRgCAACWRgwBAABLI4YAAIClEUMAAMDSiCEAAGBpxBAAALA0YggAAFgaMQQAACyNGAIAAJZGDAEAAEsjhgAAgKURQwAAwNKIIQAAYGnEEAAAsDRiCAAAWBoxBAAALI0YAgAAlkYMAQAASyOGAACApRFDAADA0oghAABgacQQAACwNGIIAABYGjEEAAAsjRgCAACWRgwBAABLI4YAAIClEUMA8oTNZlPdunXVsWNHs6cAwD8ihgDkiSlTpig0NNTsGQBMtHTpUnXr1k1ly5ZVoUKFVKVKFb3zzjtKSUkxe9pfEEMAcl1cXJxWrlypvn37mj0FgIkmTpwoT09PRUdHa9WqVRo4cKBmzpypNm3ayG63mz3vOi+zBwBwP0OGDNH48eOd7t/+AKszDENXrlxRQkKCzsbHq3a9eipatGiefb9vv/1WxYsXv/73zZs3V5EiRdSnTx9t3LhRDz30UJ5979tBDAHIVStWrFCJEiVUv359bdy48abXzZ49W7Nnz5YkXbhwwUHrAOswDEPJyclKSEhQwunTOvPLL0r47Td5pqaquN2uY5mZql6rVp5u+HMI/VeDBg0kSfHx8dc/dvToUYWGhmrYsGEaPXr09Y8PHDhQCxYs0IYNGxQWFpZnO4khALlq69atWr58uWJiYpSenq7k5GT17t1bCxYs+Mt1/fv3V//+/SUpT3+TA6zgv+Fz5swZJZw+rYTDh3Xm99/lkZysIA8PBRmGGvj6KsjfX/5Fi2pXQoLy33+/SpYs6fCtmzZtkqS/PKewYsWK6tu3r95//3299NJLKlasmMLDwzVnzhytXLkyz3+P8DAM43auv62LAVjbxo0bNXHiRK1YseIfrwsLC1NsbKyDVgHu59uvvtKBr79W2fz5FWQYCvL1VWl/f/l7e8vDw+Mv19rsdk07dUrdIyMVHBzs0J3x8fGqW7euateurTVr1vzlc2fPnlWFChU0aNAgVa1aVf3799eiRYvUo0ePu/mWHre+hEeGAABweQ2aNtXhVavUpnBhlfD1/cdrD5w/r8B69RweQqmpqercubO8vLw0d+7cv32+VKlSGjJkiCZNmqTs7GxNnTr1bkMoxzhNBiDPtGjR4paPCgG4e6VKlVLbAQP0+dmzysjOvul1dsPQlmvX9ICDX/8rPT1dnTp10rFjx7R69eqbhlilSpWUkZGhJk2aaPDgwQ7bRwwBAOAG6tSrp/JduuibU6d0s6fA/JKYqALVqql8+fIO25WVlaVu3bpp586diomJUc2aNW943fr16/XCCy+oSZMm2rp1q/bt2+ewjcQQAABu4uHOnZVco4a2JyT87XOGYeiH1FQ90Lnz355HlFfsdrt69eqldevWadmyZWrcuPENr9uzZ4+6dOmivn37auPGjQoJCdGwYcMcslEihgAAcBsXLlxQ/KlTWp2UpONJSX/53O9JSbLdd5+qVKnisD2DBw/WkiVL9MYbb8jX11fbt2+//ldcXJyk/xyrb9++vdq2batp06bJ29tbo0aNUkxMjDZv3uyQnZwmA2A6TpMBd2/3rl369oMPJB8ftevVS9s++kj9SpVSQIECkqS5x4+r/muvqVbt2g7bVK5cOZ08efKGnxs1apQGDBigpk2bKiQkRKtXr1aBP7babDbVqFFDgYGB2rZt291M4DQZAADuLjs7W0sXLNAva9YooEoVvfD66/L19VV2RoaWzJ2rZ8uVU1xyspKDglTjJs/XySsnTpy45TXHjh3728c8PT11+PDhPFh0Y8QQAAAu6vLly5ocHi6dP69GPXuqXceOypfvP8+AadaiheJ+/12rt25Vkt2uZr17X/8c/ooYAgDABR397TctmDBBMgw9MXy4qv7pFZ0lycPDQ11799bskyeVlZamnnXqmLTU+RFDAAC4EMMwtG71am1ZuFAqWlQvjRhx0zdbLViwoHoNGaKU5GR5efFH/s3wvwwAAC7i2rVr+mTqVCXu26fyDz6oJ597Tt7e3v/4NUWLFs3Td6Z3B8QQAAAu4OzZs5oVGSmlpurhwYPVqGlTh71ekLsjhgAAcHJ7d+/WsunTpUKF9HxEhO69916zJ7kVYggAACeVnZ2trxYt0qFVq+RbsaIGDh0qPz8/s2e5HWIIAAAndOXKFU0OD5dx7pzCundXh86dORqfR4ghAACczLHff9f/jR8v2Wzq8c47qla9utmT3BoxBACAkzAMQxvXrtWm+fOlwEC9OGKEihUrZvYst0cMAQDgBNLT0zV3xgyd271bIfffr979+t3y2DxyBzEEAIDJzp07p5mRkVJystoMGKCmDzzAsXkHIoYAADDRvr179fW0aVKBAnouIkIhISFmT7IcYggAABPYbDZ988UXOrBihQqWL6/Bb70lf39/s2dZEjEEAICDJScna2pUlLLj41W3Sxd1fOwxeXp6mj3LsoghAAAc6Pjx45o3bpyUlaXub72lGjVrmj3J8oghAAAcwDAMbd6wQRs+/VQKDNTgiAgVL17c7FkQMQQAQJ7LyMjQvJkzlbBzp4KbNNHT/furQIECZs/CH4ghAADy0Pnz5/VBZKR05Ypa9e+vZs2bc2zeyRBDAADkkQP79+vLKVOk/Pn17OjRKleunNmTcAPEEAAAucxms+nbpUv10/Ll8g4J0UvDhnFs3okRQwAA5KKUlBRNi45W5qlTqv3oo+r0+OMcm3dyxBAAALnk5MmTmjt2rJSZqcfefFO1atc2exJygBgCAOAuGYahLZs2ad3cuVLhwho0erRKlChh9izkEDEEAMBdyMjI0PzZsxX3448q3aCBnh00iGPzLoYYAgDgDl24cEEzIiOlpCS17NtXD7ZsybF5F0QMAQBwB34+eFBL3n9fyp9ffUaPVvny5c2ehDtEDAEAcBvsdrtWfPWV9nzzjTxLl9YrI0YoICDA7Fm4C8QQAAA5lJqaqhljx+ra8eOq0aGDuj7xBMfm3QAxBABADpw6dUpzxoyRMjLU9Y03VLtuXbMnIZcQQwAA/APDMLTthx+05pNPpIAADXz3XZUsWdLsWchFxBAAADeRmZmphR9/rJNbtqhEvXp67sUXVbBgQbNnIZcRQwAA3MDFixc1LTxcSkrSg88+q5Zt2nBs3k0RQwAA/I/Dhw7p8/fekzw99fTIkapQsaLZk5CHiCEAAP5gt9v13fLl2rV0qVSihF4dNUqFCxc2exbyGDEEAICkq1evauaECUr97TdVe/hhPfbkk/Ly4o9JK+CnDACwvLi4OH0cHS2lp6vTq6+qXliY2ZPgQMQQAMCyDMPQjm3btOqjjyQ/Pw2IjlapUqXMngUHI4YAAJaUlZWlRXPm6NimTSpWu7aef/llFSpUyOxZMAExBACwnEuXLmlqeLh08aKaPfOMWrVrx7F5CyOGAACW8usvv2jRpEmSh4d6jxypipUqmT0JJiOGAACWYLfbtXrFCu344gupRAkNGTlS99xzj9mz4ASIIQCA20tLS9OsiROV/OuvqtK6tR5/+mmOzeM6/p8AAHBr8fHx+ig6WkpLU8dXXlFYw4ZmT4KTIYYAAG7JMAzt2rFDMbNmSX5+6h8VpaCgILNnwQkRQwAAt5OVlaXP583T0Q0bFFi9uvoNGSIfHx+zZ8FJEUMAALeSlJSkKeHhUmKimj71lFq3b698+fKZPQtOjBgCALiNI7/+qs8mTpQkPfXvf6tylSomL4IrIIYAAC7PbrdrTUyMfvz8c6lYMb0ycqQCAwPNngUXQQwBAFxaWlqaPpo8WUk//6yKLVuqZ58+yp8/v9mz4EKIIQCAy0pISNDs6GgpNVUdXnpJDRo14m01cNuIIQCAS9q9a5e+/eADycdH/aKiVKZMGbMnwUURQwAAl5Kdna0l8+fr17VrFVC1qga8/jrH5nFXiCEAgMu4fPmyJoeHS+fPq1HPnmrXsSPH5nHXiCEAgEs4+ttvWjBhgmQYemL4cFUNDTV7EtwEMQQAcGqGYWjd6tXasnChVLSoXh45UkWKFDF7FtwIMQQAcFrXrl3TJ1OnKnHfPpV/8EE99fzzHJtHriOGAABO6cyZM/owKkpKTdXDgwerUdOmHJtHniCGAABOZ+/u3Vo2Y4ZUsKD6RkYqODjY7ElwY8QQAMBpZGdn66tFi3Ro1Sr5VaqkgUOHytfX1+xZcHPEEADAKVy5ckXvjx4tnT+vBo8/rvadOnFsHg5BDAEATPf70aOaP2GCZLOp57BhCq1WzexJsBBiCABgGsMwtGHNGm1esEAKDNRLI0eqaNGiZs+CxRBDAABTpKena8706Tq/Z4/KNmumXn37ytvb2+xZsCBiCADgcOfOndPMyEgpOVltBw5Uk2bNODYP0xBDAACH2rd3r76eNk0qUEDPRUQoJCTE7EmwOGIIAOAQNptNXy9erIMxMSpUvrwGv/22/Pz8zJ4FEEMAgLyXnJysKRERsp05o3pdu+qRrl3l6elp9ixAEjEEAMhjx48f17xx46SsLD3+9tuqXqOG2ZOAvyCGAAB5wjAMbd6wQRs+/VQKDNTgiAgVL17c7FnA3xBDAIBcl5GRoU8/+EBndu1ScJMmerp/fxUoUMDsWcANEUMAgFx1/vx5fRAZKV25olb9+6tZ8+Ycm4dTI4YAALnmwP79+nLKFMnbW/8KD1fZsmXNngTcEu+AByBXnT59Wi1btlRoaKiqV6+uKVOmmD0JDvDfY/Nfjhsn7xIl9Pr48YQQXAaPDAHIVV5eXpo0aZLq1aunlJQU1a9fX23atFE13njTbaWkpGhadLQyT51SnU6d9Gj37hybh0shhgDkqtKlS6t06dKSJH9/f4WGhio+Pp4YclMnTpzQp2PHSllZ6vbWW6pZq5bZk4DbRgwByDMnTpzQ3r171ahRI7OnIBclJSUpNjZWSxZ/odRDP6tygzANCg9XiRIlzJ4G3BGeMwQgT6Smpqpbt26aPHmyAgIC/vb52bNnKywsTGFhYbpw4YIJC5ETly9f1rp16zRu3Hi1b99DJUtWUMmSIer56EBtmrNQFzzz650JE/I0hI4ePar8+fNr1KhRf/n4wIED5e/vr9jY2Dz73rAGD8Mwbuf627oYgDVlZWWpY8eOateunV577bVbXh8WFsYfaE7g8uXL2rNnj2Jjd2vjxljt2bNbly6dU6FCdXTtWn1lZYVJuk/3aLHu0TmdzR+j344dVnBwcJ5vGzhwoBYuXKhjx46pWLFiCg8PV1RUlFauXKnWrVvn+feHy8rRazoQQwBylWEY6tOnj4oUKaLJkyfn6GuIIfPt3LlTjRo1kr9/I2VkNFJmZpik+pKqSPrvk6EPqozeV7by60I+bz355DUtWPCRQ/adPXtWFSpU0KBBg1S1alX1799fixYtUo8ePRzy/eGyiCEAjrdlyxY98MADqlmzpvLl+8+d+OjoaHXo0OGmX0MMmc9ms6l58w7aubO2srLG/+9n5aWvVFbLdE5llKqXVbBgHe3fv02VKlVy2Mbhw4dr0qRJys7O1pQpUzR48GCHfW+4rBzFEE+gBpCrmjVrptv8lyw4AU9PTy1b9plCQ+vrwoVGkrr98ZlU+WqsSum4TqmjstRD+fK9p7ZtWzs0hCSpUqVKysjIULNmzQgh5CqeQA0AkCQVLVpUMTFLVajQAEm/Sjql4hqqQCXodw1Vlp6UlKkCBd5TRMQ7Dt22fv16vfDCC2rSpIm2bt2qffv2OfT7w70RQwCA68LCwjRpUpQKebdVWQ1TtrwUpzGS6vxxxVw1bFhftRz4ekJ79uxRly5d1LdvX23cuFEhISEaNmyYw74/3B8xBAC47tKlS5o6brzKZJ7SJc89StJ4SSX/+GyWfHzGa8yY4Q7bc/ToUbVv315t27bVtGnT5O3trVGjRikmJkabN2922A64N2IIACBJ2r59u+4rWlQZJ39Xg8efVKn7Cihfvtl/umKRqlW7T02aNHHInrNnz6pt27YKDQ3VwoULrz8h/5lnnlHVqlX19ttvO2QH3B9PoAYAaPL7kzXxtVdVUNK7n87TM32e0fHjx1W7dmOlpNSTdL98fcdozJhpDttUqlQpHTt27G8f9/T01OHDhx22A+6PGAIAC8vMzFSn9o/q6PrvlSJp28GDql69uiSpfPnyWrz4U3Xv/oSuXRumkBB/tWrVytzBQB7gNhkAWNSxY8dUpnCgfl//vYrVbaCE1NTrIfRfHTq015Ah/SS9qOjoYfLwyNHLtgAuhRgCAAv65ptv1LhCBRVKT9NT/x6p7Xt2ytfX94bXRkaO1MKFC9WpUycHrwQcg9tkAGAhdrtdQ14eouUzpskmac6aNbd8b698+fLpqaeecsxAwATEEABYRFJSkpqFNVbmsSOyFSmuAwd+UlBQkNmzANNxmwwALGDXrl0qV6SIrh07ovrdeurE+TOEEPAHYggA3Nz0adPVpWFD+Uj698efaPHSxfL09Lzl1wFWwW0yAHBTWVlZeuzRrjq0eqVSJG3Zt8+hb6MBuApiCADc0IkTJ9S4Ri35X01RkZp1tW/bZvn5+Zk9C3BK3CYDADezYsUKNShfXt5XU9T9rXe0a/8eQgj4BzwyBABuwm63a+hrQ7V0ynsyJH20apXatWtn9izA6RFDAOAGkpOT9UCDJko7ckjZhYvop4P7FBwcbPYswCVwmwwAXNyePXt0b+HCSj1ySLU6PaaTiecIIeA2EEMA4MI+nPWhOtavL19Jb334ob5c9qW8vHjQH7gd/IoBABeUlZWlHl17aP/Kb5QqadOePapbt67ZswCXRAwBgIs5ffq0GtWoJd/kywqoWlN7d2xRQECA2bMAl8VtMgBwId99953qhoQof/JldX7tDe3++SdCCLhLPDIEAC7izaFv6fOJ4+Uh6YMVK/TII4+YPQlwC8QQADi55ORktWjygFIO7VeGX2Ht/nm/QkJCzJ4FuA1ukwGAE9u/f7+CCxfWlUP7Va39ozp96QIhBOQyYggAnNQnH3+ih2vXlr+k16fP0LKY5cqfP7/ZswC3w20yAHAyNptNT3Z/QrHfLNVVSet27VJYWJjZswC3RQwBgBNJSEhQwxq1VSgpUb4Vq2pv7HYVLlzY7FmAW+M2GQA4ie+//141y5SRZ1KiOr40RPt+/ZkQAhyAR4YAwAn8e/i/9X/RUconadqyZerUqZPZkwDLIIYAwERXr17VQ02b69L+3Uov5KedP+9X+fLlzZ4FWAq3yQDAJAcPHlQpPz8l7t+tym3aK+7yRUIIMAExBAAm+HTup2pTs6YCJL0yeYpWfh8jb29vs2cBlsRtMgBwIJvNpt5P9taOJYt1TdLq7dvVqFEjs2cBlkYMAYCDnD17Vg1r1FGBi+dUsFxFHd+zU4GBgWbPAiyP22QA4ADr169X9dKlle/iObUdMFgHf/+VEAKcBDEEAHls9KjRerZVK3lKeu/LLzVj5nTly8dvv4Cz4DYZAOSRtLQ0tX7gIZ3fs0NpBQppx88HVKFCBbNnAfgf/KsJAOSBw4cPq7Sfn87v2aH7WrRSQvJlQghwUsQQAOSyhQsXqmW1avI3DA0YP1Hfb1jLsXnAiXGbDAByid1u17O9n9WWRfOVIenrbdvUpEkTs2cBuAViCABywblz59Skdj15nkuQ173l9PtPu1WkSBGzZwHIAW6TAcBd2rRpk0JLlZJxLkEt/tVXv5z4nRACXAgxBAB3ISoyWr1btFB+SeO/+EIfzfmIY/OAi+E2GQDcgWvXrqldyzZK2LFVV/N7a8fPB1WpUiWzZwG4A/zrCwDcpiNHjijIP0AJO7bq3qbNlZB8hRACXBgxBAC3YfHixXqgShX52bLVb8w4bdi6UQULFjR7FoC7wG0yAMgBu92ufs/10/p5c5Qp6csfflCzZs3MngUgFxBDAHALiYmJalKnvhR/Sp6lg3Vk3x4VL17c7FkAcgm3yQDgH2zdulWVihdXdvwpPfDMszoSd5IQAtwMMQQANzF+3AT1bNZM3pLGLFqkOfPmcmwecEPcJgOA/5Genq5H2rTXyS0blerpqe0HD6pq1apmzwKQR4ghAPiTo0ePqlG16grMylRQw/t1YOMaFSpUyOxZAPIQj/cCwB++/PJL3V+pknyyMvVsRKQ279hCCAEWwCNDACzPbrdr0IDBWv3RLGVJ+nzDBrVo0cLsWQAchBgCYGmXLl1S07phsp06LpUorcP796pkyZJmzwLgQNwmA2BZ27dv131Fiyrz1HE1frK3jiacJoQACyKGAFjS+++/r+5NmqigpNH/93+a/9l8eXp6mj0LgAm4TQbAUjIzM9Wx3SM6tnGtUjw8tO3AAVWvXt3sWQBMRAwBsIxjx46pYfUauif9morXa6h9m9fL19fX7FkATMZtMgCW8M0336hxhQrySb+m3iNG6cfdOwghAJJ4ZAiAm7Pb7Xr5xVe0YuZ02STNXbtWrVq1MnsWACdCDAFwW0lJSWoW1liZx47IXqSEDhzYq6CgILNnAXAy3CYD4JZ27typ8kWK6NqxI6rfvaeOn08ghADcEDEEwO1MmzpNXRs1UiFJIz6Zo8VLFnNsHsBNcZsMgNvIzMxU145d9Mua75Qiacu+fapVq5bZswA4OWIIgFs4ceKEGlWvqYC0VBWtVU/7tm6Sn5+f2bMAuABukwFwed9++60alC+vAmmp6vH2cO3ct5sQApBjPDIEwGXZ7Xa9/urr+nrqZBmSPlq1Su3atTN7FgAXQwwBcElXrlzRAw2b6NqRw8oqXET7ft6vMmXKmD0LgAviNhkAl7N7926F3HOPrh45rNqdu+nUxfOEEIA7RgwBcCkffPCBHg0Lk6+ktz+craXfLOXYPIC7wm0yAC4hKytL3bt018GY5UqVtHnvXtWpU8fsWQDcADEEwOmdOnVKjarXkl/qFRUOram927coICDA7FkA3AS3yQA4te+++071ypaVd+oVdX3jTe05tJ8QApCreGQIgFOy2+16a+jb+uK9CZKkWTExat++vcmrALgjYgiA00lOTlaLxs2UcviAMvwKa8/P+xUSEmL2LABuittkAJzKTz/9pODChXXl8AFV69BJpy9dIIQA5CliCECuW7VqlapUqaKKFStq7NixOf66j2Z/pA5168pP0uszZmjZymXKnz9/3g0FAEkehmHczvW3dTEA67HZbKpcubLWrFmj4OBgNWjQQIsWLVK1atVu+jX16tXTfSH3ac+yL3VR0vrYWNWvX99xowG4K4+cXMRzhgDkqp07d6pixYq67777JElPPPGEli1bdtMYio+P19F9B5Wyd6/8KoVq764fVbhwYUdOBmBx3CYDkKvi4+N17733Xv/74OBgxcfH3/DaM2fOqNa9IQq0Z6nTK6/pp18OEkIAHO62bpM9/PDDRmJiYh7OMdeFCxdUvHhxs2fgDvCzcx5JSUlKTk5W2bJlJUkXL17U1atX//Yk6Pi4OBVKTNQVm02XJG6LuSh+7bk2d//57d69e7VhGA/f6jqeM/QnYWFhio2NNXsG7gA/O+fx448/6t1339Xq1aslSWPGjJEkvfPOO5Kk7OxsLV2wQL+sWSP/ypU14I03VKJECV29etW0zbhz/NpzbRb4+fGcIQCO16BBA/322286fvy4ypQpo8WLF+uzzz6TJF2+fFmTw8Ol8+fVsEcPPfzoo8qXj7v1AMxFDAHIVV5eXpo+fbratWsnm82m5557TtWrV9fvR49q/oQJks2mJ4YPV9XQULOnAoAkYugv+vfvb/YE3CF+ds6lQ4cO6tChgyTJMAytW71aPyxYIBUtqpdGjFDRokX/cn2xYsXMmIlcwK8918bP7z94zhCAPJOenq5Ppk7VhZ9+UvkHH9STzz0nb2/vv11ngectADAHzxkCYJ6zZ89qVlSUlJysdoMGqfH998vDI0e/LwGAQ/HMxRuYOHGiPDw85M4vI+COhg4dqqpVq6pWrVrq2rWrLl++bPYky/ppzx7NGjZMstn0fGSkmjRrdsMQ+u/bdhw8ePC23rYD5jt9+rRatmyp0NBQVa9eXVOmTDF7Em6TzWZT3bp11bFjR7OnmI4Y+h+nT5/WmjVreGNIF9SmTRsdPHhQ+/fvV+XKla8f6YbjZGdna8mCBfpm0iT5BAfrjfHj//ICjH9ms9k0ePBgfffdd6pevboWLVqkQ4cOOXgx7pSXl5cmTZqkw4cPa/v27ZoxYwY/PxczZcoUhXKQQRIx9Devvvqqxo8fz8P5Lqht27by8vrPnd/GjRsrLi7O5EXWcuXKFUW/845+XrVKYd266Y1335Wfn99Nr//z23Z4eHhcf9sOuIbSpUurXr16kiR/f3+Fhobe9JXG4Xzi4uK0cuVK9e3b1+wpToHnDP3J8uXLVaZMGdWuXdvsKbhLc+bMUc+ePc2eYRnHjh3T/40bJ9ls6vHOO6pWvfotv+ZGb9uxY8eOvJyJPHLixAnt3btXjRo1MnsKcmjIkCEaP368UlJSzJ7iFCwXQ61bt9bZs2f/9vGoqChFR0fr+++/N2EVcuqffn6dO3e+/p+9vLzUq1cvR8+zHMMwtHHtWm2aP18KDNSLI0bk+Jj8jU6y8ois60lNTVW3bt00efJkBQQEmD0HObBixQqVKFFC9evX18aNG82e4xQsF0Nr16580FgTAAAZBElEQVS94ccPHDig48ePX39UKC4uTvXq1dPOnTtVqlQpR07EP7jZz++/5s2bpxUrVmjdunX8wZrH0tPT9ekHH+hsbKxC7r9fvfv1u+Gx+ZsJDg7W6dOnr/99XFycgoKC8mIq8khWVpa6deumXr166bHHHjN7DnJo69atWr58uWJiYpSenq7k5GT17t1bCxYsMHuaaXidoZsoV66cYmNjeTE4F7Jq1Sq99tpr2rRpk1u/8aAzOHfunGZGRkrJyWrz3HNq+uCDtx2f2dnZqly5statW6fu3bsrOztbn332marn4BYbzGcYhvr06aMiRYpo8uTJZs/BHdq4caMmTpyoFStWmD0lr+ToNyaeQA238eKLLyolJUVt2rRRnTp1NGDAALMnuaX9+/Zp5jvvSNnZei4iQvc3b35Hj8L9+W07Dh48qB49ehBCLmTr1q2aP3++1q9frzp16qhOnTqKiYkxexZwR3hkCECO2Gw2ffPFFzqwYoUKli+vwW+9JX9//1z5Z/MK1ADyCK9ADSB3JCcna2pUlLLj41W3Sxd1fOwxeXp6mj0LAHIFMQTgH504cUKfjh0rZWWp+1tvqUbNmmZPAoBcRQwBuCHDMPTDxo1aP3eudM89GhwRwRPTAbglYgjA32RkZGjezJlK2LlTZRo31jMvvKACBQqYPQsA8gQxBOAvzp8/rw8iI6XLl9Wqf381u8PTYgDgKoghANcdPHBASydPlvLn17Ph4SpXrpzZkwAgzxFDAGSz2fTtl1/qp2XLlP/ee/Xy8OG5dmweAJwdMQRYXEpKiqaPGaOMkydV+9FH1enxxzk2D8BSiCHAwk6ePKm5Y8dKmZl67M03VeuP9+YDACshhgALMgxDWzdt0tq5c6XChTVo9GiVKFHC7FkAYApiCLCYjIwMLZg9W6e3b1fpsDD1GThQBQsWNHsWAJiGGAIsJDExUdMjIqSkJLV8/nk92LIlx+YBWB4xBFjEzwcPasnkyZKnp/qMHq3y5cubPQkAnAIxBLg5u92ulV9/rd1ffy3P0qX1yogRCggIMHsWADgNYghwY6mpqfpg3DilHTumGh06qEvPnvLy4pc9APwZvysCburUqVOaM3aslJ6uLq+/rjr16pk9CQCcEjEEuBnDMPTjli36/uOPpYAADRwzRiVLljR7FgA4LWIIcCOZmZn67JNPdOKHH1SiXj099+KLHJsHgFsghgA3cfHiRU2LiJAuXdKDzz6rlm3acGweAHKAGALcwOFDh/T5e+9Jnp56euRIVahY0exJAOAyiCHAhdntdn23fLl2LV0qlSihV0eNUuHChc2eBQAuhRgCXNTVq1c1a+JEpRw5omoPP6zHnnySY/MAcAf4nRNwQXFxcfo4Olq6dk2dXn1V9cLCzJ4EAC6LGAJciGEY2rFtm1Z99JHk56cBY8aoVKlSZs8CAJdGDAEuIisrS4vmzNGxzZtVtGZN9X3lFRUqVMjsWQDg8oghwAVcunRJU8PDpYsX1ezpp9WqXTuOzQNALiGGACf36y+/aNGkSZKHh3qPHKmKlSqZPQkA3AoxBDgpu92u71eu1PYvvpCKF9eQkSN1zz33mD0LANwOMQQ4obS0NH343nu6cviwqrRurceffppj8wCQR/jdFXAy8fHx+ig6WkpLU8dXXlFYw4ZmTwIAt0YMAU7CMAzF7typlTNnSn5+6h8VpaCgILNnAYDbI4YAJ5CVlaUv/u//9Nv69QqsXl39hgyRj4+P2bMAwBKIIcBkSUlJmhIeLiUmqsmTT6pNhw7Kly+f2bMAwDKIIcBER379VZ9NmiRJeurf/1blKlVMXgQA1kMMASaw2+1a+9132rZ4sVSsmF4ZOVKBgYFmzwIASyKGAAdLS0vTx1Om6NLBg6rYsqV69umj/Pnzmz0LACyLGAIcKCEhQbOjo6XUVHV48UU1aNyYt9UAAJMRQ4CD7N61S99+8IHk46N+UVEqU6aM2ZMAACKGgDyXnZ2tJfPn69e1axVQpYoGvPEGx+YBwIkQQ0Aeunz5siaHh0vnz6tRz55q17Ejx+YBwMkQQ0AeOfrbb1owYYJkGHpi+HBVDQ01exIA4AaIISCXGYahdatXa8vChVLRonp55EgVKVLE7FkAgJsghoBcdO3aNX0ydaoS9+9X+Qce0FPPP8+xeQBwcsQQkEvOnj2rWZGRUmqqHh40SI2aNuXYPAC4AGIIyAV7d+/WshkzpIIF1TcyUsHBwWZPAgDkEDEE3IXs7Gx9tWiRDq1aJb9KlTRw6FD5+vqaPQsAcBuIIeAOXblyRZPDw2WcO6cGjz+u9p06cWweAFwQMQTcgd+PHtX8CRMkm009hw1TaLVqZk8CANwhYgi4DYZhaOPatdo0f74UGKiXRo5U0aJFzZ4FALgLxBCQQ+np6Zo7Y4bO7dmjsvffr159+8rb29vsWQCAu0QMATlw7tw5zYyMlJKT1XbAADVp1oxj8wDgJogh4Bb27d2rr6dNkwoU0HMREQoJCTF7EgAgFxFDwE3YbDZ988UXOrBihQqVL6/Bb78tPz8/s2cBAHIZMQTcQHJysqZGRSk7Pl71unbVI127ytPT0+xZAIA8QAwB/+P48eOaN26clJWlx99+W9Vr1DB7EgAgDxFDwB8Mw9DmDRu04dNPpcBADY6IUPHixc2eBQDIY8QQICkjI0PzZs5Uwq5dCm7cWE/3768CBQqYPQsA4ADEECzv/Pnz+iAyUrpyRa379dP9zZtzbB4ALIQYgqUd2L9fX06ZInl761/h4SpbtqzZkwAADkYMwZJsNpuWL1mifStWyPvee/XSsGHy9/c3exYAwATEECwnJSVF06KjlXn6tOo8+qge7d6dY/MAYGHEECzl5MmTmjt2rJSZqW5vvqmatWqZPQkAYDJiCJZgGIa2bNqkdXPnSoULa9Do0SpRooTZswAAToAYgtvLyMjQ/NmzFbd9u4IaNFCfgQM5Ng8AuI4Yglu7cOGCZkRGSklJeqhvXz3QogXH5gEAf0EMwW39fPCglrz/vpQ/v/qMHq3y5cubPQkA4ISIIbgdm82mlV9/rT3ffCOvMmX08vDhCggIMHsWAMBJEUNwK6mpqZoxdqyuHT+umh07qkuPHhybd6ChQ4fq22+/lbe3typUqKC5c+fqnnvuMXsWAPyjfGYPAHLLqVOnNHHoUF1LSFDXoUPV7cknCSEHa9OmjQ4ePKj9+/ercuXKGjNmjNmTAOCWiCG4PMMwtHXzZs0ZMULy8tLAMWNUu04ds2dZUtu2beXl9Z8HnBs3bqy4uDiTFwHArXGbDC4tMzNTCz/+WCe3blXJevX0r8GDVbBgQbNnQdKcOXPUs2dPs2cAwC0RQ3BZiYmJmh4RISUlqfmzz6pF69Ycm3eA1q1b6+zZs3/7eFRUlDp37nz9P3t5ealXr143/efMnj1bs2fPlvSfl0AAALN4GIZxO9ff1sVAXjl86JA+f+89ydNTz7z5pu6rUMHsSfjDvHnzNGvWLK1bt04+Pj45+pqwsDDFxsbm8TIAFpSjf0PmkSG4FLvdrphlyxT75ZfyKFlSQ0aOVOHChc2ehT+sWrVK48aN06ZNm3IcQgBgNh4ZgstITU3VzAkTdPXoUVVv315dn3ji+pN14RwqVqyojIwMFS1aVNJ/nkQ9a9asW34djwwByCM8MgT3cfr0aX0yZoyUnq7Or72muvXrmz0JN3D06FGzJwDAbSOG4NQMw9D2rVu1+uOPJX9/DYiOVqlSpcyeBQBwI8QQnFZmZqYWzZmj4z/8oGK1aun5l19WoUKFzJ4FAHAzxBCc0qVLlzQ1PFy6eFEPPPOMHmrblmPzAIA8QQzB6fxy+LAWv/eelC+feo8cqYqVKpk9CQDgxoghOA273a7VK1ZoxxdfSCVKaMjIkbzJJwAgzxFDcApXr17Vh5MmKfnXX1W1TRt1792bY/MAAIfgTxuYLj4+Xh9FR0tpaXp0yBDVb9DA7EkAAAshhmAawzC0a8cOxcyaJfn56YXoaJUuXdrsWQAAiyGGYIqsrCx9Pm+ejm7YoCI1aqjfkCEcmwcAmIIYgsMlJSVpSni4lJiopk89pTYdOnBsHgBgGmIIDnXk11/12cSJkoeHeo0YoUqVK5s9CQBgccQQHMJut2tNTIx+/PxzqVgxvTJypAIDA82eBQAAMYS8l5aWpo8mT1bSzz+r0kMPqcczzyh//vxmzwIAQBIxhDyWkJCg2VFRUlqaHnn5ZYU1bMjzgwAAToUYQp6J3blTK2bOlHx81C8yUmXKlDF7EgAAf0MMIddlZWVpyYIFOrJ2rQqHhuqF116Tj4+P2bMAALghYgi56vLly5ocHi5duKDGTzyhto88onz58pk9CwCAmyKGkGuO/vabFkyYIBmGnhw+XFWqVjV7EgAAt0QM4a4ZhqF1q1dry8KFUtGiennkSBUpUsTsWQAA5AgxhLty7do1fTxlii4eOKD7HnxQTz73HMfmAQAuhRjCHTtz5ow+jIqSUlPVfvBgNWzShGPzAACXQwzhjuyJjdXyGTOkQoXUNzJSwcHBZk8CAOCOEEO4LdnZ2frys890ePVq+VWqpIFDh8rX19fsWQAA3DFiCDl25coVvT96tHT+vBr26KGHH32UY/MAAJdHDCFHfj96VPMnTJBsNvUcNkyh1aqZPQkAgFxBDOEfGYahDWvWaPOCBVKRInppxAgVLVrU7FkAAOQaYgg3lZ6erjnTp+v83r0q16yZnnr+eXl7e5s9CwCAXEUM4YbOnTunmZGRUkqK2g0cqMb338+xeQCAWyKG8Dc/7dmjb6ZPlwoW1PMREbr33nvNngQAQJ4hhnCdzWbT14sX62BMjHzuu0+D3npLfn5+Zs8CACBPEUOQJCUnJ2tKRIRsZ86o/mOP6ZGuXTk2DwCwBGIIOn78uOaNGydlZ+vxt99W9Ro1zJ4EAIDDEEMWZhiGNq1fr43z5kmBgXoxMlLFihUzexYAAA5FDFlUenq65s2cqTOxsbq3cWM9/cILHJsHAFgSMWRB58+f1weRkdKVK2rdr5/ub96cY/MAAMsihixm/759+mrqVMnbW/8KD1fZsmXNngQAgKmIIYuw2Wxa9sUX2r9ihQqULasX33lH/v7+Zs8CAMB0xJAFpKSkaGpUlLLi4lSnUyc92r27PD09zZ4FAIBTIIbc3IkTJ/Tp2LFSVpa6v/WWatSsafYkAACcCjHkpgzD0JZNm7Ru7lypcGENjohQ8eLFzZ4FAIDTIYbcUEZGhv7vww8Vv327gho2VJ+BA1WgQAGzZwEA4JSIITdz4cIFzYiMlC5f1kP9+umBFi04Ng8AwD8ghtzIwQMHtHTyZCl/fj07erTKlStn9iQAAJweMeQGbDabVnz1lfYuWyavMmX08vDhCggIMHsWAAAugRhycampqZo+dqzSjx9XrY4d1blHD47NAwBwG4ghF3bq1CnNGTNGysjQY2++qVq1a5s9CQAAl0MMuSDDMLTthx+05pNPpIAADXz3XZUsWdLsWQAAuCRiyMVkZmZqwUcf6dS2bSpVv76eHTRIBQsWNHsWAAAuixhyIYmJiZoeESElJanFv/6l5q1acWweAIC7RAy5iEM//6wv3n9f8vTUM+++q/vuu8/sSQAAuAViyMnZ7XbFLFum2C+/VL7SpfXKv/+twoULmz0LAAC3QQw5sdTUVM2cMEFXjx5V9fbt1fWJJ+TlxY8MAIDcxJ+sTur06dP6ZMwYKT1dXV5/XXXq1TN7EgAAbokYcjKGYWj71q1a/fHHkr+/BkRHq1SpUmbPAgDAbRFDTiQzM1OL5szR8R9+UPHatfXcSy+pUKFCZs8CAMCtEUNO4uLFi5oWESFduqQHnnlGD7Vty7F5AAAcgBhyAr8cPqzF770n5cunp0eOVIWKFc2eBACAZRBDJrLb7Vr17bfauWSJVKKEhowcqXvuucfsWQAAWAoxZJKrV69q1sSJSjlyRKFt26pbr14cmwcAwAT86WuCuLg4fTxmjJSWpk6vvqp6YWFmTwIAwLKIIQcyDEM7f/xR382eLfn56YXoaJUuXdrsWQAAWBox5CBZWVla/Omn+n3jRhWpUUP9hgzh2DwAAE6AGHKAS5cuaWpEhJSYqPt79VLr9u05Ng8AgJMghvLYkV9/1WcTJ0oeHuo1YoQqVa5s9iQAAPAnxFAesdvtWhMTox8//1wqVkyvjBypwMBAs2cBAID/QQzlgbS0NM1+7z1dPnxYlVu10uNPP638+fObPQsAANwAMZTLEhISNDsqSkpLU8dXXlFYw4ZmTwIAAP+AGMpFsTt3asXMmZKPj/pHRSkoKMjsSQAA4BaIoVyQlZWlJfPn68i6dbonNFT9X3tNPj4+Zs8CAAA5QAz9gwsXLujHTZvU8bHHlC9fvhtek5SUpCnh4VJioho/8YTaPvLITa8FAADOhxj6BxtXrtSxb76Rj4+PWnfo8LfP/3bkiBZOnCgZhp4cPlxVqlY1YSUAALgbPIRxExcvXtSJzZv1QtWqOrB4sQ4fOnT9c4ZhaE1MjBZGREi+vnp53DhCCAAAF8UjQzexZc0aNfTw0D0FC6pHsWL6bMYMlQgPl4+Pjz6eMkUXDxxQhebN9cS//sWxeQAAXBgxdANXrlzRL2vX6uVSpSRJZQIC1DIhQYumT1fihQtSaqraDx6shk2a8LYaAAC4OGLoBrZt2KB6drsK/ekRn/qlS+vggQNKDAxU38hIBQcHm7gQAADkFp4z9D+uXr2q/d99p8YlS/7l4x4eHuoVGqpS6emKP3XKpHUAACC3EUP/Y/sPP6hGZqb8CxT42+fye3qqZ1CQNn/yiU4RRAAAuAVi6E/S09MVu3y5mpYocdNrAgsVUhcfHy2dOlWpqakOXAcAAPICMfQnu7ZvV+W0NAUWKvSP11UsUkRVz5/Xko8/lt1ud9A6wHVMnDhRHh4eSkxMNHsKANwST6D+Q1ZWlrZ//bWeLV78Lx83DEMpmZlKSElRwtWrOuPhoQTDkAIDFezrK5vNlqevOL106VItWrRIsbGxOn/+vEJCQvTYY49p2LBh8vf3z7PvC9yp06dPa82aNQoJCTF7CgDkCDH0h927dink8mUVDArSr4mJSrh6VQkeHjpjGDICAlS6ShUFVa2q+vfeq0eDguTv7++QY/UTJ05USEiIoqOjFRwcrL179+rdd9/Vhg0btG3bNt76A07n1Vdf1fjx49W5c2ezpwBAjhBDf9jx/fdKsdk0MzVVQZUrKyg0VPWCgxUUFKSAgADTXk/o22+/VfE/PVrVvHlzFSlSRH369NHGjRv10EMPmbILuJHly5erTJkyql27ttlTACDHiKE/dO/XT35+fqaGz40U/5/bdpLUoEEDSVJ8fPz1jx09elShoaEaNmyYRo8eff3jAwcO1IIFC7RhwwaFhYXl/WC4vdatW+vs2bN/+3hUVJSio6P1/fff5+ifM3v2bM2ePVvSf94UGQDM4mEYxu1cf1sXI2/MmjVLAwcO1K5du/4SOAMHDtTChQt17NgxFStWTOHh4YqKitLKlSvVunVrExfDCg4cOKBWrVrJx8dHkhQXF6egoCDt3LlTpf54NfebCQsLU2xsrCNmArCWHD26QQy5mPj4eNWtW1e1a9fWmjVr/vK5s2fPqkKFCho0aJCqVq2q/v37a9GiRerRo4dJa2Fl5cqVU2xsrIoVK3bLa4khAHkkRzHEs28daO3atfLw8LjlXy1atLjh16empqpz587y8vLS3Llz//b5UqVKaciQIZo2bZpeeOEFTZ06lRACAOAWeM6QAzVt2lSHDx++5XX/vc3wZ+np6erUqZOOHTumTZs23fS90SpVqqSMjAw1a9ZMgwcPvuvNwJ06ceKE2RMAIEeIIQfy8fFR1apVb/vrsrKy1K1bN+3cuVNr165VzZo1b3jd+vXr9cILL6hJkybaunWr9u3bx6keAABugdtkTs5ut6tXr15at26dli1bpsaNG9/wuj179qhLly7q27evNm7cqJCQEA0bNszBawEAcD3EkJMbPHiwlixZojfeeEO+vr7avn379b/i4uIk/edYffv27dW2bVtNmzZN3t7eGjVqlGJiYrR582aT/xsAAODcOE3m5MqVK6eTJ0/e8HOjRo3SgAED1LRpU4WEhGj16tUqUKCAJMlms6lGjRoKDAzUtm3bHDkZuG2cJgOQRzhaD8A1EEMA8ghH6wEAAG6FGAIAAJZGDAEAAEsjhgAAgKURQwAAwNKIIQAAYGnEEAAAsDRiCAAAWBoxBAAALI0YAgAAlkYMAQAASyOGAACApRFDAADA0oghAABgacQQAACwNGIIAABYGjEEAAAsjRgCAACWRgwBAABLI4YAAIClEUMAAMDSiCEAAGBpxBAAALA0YggAAFgaMQQAACyNGAIAAJZGDAEAAEsjhgAAgKURQwAAwNKIIQAAYGnEEAAAsDRiCAAAWBoxBAAALM3DMAyzNwCwOA8Pj1WGYTxs9g4A1kQMAQAAS+M2GQAAsDRiCAAAWBoxBAAALI0YAgAAlkYMAQAASyOGAACApRFDAADA0oghAABgacQQAACwtP8HrmTs2SxARwAAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(10, 8))\n",
+ "# Set the axes through the origin\n",
+ "for spine in ['left', 'bottom']:\n",
+ " ax.spines[spine].set_position('zero')\n",
+ "for spine in ['right', 'top']:\n",
+ " ax.spines[spine].set_color('none')\n",
+ "\n",
+ "ax.set(xlim=(-5, 5), ylim=(-5, 5))\n",
+ "x = (2, 2)\n",
+ "ax.annotate('', xy=x, xytext=(0, 0),\n",
+ " arrowprops=dict(facecolor='blue',\n",
+ " shrink=0,\n",
+ " alpha=1,\n",
+ " width=0.5))\n",
+ "ax.text(x[0] + 0.4, x[1] - 0.2, '$x$', fontsize='16')\n",
+ "\n",
+ "\n",
+ "scalars = (-2, 2)\n",
+ "x = np.array(x)\n",
+ "\n",
+ "for s in scalars:\n",
+ " v = s * x\n",
+ " ax.annotate('', xy=v, xytext=(0, 0),\n",
+ " arrowprops=dict(facecolor='red',\n",
+ " shrink=0,\n",
+ " alpha=0.5,\n",
+ " width=0.5))\n",
+ " ax.text(v[0] + 0.4, v[1] - 0.2, f'${s} x$', fontsize='16')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In Python, a vector can be represented as a list or tuple, such as `x = (2, 4, 6)`, but is more commonly represented as a [NumPy array](https://lectures.quantecon.org/py/numpy.html#numpy-array)\n",
+ "\n",
+ "One advantage of NumPy arrays is that scalar multiplication and addition have very natural syntax"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([3., 5., 7.])"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = np.ones(3) # Vector of three ones\n",
+ "y = np.array((2, 4, 6)) # Converts tuple (2, 4, 6) into array\n",
+ "x + y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([4., 4., 4.])"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "4 * x"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Inner Product and Norm\n",
+ "\n",
+ "\n",
+ "\n",
+ "The *inner product* of vectors $ x,y \\in \\mathbb R ^n $ is defined as\n",
+ "\n",
+ "$$\n",
+ "x' y := \\sum_{i=1}^n x_i y_i\n",
+ "$$\n",
+ "\n",
+ "Two vectors are called *orthogonal* if their inner product is zero\n",
+ "\n",
+ "The *norm* of a vector $ x $ represents its “length” (i.e., its distance from the zero vector) and is defined as\n",
+ "\n",
+ "$$\n",
+ "\\| x \\| := \\sqrt{x' x} := \\left( \\sum_{i=1}^n x_i^2 \\right)^{1/2}\n",
+ "$$\n",
+ "\n",
+ "The expression $ \\| x - y\\| $ is thought of as the distance between $ x $ and $ y $\n",
+ "\n",
+ "Continuing on from the previous example, the inner product and norm can be computed as\n",
+ "follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "12.0"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.sum(x * y) # Inner product of x and y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.7320508075688772"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.sqrt(np.sum(x**2)) # Norm of x, take one"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "1.7320508075688772"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.linalg.norm(x) # Norm of x, take two"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Span\n",
+ "\n",
+ "\n",
+ "\n",
+ "Given a set of vectors $ A := \\{a_1, \\ldots, a_k\\} $ in $ \\mathbb R ^n $, it’s natural to think about the new vectors we can create by performing linear operations\n",
+ "\n",
+ "New vectors created in this manner are called *linear combinations* of $ A $\n",
+ "\n",
+ "In particular, $ y \\in \\mathbb R ^n $ is a linear combination of $ A := \\{a_1, \\ldots, a_k\\} $ if\n",
+ "\n",
+ "$$\n",
+ "y = \\beta_1 a_1 + \\cdots + \\beta_k a_k\n",
+ "\\text{ for some scalars } \\beta_1, \\ldots, \\beta_k\n",
+ "$$\n",
+ "\n",
+ "In this context, the values $ \\beta_1, \\ldots, \\beta_k $ are called the *coefficients* of the linear combination\n",
+ "\n",
+ "The set of linear combinations of $ A $ is called the *span* of $ A $\n",
+ "\n",
+ "The next figure shows the span of $ A = \\{a_1, a_2\\} $ in $ \\mathbb R ^3 $\n",
+ "\n",
+ "The span is a 2 dimensional plane passing through these two points and the origin\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "hide-output": false,
+ "html-class": "collapse"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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xepra2tDZmYmHnnkEWzdupUjBYhuj2GIiGgwhBC4fv26fOjs6dOnERISIg+ATElJwahRo1xSyzfffIM//vGPyMnJweLFi13ymkQqwDBERDSUhBBobW2VF2OfPXsWY8eOlWcczZ49e8gPnRVC4MCBA8jNzUVeXh7i4+OH9M8nUjmGISKi4SSEQFNTEwwGA4qKilBWVoYJEyZAr9dDp9Nh5syZg9rq3tfXh2effRZmsxm5ubkICgoawuqJvALDEBGRKwkhUF9fL4ej77//HnFxccjIyIBer4dWq73jdT6tra1YuXIllixZgs2bN3N9ENG9YRgiIlKSJEmora2Vw1FVVRUSExPlNUcJCQk/G3JKS0uRlZWFV155BYsWLVKgciLVYBgiInInkiShoqJCPnS2rq4OWq0WOp0Oer0ecXFxeP/99/HRRx+hoKAAcXFxSpdM5OkYhoiI3JnT6cS5c+fkBdllZWVITk7GoUOHEBgYqHR5RGrAMERE5EnMZjP8/f1dtl2fyAswDBEREZFXu6MwxO0JRERE5NUYhoiIiMirMQwRERGRV2MYIiIiIq/GMERERERejWGIiIiIvBrDEBEREXk1hiEiIiLyagxDRERE5NUYhoiIiMirMQwRERGRV2MYIiIiIq/GMERERERejWGIiIiIvBrDEBEREXk1hiEiIiLyagxDRERE5NUYhoiIiMirMQwRERGRV2MYIiIiIq/GMERERERejWGIiIiIvBrDEBEREXk1hiEiIiLyar53+ft9hqUKIiIiIoWwM0RERERejWGIiIiIvBrDEBEREXk1hiEiIiLyagxDRERE5NUYhoiIiMirMQwRERGRV2MYIiIiIq/GMERERERejWGIiIiIvNr/AV5wMTJvueVBAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from matplotlib import cm\n",
+ "from mpl_toolkits.mplot3d import Axes3D\n",
+ "from scipy.interpolate import interp2d\n",
+ "\n",
+ "fig = plt.figure(figsize=(10, 8))\n",
+ "ax = fig.gca(projection='3d')\n",
+ "\n",
+ "x_min, x_max = -5, 5\n",
+ "y_min, y_max = -5, 5\n",
+ "\n",
+ "α, β = 0.2, 0.1\n",
+ "\n",
+ "ax.set(xlim=(x_min, x_max), ylim=(x_min, x_max), zlim=(x_min, x_max),\n",
+ " xticks=(0,), yticks=(0,), zticks=(0,))\n",
+ "\n",
+ "gs = 3\n",
+ "z = np.linspace(x_min, x_max, gs)\n",
+ "x = np.zeros(gs)\n",
+ "y = np.zeros(gs)\n",
+ "ax.plot(x, y, z, 'k-', lw=2, alpha=0.5)\n",
+ "ax.plot(z, x, y, 'k-', lw=2, alpha=0.5)\n",
+ "ax.plot(y, z, x, 'k-', lw=2, alpha=0.5)\n",
+ "\n",
+ "\n",
+ "# Fixed linear function, to generate a plane\n",
+ "def f(x, y):\n",
+ " return α * x + β * y\n",
+ "\n",
+ "# Vector locations, by coordinate\n",
+ "x_coords = np.array((3, 3))\n",
+ "y_coords = np.array((4, -4))\n",
+ "z = f(x_coords, y_coords)\n",
+ "for i in (0, 1):\n",
+ " ax.text(x_coords[i], y_coords[i], z[i], f'$a_{i+1}$', fontsize=14)\n",
+ "\n",
+ "# Lines to vectors\n",
+ "for i in (0, 1):\n",
+ " x = (0, x_coords[i])\n",
+ " y = (0, y_coords[i])\n",
+ " z = (0, f(x_coords[i], y_coords[i]))\n",
+ " ax.plot(x, y, z, 'b-', lw=1.5, alpha=0.6)\n",
+ "\n",
+ "\n",
+ "# Draw the plane\n",
+ "grid_size = 20\n",
+ "xr2 = np.linspace(x_min, x_max, grid_size)\n",
+ "yr2 = np.linspace(y_min, y_max, grid_size)\n",
+ "x2, y2 = np.meshgrid(xr2, yr2)\n",
+ "z2 = f(x2, y2)\n",
+ "ax.plot_surface(x2, y2, z2, rstride=1, cstride=1, cmap=cm.jet,\n",
+ " linewidth=0, antialiased=True, alpha=0.2)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Examples\n",
+ "\n",
+ "If $ A $ contains only one vector $ a_1 \\in \\mathbb R ^2 $, then its\n",
+ "span is just the scalar multiples of $ a_1 $, which is the unique line passing through both $ a_1 $ and the origin\n",
+ "\n",
+ "If $ A = \\{e_1, e_2, e_3\\} $ consists of the *canonical basis vectors* of $ \\mathbb R ^3 $, that is\n",
+ "\n",
+ "$$\n",
+ "e_1 :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " 1 \\\\\n",
+ " 0 \\\\\n",
+ " 0\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ ", \\quad\n",
+ "e_2 :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " 0 \\\\\n",
+ " 1 \\\\\n",
+ " 0\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ ", \\quad\n",
+ "e_3 :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " 0 \\\\\n",
+ " 0 \\\\\n",
+ " 1\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "then the span of $ A $ is all of $ \\mathbb R ^3 $, because, for any\n",
+ "$ x = (x_1, x_2, x_3) \\in \\mathbb R ^3 $, we can write\n",
+ "\n",
+ "$$\n",
+ "x = x_1 e_1 + x_2 e_2 + x_3 e_3\n",
+ "$$\n",
+ "\n",
+ "Now consider $ A_0 = \\{e_1, e_2, e_1 + e_2\\} $\n",
+ "\n",
+ "If $ y = (y_1, y_2, y_3) $ is any linear combination of these vectors, then $ y_3 = 0 $ (check it)\n",
+ "\n",
+ "Hence $ A_0 $ fails to span all of $ \\mathbb R ^3 $\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Linear Independence\n",
+ "\n",
+ "\n",
+ "\n",
+ "As we’ll see, it’s often desirable to find families of vectors with relatively large span, so that many vectors can be described by linear operators on a few vectors\n",
+ "\n",
+ "The condition we need for a set of vectors to have a large span is what’s called linear independence\n",
+ "\n",
+ "In particular, a collection of vectors $ A := \\{a_1, \\ldots, a_k\\} $ in $ \\mathbb R ^n $ is said to be\n",
+ "\n",
+ "- *linearly dependent* if some strict subset of $ A $ has the same span as $ A $ \n",
+ "- *linearly independent* if it is not linearly dependent \n",
+ "\n",
+ "\n",
+ "Put differently, a set of vectors is linearly independent if no vector is redundant to the span, and linearly dependent otherwise\n",
+ "\n",
+ "To illustrate the idea, recall [the figure](#la-3dvec) that showed the span of vectors $ \\{a_1, a_2\\} $ in $ \\mathbb R ^3 $ as a plane through the origin\n",
+ "\n",
+ "If we take a third vector $ a_3 $ and form the set $ \\{a_1, a_2, a_3\\} $, this set will be\n",
+ "\n",
+ "- linearly dependent if $ a_3 $ lies in the plane \n",
+ "- linearly independent otherwise \n",
+ "\n",
+ "\n",
+ "As another illustration of the concept, since $ \\mathbb R ^n $ can be spanned by $ n $ vectors\n",
+ "(see the discussion of canonical basis vectors above), any collection of\n",
+ "$ m > n $ vectors in $ \\mathbb R ^n $ must be linearly dependent\n",
+ "\n",
+ "The following statements are equivalent to linear independence of $ A := \\{a_1, \\ldots, a_k\\} \\subset \\mathbb R ^n $\n",
+ "\n",
+ "1. No vector in $ A $ can be formed as a linear combination of the other elements \n",
+ "1. If $ \\beta_1 a_1 + \\cdots \\beta_k a_k = 0 $ for scalars $ \\beta_1, \\ldots, \\beta_k $, then $ \\beta_1 = \\cdots = \\beta_k = 0 $ \n",
+ "\n",
+ "\n",
+ "(The zero in the first expression is the origin of $ \\mathbb R ^n $)\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Unique Representations\n",
+ "\n",
+ "Another nice thing about sets of linearly independent vectors is that each element in the span has a unique representation as a linear combination of these vectors\n",
+ "\n",
+ "In other words, if $ A := \\{a_1, \\ldots, a_k\\} \\subset \\mathbb R ^n $ is\n",
+ "linearly independent and\n",
+ "\n",
+ "$$\n",
+ "y = \\beta_1 a_1 + \\cdots \\beta_k a_k\n",
+ "$$\n",
+ "\n",
+ "then no other coefficient sequence $ \\gamma_1, \\ldots, \\gamma_k $ will produce\n",
+ "the same vector $ y $\n",
+ "\n",
+ "Indeed, if we also have $ y = \\gamma_1 a_1 + \\cdots \\gamma_k a_k $,\n",
+ "then\n",
+ "\n",
+ "$$\n",
+ "(\\beta_1 - \\gamma_1) a_1 + \\cdots + (\\beta_k - \\gamma_k) a_k = 0\n",
+ "$$\n",
+ "\n",
+ "Linear independence now implies $ \\gamma_i = \\beta_i $ for all $ i $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Matrices\n",
+ "\n",
+ "\n",
+ "\n",
+ "Matrices are a neat way of organizing data for use in linear operations\n",
+ "\n",
+ "An $ n \\times k $ matrix is a rectangular array $ A $ of numbers with $ n $ rows and $ k $ columns:\n",
+ "\n",
+ "$$\n",
+ "A =\n",
+ "\\left[\n",
+ "\\begin{array}{cccc}\n",
+ " a_{11} & a_{12} & \\cdots & a_{1k} \\\\\n",
+ " a_{21} & a_{22} & \\cdots & a_{2k} \\\\\n",
+ " \\vdots & \\vdots & & \\vdots \\\\\n",
+ " a_{n1} & a_{n2} & \\cdots & a_{nk}\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "Often, the numbers in the matrix represent coefficients in a system of linear equations, as discussed at the start of this lecture\n",
+ "\n",
+ "For obvious reasons, the matrix $ A $ is also called a vector if either $ n = 1 $ or $ k = 1 $\n",
+ "\n",
+ "In the former case, $ A $ is called a *row vector*, while in the latter it is called a *column vector*\n",
+ "\n",
+ "If $ n = k $, then $ A $ is called *square*\n",
+ "\n",
+ "The matrix formed by replacing $ a_{ij} $ by $ a_{ji} $ for every $ i $ and $ j $ is called the *transpose* of $ A $, and denoted $ A' $ or $ A^{\\top} $\n",
+ "\n",
+ "If $ A = A' $, then $ A $ is called *symmetric*\n",
+ "\n",
+ "For a square matrix $ A $, the $ i $ elements of the form $ a_{ii} $ for $ i=1,\\ldots,n $ are called the *principal diagonal*\n",
+ "\n",
+ "$ A $ is called *diagonal* if the only nonzero entries are on the principal diagonal\n",
+ "\n",
+ "If, in addition to being diagonal, each element along the principal diagonal is equal to 1, then $ A $ is called the *identity matrix*, and denoted by $ I $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Matrix Operations\n",
+ "\n",
+ "\n",
+ "\n",
+ "Just as was the case for vectors, a number of algebraic operations are defined for matrices\n",
+ "\n",
+ "Scalar multiplication and addition are immediate generalizations of the vector case:\n",
+ "\n",
+ "$$\n",
+ "\\gamma A =\n",
+ "\\gamma\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " a_{11} & \\cdots & a_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " a_{n1} & \\cdots & a_{nk} \\\\\n",
+ "\\end{array}\n",
+ "\\right] :=\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " \\gamma a_{11} & \\cdots & \\gamma a_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " \\gamma a_{n1} & \\cdots & \\gamma a_{nk} \\\\\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "and\n",
+ "\n",
+ "$$\n",
+ "A + B =\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " a_{11} & \\cdots & a_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " a_{n1} & \\cdots & a_{nk} \\\\\n",
+ "\\end{array}\n",
+ "\\right] +\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " b_{11} & \\cdots & b_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " b_{n1} & \\cdots & b_{nk} \\\\\n",
+ "\\end{array}\n",
+ "\\right] :=\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " a_{11} + b_{11} & \\cdots & a_{1k} + b_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " a_{n1} + b_{n1} & \\cdots & a_{nk} + b_{nk} \\\\\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "$$\n",
+ "\n",
+ "In the latter case, the matrices must have the same shape in order for the definition to make sense\n",
+ "\n",
+ "We also have a convention for *multiplying* two matrices\n",
+ "\n",
+ "The rule for matrix multiplication generalizes the idea of inner products discussed above,\n",
+ "and is designed to make multiplication play well with basic linear operations\n",
+ "\n",
+ "If $ A $ and $ B $ are two matrices, then their product $ A B $ is formed by taking as its\n",
+ "$ i,j $-th element the inner product of the $ i $-th row of $ A $ and the\n",
+ "$ j $-th column of $ B $\n",
+ "\n",
+ "There are many tutorials to help you visualize this operation, such as [this one](http://www.mathsisfun.com/algebra/matrix-multiplying.html), or the discussion on the [Wikipedia page](https://en.wikipedia.org/wiki/Matrix_multiplication)\n",
+ "\n",
+ "If $ A $ is $ n \\times k $ and $ B $ is $ j \\times m $, then\n",
+ "to multiply $ A $ and $ B $ we require $ k = j $, and the\n",
+ "resulting matrix $ A B $ is $ n \\times m $\n",
+ "\n",
+ "As perhaps the most important special case, consider multiplying $ n \\times k $ matrix $ A $ and $ k \\times 1 $ column vector $ x $\n",
+ "\n",
+ "According to the preceding rule, this gives us an $ n \\times 1 $ column vector\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "A x =\n",
+ "\\left[\n",
+ "\\begin{array}{ccc}\n",
+ " a_{11} & \\cdots & a_{1k} \\\\\n",
+ " \\vdots & \\vdots & \\vdots \\\\\n",
+ " a_{n1} & \\cdots & a_{nk}\n",
+ "\\end{array}\n",
+ "\\right]\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " x_{1} \\\\\n",
+ " \\vdots \\\\\n",
+ " x_{k}\n",
+ "\\end{array}\n",
+ "\\right] :=\n",
+ "\\left[\n",
+ "\\begin{array}{c}\n",
+ " a_{11} x_1 + \\cdots + a_{1k} x_k \\\\\n",
+ " \\vdots \\\\\n",
+ " a_{n1} x_1 + \\cdots + a_{nk} x_k\n",
+ "\\end{array}\n",
+ "\\right] \\tag{2}\n",
+ "$$\n",
+ "\n",
+ ">**Note**\n",
+ ">\n",
+ ">$ A B $ and $ B A $ are not generally the same thing\n",
+ "\n",
+ "Another important special case is the identity matrix\n",
+ "\n",
+ "You should check that if $ A $ is $ n \\times k $ and $ I $ is the $ k \\times k $ identity matrix, then $ AI = A $\n",
+ "\n",
+ "If $ I $ is the $ n \\times n $ identity matrix, then $ IA = A $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Matrices in NumPy\n",
+ "\n",
+ "\n",
+ "\n",
+ "NumPy arrays are also used as matrices, and have fast, efficient functions and methods for all the standard matrix operations [1]\n",
+ "\n",
+ "You can create them manually from tuples of tuples (or lists of lists) as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "tuple"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = ((1, 2),\n",
+ " (3, 4))\n",
+ "\n",
+ "type(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "numpy.ndarray"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.array(A)\n",
+ "\n",
+ "type(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(2, 2)"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The `shape` attribute is a tuple giving the number of rows and columns —\n",
+ "see [here](https://lectures.quantecon.org/py/numpy.html#numpy-shape-dim) for more discussion\n",
+ "\n",
+ "To get the transpose of `A`, use `A.transpose()` or, more simply, `A.T`\n",
+ "\n",
+ "There are many convenient functions for creating common matrices (matrices of zeros, ones, etc.) — see [here](https://lectures.quantecon.org/py/numpy.html#creating-arrays)\n",
+ "\n",
+ "Since operations are performed elementwise by default, scalar multiplication and addition have very natural syntax"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[2., 0., 0.],\n",
+ " [0., 2., 0.],\n",
+ " [0., 0., 2.]])"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = np.identity(3)\n",
+ "B = np.ones((3, 3))\n",
+ "2 * A"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[2., 1., 1.],\n",
+ " [1., 2., 1.],\n",
+ " [1., 1., 2.]])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A + B"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To multiply matrices we use the `@` symbol\n",
+ "\n",
+ "In particular, `A @ B` is matrix multiplication, whereas `A * B` is element by element multiplication\n",
+ "\n",
+ "See [here](https://lectures.quantecon.org/py/numpy.html#numpy-matrix-multiplication) for more discussion\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Matrices as Maps\n",
+ "\n",
+ "\n",
+ "\n",
+ "Each $ n \\times k $ matrix $ A $ can be identified with a function $ f(x) = Ax $ that maps $ x \\in \\mathbb R ^k $ into $ y = Ax \\in \\mathbb R ^n $\n",
+ "\n",
+ "These kinds of functions have a special property: they are *linear*\n",
+ "\n",
+ "A function $ f \\colon \\mathbb R ^k \\to \\mathbb R ^n $ is called *linear* if, for all $ x, y \\in \\mathbb R ^k $ and all scalars $ \\alpha, \\beta $, we have\n",
+ "\n",
+ "$$\n",
+ "f(\\alpha x + \\beta y) = \\alpha f(x) + \\beta f(y)\n",
+ "$$\n",
+ "\n",
+ "You can check that this holds for the function $ f(x) = A x + b $ when $ b $ is the zero vector, and fails when $ b $ is nonzero\n",
+ "\n",
+ "In fact, it’s [known](https://en.wikipedia.org/wiki/Linear_map#Matrices) that $ f $ is linear if and *only if* there exists a matrix $ A $ such that $ f(x) = Ax $ for all $ x $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Solving Systems of Equations\n",
+ "\n",
+ "\n",
+ "\n",
+ "Recall again the system of equations [(1)](#equation-la-se)\n",
+ "\n",
+ "If we compare [(1)](#equation-la-se) and [(2)](#equation-la-atx), we see that [(1)](#equation-la-se) can now be\n",
+ "written more conveniently as\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "y = Ax \\tag{3}\n",
+ "$$\n",
+ "\n",
+ "The problem we face is to determine a vector $ x \\in \\mathbb R ^k $ that solves [(3)](#equation-la-se2), taking $ y $ and $ A $ as given\n",
+ "\n",
+ "This is a special case of a more general problem: Find an $ x $ such that $ y = f(x) $\n",
+ "\n",
+ "Given an arbitrary function $ f $ and a $ y $, is there always an $ x $ such that $ y = f(x) $?\n",
+ "\n",
+ "If so, is it always unique?\n",
+ "\n",
+ "The answer to both these questions is negative, as the next figure shows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "hide-output": false,
+ "html-class": "collapse"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAI1CAYAAADVQv5HAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3XdcVuX/x/E3MlQUcO+9UMGNigtzhqa40zKzYa40M6tvy5w50rKs/FpZuXCXO/3m3hiIOEBxK2puBRQHyPn9Qd4/SStU4NxwXs/H436g5zp4f4Rz3ff7vs51ruNgGIYAAACsKovZBQAAAJiJMAQAACyNMAQAACyNMAQAACyNMAQAACyNMAQAACyNMAQAACyNMAQAACyNMAQAACyNMAQAACzN6RH3594dAFKdv7+/Vq9ebXYZADIfh5TsxMgQANNdunTJ7BIAWBhhCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAWBphCAAAixkyZIgqV66sgQMHml2KXXjUe5MBAIAM7NixY9q2bZsiIiLMLsVuMDIEAIBFREZGqnHjxjp58qRq1KihGzdumF2SXWBkCACAdObgkKKbqT8ywzD+sd3T01M9e/ZUqVKl1KtXrzSpISNiZAgAAAvZt2+fqlWrZnYZdoWRIQAA0tm/jeCkpfDwcHl5eZn2/PaIkSEAACwiNjZWzs7OcnV1NbsUu0IYAgDAIvbv3y9vb2+zy7A7Do84VGfeuB6ATMvHx0chISFmlwEg80nRTHVGhgAAgKURhgAAgKURhgAAgKURhgAAgKURhgAAgKURhgAAgKURhgAAgKURhgAAgKURhgAAgOkmT56sSpUqqXv37g9tHzJkiCpXrqyBAwem+nNzo1YAACzIMAwZhqEsWexjXGTKlClatWqVSpcu/UDbsWPHtG3bNkVERKTJc9vHTwAAAKS5EydOqFKlSurfv79q1qypqKgotW/fXrVq1ZKXl5e+++67ZPu99tpr8vLyUsuWLXXz5k1J0qhRo1SxYkW1aNFCzz33nCZOnChJmj17turUqaPq1aurT58+unv37kNr+Pzzz+Xt7S1vb2998cUXkqS+ffvq2LFjCggI0KRJk5LtHxkZqcaNG+vkyZOqUaOGbty4kfo/mHvJMIUPAEh1tWrVMrsEIN0NG2YYUuo9hg379+c8fvy44eDgYOzYscO27fLly4ZhGEZcXJzh5eVlXLp0yTh+/Ljh6Oho7N692zAMw+jSpYsxa9YsIzg42KhWrZoRFxdnxMTEGOXKlTMmTJhgREREGG3atDHu3LljGIZh9OvXz5gxY8YDzx8SEmJ4e3sb169fN2JjY43KlSsboaGhhmEYRsmSJY2LFy8+tO4PP/zQ+P777x/hp2uTonzDaTIAACykZMmS8vX1tf198uTJWrx4sSQpKipKhw8fVqFChVS6dGlVr15dklSrVi2dOHFCly5dUrt27ZQ9e3ZJUtu2bSVJ69at065du1S7dm1J0s2bN1WgQIEHnnvr1q3q0KGDcuTIIUnq2LGjtmzZoho1avxjzfv27VO7du2e8H/+9whDAABYyL0gIkkbN27U2rVrtWPHDrm6uuqpp57SrVu3JElZs2a17efo6KibN2/KMIyH/puGYahnz54aO3bsPz73333/vwkPD5eXl9djfW9KMGcIAAATDB+emifJkv69RxUdHa3cuXPL1dVVBw8eVFBQ0D/u37BhQy1fvly3bt3S9evXtXLlSklSs2bNtGjRIl24cEGSdOXKFZ08efKB7/fz89OSJUsUFxenGzduaPHixWrUqNE/PmdsbKycnZ3l6ur66P/BFGJkCAAAi/L399fUqVNVtWpVeXp6Jjt99jC1a9dWQECAqlWrppIlS8rHx0ceHh6qXLmyRo8erZYtWyoxMVHOzs765ptvVLJkyWTfX7NmTb300kuqU6eOJKlXr17/eops//798vb2frL/6L9weMQhq8cb3wKAf+Dj46OQkBCzywCQAtevX1fOnDkVFxcnPz8/fffdd6pZs6bZZf0dh5TsxMgQAABIsd69eysiIkK3bt1Sz5497TkIpRhhCAAApNicOXPMLiHVMYEaAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEIAABYGmEI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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def f(x):\n",
+ " return 0.6 * np.cos(4 * x) + 1.4\n",
+ "\n",
+ "\n",
+ "xmin, xmax = -1, 1\n",
+ "x = np.linspace(xmin, xmax, 160)\n",
+ "y = f(x)\n",
+ "ya, yb = np.min(y), np.max(y)\n",
+ "\n",
+ "fig, axes = plt.subplots(2, 1, figsize=(10, 10))\n",
+ "\n",
+ "for ax in axes:\n",
+ " # Set the axes through the origin\n",
+ " for spine in ['left', 'bottom']:\n",
+ " ax.spines[spine].set_position('zero')\n",
+ " for spine in ['right', 'top']:\n",
+ " ax.spines[spine].set_color('none')\n",
+ "\n",
+ " ax.set(ylim=(-0.6, 3.2), xlim=(xmin, xmax),\n",
+ " yticks=(), xticks=())\n",
+ "\n",
+ " ax.plot(x, y, 'k-', lw=2, label='$f$')\n",
+ " ax.fill_between(x, ya, yb, facecolor='blue', alpha=0.05)\n",
+ " ax.vlines([0], ya, yb, lw=3, color='blue', label='range of $f$')\n",
+ " ax.text(0.04, -0.3, '$0$', fontsize=16)\n",
+ "\n",
+ "ax = axes[0]\n",
+ "\n",
+ "ax.legend(loc='upper right', frameon=False)\n",
+ "ybar = 1.5\n",
+ "ax.plot(x, x * 0 + ybar, 'k--', alpha=0.5)\n",
+ "ax.text(0.05, 0.8 * ybar, '$y$', fontsize=16)\n",
+ "for i, z in enumerate((-0.35, 0.35)):\n",
+ " ax.vlines(z, 0, f(z), linestyle='--', alpha=0.5)\n",
+ " ax.text(z, -0.2, f'$x_{i}$', fontsize=16)\n",
+ "\n",
+ "ax = axes[1]\n",
+ "\n",
+ "ybar = 2.6\n",
+ "ax.plot(x, x * 0 + ybar, 'k--', alpha=0.5)\n",
+ "ax.text(0.04, 0.91 * ybar, '$y$', fontsize=16)\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In the first plot there are multiple solutions, as the function is not one-to-one, while\n",
+ "in the second there are no solutions, since $ y $ lies outside the range of $ f $\n",
+ "\n",
+ "Can we impose conditions on $ A $ in [(3)](#equation-la-se2) that rule out these problems?\n",
+ "\n",
+ "In this context, the most important thing to recognize about the expression\n",
+ "$ Ax $ is that it corresponds to a linear combination of the columns of $ A $\n",
+ "\n",
+ "In particular, if $ a_1, \\ldots, a_k $ are the columns of $ A $, then\n",
+ "\n",
+ "$$\n",
+ "Ax = x_1 a_1 + \\cdots + x_k a_k\n",
+ "$$\n",
+ "\n",
+ "Hence the range of $ f(x) = Ax $ is exactly the span of the columns of $ A $\n",
+ "\n",
+ "We want the range to be large, so that it contains arbitrary $ y $\n",
+ "\n",
+ "As you might recall, the condition that we want for the span to be large is [linear independence](#la-li)\n",
+ "\n",
+ "A happy fact is that linear independence of the columns of $ A $ also gives us uniqueness\n",
+ "\n",
+ "Indeed, it follows from our [earlier discussion](#la-unique-reps) that if $ \\{a_1, \\ldots, a_k\\} $ are linearly independent and $ y = Ax = x_1 a_1 + \\cdots + x_k a_k $, then no $ z \\not= x $ satisfies $ y = Az $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### The $ n \\times n $ Case\n",
+ "\n",
+ "Let’s discuss some more details, starting with the case where $ A $ is $ n \\times n $\n",
+ "\n",
+ "This is the familiar case where the number of unknowns equals the number of equations\n",
+ "\n",
+ "For arbitrary $ y \\in \\mathbb R ^n $, we hope to find a unique $ x \\in \\mathbb R ^n $ such that $ y = Ax $\n",
+ "\n",
+ "In view of the observations immediately above, if the columns of $ A $ are\n",
+ "linearly independent, then their span, and hence the range of $ f(x) =\n",
+ "Ax $, is all of $ \\mathbb R ^n $\n",
+ "\n",
+ "Hence there always exists an $ x $ such that $ y = Ax $\n",
+ "\n",
+ "Moreover, the solution is unique\n",
+ "\n",
+ "In particular, the following are equivalent\n",
+ "\n",
+ "1. The columns of $ A $ are linearly independent \n",
+ "1. For any $ y \\in \\mathbb R ^n $, the equation $ y = Ax $ has a unique solution \n",
+ "\n",
+ "\n",
+ "The property of having linearly independent columns is sometimes expressed as having *full column rank*"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Inverse Matrices\n",
+ "\n",
+ "\n",
+ "\n",
+ "Can we give some sort of expression for the solution?\n",
+ "\n",
+ "If $ y $ and $ A $ are scalar with $ A \\not= 0 $, then the\n",
+ "solution is $ x = A^{-1} y $\n",
+ "\n",
+ "A similar expression is available in the matrix case\n",
+ "\n",
+ "In particular, if square matrix $ A $ has full column rank, then it possesses a multiplicative\n",
+ "*inverse matrix* $ A^{-1} $, with the property that $ A A^{-1} = A^{-1} A = I $\n",
+ "\n",
+ "As a consequence, if we pre-multiply both sides of $ y = Ax $ by $ A^{-1} $, we get $ x = A^{-1} y $\n",
+ "\n",
+ "This is the solution that we’re looking for"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Determinants\n",
+ "\n",
+ "\n",
+ "\n",
+ "Another quick comment about square matrices is that to every such matrix we\n",
+ "assign a unique number called the *determinant* of the matrix — you can find\n",
+ "the expression for it [here](https://en.wikipedia.org/wiki/Determinant)\n",
+ "\n",
+ "If the determinant of $ A $ is not zero, then we say that $ A $ is\n",
+ "*nonsingular*\n",
+ "\n",
+ "Perhaps the most important fact about determinants is that $ A $ is nonsingular if and only if $ A $ is of full column rank\n",
+ "\n",
+ "This gives us a useful one-number summary of whether or not a square matrix can be\n",
+ "inverted"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### More Rows than Columns\n",
+ "\n",
+ "This is the $ n \\times k $ case with $ n > k $\n",
+ "\n",
+ "This case is very important in many settings, not least in the setting of linear regression (where $ n $ is the number of observations, and $ k $ is the number of explanatory variables)\n",
+ "\n",
+ "Given arbitrary $ y \\in \\mathbb R ^n $, we seek an $ x \\in \\mathbb R ^k $ such that $ y = Ax $\n",
+ "\n",
+ "In this setting, existence of a solution is highly unlikely\n",
+ "\n",
+ "Without much loss of generality, let’s go over the intuition focusing on the case where the columns of\n",
+ "$ A $ are linearly independent\n",
+ "\n",
+ "It follows that the span of the columns of $ A $ is a $ k $-dimensional subspace of $ \\mathbb R ^n $\n",
+ "\n",
+ "This span is very “unlikely” to contain arbitrary $ y \\in \\mathbb R ^n $\n",
+ "\n",
+ "To see why, recall the [figure above](#la-3dvec), where $ k=2 $ and $ n=3 $\n",
+ "\n",
+ "Imagine an arbitrarily chosen $ y \\in \\mathbb R ^3 $, located somewhere in that three dimensional space\n",
+ "\n",
+ "What’s the likelihood that $ y $ lies in the span of $ \\{a_1, a_2\\} $ (i.e., the two dimensional plane through these points)?\n",
+ "\n",
+ "In a sense it must be very small, since this plane has zero “thickness”\n",
+ "\n",
+ "As a result, in the $ n > k $ case we usually give up on existence\n",
+ "\n",
+ "However, we can still seek a best approximation, for example an\n",
+ "$ x $ that makes the distance $ \\| y - Ax\\| $ as small as possible\n",
+ "\n",
+ "To solve this problem, one can use either calculus or the theory of orthogonal\n",
+ "projections\n",
+ "\n",
+ "The solution is known to be $ \\hat x = (A'A)^{-1}A'y $ — see for example\n",
+ "chapter 3 of these notes"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### More Columns than Rows\n",
+ "\n",
+ "This is the $ n \\times k $ case with $ n < k $, so there are fewer\n",
+ "equations than unknowns\n",
+ "\n",
+ "In this case there are either no solutions or infinitely many — in other words, uniqueness never holds\n",
+ "\n",
+ "For example, consider the case where $ k=3 $ and $ n=2 $\n",
+ "\n",
+ "Thus, the columns of $ A $ consists of 3 vectors in $ \\mathbb R ^2 $\n",
+ "\n",
+ "This set can never be linearly independent, since it is possible to find two vectors that span\n",
+ "$ \\mathbb R ^2 $\n",
+ "\n",
+ "(For example, use the canonical basis vectors)\n",
+ "\n",
+ "It follows that one column is a linear combination of the other two\n",
+ "\n",
+ "For example, let’s say that $ a_1 = \\alpha a_2 + \\beta a_3 $\n",
+ "\n",
+ "Then if $ y = Ax = x_1 a_1 + x_2 a_2 + x_3 a_3 $, we can also write\n",
+ "\n",
+ "$$\n",
+ "y\n",
+ "= x_1 (\\alpha a_2 + \\beta a_3) + x_2 a_2 + x_3 a_3\n",
+ "= (x_1 \\alpha + x_2) a_2 + (x_1 \\beta + x_3) a_3\n",
+ "$$\n",
+ "\n",
+ "In other words, uniqueness fails"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Linear Equations with SciPy\n",
+ "\n",
+ "\n",
+ "\n",
+ "Here’s an illustration of how to solve linear equations with SciPy’s `linalg` submodule\n",
+ "\n",
+ "All of these routines are Python front ends to time-tested and highly optimized FORTRAN code"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-2.0"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from scipy.linalg import inv, solve, det\n",
+ "\n",
+ "A = ((1, 2), (3, 4))\n",
+ "A = np.array(A)\n",
+ "y = np.ones((2, 1)) # Column vector\n",
+ "det(A) # Check that A is nonsingular, and hence invertible"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-2. , 1. ],\n",
+ " [ 1.5, -0.5]])"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A_inv = inv(A) # Compute the inverse\n",
+ "A_inv"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[1.],\n",
+ " [1.]])"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = A_inv @ y # Solution\n",
+ "A @ x # Should equal y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-1.],\n",
+ " [ 1.]])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "solve(A, y) # Produces same solution"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Observe how we can solve for $ x = A^{-1} y $ by either via `inv(A) @ y`, or using `solve(A, y)`\n",
+ "\n",
+ "The latter method uses a different algorithm (LU decomposition) that is numerically more stable, and hence should almost always be preferred\n",
+ "\n",
+ "To obtain the least squares solution $ \\hat x = (A'A)^{-1}A'y $, use `scipy.linalg.lstsq(A, y)`\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Eigenvalues and Eigenvectors\n",
+ "\n",
+ "\n",
+ "\n",
+ "Let $ A $ be an $ n \\times n $ square matrix\n",
+ "\n",
+ "If $ \\lambda $ is scalar and $ v $ is a non-zero vector in $ \\mathbb R ^n $ such that\n",
+ "\n",
+ "$$\n",
+ "A v = \\lambda v\n",
+ "$$\n",
+ "\n",
+ "then we say that $ \\lambda $ is an *eigenvalue* of $ A $, and\n",
+ "$ v $ is an *eigenvector*\n",
+ "\n",
+ "Thus, an eigenvector of $ A $ is a vector such that when the map $ f(x) = Ax $ is applied, $ v $ is merely scaled\n",
+ "\n",
+ "The next figure shows two eigenvectors (blue arrows) and their images under $ A $ (red arrows)\n",
+ "\n",
+ "As expected, the image $ Av $ of each $ v $ is just a scaled version of the original"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "hide-output": false,
+ "html-class": "collapse"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from scipy.linalg import eig\n",
+ "\n",
+ "A = ((1, 2),\n",
+ " (2, 1))\n",
+ "A = np.array(A)\n",
+ "evals, evecs = eig(A)\n",
+ "evecs = evecs[:, 0], evecs[:, 1]\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(10, 8))\n",
+ "# Set the axes through the origin\n",
+ "for spine in ['left', 'bottom']:\n",
+ " ax.spines[spine].set_position('zero')\n",
+ "for spine in ['right', 'top']:\n",
+ " ax.spines[spine].set_color('none')\n",
+ "ax.grid(alpha=0.4)\n",
+ "\n",
+ "xmin, xmax = -3, 3\n",
+ "ymin, ymax = -3, 3\n",
+ "ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))\n",
+ "\n",
+ "# Plot each eigenvector\n",
+ "for v in evecs:\n",
+ " ax.annotate('', xy=v, xytext=(0, 0),\n",
+ " arrowprops=dict(facecolor='blue',\n",
+ " shrink=0,\n",
+ " alpha=0.6,\n",
+ " width=0.5))\n",
+ "\n",
+ "# Plot the image of each eigenvector\n",
+ "for v in evecs:\n",
+ " v = A @ v\n",
+ " ax.annotate('', xy=v, xytext=(0, 0),\n",
+ " arrowprops=dict(facecolor='red',\n",
+ " shrink=0,\n",
+ " alpha=0.6,\n",
+ " width=0.5))\n",
+ "\n",
+ "# Plot the lines they run through\n",
+ "x = np.linspace(xmin, xmax, 3)\n",
+ "for v in evecs:\n",
+ " a = v[1] / v[0]\n",
+ " ax.plot(x, a * x, 'b-', lw=0.4)\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The eigenvalue equation is equivalent to $ (A - \\lambda I) v = 0 $, and\n",
+ "this has a nonzero solution $ v $ only when the columns of $ A -\n",
+ "\\lambda I $ are linearly dependent\n",
+ "\n",
+ "This in turn is equivalent to stating that the determinant is zero\n",
+ "\n",
+ "Hence to find all eigenvalues, we can look for $ \\lambda $ such that the\n",
+ "determinant of $ A - \\lambda I $ is zero\n",
+ "\n",
+ "This problem can be expressed as one of solving for the roots of a polynomial\n",
+ "in $ \\lambda $ of degree $ n $\n",
+ "\n",
+ "This in turn implies the existence of $ n $ solutions in the complex\n",
+ "plane, although some might be repeated\n",
+ "\n",
+ "Some nice facts about the eigenvalues of a square matrix $ A $ are as follows\n",
+ "\n",
+ "1. The determinant of $ A $ equals the product of the eigenvalues \n",
+ "1. The trace of $ A $ (the sum of the elements on the principal diagonal) equals the sum of the eigenvalues \n",
+ "1. If $ A $ is symmetric, then all of its eigenvalues are real \n",
+ "1. If $ A $ is invertible and $ \\lambda_1, \\ldots, \\lambda_n $ are its eigenvalues, then the eigenvalues of $ A^{-1} $ are $ 1/\\lambda_1, \\ldots, 1/\\lambda_n $ \n",
+ "\n",
+ "\n",
+ "A corollary of the first statement is that a matrix is invertible if and only if all its eigenvalues are nonzero\n",
+ "\n",
+ "Using SciPy, we can solve for the eigenvalues and eigenvectors of a matrix as\n",
+ "follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 3.+0.j, -1.+0.j])"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "A = ((1, 2),\n",
+ " (2, 1))\n",
+ "\n",
+ "A = np.array(A)\n",
+ "evals, evecs = eig(A)\n",
+ "evals"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 0.70710678, -0.70710678],\n",
+ " [ 0.70710678, 0.70710678]])"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "evecs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note that the *columns* of `evecs` are the eigenvectors\n",
+ "\n",
+ "Since any scalar multiple of an eigenvector is an eigenvector with the same\n",
+ "eigenvalue (check it), the eig routine normalizes the length of each eigenvector\n",
+ "to one"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Generalized Eigenvalues\n",
+ "\n",
+ "It is sometimes useful to consider the *generalized eigenvalue problem*, which, for given\n",
+ "matrices $ A $ and $ B $, seeks generalized eigenvalues\n",
+ "$ \\lambda $ and eigenvectors $ v $ such that\n",
+ "\n",
+ "$$\n",
+ "A v = \\lambda B v\n",
+ "$$\n",
+ "\n",
+ "This can be solved in SciPy via `scipy.linalg.eig(A, B)`\n",
+ "\n",
+ "Of course, if $ B $ is square and invertible, then we can treat the\n",
+ "generalized eigenvalue problem as an ordinary eigenvalue problem $ B^{-1}\n",
+ "A v = \\lambda v $, but this is not always the case"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Further Topics\n",
+ "\n",
+ "We round out our discussion by briefly mentioning several other important\n",
+ "topics"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Series Expansions\n",
+ "\n",
+ "\n",
+ "\n",
+ "Recall the usual summation formula for a geometric progression, which states\n",
+ "that if $ |a| < 1 $, then $ \\sum_{k=0}^{\\infty} a^k = (1 - a)^{-1} $\n",
+ "\n",
+ "A generalization of this idea exists in the matrix setting\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Matrix Norms\n",
+ "\n",
+ "\n",
+ "\n",
+ "Let $ A $ be a square matrix, and let\n",
+ "\n",
+ "$$\n",
+ "\\| A \\| := \\max_{\\| x \\| = 1} \\| A x \\|\n",
+ "$$\n",
+ "\n",
+ "The norms on the right-hand side are ordinary vector norms, while the norm on\n",
+ "the left-hand side is a *matrix norm* — in this case, the so-called\n",
+ "*spectral norm*\n",
+ "\n",
+ "For example, for a square matrix $ S $, the condition $ \\| S \\| < 1 $ means that $ S $ is *contractive*, in the sense that it pulls all vectors towards the origin [2]\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Neumann’s Theorem\n",
+ "\n",
+ "\n",
+ "\n",
+ "Let $ A $ be a square matrix and let $ A^k := A A^{k-1} $ with $ A^1 := A $\n",
+ "\n",
+ "In other words, $ A^k $ is the $ k $-th power of $ A $\n",
+ "\n",
+ "Neumann’s theorem states the following: If $ \\| A^k \\| < 1 $ for some\n",
+ "$ k \\in \\mathbb{N} $, then $ I - A $ is invertible, and\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "(I - A)^{-1} = \\sum_{k=0}^{\\infty} A^k \\tag{4}\n",
+ "$$\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Spectral Radius\n",
+ "\n",
+ "\n",
+ "\n",
+ "A result known as Gelfand’s formula tells us that, for any square matrix $ A $,\n",
+ "\n",
+ "$$\n",
+ "\\rho(A) = \\lim_{k \\to \\infty} \\| A^k \\|^{1/k}\n",
+ "$$\n",
+ "\n",
+ "Here $ \\rho(A) $ is the *spectral radius*, defined as $ \\max_i |\\lambda_i| $, where $ \\{\\lambda_i\\}_i $ is the set of eigenvalues of $ A $\n",
+ "\n",
+ "As a consequence of Gelfand’s formula, if all eigenvalues are strictly less than one in modulus,\n",
+ "there exists a $ k $ with $ \\| A^k \\| < 1 $\n",
+ "\n",
+ "In which case [(4)](#equation-la-neumann) is valid"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Positive Definite Matrices\n",
+ "\n",
+ "\n",
+ "\n",
+ "Let $ A $ be a symmetric $ n \\times n $ matrix\n",
+ "\n",
+ "We say that $ A $ is\n",
+ "\n",
+ "1. *positive definite* if $ x' A x > 0 $ for every $ x \\in \\mathbb R ^n \\setminus \\{0\\} $ \n",
+ "1. *positive semi-definite* or *nonnegative definite* if $ x' A x \\geq 0 $ for every $ x \\in \\mathbb R ^n $ \n",
+ "\n",
+ "\n",
+ "Analogous definitions exist for negative definite and negative semi-definite matrices\n",
+ "\n",
+ "It is notable that if $ A $ is positive definite, then all of its eigenvalues\n",
+ "are strictly positive, and hence $ A $ is invertible (with positive\n",
+ "definite inverse)\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Differentiating Linear and Quadratic forms\n",
+ "\n",
+ "\n",
+ "\n",
+ "The following formulas are useful in many economic contexts. Let\n",
+ "\n",
+ "- $ z, x $ and $ a $ all be $ n \\times 1 $ vectors \n",
+ "- $ A $ be an $ n \\times n $ matrix \n",
+ "- $ B $ be an $ m \\times n $ matrix and $ y $ be an $ m \\times 1 $ vector \n",
+ "\n",
+ "\n",
+ "Then\n",
+ "\n",
+ "1. $ \\frac{\\partial a' x}{\\partial x} = a $ \n",
+ "1. $ \\frac{\\partial A x}{\\partial x} = A' $ \n",
+ "1. $ \\frac{\\partial x'A x}{\\partial x} = (A + A') x $ \n",
+ "1. $ \\frac{\\partial y'B z}{\\partial y} = B z $ \n",
+ "1. $ \\frac{\\partial y'B z}{\\partial B} = y z' $ \n",
+ "\n",
+ "\n",
+ "Exercise 1 below asks you to apply these formulas"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Further Reading\n",
+ "\n",
+ "The documentation of the `scipy.linalg` submodule can be found [here](http://docs.scipy.org/doc/scipy/reference/linalg.html)\n",
+ "\n",
+ "Chapters 2 and 3 of the [Econometric Theory](http://www.johnstachurski.net/emet.html) contains\n",
+ "a discussion of linear algebra along the same lines as above, with solved exercises\n",
+ "\n",
+ "If you don’t mind a slightly abstract approach, a nice intermediate-level text on linear algebra\n",
+ "is [[Janich94]](https://lectures.quantecon.org/py/zreferences.html#janich1994)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercises"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 1\n",
+ "\n",
+ "Let $ x $ be a given $ n \\times 1 $ vector and consider the problem\n",
+ "\n",
+ "$$\n",
+ "v(x) = \\max_{y,u} \\left\\{ - y'P y - u' Q u \\right\\}\n",
+ "$$\n",
+ "\n",
+ "subject to the linear constraint\n",
+ "\n",
+ "$$\n",
+ "y = A x + B u\n",
+ "$$\n",
+ "\n",
+ "Here\n",
+ "\n",
+ "- $ P $ is an $ n \\times n $ matrix and $ Q $ is an $ m \\times m $ matrix \n",
+ "- $ A $ is an $ n \\times n $ matrix and $ B $ is an $ n \\times m $ matrix \n",
+ "- both $ P $ and $ Q $ are symmetric and positive semidefinite \n",
+ "\n",
+ "\n",
+ "(What must the dimensions of $ y $ and $ u $ be to make this a well-posed problem?)\n",
+ "\n",
+ "One way to solve the problem is to form the Lagrangian\n",
+ "\n",
+ "$$\n",
+ "\\mathcal L = - y' P y - u' Q u + \\lambda' \\left[A x + B u - y\\right]\n",
+ "$$\n",
+ "\n",
+ "where $ \\lambda $ is an $ n \\times 1 $ vector of Lagrange multipliers\n",
+ "\n",
+ "Try applying the formulas given above for differentiating quadratic and linear forms to obtain the first-order conditions for maximizing $ \\mathcal L $ with respect to $ y, u $ and minimizing it with respect to $ \\lambda $\n",
+ "\n",
+ "Show that these conditions imply that\n",
+ "\n",
+ "1. $ \\lambda = - 2 P y $ \n",
+ "1. The optimizing choice of $ u $ satisfies $ u = - (Q + B' P B)^{-1} B' P A x $ \n",
+ "1. The function $ v $ satisfies $ v(x) = - x' \\tilde P x $ where $ \\tilde P = A' P A - A'P B (Q + B'P B)^{-1} B' P A $ \n",
+ "\n",
+ "\n",
+ "As we will see, in economic contexts Lagrange multipliers often are shadow prices\n",
+ "\n",
+ ">**Note**\n",
+ ">\n",
+ ">If we don’t care about the Lagrange multipliers, we can substitute the constraint into the objective function, and then just maximize $ -(Ax + Bu)'P (Ax + Bu) - u' Q u $ with respect to $ u $. You can verify that this leads to the same maximizer."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Solution to Exercise 1\n",
+ "\n",
+ "We have an optimization problem:\n",
+ "\n",
+ "$$\n",
+ "v(x) = \\max_{y,u} \\{ -y'Py - u'Qu \\}\n",
+ "$$\n",
+ "\n",
+ "s.t.\n",
+ "\n",
+ "$$\n",
+ "y = Ax + Bu\n",
+ "$$\n",
+ "\n",
+ "with primitives\n",
+ "\n",
+ "- $ P $ be a symmetric and positive semidefinite $ n \\times n $\n",
+ " matrix \n",
+ "- $ Q $ be a symmetric and positive semidefinite $ m \\times m $\n",
+ " matrix \n",
+ "- $ A $ an $ n \\times n $ matrix \n",
+ "- $ B $ an $ n \\times m $ matrix \n",
+ "\n",
+ "\n",
+ "The associated Lagrangian is :\n",
+ "\n",
+ "$$\n",
+ "L = -y'Py - u'Qu + \\lambda' \\lbrack Ax + Bu - y \\rbrack\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### 1.\n",
+ "\n",
+ "Differentiating Lagrangian equation w.r.t y and setting its derivative\n",
+ "equal to zero yields\n",
+ "\n",
+ "$$\n",
+ "\\frac{ \\partial L}{\\partial y} = - (P + P') y - \\lambda = - 2 P y - \\lambda = 0 \\:,\n",
+ "$$\n",
+ "\n",
+ "since P is symmetric\n",
+ "\n",
+ "Accordingly, the first-order condition for maximizing L w.r.t. y implies\n",
+ "\n",
+ "$$\n",
+ "\\lambda = -2 Py \\:\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### 2.\n",
+ "\n",
+ "Differentiating Lagrangian equation w.r.t. u and setting its derivative\n",
+ "equal to zero yields\n",
+ "\n",
+ "$$\n",
+ "\\frac{ \\partial L}{\\partial u} = - (Q + Q') u - B'\\lambda = - 2Qu + B'\\lambda = 0 \\:\n",
+ "$$\n",
+ "\n",
+ "Substituting $ \\lambda = -2 P y $ gives\n",
+ "\n",
+ "$$\n",
+ "Qu + B'Py = 0 \\:\n",
+ "$$\n",
+ "\n",
+ "Substituting the linear constraint $ y = Ax + Bu $ into above\n",
+ "equation gives\n",
+ "\n",
+ "$$\n",
+ "Qu + B'P(Ax + Bu) = 0\n",
+ "$$\n",
+ "\n",
+ "$$\n",
+ "(Q + B'PB)u + B'PAx = 0\n",
+ "$$\n",
+ "\n",
+ "which is the first-order condition for maximizing L w.r.t. u\n",
+ "\n",
+ "Thus, the optimal choice of u must satisfy\n",
+ "\n",
+ "$$\n",
+ "u = -(Q + B'PB)^{-1}B'PAx \\:,\n",
+ "$$\n",
+ "\n",
+ "which follows from the definition of the first-order conditions for\n",
+ "Lagrangian equation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### 3.\n",
+ "\n",
+ "Rewriting our problem by substituting the constraint into the objective\n",
+ "function, we get\n",
+ "\n",
+ "$$\n",
+ "v(x) = \\max_{u} \\{ -(Ax+ Bu)'P(Ax+Bu) - u'Qu \\} \\:\n",
+ "$$\n",
+ "\n",
+ "Since we know the optimal choice of u satisfies $ u = -(Q +\n",
+ "B’PB)^{-1}B’PAx $, then\n",
+ "\n",
+ "$$\n",
+ "v(x) = -(Ax+ B u)'P(Ax+B u) - u'Q u \\,\\,\\,\\, with \\,\\,\\,\\, u = -(Q + B'PB)^{-1}B'PAx\n",
+ "$$\n",
+ "\n",
+ "To evaluate the function\n",
+ "\n",
+ "$$\n",
+ "\\begin{aligned}\n",
+ "v(x) &= -(Ax+ B u)'P(Ax+Bu) - u'Q u \\\\\n",
+ "&= -(x'A' + u'B')P(Ax+Bu) - u'Q u \\\\\n",
+ "&= - x'A'PAx - u'B'PAx - x'A'PBu - u'B'PBu - u'Qu \\\\\n",
+ "&= - x'A'PAx - 2u'B'PAx - u'(Q + B'PB) u\n",
+ "\\end{aligned}\n",
+ "$$\n",
+ "\n",
+ "For simplicity, denote by $ S := (Q + B'PB)^{-1} B'PA $, then $ u =\n",
+ "-Sx$\n",
+ "\n",
+ "Regarding the second term $ - 2u'B'PAx $,\n",
+ "\n",
+ "$$\n",
+ "\\begin{aligned}\n",
+ "-2u'B'PAx &= -2 x'S'B'PAx \\\\\n",
+ "& = 2 x'A'PB( Q + B'PB)^{-1} B'PAx\n",
+ "\\end{aligned}\n",
+ "$$\n",
+ "\n",
+ "Notice that the term $ (Q + B'PB)^{-1} $ is symmetric as both P and Q\n",
+ "are symmetric\n",
+ "\n",
+ "Regarding the third term $ - u'(Q + B'PB) u $,\n",
+ "\n",
+ "$$\n",
+ "\\begin{aligned}\n",
+ "-u'(Q + B'PB) u &= - x'S' (Q + B'PB)Sx \\\\\n",
+ "&= -x'A'PB(Q + B'PB)^{-1}B'PAx\n",
+ "\\end{aligned}\n",
+ "$$\n",
+ "\n",
+ "Hence, the summation of second and third terms is\n",
+ "$ x'A'PB(Q + B'PB)^{-1}B'PAx $\n",
+ "\n",
+ "This implies that\n",
+ "\n",
+ "$$\n",
+ "\\begin{aligned}\n",
+ " v(x) &= - x'A'PAx - 2u'B'PAx - u'(Q + B'PB) u\\\\\n",
+ " &= - x'A'PAx + x'A'PB(Q + B'PB)^{-1}B'PAx \\\\\n",
+ " &= -x'[A'PA - A'PB(Q + B'PB)^{-1}B'PA] x\n",
+ "\\end{aligned}\n",
+ "$$\n",
+ "\n",
+ "Therefore, the solution to the optimization problem\n",
+ "$ v(x) = -x' \\tilde{P}x $ follows the above result by denoting\n",
+ "$ \\tilde{P} := A'PA - A'PB(Q + B'PB)^{-1}B'PA $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Footnotes**\n",
+ "\n",
+ "
[1] Although there is a specialized matrix data type defined in NumPy, it’s more standard to work with ordinary NumPy arrays. See [this discussion](https://lectures.quantecon.org/py/numpy.html#numpy-matrix-multiplication).\n",
+ "\n",
+ "
[2] Suppose that $ \\|S \\| < 1 $. Take any nonzero vector $ x $, and let $ r := \\|x\\| $. We have $ \\| Sx \\| = r \\| S (x/r) \\| \\leq r \\| S \\| < r = \\| x\\| $. Hence every point is pulled towards the origin."
+ ]
+ }
+ ],
+ "metadata": {
+ "filename": "linear_algebra.rst",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ },
+ "title": "Linear Algebra"
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/0-pre-requisitos/2-math/orth_proj.ipynb b/0-pre-requisitos/2-math/orth_proj.ipynb
new file mode 100755
index 0000000..b147a81
--- /dev/null
+++ b/0-pre-requisitos/2-math/orth_proj.ipynb
@@ -0,0 +1,1141 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Orthogonal Projections and Their Applications\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Contents\n",
+ "\n",
+ "- [Orthogonal Projections and Their Applications](#Orthogonal-Projections-and-Their-Applications) \n",
+ " - [Overview](#Overview) \n",
+ " - [Key Definitions](#Key-Definitions) \n",
+ " - [The Orthogonal Projection Theorem](#The-Orthogonal-Projection-Theorem) \n",
+ " - [Orthonormal Basis](#Orthonormal-Basis) \n",
+ " - [Projection Using Matrix Algebra](#Projection-Using-Matrix-Algebra) \n",
+ " - [Least Squares Regression](#Least-Squares-Regression) \n",
+ " - [Orthogonalization and Decomposition](#Orthogonalization-and-Decomposition) \n",
+ " - [Exercises](#Exercises) \n",
+ " - [Solutions](#Solutions) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Overview\n",
+ "\n",
+ "Orthogonal projection is a cornerstone of vector space methods, with many diverse applications\n",
+ "\n",
+ "These include, but are not limited to,\n",
+ "\n",
+ "- Least squares projection, also known as linear regression \n",
+ "- Conditional expectations for multivariate normal (Gaussian) distributions \n",
+ "- Gram–Schmidt orthogonalization \n",
+ "- QR decomposition \n",
+ "- Orthogonal polynomials \n",
+ "- etc \n",
+ "\n",
+ "\n",
+ "In this lecture we focus on\n",
+ "\n",
+ "- key ideas \n",
+ "- least squares regression "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Further Reading\n",
+ "\n",
+ "For background and foundational concepts, see our lecture [on linear algebra](https://lectures.quantecon.org/py/linear_algebra.html)\n",
+ "\n",
+ "For more proofs and greater theoretical detail, see [A Primer in Econometric Theory](http://www.johnstachurski.net/emet.html)\n",
+ "\n",
+ "For a complete set of proofs in a general setting, see, for example, [[Rom05]](https://lectures.quantecon.org/py/zreferences.html#roman2005)\n",
+ "\n",
+ "For an advanced treatment of projection in the context of least squares prediction, see [this book chapter](http://www.tomsargent.com/books/TOMchpt.2.pdf)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Key Definitions\n",
+ "\n",
+ "Assume $ x, z \\in \\mathbb R^n $\n",
+ "\n",
+ "Define $ \\langle x, z\\rangle = \\sum_i x_i z_i $\n",
+ "\n",
+ "Recall $ \\|x \\|^2 = \\langle x, x \\rangle $\n",
+ "\n",
+ "The **law of cosines** states that $ \\langle x, z \\rangle = \\| x \\| \\| z \\| \\cos(\\theta) $ where $ \\theta $ is the angle between the vectors $ x $ and $ z $\n",
+ "\n",
+ "When $ \\langle x, z\\rangle = 0 $, then $ \\cos(\\theta) = 0 $ and $ x $ and $ z $ are said to be **orthogonal** and we write $ x \\perp z $\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "For a linear subspace $ S \\subset \\mathbb R^n $, we call $ x \\in \\mathbb R^n $ **orthogonal to** $ S $ if $ x \\perp z $ for all $ z \\in S $, and write $ x \\perp S $\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "The **orthogonal complement** of linear subspace $ S \\subset \\mathbb R^n $ is the set $ S^{\\perp} := \\{x \\in \\mathbb R^n \\,:\\, x \\perp S\\} $\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "$ S^\\perp $ is a linear subspace of $ \\mathbb R^n $\n",
+ "\n",
+ "- To see this, fix $ x, y \\in S^{\\perp} $ and $ \\alpha, \\beta \\in \\mathbb R $ \n",
+ "- Observe that if $ z \\in S $, then \n",
+ "\n",
+ "\n",
+ "$$\n",
+ "\\langle \\alpha x + \\beta y, z \\rangle\n",
+ "= \\alpha \\langle x, z \\rangle + \\beta \\langle y, z \\rangle\n",
+ " = \\alpha \\times 0 + \\beta \\times 0 = 0\n",
+ "$$\n",
+ "\n",
+ "- Hence $ \\alpha x + \\beta y \\in S^{\\perp} $, as was to be shown \n",
+ "\n",
+ "\n",
+ "A set of vectors $ \\{x_1, \\ldots, x_k\\} \\subset \\mathbb R^n $ is called an **orthogonal set** if $ x_i \\perp x_j $ whenever $ i \\not= j $\n",
+ "\n",
+ "If $ \\{x_1, \\ldots, x_k\\} $ is an orthogonal set, then the **Pythagorean Law** states that\n",
+ "\n",
+ "$$\n",
+ "\\| x_1 + \\cdots + x_k \\|^2\n",
+ "= \\| x_1 \\|^2 + \\cdots + \\| x_k \\|^2\n",
+ "$$\n",
+ "\n",
+ "For example, when $ k=2 $, $ x_1 \\perp x_2 $ implies\n",
+ "\n",
+ "$$\n",
+ "\\| x_1 + x_2 \\|^2\n",
+ " = \\langle x_1 + x_2, x_1 + x_2 \\rangle\n",
+ " = \\langle x_1, x_1 \\rangle + 2 \\langle x_2, x_1 \\rangle + \\langle x_2, x_2 \\rangle\n",
+ " = \\| x_1 \\|^2 + \\| x_2 \\|^2\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Linear Independence vs Orthogonality\n",
+ "\n",
+ "If $ X \\subset \\mathbb R^n $ is an orthogonal set and $ 0 \\notin X $, then $ X $ is linearly independent\n",
+ "\n",
+ "Proving this is a nice exercise\n",
+ "\n",
+ "While the converse is not true, a kind of partial converse holds, as we’ll [see below](#gram-schmidt)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## The Orthogonal Projection Theorem\n",
+ "\n",
+ "What vector within a linear subspace of $ \\mathbb R^n $ best approximates a given vector in $ \\mathbb R^n $?\n",
+ "\n",
+ "The next theorem provides answers this question\n",
+ "\n",
+ "**Theorem** (OPT) Given $ y \\in \\mathbb R^n $ and linear subspace $ S \\subset \\mathbb R^n $,\n",
+ "there exists a unique solution to the minimization problem\n",
+ "\n",
+ "$$\n",
+ "\\hat y := \\argmin_{z \\in S} \\|y - z\\|\n",
+ "$$\n",
+ "\n",
+ "The minimizer $ \\hat y $ is the unique vector in $ \\mathbb R^n $ that satisfies\n",
+ "\n",
+ "- $ \\hat y \\in S $ \n",
+ "- $ y - \\hat y \\perp S $ \n",
+ "\n",
+ "\n",
+ "The vector $ \\hat y $ is called the **orthogonal projection** of $ y $ onto $ S $\n",
+ "\n",
+ "The next figure provides some intuition\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Proof of sufficiency\n",
+ "\n",
+ "We’ll omit the full proof.\n",
+ "\n",
+ "But we will prove sufficiency of the asserted conditions\n",
+ "\n",
+ "To this end, let $ y \\in \\mathbb R^n $ and let $ S $ be a linear subspace of $ \\mathbb R^n $\n",
+ "\n",
+ "Let $ \\hat y $ be a vector in $ \\mathbb R^n $ such that $ \\hat y \\in S $ and $ y - \\hat y \\perp S $\n",
+ "\n",
+ "Let $ z $ be any other point in $ S $ and use the fact that $ S $ is a linear subspace to deduce\n",
+ "\n",
+ "$$\n",
+ "\\| y - z \\|^2\n",
+ "= \\| (y - \\hat y) + (\\hat y - z) \\|^2\n",
+ "= \\| y - \\hat y \\|^2 + \\| \\hat y - z \\|^2\n",
+ "$$\n",
+ "\n",
+ "Hence $ \\| y - z \\| \\geq \\| y - \\hat y \\| $, which completes the proof"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Orthogonal Projection as a Mapping\n",
+ "\n",
+ "For a linear space $ Y $ and a fixed linear subspace $ S $, we have a functional relationship\n",
+ "\n",
+ "$$\n",
+ "y \\in Y\\; \\mapsto \\text{ its orthogonal projection } \\hat y \\in S\n",
+ "$$\n",
+ "\n",
+ "By the OPT, this is a well-defined mapping or *operator* from $ \\mathbb R^n $ to $ \\mathbb R^n $\n",
+ "\n",
+ "In what follows we denote this operator by a matrix $ P $\n",
+ "\n",
+ "- $ P y $ represents the projection $ \\hat y $ \n",
+ "- This is sometimes expressed as $ \\hat E_S y = P y $, where $ \\hat E $ denotes a **wide-sense expectations operator** and the subscript $ S $ indicates that we are projecting $ y $ onto the linear subspace $ S $ \n",
+ "\n",
+ "\n",
+ "The operator $ P $ is called the **orthogonal projection mapping onto** $ S $\n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "It is immediate from the OPT that for any $ y \\in \\mathbb R^n $\n",
+ "\n",
+ "1. $ P y \\in S $ and \n",
+ "1. $ y - P y \\perp S $ \n",
+ "\n",
+ "\n",
+ "From this we can deduce additional useful properties, such as\n",
+ "\n",
+ "1. $ \\| y \\|^2 = \\| P y \\|^2 + \\| y - P y \\|^2 $ and \n",
+ "1. $ \\| P y \\| \\leq \\| y \\| $ \n",
+ "\n",
+ "\n",
+ "For example, to prove 1, observe that $ y = P y + y - P y $ and apply the Pythagorean law"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Orthogonal Complement\n",
+ "\n",
+ "Let $ S \\subset \\mathbb R^n $.\n",
+ "\n",
+ "The **orthogonal complement** of $ S $ is the linear subspace $ S^{\\perp} $ that satisfies\n",
+ "$ x_1 \\perp x_2 $ for every $ x_1 \\in S $ and $ x_2 \\in S^{\\perp} $\n",
+ "\n",
+ "Let $ Y $ be a linear space with linear subspace $ S $ and its orthogonal complement $ S^{\\perp} $\n",
+ "\n",
+ "We write\n",
+ "\n",
+ "$$\n",
+ "Y = S \\oplus S^{\\perp}\n",
+ "$$\n",
+ "\n",
+ "to indicate that for every $ y \\in Y $ there is unique $ x_1 \\in S $ and a unique $ x_2 \\in S^{\\perp} $\n",
+ "such that $ y = x_1 + x_2 $\n",
+ "\n",
+ "Moreover, $ x_1 = \\hat E_S y $ and $ x_2 = y - \\hat E_S y $\n",
+ "\n",
+ "This amounts to another version of the OPT:\n",
+ "\n",
+ "**Theorem**. If $ S $ is a linear subspace of $ \\mathbb R^n $, $ \\hat E_S y = P y $ and $ \\hat E_{S^{\\perp}} y = M y $, then\n",
+ "\n",
+ "$$\n",
+ "P y \\perp M y\n",
+ " \\quad \\text{and} \\quad\n",
+ "y = P y + M y\n",
+ " \\quad \\text{for all } \\, y \\in \\mathbb R^n\n",
+ "$$\n",
+ "\n",
+ "The next figure illustrates\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Orthonormal Basis\n",
+ "\n",
+ "An orthogonal set of vectors $ O \\subset \\mathbb R^n $ is called an **orthonormal set** if $ \\| u \\| = 1 $ for all $ u \\in O $\n",
+ "\n",
+ "Let $ S $ be a linear subspace of $ \\mathbb R^n $ and let $ O \\subset S $\n",
+ "\n",
+ "If $ O $ is orthonormal and $ \\mathop{\\mathrm{span}} O = S $, then $ O $ is called an **orthonormal basis** of $ S $\n",
+ "\n",
+ "$ O $ is necessarily a basis of $ S $ (being independent by orthogonality and the fact that no element is the zero vector)\n",
+ "\n",
+ "One example of an orthonormal set is the canonical basis $ \\{e_1, \\ldots, e_n\\} $\n",
+ "that forms an orthonormal basis of $ \\mathbb R^n $, where $ e_i $ is the $ i $ th unit vector\n",
+ "\n",
+ "If $ \\{u_1, \\ldots, u_k\\} $ is an orthonormal basis of linear subspace $ S $, then\n",
+ "\n",
+ "$$\n",
+ "x = \\sum_{i=1}^k \\langle x, u_i \\rangle u_i\n",
+ "\\quad \\text{for all} \\quad\n",
+ "x \\in S\n",
+ "$$\n",
+ "\n",
+ "To see this, observe that since $ x \\in \\mathop{\\mathrm{span}}\\{u_1, \\ldots, u_k\\} $, we can find\n",
+ "scalars $ \\alpha_1, \\ldots, \\alpha_k $ that verify\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "x = \\sum_{j=1}^k \\alpha_j u_j \\tag{1}\n",
+ "$$\n",
+ "\n",
+ "Taking the inner product with respect to $ u_i $ gives\n",
+ "\n",
+ "$$\n",
+ "\\langle x, u_i \\rangle\n",
+ "= \\sum_{j=1}^k \\alpha_j \\langle u_j, u_i \\rangle\n",
+ "= \\alpha_i\n",
+ "$$\n",
+ "\n",
+ "Combining this result with [(1)](#equation-pob) verifies the claim"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Projection onto an Orthonormal Basis\n",
+ "\n",
+ "When the subspace onto which are projecting is orthonormal, computing the projection simplifies:\n",
+ "\n",
+ "**Theorem** If $ \\{u_1, \\ldots, u_k\\} $ is an orthonormal basis for $ S $, then\n",
+ "\n",
+ "\n",
+ "\n",
+ "$$\n",
+ "P y = \\sum_{i=1}^k \\langle y, u_i \\rangle u_i,\n",
+ "\\quad\n",
+ "\\forall \\; y \\in \\mathbb R^n \\tag{2}\n",
+ "$$\n",
+ "\n",
+ "Proof: Fix $ y \\in \\mathbb R^n $ and let $ P y $ be defined as in [(2)](#equation-exp-for-op)\n",
+ "\n",
+ "Clearly, $ P y \\in S $\n",
+ "\n",
+ "We claim that $ y - P y \\perp S $ also holds\n",
+ "\n",
+ "It sufficies to show that $ y - P y \\perp $ any basis vector $ u_i $ (why?)\n",
+ "\n",
+ "This is true because\n",
+ "\n",
+ "$$\n",
+ "\\left\\langle y - \\sum_{i=1}^k \\langle y, u_i \\rangle u_i, u_j \\right\\rangle\n",
+ "= \\langle y, u_j \\rangle - \\sum_{i=1}^k \\langle y, u_i \\rangle\n",
+ "\\langle u_i, u_j \\rangle = 0\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Projection Using Matrix Algebra\n",
+ "\n",
+ "Let $ S $ be a linear subspace of $ \\mathbb R^n $ and let $ y \\in \\mathbb R^n $\n",
+ "\n",
+ "We want to compute the matrix $ P $ that verifies\n",
+ "\n",
+ "$$\n",
+ "\\hat E_S y = P y\n",
+ "$$\n",
+ "\n",
+ "Evidently $ Py $ is a linear function from $ y \\in \\mathbb R^n $ to $ P y \\in \\mathbb R^n $\n",
+ "\n",
+ "This reference is useful [https://en.wikipedia.org/wiki/Linear_map#Matrices](https://en.wikipedia.org/wiki/Linear_map#Matrices)\n",
+ "\n",
+ "**Theorem.** Let the columns of $ n \\times k $ matrix $ X $ form a basis of $ S $. Then\n",
+ "\n",
+ "$$\n",
+ "P = X (X'X)^{-1} X'\n",
+ "$$\n",
+ "\n",
+ "Proof: Given arbitrary $ y \\in \\mathbb R^n $ and $ P = X (X'X)^{-1} X' $, our claim is that\n",
+ "\n",
+ "1. $ P y \\in S $, and \n",
+ "1. $ y - P y \\perp S $ \n",
+ "\n",
+ "\n",
+ "Claim 1 is true because\n",
+ "\n",
+ "$$\n",
+ "P y = X (X' X)^{-1} X' y = X a\n",
+ "\\quad \\text{when} \\quad\n",
+ "a := (X' X)^{-1} X' y\n",
+ "$$\n",
+ "\n",
+ "An expression of the form $ X a $ is precisely a linear combination of the\n",
+ "columns of $ X $, and hence an element of $ S $\n",
+ "\n",
+ "Claim 2 is equivalent to the statement\n",
+ "\n",
+ "$$\n",
+ "y - X (X' X)^{-1} X' y \\, \\perp\\, X b\n",
+ "\\quad \\text{for all} \\quad\n",
+ "b \\in \\mathbb R^K\n",
+ "$$\n",
+ "\n",
+ "This is true: If $ b \\in \\mathbb R^K $, then\n",
+ "\n",
+ "$$\n",
+ "(X b)' [y - X (X' X)^{-1} X'\n",
+ "y]\n",
+ "= b' [X' y - X' y]\n",
+ "= 0\n",
+ "$$\n",
+ "\n",
+ "The proof is now complete"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Starting with $ X $\n",
+ "\n",
+ "It is common in applications to start with $ n \\times k $ matrix $ X $ with linearly independent columns and let\n",
+ "\n",
+ "$$\n",
+ "S := \\mathop{\\mathrm{span}} X := \\mathop{\\mathrm{span}} \\{\\col_1 X, \\ldots, \\col_k X \\}\n",
+ "$$\n",
+ "\n",
+ "Then the columns of $ X $ form a basis of $ S $\n",
+ "\n",
+ "From the preceding theorem, $ P = X (X' X)^{-1} X' y $ projects $ y $ onto $ S $\n",
+ "\n",
+ "In this context, $ P $ is often called the **projection matrix**\n",
+ "\n",
+ "- The matrix $ M = I - P $ satisfies $ M y = \\hat E_{S^{\\perp}} y $ and is sometimes called the **annihilator matrix** "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### The Orthonormal Case\n",
+ "\n",
+ "Suppose that $ U $ is $ n \\times k $ with orthonormal columns\n",
+ "\n",
+ "Let $ u_i := \\mathop{\\mathrm{col}} U_i $ for each $ i $, let $ S := \\mathop{\\mathrm{span}} U $ and let $ y \\in \\mathbb R^n $\n",
+ "\n",
+ "We know that the projection of $ y $ onto $ S $ is\n",
+ "\n",
+ "$$\n",
+ "P y = U (U' U)^{-1} U' y\n",
+ "$$\n",
+ "\n",
+ "Since $ U $ has orthonormal columns, we have $ U' U = I $\n",
+ "\n",
+ "Hence\n",
+ "\n",
+ "$$\n",
+ "P y\n",
+ "= U U' y\n",
+ "= \\sum_{i=1}^k \\langle u_i, y \\rangle u_i\n",
+ "$$\n",
+ "\n",
+ "We have recovered our earlier result about projecting onto the span of an orthonormal\n",
+ "basis"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Application: Overdetermined Systems of Equations\n",
+ "\n",
+ "Let $ y \\in \\mathbb R^n $ and let $ X $ is $ n \\times k $ with linearly independent columns\n",
+ "\n",
+ "Given $ X $ and $ y $, we seek $ b \\in \\mathbb R^k $ satisfying the system of linear equations $ X b = y $\n",
+ "\n",
+ "If $ n > k $ (more equations than unknowns), then $ b $ is said to be **overdetermined**\n",
+ "\n",
+ "Intuitively, we may not be able find a $ b $ that satisfies all $ n $ equations\n",
+ "\n",
+ "The best approach here is to\n",
+ "\n",
+ "- Accept that an exact solution may not exist \n",
+ "- Look instead for an approximate solution \n",
+ "\n",
+ "\n",
+ "By approximate solution, we mean a $ b \\in \\mathbb R^k $ such that $ X b $ is as close to $ y $ as possible\n",
+ "\n",
+ "The next theorem shows that the solution is well defined and unique\n",
+ "\n",
+ "The proof uses the OPT\n",
+ "\n",
+ "**Theorem** The unique minimizer of $ \\| y - X b \\| $ over $ b \\in \\mathbb R^K $ is\n",
+ "\n",
+ "$$\n",
+ "\\hat \\beta := (X' X)^{-1} X' y\n",
+ "$$\n",
+ "\n",
+ "Proof: Note that\n",
+ "\n",
+ "$$\n",
+ "X \\hat \\beta = X (X' X)^{-1} X' y =\n",
+ "P y\n",
+ "$$\n",
+ "\n",
+ "Since $ P y $ is the orthogonal projection onto $ \\mathop{\\mathrm{span}}(X) $ we have\n",
+ "\n",
+ "$$\n",
+ "\\| y - P y \\|\n",
+ "\\leq \\| y - z \\| \\text{ for any } z \\in \\mathop{\\mathrm{span}}(X)\n",
+ "$$\n",
+ "\n",
+ "Because $ Xb \\in \\mathop{\\mathrm{span}}(X) $\n",
+ "\n",
+ "$$\n",
+ "\\| y - X \\hat \\beta \\|\n",
+ "\\leq \\| y - X b \\| \\text{ for any } b \\in \\mathbb R^K\n",
+ "$$\n",
+ "\n",
+ "This is what we aimed to show"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Least Squares Regression\n",
+ "\n",
+ "Let’s apply the theory of orthogonal projection to least squares regression\n",
+ "\n",
+ "This approach provides insights about many geometric properties of linear regression\n",
+ "\n",
+ "We treat only some examples"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Squared risk measures\n",
+ "\n",
+ "Given pairs $ (x, y) \\in \\mathbb R^K \\times \\mathbb R $, consider choosing $ f \\colon \\mathbb R^K \\to \\mathbb R $ to minimize\n",
+ "the **risk**\n",
+ "\n",
+ "$$\n",
+ "R(f) := \\mathbb{E}\\, [(y - f(x))^2]\n",
+ "$$\n",
+ "\n",
+ "If probabilities and hence $ \\mathbb{E}\\, $ are unknown, we cannot solve this problem directly\n",
+ "\n",
+ "However, if a sample is available, we can estimate the risk with the **empirical risk**:\n",
+ "\n",
+ "$$\n",
+ "\\min_{f \\in \\mathcal{F}} \\frac{1}{N} \\sum_{n=1}^N (y_n - f(x_n))^2\n",
+ "$$\n",
+ "\n",
+ "Minimizing this expression is called **empirical risk minimization**\n",
+ "\n",
+ "The set $ \\mathcal{F} $ is sometimes called the hypothesis space\n",
+ "\n",
+ "The theory of statistical learning tells us that to prevent overfitting we should take the set $ \\mathcal{F} $ to be relatively simple\n",
+ "\n",
+ "If we let $ \\mathcal{F} $ be the class of linear functions $ 1/N $, the problem is\n",
+ "\n",
+ "$$\n",
+ "\\min_{b \\in \\mathbb R^K} \\;\n",
+ "\\sum_{n=1}^N (y_n - b' x_n)^2\n",
+ "$$\n",
+ "\n",
+ "This is the sample **linear least squares problem**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Solution\n",
+ "\n",
+ "Define the matrices\n",
+ "\n",
+ "$$\n",
+ "y :=\n",
+ "\\left(\n",
+ "\\begin{array}{c}\n",
+ " y_1 \\\\\n",
+ " y_2 \\\\\n",
+ " \\vdots \\\\\n",
+ " y_N\n",
+ "\\end{array}\n",
+ "\\right),\n",
+ "\\quad\n",
+ "x_n :=\n",
+ "\\left(\n",
+ "\\begin{array}{c}\n",
+ " x_{n1} \\\\\n",
+ " x_{n2} \\\\\n",
+ " \\vdots \\\\\n",
+ " x_{nK}\n",
+ "\\end{array}\n",
+ "\\right)\n",
+ "= \\text{ $n$-th obs on all regressors}\n",
+ "$$\n",
+ "\n",
+ "and\n",
+ "\n",
+ "$$\n",
+ "X :=\n",
+ "\\left(\n",
+ "\\begin{array}{c}\n",
+ " x_1' \\\\\n",
+ " x_2' \\\\\n",
+ " \\vdots \\\\\n",
+ " x_N'\n",
+ "\\end{array}\n",
+ "\\right)\n",
+ ":=:\n",
+ "\\left(\n",
+ "\\begin{array}{cccc}\n",
+ " x_{11} & x_{12} & \\cdots & x_{1K} \\\\\n",
+ " x_{21} & x_{22} & \\cdots & x_{2K} \\\\\n",
+ " \\vdots & \\vdots & & \\vdots \\\\\n",
+ " x_{N1} & x_{N2} & \\cdots & x_{NK}\n",
+ "\\end{array}\n",
+ "\\right)\n",
+ "$$\n",
+ "\n",
+ "We assume throughout that $ N > K $ and $ X $ is full column rank\n",
+ "\n",
+ "If you work through the algebra, you will be able to verify that $ \\| y - X b \\|^2 = \\sum_{n=1}^N (y_n - b' x_n)^2 $\n",
+ "\n",
+ "Since monotone transforms don’t affect minimizers, we have\n",
+ "\n",
+ "$$\n",
+ "\\argmin_{b \\in \\mathbb R^K} \\sum_{n=1}^N (y_n - b' x_n)^2\n",
+ "= \\argmin_{b \\in \\mathbb R^K} \\| y - X b \\|\n",
+ "$$\n",
+ "\n",
+ "By our results about overdetermined linear systems of equations, the solution is\n",
+ "\n",
+ "$$\n",
+ "\\hat \\beta := (X' X)^{-1} X' y\n",
+ "$$\n",
+ "\n",
+ "Let $ P $ and $ M $ be the projection and annihilator associated with $ X $:\n",
+ "\n",
+ "$$\n",
+ "P := X (X' X)^{-1} X'\n",
+ "\\quad \\text{and} \\quad\n",
+ "M := I - P\n",
+ "$$\n",
+ "\n",
+ "The **vector of fitted values** is\n",
+ "\n",
+ "$$\n",
+ "\\hat y := X \\hat \\beta = P y\n",
+ "$$\n",
+ "\n",
+ "The **vector of residuals** is\n",
+ "\n",
+ "$$\n",
+ "\\hat u := y - \\hat y = y - P y = M y\n",
+ "$$\n",
+ "\n",
+ "Here are some more standard definitions:\n",
+ "\n",
+ "- The **total sum of squares** is $ := \\| y \\|^2 $ \n",
+ "- The **sum of squared residuals** is $ := \\| \\hat u \\|^2 $ \n",
+ "- The **explained sum of squares** is $ := \\| \\hat y \\|^2 $ \n",
+ "\n",
+ "\n",
+ "> TSS = ESS + SSR\n",
+ "\n",
+ "\n",
+ "We can prove this easily using the OPT\n",
+ "\n",
+ "From the OPT we have $ y = \\hat y + \\hat u $ and $ \\hat u \\perp \\hat y $\n",
+ "\n",
+ "Applying the Pythagorean law completes the proof"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Orthogonalization and Decomposition\n",
+ "\n",
+ "Let’s return to the connection between linear independence and orthogonality touched on above\n",
+ "\n",
+ "A result of much interest is a famous algorithm for constructing orthonormal sets from linearly independent sets\n",
+ "\n",
+ "The next section gives details\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Gram-Schmidt Orthogonalization\n",
+ "\n",
+ "**Theorem** For each linearly independent set $ \\{x_1, \\ldots, x_k\\} \\subset \\mathbb R^n $, there exists an\n",
+ "orthonormal set $ \\{u_1, \\ldots, u_k\\} $ with\n",
+ "\n",
+ "$$\n",
+ "\\mathop{\\mathrm{span}} \\{x_1, \\ldots, x_i\\} =\n",
+ "\\mathop{\\mathrm{span}} \\{u_1, \\ldots, u_i\\}\n",
+ "\\quad \\text{for} \\quad\n",
+ "i = 1, \\ldots, k\n",
+ "$$\n",
+ "\n",
+ "The **Gram-Schmidt orthogonalization** procedure constructs an orthogonal set $ \\{ u_1, u_2, \\ldots, u_n\\} $\n",
+ "\n",
+ "One description of this procedure is as follows:\n",
+ "\n",
+ "- For $ i = 1, \\ldots, k $, form $ S_i := \\mathop{\\mathrm{span}}\\{x_1, \\ldots, x_i\\} $ and $ S_i^{\\perp} $ \n",
+ "- Set $ v_1 = x_1 $ \n",
+ "- For $ i \\geq 2 $ set $ v_i := \\hat E_{S_{i-1}^{\\perp}} x_i $ and $ u_i := v_i / \\| v_i \\| $ \n",
+ "\n",
+ "\n",
+ "The sequence $ u_1, \\ldots, u_k $ has the stated properties\n",
+ "\n",
+ "A Gram-Schmidt orthogonalization construction is a key idea behind the Kalman filter described in [A First Look at the Kalman filter](https://lectures.quantecon.org/py/kalman.html)\n",
+ "\n",
+ "In some exercises below you are asked to implement this algorithm and test it using projection"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### QR Decomposition\n",
+ "\n",
+ "The following result uses the preceding algorithm to produce a useful decomposition\n",
+ "\n",
+ "**Theorem** If $ X $ is $ n \\times k $ with linearly independent columns, then there exists a factorization $ X = Q R $ where\n",
+ "\n",
+ "- $ R $ is $ k \\times k $, upper triangular, and nonsingular \n",
+ "- $ Q $ is $ n \\times k $ with orthonormal columns \n",
+ "\n",
+ "\n",
+ "Proof sketch: Let\n",
+ "\n",
+ "- $ x_j := \\col_j (X) $ \n",
+ "- $ \\{u_1, \\ldots, u_k\\} $ be orthonormal with same span as $ \\{x_1, \\ldots, x_k\\} $ (to be constructed using Gram–Schmidt) \n",
+ "- $ Q $ be formed from cols $ u_i $ \n",
+ "\n",
+ "\n",
+ "Since $ x_j \\in \\mathop{\\mathrm{span}}\\{u_1, \\ldots, u_j\\} $, we have\n",
+ "\n",
+ "$$\n",
+ "x_j = \\sum_{i=1}^j \\langle u_i, x_j \\rangle u_i\n",
+ "\\quad \\text{for } j = 1, \\ldots, k\n",
+ "$$\n",
+ "\n",
+ "Some rearranging gives $ X = Q R $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Linear Regression via QR Decomposition\n",
+ "\n",
+ "For matrices $ X $ and $ y $ that overdetermine $ beta $ in the linear\n",
+ "equation system $ y = X \\beta $, we found the least squares approximator $ \\hat \\beta = (X' X)^{-1} X' y $\n",
+ "\n",
+ "Using the QR decomposition $ X = Q R $ gives\n",
+ "\n",
+ "$$\n",
+ "\\begin{aligned}\n",
+ " \\hat \\beta\n",
+ " & = (R'Q' Q R)^{-1} R' Q' y \\\\\n",
+ " & = (R' R)^{-1} R' Q' y \\\\\n",
+ " & = R^{-1} (R')^{-1} R' Q' y\n",
+ " = R^{-1} Q' y\n",
+ "\\end{aligned}\n",
+ "$$\n",
+ "\n",
+ "Numerical routines would in this case use the alternative form $ R \\hat \\beta = Q' y $ and back substitution"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercises"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 1\n",
+ "\n",
+ "Show that, for any linear subspace $ S \\subset \\mathbb R^n $, $ S \\cap S^{\\perp} = \\{0\\} $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 2\n",
+ "\n",
+ "Let $ P = X (X' X)^{-1} X' $ and let $ M = I - P $. Show that\n",
+ "$ P $ and $ M $ are both idempotent and symmetric. Can you give any\n",
+ "intuition as to why they should be idempotent?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 3\n",
+ "\n",
+ "Using Gram-Schmidt orthogonalization, produce a linear projection of $ y $ onto the column space of $ X $ and verify this using the projection matrix $ P := X (X' X)^{-1} X' $ and also using QR decomposition, where:\n",
+ "\n",
+ "$$\n",
+ "y :=\n",
+ "\\left(\n",
+ "\\begin{array}{c}\n",
+ " 1 \\\\\n",
+ " 3 \\\\\n",
+ " -3\n",
+ "\\end{array}\n",
+ "\\right),\n",
+ "\\quad\n",
+ "$$\n",
+ "\n",
+ "and\n",
+ "\n",
+ "$$\n",
+ "X :=\n",
+ "\\left(\n",
+ "\\begin{array}{cc}\n",
+ " 1 & 0 \\\\\n",
+ " 0 & -6 \\\\\n",
+ " 2 & 2\n",
+ "\\end{array}\n",
+ "\\right)\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Solutions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 1\n",
+ "\n",
+ "If $ x \\in S $ and $ x \\in S^\\perp $, then we have in particular\n",
+ "that $ \\langle x, x \\rangle = 0 $, ut then $ x = 0 $"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 2\n",
+ "\n",
+ "Symmetry and idempotence of $ M $ and $ P $ can be established\n",
+ "using standard rules for matrix algebra. The intuition behind\n",
+ "idempotence of $ M $ and $ P $ is that both are orthogonal\n",
+ "projections. After a point is projected into a given subspace, applying\n",
+ "the projection again makes no difference. (A point inside the subspace\n",
+ "is not shifted by orthogonal projection onto that space because it is\n",
+ "already the closest point in the subspace to itself.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise 3\n",
+ "\n",
+ "Here’s a function that computes the orthonormal vectors using the GS\n",
+ "algorithm given in the lecture"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "def gram_schmidt(X):\n",
+ " \"\"\"\n",
+ " Implements Gram-Schmidt orthogonalization.\n",
+ "\n",
+ " Parameters\n",
+ " ----------\n",
+ " X : an n x k array with linearly independent columns\n",
+ "\n",
+ " Returns\n",
+ " -------\n",
+ " U : an n x k array with orthonormal columns\n",
+ "\n",
+ " \"\"\"\n",
+ "\n",
+ " # Set up\n",
+ " n, k = X.shape\n",
+ " U = np.empty((n, k))\n",
+ " I = np.eye(n)\n",
+ "\n",
+ " # The first col of U is just the normalized first col of X\n",
+ " v1 = X[:,0]\n",
+ " U[:, 0] = v1 / np.sqrt(np.sum(v1 * v1))\n",
+ "\n",
+ " for i in range(1, k):\n",
+ " # Set up\n",
+ " b = X[:, i] # The vector we're going to project\n",
+ " Z = X[:, 0:i] # First i-1 columns of X\n",
+ "\n",
+ " # Project onto the orthogonal complement of the col span of Z\n",
+ " M = I - Z @ np.linalg.inv(Z.T @ Z) @ Z.T\n",
+ " u = M @ b\n",
+ "\n",
+ " # Normalize\n",
+ " U[:, i] = u / np.sqrt(np.sum(u * u))\n",
+ "\n",
+ " return U"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here are the arrays we’ll work with"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [],
+ "source": [
+ "y = [1, 3, -3]\n",
+ "\n",
+ "X = [[1, 0],\n",
+ " [0, -6],\n",
+ " [2, 2]]\n",
+ "\n",
+ "X, y = [np.asarray(z) for z in (X, y)]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First let’s try projection of $ y $ onto the column space of\n",
+ "$ X $ using the ordinary matrix expression:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.56521739, 3.26086957, -2.2173913 ])"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Py1 = X @ np.linalg.inv(X.T @ X) @ X.T @ y\n",
+ "Py1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let’s do the same using an orthonormal basis created from our\n",
+ "`gram_schmidt` function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 0.4472136 , -0.13187609],\n",
+ " [ 0. , -0.98907071],\n",
+ " [ 0.89442719, 0.06593805]])"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "U = gram_schmidt(X)\n",
+ "U"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.56521739, 3.26086957, -2.2173913 ])"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Py2 = U @ U.T @ y\n",
+ "Py2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This is the same answer. So far so good. Finally, let’s try the same\n",
+ "thing but with the basis obtained via QR decomposition:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-0.4472136 , -0.13187609],\n",
+ " [-0. , -0.98907071],\n",
+ " [-0.89442719, 0.06593805]])"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from scipy.linalg import qr\n",
+ "\n",
+ "Q, R = qr(X, mode='economic')\n",
+ "Q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "hide-output": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([-0.56521739, 3.26086957, -2.2173913 ])"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Py3 = Q @ Q.T @ y\n",
+ "Py3"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Again, we obtain the same answer"
+ ]
+ }
+ ],
+ "metadata": {
+ "filename": "orth_proj.rst",
+ "kernelspec": {
+ "display_name": "Python",
+ "language": "python3",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "title": "Orthogonal Projections and Their Applications"
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-I.ipynb" "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-I.ipynb"
old mode 100644
new mode 100755
index 649d31d..00ba88e
--- "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-I.ipynb"
+++ "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-I.ipynb"
@@ -1,1128 +1,5916 @@
{
- "cells": [
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# Optimization"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "!pip install numdifftools",
- "execution_count": 118,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Requirement already satisfied: numdifftools in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (0.9.20)\nRequirement already satisfied: numpy>=1.9 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (1.15.2)\nRequirement already satisfied: scipy>=0.8 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (1.1.0)\nRequirement already satisfied: algopy>=0.4 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (0.5.7)\nRequirement already satisfied: setuptools>=9.0 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (40.4.3)\n\u001b[33mYou are using pip version 18.0, however version 18.1 is available.\nYou should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n",
- "name": "stdout"
- }
- ]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import numpy as np\nimport timeit\nfrom scipy import optimize as opt\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d.axes3d import get_test_data\nimport numdifftools as nd",
- "execution_count": 119,
- "outputs": []
- },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Optimization - Otimização\n",
+ "\n",
+ "Instalando a biblioteca `numdifftools` e suas dependências."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 118,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Scalar functions"
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: numdifftools in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (0.9.20)\n",
+ "Requirement already satisfied: numpy>=1.9 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (1.15.2)\n",
+ "Requirement already satisfied: scipy>=0.8 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (1.1.0)\n",
+ "Requirement already satisfied: algopy>=0.4 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (0.5.7)\n",
+ "Requirement already satisfied: setuptools>=9.0 in /home/nbuser/anaconda3_420/lib/python3.5/site-packages (from numdifftools) (40.4.3)\n",
+ "\u001b[33mYou are using pip version 18.0, however version 18.1 is available.\n",
+ "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install numdifftools"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 119,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import timeit\n",
+ "from scipy import optimize as opt\n",
+ "import matplotlib.pyplot as plt\n",
+ "from mpl_toolkits.mplot3d.axes3d import get_test_data\n",
+ "import numdifftools as nd"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Scalar functions - Funções Escalares"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def f(x):\n",
+ " return (x+3)*(x-1)**2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 121,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "X = np.arange(-5, 5, .1)\n",
+ "Y = f(X)\n",
+ "plt.plot(X, Y)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 122,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def f(x):\n return (x+3)*(x-1)**2",
- "execution_count": 120,
- "outputs": []
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "567 µs ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "%timeit opt.minimize_scalar(f, bracket=(-2, 2, 4), method='golden')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "scrolled": false,
- "trusted": true
- },
- "cell_type": "code",
- "source": "X = np.arange(-5, 5, .1)\nY = f(X)\nplt.plot(X, Y)\nplt.show()",
- "execution_count": 121,
- "outputs": []
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "714 µs ± 33.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "%timeit opt.minimize_scalar(f, bracket=(-2, 2, 4), method='brent')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Function to calculate first derivative of $f$ at $x_{0}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 124,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def d1(x, f, h=1e-5):\n",
+ " return (f(x+h)-f(x-h))/(2*h)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 125,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%timeit opt.minimize_scalar(f, bracket=(-2, 2, 4), method='golden')",
- "execution_count": 122,
- "outputs": [
- {
- "output_type": "stream",
- "text": "567 µs ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
- "name": "stdout"
- }
+ "data": {
+ "text/plain": [
+ "79.99999999697138"
]
- },
+ },
+ "execution_count": 125,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Test\n",
+ "d1(5, f)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Function to calculate second derivative of $f$ at $x_{0}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 126,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def d2(x, f, h=1e-5):\n",
+ " return (f(x+2*h)+f(x-2*h)-2*f(x))/(2*h)**2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 127,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%timeit opt.minimize_scalar(f, bracket=(-2, 2, 4), method='brent')",
- "execution_count": 123,
- "outputs": [
- {
- "output_type": "stream",
- "text": "714 µs ± 33.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n",
- "name": "stdout"
- }
+ "data": {
+ "text/plain": [
+ "32.000002647691865"
]
- },
+ },
+ "execution_count": 127,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Test\n",
+ "d2(5, f)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Newton-Raphson"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 128,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def my_newton(f, x0, h=1e-5, delta=1e-5, eps=1e-5):\n",
+ " \n",
+ " dif = 1\n",
+ " der = 1\n",
+ " i = 0\n",
+ " \n",
+ " while dif>eps or der>delta:\n",
+ " \n",
+ " i += 1\n",
+ " d = d1(x0, f)\n",
+ " x1 = x0 - (d/d2(x0, f))\n",
+ " dif = abs(x1-x0)\n",
+ " der = abs(d)\n",
+ " x0 = x1\n",
+ " if i > 100:\n",
+ " break\n",
+ " \n",
+ " return x1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 129,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "Function to calculate first derivative of $f$ at $x_{0}$"
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "74.6 µs ± 4.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "%timeit my_newton(f, 10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Derivatives - Derivativas"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 130,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df1 = nd.Derivative(f)\n",
+ "df2 = nd.Derivative(f, n=2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 131,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def d1(x, f, h=1e-5):\n return (f(x+h)-f(x-h))/(2*h)",
- "execution_count": 124,
- "outputs": []
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "185 ms ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "%timeit opt.minimize(f, 10, method='Newton-CG', jac=df1, hess=df2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Refresher of matrix algebra"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Quadratic form: $Q(x_{1}, x_{2}) = a_{1}\\,x_{1}^2 + a_{2}\\,x_{2}^2 + a_{3}\\,x_{1}\\,x_{2}$ \n",
+ "\n",
+ "This a algebraic expression can be written with matrix notation:\n",
+ "$\n",
+ " x=\n",
+ " \\left[ {\\begin{array}{c}\n",
+ " x_{1} \\\\\n",
+ " x_{2} \\\\\n",
+ " \\end{array} } \\right]\n",
+ "$\n",
+ " and \n",
+ "$\n",
+ " A=\n",
+ " \\left[ {\\begin{array}{c}\n",
+ " a_{1} & a_{3}/2 \\\\\n",
+ " a_{3}/2 & a_{2} \\\\\n",
+ " \\end{array} } \\right]\n",
+ "$\n",
+ " imply $Q(x)=x^{T}\\,A\\,x$. Notice that $A$ is a square, **symmetric** matrix. Therefore, there is a one-to-one relationship between quadratic forms and symmetric matrices.\n",
+ " \n",
+ "*Definitions*: \n",
+ "* A quadratic form is *positive definite* iff $Q(x)>0$ for any $x\\neq0$.\n",
+ "* A quadratic form is *negative definite* iff $Q(x)<0$ for any $x\\neq0$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 132,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Test\nd1(5, f)",
- "execution_count": 125,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 125,
- "data": {
- "text/plain": "79.99999999697138"
- },
- "metadata": {}
- }
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('
');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "Function to calculate second derivative of $f$ at $x_{0}$"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def d2(x, f, h=1e-5):\n return (f(x+2*h)+f(x-2*h)-2*f(x))/(2*h)**2",
- "execution_count": 126,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Test\nd2(5, f)",
- "execution_count": 127,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 127,
- "data": {
- "text/plain": "32.000002647691865"
- },
- "metadata": {}
- }
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Newton-Raphson"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def my_newton(f, x0, h=1e-5, delta=1e-5, eps=1e-5):\n \n dif = 1\n der = 1\n i = 0\n \n while dif>eps or der>delta:\n \n i += 1\n d = d1(x0, f)\n x1 = x0 - (d/d2(x0, f))\n dif = abs(x1-x0)\n der = abs(d)\n x0 = x1\n if i > 100:\n break\n \n return x1",
- "execution_count": 128,
- "outputs": []
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib notebook\n",
+ "plt.rcParams['figure.figsize'] = [8, 3]\n",
+ "fig = plt.figure()\n",
+ "fig.suptitle('Definite Quadratic Forms', fontsize=16)\n",
+ "\n",
+ "x = np.linspace(-5, 5, 101)\n",
+ "y = np.linspace(-5, 5, 101)\n",
+ "X, Y = np.meshgrid(x, y)\n",
+ "\n",
+ "ax1 = fig.add_subplot(121, projection='3d')\n",
+ "ax1.plot_wireframe(X, Y, X**2+Y**2, rstride=10, cstride=10)\n",
+ "ax1.set_title('Positive Definite')\n",
+ "\n",
+ "ax2 = fig.add_subplot(122, projection='3d')\n",
+ "ax2.plot_wireframe(X, Y, -X**2-Y**2, rstride=10, cstride=10)\n",
+ "ax2.set_title('Negative Definite')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "*Definitions*: \n",
+ "* A quadratic form is *positive semi-definite* iff $Q(x)\\geq0$ for any $x$.\n",
+ "* A quadratic form is *negative semi-definite* iff $Q(x)\\leq0$ for any $x$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 133,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%timeit my_newton(f, 10)",
- "execution_count": 129,
- "outputs": [
- {
- "output_type": "stream",
- "text": "74.6 µs ± 4.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n",
- "name": "stdout"
- }
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Derivatives"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "df1 = nd.Derivative(f)\ndf2 = nd.Derivative(f, n=2)",
- "execution_count": 130,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%timeit opt.minimize(f, 10, method='Newton-CG', jac=df1, hess=df2)",
- "execution_count": 131,
- "outputs": [
- {
- "output_type": "stream",
- "text": "185 ms ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
- "name": "stdout"
- }
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Refresher of matrix algebra"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Quadratic form: $Q(x_{1}, x_{2}) = a_{1}\\,x_{1}^2 + a_{2}\\,x_{2}^2 + a_{3}\\,x_{1}\\,x_{2}$ \n\nThis a algebraic expression can be written with matrix notation:\n$\n x=\n \\left[ {\\begin{array}{c}\n x_{1} \\\\\n x_{2} \\\\\n \\end{array} } \\right]\n$\n and \n$\n A=\n \\left[ {\\begin{array}{c}\n a_{1} & a_{3}/2 \\\\\n a_{3}/2 & a_{2} \\\\\n \\end{array} } \\right]\n$\n imply $Q(x)=x^{T}\\,A\\,x$. Notice that $A$ is a square, **symmetric** matrix. Therefore, there is a one-to-one relationship between quadratic forms and symmetric matrices.\n \n*Definitions*: \n* A quadratic form is *positive definite* iff $Q(x)>0$ for any $x\\neq0$.\n* A quadratic form is *negative definite* iff $Q(x)<0$ for any $x\\neq0$."
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib notebook\n",
+ "fig = plt.figure()\n",
+ "fig.suptitle('Semi-Definite Quadratic Forms', fontsize=16)\n",
+ "\n",
+ "ax1 = fig.add_subplot(121, projection='3d')\n",
+ "ax1.plot_wireframe(X, Y, (X+Y)**2, rstride=10, cstride=10)\n",
+ "ax1.set_title('Positive Semi-Definite')\n",
+ "\n",
+ "ax2 = fig.add_subplot(122, projection='3d')\n",
+ "ax2.plot_wireframe(X, Y, -(X+Y)**2, rstride=10, cstride=10)\n",
+ "ax2.set_title('Negative Semi-Definite')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "*Definitions*: \n",
+ "* A quadratic form is *indefinite* iff $Q(x)>0$ for some $x$ and $Q(x)<0$ for another $x$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 134,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%matplotlib notebook\nplt.rcParams['figure.figsize'] = [8, 3]\nfig = plt.figure()\nfig.suptitle('Definite Quadratic Forms', fontsize=16)\n\nx = np.linspace(-5, 5, 101)\ny = np.linspace(-5, 5, 101)\nX, Y = np.meshgrid(x, y)\n\nax1 = fig.add_subplot(121, projection='3d')\nax1.plot_wireframe(X, Y, X**2+Y**2, rstride=10, cstride=10)\nax1.set_title('Positive Definite')\n\nax2 = fig.add_subplot(122, projection='3d')\nax2.plot_wireframe(X, Y, -X**2-Y**2, rstride=10, cstride=10)\nax2.set_title('Negative Definite')\n\nplt.show()",
- "execution_count": 132,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\n\nmpl.get_websocket_type = function() {\n if (typeof(WebSocket) !== 'undefined') {\n return WebSocket;\n } else if (typeof(MozWebSocket) !== 'undefined') {\n return MozWebSocket;\n } else {\n alert('Your browser does not have WebSocket support.' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.');\n };\n}\n\nmpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = (this.ws.binaryType != undefined);\n\n if (!this.supports_binary) {\n var warnings = document.getElementById(\"mpl-warnings\");\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent = (\n \"This browser does not support binary websocket messages. \" +\n \"Performance may be slow.\");\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = $('');\n this._root_extra_style(this.root)\n this.root.attr('style', 'display: inline-block');\n\n $(parent_element).append(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n fig.send_message(\"send_image_mode\", {});\n if (mpl.ratio != 1) {\n fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n }\n fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n fig.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '');\n var titletext = $(\n '');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\n canvas.addClass('mpl-canvas');\n canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n\n this.canvas = canvas[0];\n this.context = canvas[0].getContext(\"2d\");\n\n var backingStore = this.context.backingStorePixelRatio ||\n\tthis.context.webkitBackingStorePixelRatio ||\n\tthis.context.mozBackingStorePixelRatio ||\n\tthis.context.msBackingStorePixelRatio ||\n\tthis.context.oBackingStorePixelRatio ||\n\tthis.context.backingStorePixelRatio || 1;\n\n mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width * mpl.ratio);\n canvas.attr('height', height * mpl.ratio);\n canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n // put a spacer in here.\n continue;\n }\n var button = $('');\n button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n 'ui-button-icon-only');\n button.attr('role', 'button');\n button.attr('aria-disabled', 'false');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n\n var icon_img = $('');\n icon_img.addClass('ui-button-icon-primary ui-icon');\n icon_img.addClass(image);\n icon_img.addClass('ui-corner-all');\n\n var tooltip_span = $('');\n tooltip_span.addClass('ui-button-text');\n tooltip_span.html(tooltip);\n\n button.append(icon_img);\n button.append(tooltip_span);\n\n nav_element.append(button);\n }\n\n var fmt_picker_span = $('');\n\n var fmt_picker = $('');\n fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n fmt_picker_span.append(fmt_picker);\n nav_element.append(fmt_picker_span);\n this.format_dropdown = fmt_picker[0];\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = $(\n '', {selected: fmt === mpl.default_extension}).html(fmt);\n fmt_picker.append(option)\n }\n\n // Add hover states to the ui-buttons\n $( \".ui-button\" ).hover(\n function() { $(this).addClass(\"ui-state-hover\");},\n function() { $(this).removeClass(\"ui-state-hover\");}\n );\n\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n}\n\nmpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n}\n\nmpl.figure.prototype.send_message = function(type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n}\n\nmpl.figure.prototype.send_draw_message = function() {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n }\n}\n\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n}\n\n\nmpl.figure.prototype.handle_resize = function(fig, msg) {\n var size = msg['size'];\n if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n fig._resize_canvas(size[0], size[1]);\n fig.send_message(\"refresh\", {});\n };\n}\n\nmpl.figure.prototype.handle_rubberband = function(fig, msg) {\n var x0 = msg['x0'] / mpl.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n var x1 = msg['x1'] / mpl.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0, 0, fig.canvas.width, fig.canvas.height);\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n}\n\nmpl.figure.prototype.handle_figure_label = function(fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n}\n\nmpl.figure.prototype.handle_cursor = function(fig, msg) {\n var cursor = msg['cursor'];\n switch(cursor)\n {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n}\n\nmpl.figure.prototype.handle_message = function(fig, msg) {\n fig.message.textContent = msg['message'];\n}\n\nmpl.figure.prototype.handle_draw = function(fig, msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n}\n\nmpl.figure.prototype.handle_image_mode = function(fig, msg) {\n fig.image_mode = msg['mode'];\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Called whenever the canvas gets updated.\n this.send_message(\"ack\", {});\n}\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function(fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = \"image/png\";\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src);\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data);\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig[\"handle_\" + msg_type];\n } catch (e) {\n console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n }\n }\n };\n}\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function(e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e)\n e = window.event;\n if (e.target)\n targ = e.target;\n else if (e.srcElement)\n targ = e.srcElement;\n if (targ.nodeType == 3) // defeat Safari bug\n targ = targ.parentNode;\n\n // jQuery normalizes the pageX and pageY\n // pageX,Y are the mouse positions relative to the document\n // offset() returns the position of the element relative to the document\n var x = e.pageX - $(targ).offset().left;\n var y = e.pageY - $(targ).offset().top;\n\n return {\"x\": x, \"y\": y};\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys (original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object')\n obj[key] = original[key]\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function(event, name) {\n var canvas_pos = mpl.findpos(event)\n\n if (name === 'button_press')\n {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * mpl.ratio;\n var y = canvas_pos.y * mpl.ratio;\n\n this.send_message(name, {x: x, y: y, button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event)});\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n // Handle any extra behaviour associated with a key event\n}\n\nmpl.figure.prototype.key_event = function(event, name) {\n\n // Prevent repeat events\n if (name == 'key_press')\n {\n if (event.which === this._key)\n return;\n else\n this._key = event.which;\n }\n if (name == 'key_release')\n this._key = null;\n\n var value = '';\n if (event.ctrlKey && event.which != 17)\n value += \"ctrl+\";\n if (event.altKey && event.which != 18)\n value += \"alt+\";\n if (event.shiftKey && event.which != 16)\n value += \"shift+\";\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, {key: value,\n guiEvent: simpleKeys(event)});\n return false;\n}\n\nmpl.figure.prototype.toolbar_button_onclick = function(name) {\n if (name == 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message(\"toolbar_button\", {name: name});\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function() {\n comm.close()\n };\n ws.send = function(m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function(msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overriden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data'])\n });\n return ws;\n}\n\nmpl.mpl_figure_comm = function(comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = $(\"#\" + id);\n var ws_proxy = comm_websocket_adapter(comm)\n\n function ondownload(figure, format) {\n window.open(figure.imageObj.src);\n }\n\n var fig = new mpl.figure(id, ws_proxy,\n ondownload,\n element.get(0));\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element.get(0);\n fig.cell_info = mpl.find_output_cell(\"\");\n if (!fig.cell_info) {\n console.error(\"Failed to find cell for figure\", id, fig);\n return;\n }\n\n var output_index = fig.cell_info[2]\n var cell = fig.cell_info[0];\n\n};\n\nmpl.figure.prototype.handle_close = function(fig, msg) {\n var width = fig.canvas.width/mpl.ratio\n fig.root.unbind('remove')\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable()\n $(fig.parent_element).html('');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n",
- "text/plain": ""
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": "",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "*Definitions*: \n* A quadratic form is *positive semi-definite* iff $Q(x)\\geq0$ for any $x$.\n* A quadratic form is *negative semi-definite* iff $Q(x)\\leq0$ for any $x$."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%matplotlib notebook\nfig = plt.figure()\nfig.suptitle('Semi-Definite Quadratic Forms', fontsize=16)\n\nax1 = fig.add_subplot(121, projection='3d')\nax1.plot_wireframe(X, Y, (X+Y)**2, rstride=10, cstride=10)\nax1.set_title('Positive Semi-Definite')\n\nax2 = fig.add_subplot(122, projection='3d')\nax2.plot_wireframe(X, Y, -(X+Y)**2, rstride=10, cstride=10)\nax2.set_title('Negative Semi-Definite')\n\nplt.show()",
- "execution_count": 133,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\n\nmpl.get_websocket_type = function() {\n if (typeof(WebSocket) !== 'undefined') {\n return WebSocket;\n } else if (typeof(MozWebSocket) !== 'undefined') {\n return MozWebSocket;\n } else {\n alert('Your browser does not have WebSocket support.' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.');\n };\n}\n\nmpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = (this.ws.binaryType != undefined);\n\n if (!this.supports_binary) {\n var warnings = document.getElementById(\"mpl-warnings\");\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent = (\n \"This browser does not support binary websocket messages. \" +\n \"Performance may be slow.\");\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = $('');\n this._root_extra_style(this.root)\n this.root.attr('style', 'display: inline-block');\n\n $(parent_element).append(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n fig.send_message(\"send_image_mode\", {});\n if (mpl.ratio != 1) {\n fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n }\n fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n fig.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '');\n var titletext = $(\n '');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\n canvas.addClass('mpl-canvas');\n canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n\n this.canvas = canvas[0];\n this.context = canvas[0].getContext(\"2d\");\n\n var backingStore = this.context.backingStorePixelRatio ||\n\tthis.context.webkitBackingStorePixelRatio ||\n\tthis.context.mozBackingStorePixelRatio ||\n\tthis.context.msBackingStorePixelRatio ||\n\tthis.context.oBackingStorePixelRatio ||\n\tthis.context.backingStorePixelRatio || 1;\n\n mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width * mpl.ratio);\n canvas.attr('height', height * mpl.ratio);\n canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n // put a spacer in here.\n continue;\n }\n var button = $('');\n button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n 'ui-button-icon-only');\n button.attr('role', 'button');\n button.attr('aria-disabled', 'false');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n\n var icon_img = $('');\n icon_img.addClass('ui-button-icon-primary ui-icon');\n icon_img.addClass(image);\n icon_img.addClass('ui-corner-all');\n\n var tooltip_span = $('');\n tooltip_span.addClass('ui-button-text');\n tooltip_span.html(tooltip);\n\n button.append(icon_img);\n button.append(tooltip_span);\n\n nav_element.append(button);\n }\n\n var fmt_picker_span = $('');\n\n var fmt_picker = $('');\n fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n fmt_picker_span.append(fmt_picker);\n nav_element.append(fmt_picker_span);\n this.format_dropdown = fmt_picker[0];\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = $(\n '', {selected: fmt === mpl.default_extension}).html(fmt);\n fmt_picker.append(option)\n }\n\n // Add hover states to the ui-buttons\n $( \".ui-button\" ).hover(\n function() { $(this).addClass(\"ui-state-hover\");},\n function() { $(this).removeClass(\"ui-state-hover\");}\n );\n\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n}\n\nmpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n}\n\nmpl.figure.prototype.send_message = function(type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n}\n\nmpl.figure.prototype.send_draw_message = function() {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n }\n}\n\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n}\n\n\nmpl.figure.prototype.handle_resize = function(fig, msg) {\n var size = msg['size'];\n if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n fig._resize_canvas(size[0], size[1]);\n fig.send_message(\"refresh\", {});\n };\n}\n\nmpl.figure.prototype.handle_rubberband = function(fig, msg) {\n var x0 = msg['x0'] / mpl.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n var x1 = msg['x1'] / mpl.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0, 0, fig.canvas.width, fig.canvas.height);\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n}\n\nmpl.figure.prototype.handle_figure_label = function(fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n}\n\nmpl.figure.prototype.handle_cursor = function(fig, msg) {\n var cursor = msg['cursor'];\n switch(cursor)\n {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n}\n\nmpl.figure.prototype.handle_message = function(fig, msg) {\n fig.message.textContent = msg['message'];\n}\n\nmpl.figure.prototype.handle_draw = function(fig, msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n}\n\nmpl.figure.prototype.handle_image_mode = function(fig, msg) {\n fig.image_mode = msg['mode'];\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Called whenever the canvas gets updated.\n this.send_message(\"ack\", {});\n}\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function(fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = \"image/png\";\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src);\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data);\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig[\"handle_\" + msg_type];\n } catch (e) {\n console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n }\n }\n };\n}\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function(e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e)\n e = window.event;\n if (e.target)\n targ = e.target;\n else if (e.srcElement)\n targ = e.srcElement;\n if (targ.nodeType == 3) // defeat Safari bug\n targ = targ.parentNode;\n\n // jQuery normalizes the pageX and pageY\n // pageX,Y are the mouse positions relative to the document\n // offset() returns the position of the element relative to the document\n var x = e.pageX - $(targ).offset().left;\n var y = e.pageY - $(targ).offset().top;\n\n return {\"x\": x, \"y\": y};\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys (original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object')\n obj[key] = original[key]\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function(event, name) {\n var canvas_pos = mpl.findpos(event)\n\n if (name === 'button_press')\n {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * mpl.ratio;\n var y = canvas_pos.y * mpl.ratio;\n\n this.send_message(name, {x: x, y: y, button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event)});\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n // Handle any extra behaviour associated with a key event\n}\n\nmpl.figure.prototype.key_event = function(event, name) {\n\n // Prevent repeat events\n if (name == 'key_press')\n {\n if (event.which === this._key)\n return;\n else\n this._key = event.which;\n }\n if (name == 'key_release')\n this._key = null;\n\n var value = '';\n if (event.ctrlKey && event.which != 17)\n value += \"ctrl+\";\n if (event.altKey && event.which != 18)\n value += \"alt+\";\n if (event.shiftKey && event.which != 16)\n value += \"shift+\";\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, {key: value,\n guiEvent: simpleKeys(event)});\n return false;\n}\n\nmpl.figure.prototype.toolbar_button_onclick = function(name) {\n if (name == 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message(\"toolbar_button\", {name: name});\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function() {\n comm.close()\n };\n ws.send = function(m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function(msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overriden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data'])\n });\n return ws;\n}\n\nmpl.mpl_figure_comm = function(comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = $(\"#\" + id);\n var ws_proxy = comm_websocket_adapter(comm)\n\n function ondownload(figure, format) {\n window.open(figure.imageObj.src);\n }\n\n var fig = new mpl.figure(id, ws_proxy,\n ondownload,\n element.get(0));\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element.get(0);\n fig.cell_info = mpl.find_output_cell(\"\");\n if (!fig.cell_info) {\n console.error(\"Failed to find cell for figure\", id, fig);\n return;\n }\n\n var output_index = fig.cell_info[2]\n var cell = fig.cell_info[0];\n\n};\n\nmpl.figure.prototype.handle_close = function(fig, msg) {\n var width = fig.canvas.width/mpl.ratio\n fig.root.unbind('remove')\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable()\n $(fig.parent_element).html('');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n",
- "text/plain": ""
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": "",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "*Definitions*: \n* A quadratic form is *indefinite* iff $Q(x)>0$ for some $x$ and $Q(x)<0$ for another $x$."
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib notebook\n",
+ "plt.rcParams['figure.figsize'] = [5, 3]\n",
+ "fig = plt.figure()\n",
+ "fig.suptitle('Indefinite Quadratic Forms', fontsize=16)\n",
+ "\n",
+ "ax = fig.add_subplot(111, projection='3d')\n",
+ "ax.plot_wireframe(X, Y, X**2-Y**2, rstride=10, cstride=10)\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Testing definiteness"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def principal_minors(M):\n",
+ " if M.ndim == 2 and np.all(M == M.transpose()):\n",
+ " lpm = []\n",
+ " for k in np.arange(0, M.shape[0], 1):\n",
+ " lpm.append(np.linalg.det(M[0:k+1, 0:k+1]))\n",
+ " return lpm"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 136,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "A = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 9]])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 137,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "%matplotlib notebook\nplt.rcParams['figure.figsize'] = [5, 3]\nfig = plt.figure()\nfig.suptitle('Indefinite Quadratic Forms', fontsize=16)\n\nax = fig.add_subplot(111, projection='3d')\nax.plot_wireframe(X, Y, X**2-Y**2, rstride=10, cstride=10)\n\nplt.show()",
- "execution_count": 134,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\n\nmpl.get_websocket_type = function() {\n if (typeof(WebSocket) !== 'undefined') {\n return WebSocket;\n } else if (typeof(MozWebSocket) !== 'undefined') {\n return MozWebSocket;\n } else {\n alert('Your browser does not have WebSocket support.' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.');\n };\n}\n\nmpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = (this.ws.binaryType != undefined);\n\n if (!this.supports_binary) {\n var warnings = document.getElementById(\"mpl-warnings\");\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent = (\n \"This browser does not support binary websocket messages. \" +\n \"Performance may be slow.\");\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = $('');\n this._root_extra_style(this.root)\n this.root.attr('style', 'display: inline-block');\n\n $(parent_element).append(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n fig.send_message(\"send_image_mode\", {});\n if (mpl.ratio != 1) {\n fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n }\n fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n fig.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '');\n var titletext = $(\n '');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\n canvas.addClass('mpl-canvas');\n canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n\n this.canvas = canvas[0];\n this.context = canvas[0].getContext(\"2d\");\n\n var backingStore = this.context.backingStorePixelRatio ||\n\tthis.context.webkitBackingStorePixelRatio ||\n\tthis.context.mozBackingStorePixelRatio ||\n\tthis.context.msBackingStorePixelRatio ||\n\tthis.context.oBackingStorePixelRatio ||\n\tthis.context.backingStorePixelRatio || 1;\n\n mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width * mpl.ratio);\n canvas.attr('height', height * mpl.ratio);\n canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n // put a spacer in here.\n continue;\n }\n var button = $('');\n button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n 'ui-button-icon-only');\n button.attr('role', 'button');\n button.attr('aria-disabled', 'false');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n\n var icon_img = $('');\n icon_img.addClass('ui-button-icon-primary ui-icon');\n icon_img.addClass(image);\n icon_img.addClass('ui-corner-all');\n\n var tooltip_span = $('');\n tooltip_span.addClass('ui-button-text');\n tooltip_span.html(tooltip);\n\n button.append(icon_img);\n button.append(tooltip_span);\n\n nav_element.append(button);\n }\n\n var fmt_picker_span = $('');\n\n var fmt_picker = $('');\n fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n fmt_picker_span.append(fmt_picker);\n nav_element.append(fmt_picker_span);\n this.format_dropdown = fmt_picker[0];\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = $(\n '', {selected: fmt === mpl.default_extension}).html(fmt);\n fmt_picker.append(option)\n }\n\n // Add hover states to the ui-buttons\n $( \".ui-button\" ).hover(\n function() { $(this).addClass(\"ui-state-hover\");},\n function() { $(this).removeClass(\"ui-state-hover\");}\n );\n\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n}\n\nmpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n}\n\nmpl.figure.prototype.send_message = function(type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n}\n\nmpl.figure.prototype.send_draw_message = function() {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n }\n}\n\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n}\n\n\nmpl.figure.prototype.handle_resize = function(fig, msg) {\n var size = msg['size'];\n if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n fig._resize_canvas(size[0], size[1]);\n fig.send_message(\"refresh\", {});\n };\n}\n\nmpl.figure.prototype.handle_rubberband = function(fig, msg) {\n var x0 = msg['x0'] / mpl.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n var x1 = msg['x1'] / mpl.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0, 0, fig.canvas.width, fig.canvas.height);\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n}\n\nmpl.figure.prototype.handle_figure_label = function(fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n}\n\nmpl.figure.prototype.handle_cursor = function(fig, msg) {\n var cursor = msg['cursor'];\n switch(cursor)\n {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n}\n\nmpl.figure.prototype.handle_message = function(fig, msg) {\n fig.message.textContent = msg['message'];\n}\n\nmpl.figure.prototype.handle_draw = function(fig, msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n}\n\nmpl.figure.prototype.handle_image_mode = function(fig, msg) {\n fig.image_mode = msg['mode'];\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Called whenever the canvas gets updated.\n this.send_message(\"ack\", {});\n}\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function(fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = \"image/png\";\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src);\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data);\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig[\"handle_\" + msg_type];\n } catch (e) {\n console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n }\n }\n };\n}\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function(e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e)\n e = window.event;\n if (e.target)\n targ = e.target;\n else if (e.srcElement)\n targ = e.srcElement;\n if (targ.nodeType == 3) // defeat Safari bug\n targ = targ.parentNode;\n\n // jQuery normalizes the pageX and pageY\n // pageX,Y are the mouse positions relative to the document\n // offset() returns the position of the element relative to the document\n var x = e.pageX - $(targ).offset().left;\n var y = e.pageY - $(targ).offset().top;\n\n return {\"x\": x, \"y\": y};\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys (original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object')\n obj[key] = original[key]\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function(event, name) {\n var canvas_pos = mpl.findpos(event)\n\n if (name === 'button_press')\n {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * mpl.ratio;\n var y = canvas_pos.y * mpl.ratio;\n\n this.send_message(name, {x: x, y: y, button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event)});\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n // Handle any extra behaviour associated with a key event\n}\n\nmpl.figure.prototype.key_event = function(event, name) {\n\n // Prevent repeat events\n if (name == 'key_press')\n {\n if (event.which === this._key)\n return;\n else\n this._key = event.which;\n }\n if (name == 'key_release')\n this._key = null;\n\n var value = '';\n if (event.ctrlKey && event.which != 17)\n value += \"ctrl+\";\n if (event.altKey && event.which != 18)\n value += \"alt+\";\n if (event.shiftKey && event.which != 16)\n value += \"shift+\";\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, {key: value,\n guiEvent: simpleKeys(event)});\n return false;\n}\n\nmpl.figure.prototype.toolbar_button_onclick = function(name) {\n if (name == 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message(\"toolbar_button\", {name: name});\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function() {\n comm.close()\n };\n ws.send = function(m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function(msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overriden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data'])\n });\n return ws;\n}\n\nmpl.mpl_figure_comm = function(comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = $(\"#\" + id);\n var ws_proxy = comm_websocket_adapter(comm)\n\n function ondownload(figure, format) {\n window.open(figure.imageObj.src);\n }\n\n var fig = new mpl.figure(id, ws_proxy,\n ondownload,\n element.get(0));\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element.get(0);\n fig.cell_info = mpl.find_output_cell(\"\");\n if (!fig.cell_info) {\n console.error(\"Failed to find cell for figure\", id, fig);\n return;\n }\n\n var output_index = fig.cell_info[2]\n var cell = fig.cell_info[0];\n\n};\n\nmpl.figure.prototype.handle_close = function(fig, msg) {\n var width = fig.canvas.width/mpl.ratio\n fig.root.unbind('remove')\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable()\n $(fig.parent_element).html('');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n",
- "text/plain": ""
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": "",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "[1.0, -1.0, -4.000000000000001]"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Testing definiteness"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def principal_minors(M):\n if M.ndim == 2 and np.all(M == M.transpose()):\n lpm = []\n for k in np.arange(0, M.shape[0], 1):\n lpm.append(np.linalg.det(M[0:k+1, 0:k+1]))\n return lpm",
- "execution_count": 135,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "A = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 9]])",
- "execution_count": 136,
- "outputs": []
- },
+ },
+ "execution_count": 137,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "principal_minors(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 138,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def positive_definite(M):\n",
+ " if M.ndim == 2 and np.all(M == M.transpose()):\n",
+ " return np.all(np.array(principal_minors(M))>0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 139,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "principal_minors(A)",
- "execution_count": 137,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 137,
- "data": {
- "text/plain": "[1.0, -1.0, -4.000000000000001]"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "False"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def positive_definite(M):\n if M.ndim == 2 and np.all(M == M.transpose()):\n return np.all(np.array(principal_minors(M))>0)",
- "execution_count": 138,
- "outputs": []
- },
+ },
+ "execution_count": 139,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "positive_definite(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 140,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def negative_definite(M):\n",
+ " if M.ndim == 2 and np.all(M == M.transpose()):\n",
+ " n = M.shape[0]\n",
+ " c = [(-1)**(i+1) for i in np.arange(0, n, 1)]\n",
+ " return np.all((np.array(c)*np.array(principal_minors(M)))>0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 141,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "positive_definite(A)",
- "execution_count": 139,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 139,
- "data": {
- "text/plain": "False"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "False"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def negative_definite(M):\n if M.ndim == 2 and np.all(M == M.transpose()):\n n = M.shape[0]\n c = [(-1)**(i+1) for i in np.arange(0, n, 1)]\n return np.all((np.array(c)*np.array(principal_minors(M)))>0)",
- "execution_count": 140,
- "outputs": []
- },
+ },
+ "execution_count": 141,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "negative_definite(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def indefinite(M):\n",
+ " if M.ndim == 2 and np.all(M == M.transpose()):\n",
+ " if not positive_definite(M) and not negative_definite(M):\n",
+ " n = M.shape[0]\n",
+ " return np.all(np.array(principal_minors(M)) != 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 143,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "negative_definite(A)",
- "execution_count": 141,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 141,
- "data": {
- "text/plain": "False"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "True"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def indefinite(M):\n if M.ndim == 2 and np.all(M == M.transpose()):\n if not positive_definite(M) and not negative_definite(M):\n n = M.shape[0]\n return np.all(np.array(principal_minors(M)) != 0)",
- "execution_count": 142,
- "outputs": []
- },
+ },
+ "execution_count": 143,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "indefinite(A)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Eigenvalues, Eigenvectors and Eigen Decomposition\n",
+ "\n",
+ "$A$: square matrix ($n \\times n$), $x$: column vector ($n \\times 1$), $\\lambda$: scalar. \n",
+ "\n",
+ "*Definition*: $\\lambda$ is an **eigenvalue** of $A$ with corresponding $x$ **eigenvector** iff $A\\,x=\\lambda\\,x$.\n",
+ "\n",
+ "Eigenvalues must solve $\\mathrm{det}(A-\\lambda\\,I)=0$.\n",
+ "\n",
+ "*Result*: If $A$ is a real symmetric matrix, all of its eigenvalues are real numbers, and eigenvectors corresponding to distinct eigenvalues are orthogonal.\n",
+ "\n",
+ "*Eigen Decomposition of Symmetric Matrices*: \n",
+ "Let $P = [x_1, x_2, ..., x_n]$ and $D=diag(\\lambda_1, \\lambda_2, ..., \\lambda_n)$. Then $A = P\\,D\\,P^{-1}$.\n",
+ "\n",
+ "If $\\lambda_i>0, \\forall i$, then $A$ is **positive definite**. \n",
+ "\n",
+ "If $\\lambda_i<0, \\forall i$, then $A$ is **negative definite**. \n",
+ "\n",
+ "If $\\lambda_i\\geq0, \\forall i$, then $A$ is **positive semi-definite**. \n",
+ "\n",
+ "If $\\lambda_i\\leq0, \\forall i$, then $A$ is **negative semi-definite**."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 144,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "indefinite(A)",
- "execution_count": 143,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 143,
- "data": {
- "text/plain": "True"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "(array([12.14984759, -0.28900503, 1.13915745]),\n",
+ " array([[ 0.30595473, 0.90505749, -0.29540249],\n",
+ " [ 0.43670868, -0.40912915, -0.80118592],\n",
+ " [ 0.84597709, -0.11612179, 0.52042146]]))"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Eigenvalues, Eigenvectors and Eigen Decomposition\n\n$A$: square matrix ($n \\times n$), $x$: column vector ($n \\times 1$), $\\lambda$: scalar. \n\n*Definition*: $\\lambda$ is an **eigenvalue** of $A$ with corresponding $x$ **eigenvector** iff $A\\,x=\\lambda\\,x$.\n\nEigenvalues must solve $\\mathrm{det}(A-\\lambda\\,I)=0$.\n\n*Result*: If $A$ is a real symmetric matrix, all of its eigenvalues are real numbers, and eigenvectors corresponding to distinct eigenvalues are orthogonal.\n\n*Eigen Decomposition of Symmetric Matrices*: \nLet $P = [x_1, x_2, ..., x_n]$ and $D=diag(\\lambda_1, \\lambda_2, ..., \\lambda_n)$. Then $A = P\\,D\\,P^{-1}$.\n\nIf $\\lambda_i>0, \\forall i$, then $A$ is **positive definite**. \n\nIf $\\lambda_i<0, \\forall i$, then $A$ is **negative definite**. \n\nIf $\\lambda_i\\geq0, \\forall i$, then $A$ is **positive semi-definite**. \n\nIf $\\lambda_i\\leq0, \\forall i$, then $A$ is **negative semi-definite**."
- },
+ },
+ "execution_count": 144,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.linalg.eig(A)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 145,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def pos_def(A):\n",
+ " return (np.all(np.linalg.eig(A)[0]>0))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 146,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "np.linalg.eig(A)",
- "execution_count": 144,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 144,
- "data": {
- "text/plain": "(array([12.14984759, -0.28900503, 1.13915745]),\n array([[ 0.30595473, 0.90505749, -0.29540249],\n [ 0.43670868, -0.40912915, -0.80118592],\n [ 0.84597709, -0.11612179, 0.52042146]]))"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "False"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def pos_def(A):\n return (np.all(np.linalg.eig(A)[0]>0))",
- "execution_count": 145,
- "outputs": []
- },
+ },
+ "execution_count": 146,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pos_def(A)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Multivariate functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 147,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def f(x):\n",
+ " return x[0]**2+x[1]**2-50*np.sin(.5*(x[0]+x[1]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 148,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x = np.array([1, 2, 3])\n",
+ "y = np.array([20, 40, 60])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 149,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X, Y = np.meshgrid(x, y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 150,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "pos_def(A)",
- "execution_count": 146,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 146,
- "data": {
- "text/plain": "False"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "array([[1, 2, 3],\n",
+ " [1, 2, 3],\n",
+ " [1, 2, 3]])"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Multivariate functions"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def f(x):\n return x[0]**2+x[1]**2-50*np.sin(.5*(x[0]+x[1]))",
- "execution_count": 147,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x = np.array([1, 2, 3])\ny = np.array([20, 40, 60])",
- "execution_count": 148,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "X, Y = np.meshgrid(x, y)",
- "execution_count": 149,
- "outputs": []
- },
+ },
+ "execution_count": 150,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 151,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "X",
- "execution_count": 150,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 150,
- "data": {
- "text/plain": "array([[1, 2, 3],\n [1, 2, 3],\n [1, 2, 3]])"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "array([[20, 20, 20],\n",
+ " [40, 40, 40],\n",
+ " [60, 60, 60]])"
]
- },
+ },
+ "execution_count": 151,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 152,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "Y",
- "execution_count": 151,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 151,
- "data": {
- "text/plain": "array([[20, 20, 20],\n [40, 40, 40],\n [60, 60, 60]])"
- },
- "metadata": {}
- }
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {
- "scrolled": true,
- "trusted": true
- },
- "cell_type": "code",
- "source": "%matplotlib notebook\nplt.rcParams['figure.figsize'] = [5, 3]\n\nx = np.linspace(-10, 10, 101)\ny = np.linspace(-10, 10, 101)\nX, Y = np.meshgrid(x, y)\n\nfig = plt.figure()\nfig.suptitle('$x^2+y^2-50\\,sin(.5(x+y))$', fontsize=16)\n\nax = fig.add_subplot(111, projection='3d')\nax.plot_wireframe(X, Y, f([X, Y]), rstride=10, cstride=10)\n\nplt.show()",
- "execution_count": 152,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\n\nmpl.get_websocket_type = function() {\n if (typeof(WebSocket) !== 'undefined') {\n return WebSocket;\n } else if (typeof(MozWebSocket) !== 'undefined') {\n return MozWebSocket;\n } else {\n alert('Your browser does not have WebSocket support.' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.');\n };\n}\n\nmpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = (this.ws.binaryType != undefined);\n\n if (!this.supports_binary) {\n var warnings = document.getElementById(\"mpl-warnings\");\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent = (\n \"This browser does not support binary websocket messages. \" +\n \"Performance may be slow.\");\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = $('');\n this._root_extra_style(this.root)\n this.root.attr('style', 'display: inline-block');\n\n $(parent_element).append(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n fig.send_message(\"send_image_mode\", {});\n if (mpl.ratio != 1) {\n fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n }\n fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n fig.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '');\n var titletext = $(\n '');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\n canvas.addClass('mpl-canvas');\n canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n\n this.canvas = canvas[0];\n this.context = canvas[0].getContext(\"2d\");\n\n var backingStore = this.context.backingStorePixelRatio ||\n\tthis.context.webkitBackingStorePixelRatio ||\n\tthis.context.mozBackingStorePixelRatio ||\n\tthis.context.msBackingStorePixelRatio ||\n\tthis.context.oBackingStorePixelRatio ||\n\tthis.context.backingStorePixelRatio || 1;\n\n mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width * mpl.ratio);\n canvas.attr('height', height * mpl.ratio);\n canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n // put a spacer in here.\n continue;\n }\n var button = $('');\n button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n 'ui-button-icon-only');\n button.attr('role', 'button');\n button.attr('aria-disabled', 'false');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n\n var icon_img = $('');\n icon_img.addClass('ui-button-icon-primary ui-icon');\n icon_img.addClass(image);\n icon_img.addClass('ui-corner-all');\n\n var tooltip_span = $('');\n tooltip_span.addClass('ui-button-text');\n tooltip_span.html(tooltip);\n\n button.append(icon_img);\n button.append(tooltip_span);\n\n nav_element.append(button);\n }\n\n var fmt_picker_span = $('');\n\n var fmt_picker = $('');\n fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n fmt_picker_span.append(fmt_picker);\n nav_element.append(fmt_picker_span);\n this.format_dropdown = fmt_picker[0];\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = $(\n '', {selected: fmt === mpl.default_extension}).html(fmt);\n fmt_picker.append(option)\n }\n\n // Add hover states to the ui-buttons\n $( \".ui-button\" ).hover(\n function() { $(this).addClass(\"ui-state-hover\");},\n function() { $(this).removeClass(\"ui-state-hover\");}\n );\n\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n}\n\nmpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n}\n\nmpl.figure.prototype.send_message = function(type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n}\n\nmpl.figure.prototype.send_draw_message = function() {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n }\n}\n\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n}\n\n\nmpl.figure.prototype.handle_resize = function(fig, msg) {\n var size = msg['size'];\n if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n fig._resize_canvas(size[0], size[1]);\n fig.send_message(\"refresh\", {});\n };\n}\n\nmpl.figure.prototype.handle_rubberband = function(fig, msg) {\n var x0 = msg['x0'] / mpl.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n var x1 = msg['x1'] / mpl.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0, 0, fig.canvas.width, fig.canvas.height);\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n}\n\nmpl.figure.prototype.handle_figure_label = function(fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n}\n\nmpl.figure.prototype.handle_cursor = function(fig, msg) {\n var cursor = msg['cursor'];\n switch(cursor)\n {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n}\n\nmpl.figure.prototype.handle_message = function(fig, msg) {\n fig.message.textContent = msg['message'];\n}\n\nmpl.figure.prototype.handle_draw = function(fig, msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n}\n\nmpl.figure.prototype.handle_image_mode = function(fig, msg) {\n fig.image_mode = msg['mode'];\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Called whenever the canvas gets updated.\n this.send_message(\"ack\", {});\n}\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function(fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = \"image/png\";\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src);\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data);\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig[\"handle_\" + msg_type];\n } catch (e) {\n console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n }\n }\n };\n}\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function(e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e)\n e = window.event;\n if (e.target)\n targ = e.target;\n else if (e.srcElement)\n targ = e.srcElement;\n if (targ.nodeType == 3) // defeat Safari bug\n targ = targ.parentNode;\n\n // jQuery normalizes the pageX and pageY\n // pageX,Y are the mouse positions relative to the document\n // offset() returns the position of the element relative to the document\n var x = e.pageX - $(targ).offset().left;\n var y = e.pageY - $(targ).offset().top;\n\n return {\"x\": x, \"y\": y};\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys (original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object')\n obj[key] = original[key]\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function(event, name) {\n var canvas_pos = mpl.findpos(event)\n\n if (name === 'button_press')\n {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * mpl.ratio;\n var y = canvas_pos.y * mpl.ratio;\n\n this.send_message(name, {x: x, y: y, button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event)});\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n // Handle any extra behaviour associated with a key event\n}\n\nmpl.figure.prototype.key_event = function(event, name) {\n\n // Prevent repeat events\n if (name == 'key_press')\n {\n if (event.which === this._key)\n return;\n else\n this._key = event.which;\n }\n if (name == 'key_release')\n this._key = null;\n\n var value = '';\n if (event.ctrlKey && event.which != 17)\n value += \"ctrl+\";\n if (event.altKey && event.which != 18)\n value += \"alt+\";\n if (event.shiftKey && event.which != 16)\n value += \"shift+\";\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, {key: value,\n guiEvent: simpleKeys(event)});\n return false;\n}\n\nmpl.figure.prototype.toolbar_button_onclick = function(name) {\n if (name == 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message(\"toolbar_button\", {name: name});\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function() {\n comm.close()\n };\n ws.send = function(m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function(msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overriden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data'])\n });\n return ws;\n}\n\nmpl.mpl_figure_comm = function(comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = $(\"#\" + id);\n var ws_proxy = comm_websocket_adapter(comm)\n\n function ondownload(figure, format) {\n window.open(figure.imageObj.src);\n }\n\n var fig = new mpl.figure(id, ws_proxy,\n ondownload,\n element.get(0));\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element.get(0);\n fig.cell_info = mpl.find_output_cell(\"\");\n if (!fig.cell_info) {\n console.error(\"Failed to find cell for figure\", id, fig);\n return;\n }\n\n var output_index = fig.cell_info[2]\n var cell = fig.cell_info[0];\n\n};\n\nmpl.figure.prototype.handle_close = function(fig, msg) {\n var width = fig.canvas.width/mpl.ratio\n fig.root.unbind('remove')\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable()\n $(fig.parent_element).html('');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n",
- "text/plain": ""
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": "",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
]
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib notebook\n",
+ "plt.rcParams['figure.figsize'] = [5, 3]\n",
+ "\n",
+ "x = np.linspace(-10, 10, 101)\n",
+ "y = np.linspace(-10, 10, 101)\n",
+ "X, Y = np.meshgrid(x, y)\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "fig.suptitle('$x^2+y^2-50\\,sin(.5(x+y))$', fontsize=16)\n",
+ "\n",
+ "ax = fig.add_subplot(111, projection='3d')\n",
+ "ax.plot_wireframe(X, Y, f([X, Y]), rstride=10, cstride=10)\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 153,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
{
- "metadata": {
- "trusted": true,
- "scrolled": true
- },
- "cell_type": "code",
- "source": "%matplotlib notebook\nplt.rcParams['figure.figsize'] = [5, 3]\nx = np.linspace(-10, 10, 101)\ny = np.linspace(-10, 10, 101)\nX, Y = np.meshgrid(x, y)\n\nfig = plt.figure()\n\nax = fig.add_subplot(111)\nax.contour(X, Y, f([X, Y]))\n\nplt.show()",
- "execution_count": 153,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\n\nmpl.get_websocket_type = function() {\n if (typeof(WebSocket) !== 'undefined') {\n return WebSocket;\n } else if (typeof(MozWebSocket) !== 'undefined') {\n return MozWebSocket;\n } else {\n alert('Your browser does not have WebSocket support.' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.');\n };\n}\n\nmpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = (this.ws.binaryType != undefined);\n\n if (!this.supports_binary) {\n var warnings = document.getElementById(\"mpl-warnings\");\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent = (\n \"This browser does not support binary websocket messages. \" +\n \"Performance may be slow.\");\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = $('');\n this._root_extra_style(this.root)\n this.root.attr('style', 'display: inline-block');\n\n $(parent_element).append(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n fig.send_message(\"send_image_mode\", {});\n if (mpl.ratio != 1) {\n fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n }\n fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n fig.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '');\n var titletext = $(\n '');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\n canvas.addClass('mpl-canvas');\n canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n\n this.canvas = canvas[0];\n this.context = canvas[0].getContext(\"2d\");\n\n var backingStore = this.context.backingStorePixelRatio ||\n\tthis.context.webkitBackingStorePixelRatio ||\n\tthis.context.mozBackingStorePixelRatio ||\n\tthis.context.msBackingStorePixelRatio ||\n\tthis.context.oBackingStorePixelRatio ||\n\tthis.context.backingStorePixelRatio || 1;\n\n mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width * mpl.ratio);\n canvas.attr('height', height * mpl.ratio);\n canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n // put a spacer in here.\n continue;\n }\n var button = $('');\n button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n 'ui-button-icon-only');\n button.attr('role', 'button');\n button.attr('aria-disabled', 'false');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n\n var icon_img = $('');\n icon_img.addClass('ui-button-icon-primary ui-icon');\n icon_img.addClass(image);\n icon_img.addClass('ui-corner-all');\n\n var tooltip_span = $('');\n tooltip_span.addClass('ui-button-text');\n tooltip_span.html(tooltip);\n\n button.append(icon_img);\n button.append(tooltip_span);\n\n nav_element.append(button);\n }\n\n var fmt_picker_span = $('');\n\n var fmt_picker = $('');\n fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n fmt_picker_span.append(fmt_picker);\n nav_element.append(fmt_picker_span);\n this.format_dropdown = fmt_picker[0];\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = $(\n '', {selected: fmt === mpl.default_extension}).html(fmt);\n fmt_picker.append(option)\n }\n\n // Add hover states to the ui-buttons\n $( \".ui-button\" ).hover(\n function() { $(this).addClass(\"ui-state-hover\");},\n function() { $(this).removeClass(\"ui-state-hover\");}\n );\n\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n}\n\nmpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n}\n\nmpl.figure.prototype.send_message = function(type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n}\n\nmpl.figure.prototype.send_draw_message = function() {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n }\n}\n\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n}\n\n\nmpl.figure.prototype.handle_resize = function(fig, msg) {\n var size = msg['size'];\n if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n fig._resize_canvas(size[0], size[1]);\n fig.send_message(\"refresh\", {});\n };\n}\n\nmpl.figure.prototype.handle_rubberband = function(fig, msg) {\n var x0 = msg['x0'] / mpl.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n var x1 = msg['x1'] / mpl.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0, 0, fig.canvas.width, fig.canvas.height);\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n}\n\nmpl.figure.prototype.handle_figure_label = function(fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n}\n\nmpl.figure.prototype.handle_cursor = function(fig, msg) {\n var cursor = msg['cursor'];\n switch(cursor)\n {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n}\n\nmpl.figure.prototype.handle_message = function(fig, msg) {\n fig.message.textContent = msg['message'];\n}\n\nmpl.figure.prototype.handle_draw = function(fig, msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n}\n\nmpl.figure.prototype.handle_image_mode = function(fig, msg) {\n fig.image_mode = msg['mode'];\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Called whenever the canvas gets updated.\n this.send_message(\"ack\", {});\n}\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function(fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = \"image/png\";\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src);\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data);\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig[\"handle_\" + msg_type];\n } catch (e) {\n console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n }\n }\n };\n}\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function(e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e)\n e = window.event;\n if (e.target)\n targ = e.target;\n else if (e.srcElement)\n targ = e.srcElement;\n if (targ.nodeType == 3) // defeat Safari bug\n targ = targ.parentNode;\n\n // jQuery normalizes the pageX and pageY\n // pageX,Y are the mouse positions relative to the document\n // offset() returns the position of the element relative to the document\n var x = e.pageX - $(targ).offset().left;\n var y = e.pageY - $(targ).offset().top;\n\n return {\"x\": x, \"y\": y};\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys (original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object')\n obj[key] = original[key]\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function(event, name) {\n var canvas_pos = mpl.findpos(event)\n\n if (name === 'button_press')\n {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * mpl.ratio;\n var y = canvas_pos.y * mpl.ratio;\n\n this.send_message(name, {x: x, y: y, button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event)});\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n // Handle any extra behaviour associated with a key event\n}\n\nmpl.figure.prototype.key_event = function(event, name) {\n\n // Prevent repeat events\n if (name == 'key_press')\n {\n if (event.which === this._key)\n return;\n else\n this._key = event.which;\n }\n if (name == 'key_release')\n this._key = null;\n\n var value = '';\n if (event.ctrlKey && event.which != 17)\n value += \"ctrl+\";\n if (event.altKey && event.which != 18)\n value += \"alt+\";\n if (event.shiftKey && event.which != 16)\n value += \"shift+\";\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, {key: value,\n guiEvent: simpleKeys(event)});\n return false;\n}\n\nmpl.figure.prototype.toolbar_button_onclick = function(name) {\n if (name == 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message(\"toolbar_button\", {name: name});\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function() {\n comm.close()\n };\n ws.send = function(m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function(msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overriden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data'])\n });\n return ws;\n}\n\nmpl.mpl_figure_comm = function(comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = $(\"#\" + id);\n var ws_proxy = comm_websocket_adapter(comm)\n\n function ondownload(figure, format) {\n window.open(figure.imageObj.src);\n }\n\n var fig = new mpl.figure(id, ws_proxy,\n ondownload,\n element.get(0));\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element.get(0);\n fig.cell_info = mpl.find_output_cell(\"\");\n if (!fig.cell_info) {\n console.error(\"Failed to find cell for figure\", id, fig);\n return;\n }\n\n var output_index = fig.cell_info[2]\n var cell = fig.cell_info[0];\n\n};\n\nmpl.figure.prototype.handle_close = function(fig, msg) {\n var width = fig.canvas.width/mpl.ratio\n fig.root.unbind('remove')\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable()\n $(fig.parent_element).html('');\n fig.close_ws(fig, msg);\n}\n\nmpl.figure.prototype.close_ws = function(fig, msg){\n fig.send_message('closing', msg);\n // fig.ws.close()\n}\n\nmpl.figure.prototype.push_to_output = function(remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width/mpl.ratio\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] = '';\n}\n\nmpl.figure.prototype.updated_canvas_event = function() {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message(\"ack\", {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () { fig.push_to_output() }, 1000);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('')\n nav_element.attr('style', 'width: 100%');\n this.root.append(nav_element);\n\n // Define a callback function for later on.\n function toolbar_event(event) {\n return fig.toolbar_button_onclick(event['data']);\n }\n function toolbar_mouse_event(event) {\n return fig.toolbar_button_onmouseover(event['data']);\n }\n\n for(var toolbar_ind in mpl.toolbar_items){\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) { continue; };\n\n var button = $('');\n button.click(method_name, toolbar_event);\n button.mouseover(tooltip, toolbar_mouse_event);\n nav_element.append(button);\n }\n\n // Add the status bar.\n var status_bar = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('');\n var button = $('');\n button.click(function (evt) { fig.handle_close(fig, {}); } );\n button.mouseover('Stop Interaction', toolbar_mouse_event);\n buttongrp.append(button);\n var titlebar = this.root.find($('.ui-dialog-titlebar'));\n titlebar.prepend(buttongrp);\n}\n\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n",
- "text/plain": ""
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "text/html": "",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import numpy as np\nfrom scipy.optimize import minimize",
- "execution_count": 154,
- "outputs": []
- },
+ "data": {
+ "text/html": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "%matplotlib notebook\n",
+ "plt.rcParams['figure.figsize'] = [5, 3]\n",
+ "x = np.linspace(-10, 10, 101)\n",
+ "y = np.linspace(-10, 10, 101)\n",
+ "X, Y = np.meshgrid(x, y)\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "\n",
+ "ax = fig.add_subplot(111)\n",
+ "ax.contour(X, Y, f([X, Y]))\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 154,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "from scipy.optimize import minimize"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Nelder-Mead"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 155,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Nelder-Mead"
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully.\n",
+ " Current function value: -45.431122\n",
+ " Iterations: 76\n",
+ " Function evaluations: 137\n",
+ "[1.4541966 1.45419654]\n"
+ ]
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([0, 0])\nres = minimize(f, x0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})\nprint(res.x)\nf(res.x)",
- "execution_count": 155,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully.\n Current function value: -45.431122\n Iterations: 76\n Function evaluations: 137\n[1.4541966 1.45419654]\n",
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "execution_count": 155,
- "data": {
- "text/plain": "-45.43112199357746"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "-45.43112199357746"
]
- },
+ },
+ "execution_count": 155,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x0 = np.array([0, 0])\n",
+ "res = minimize(f, x0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})\n",
+ "print(res.x)\n",
+ "f(res.x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 156,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "res",
- "execution_count": 156,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 156,
- "data": {
- "text/plain": " final_simplex: (array([[1.4541966 , 1.45419654],\n [1.4541966 , 1.45419654],\n [1.4541966 , 1.45419654]]), array([-45.43112199, -45.43112199, -45.43112199]))\n fun: -45.43112199357746\n message: 'Optimization terminated successfully.'\n nfev: 137\n nit: 76\n status: 0\n success: True\n x: array([1.4541966 , 1.45419654])"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ " final_simplex: (array([[1.4541966 , 1.45419654],\n",
+ " [1.4541966 , 1.45419654],\n",
+ " [1.4541966 , 1.45419654]]), array([-45.43112199, -45.43112199, -45.43112199]))\n",
+ " fun: -45.43112199357746\n",
+ " message: 'Optimization terminated successfully.'\n",
+ " nfev: 137\n",
+ " nit: 76\n",
+ " status: 0\n",
+ " success: True\n",
+ " x: array([1.4541966 , 1.45419654])"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Gradient and Hessian"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "fgrad = nd.Gradient(f)\nfhess = nd.Hessian(f)",
- "execution_count": 157,
- "outputs": []
- },
+ },
+ "execution_count": 156,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Gradient and Hessian"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 157,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fgrad = nd.Gradient(f)\n",
+ "fhess = nd.Hessian(f)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 158,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "type(fgrad)",
- "execution_count": 158,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 158,
- "data": {
- "text/plain": "numdifftools.core.Gradient"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "numdifftools.core.Gradient"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Conjugate Gradient"
- },
+ },
+ "execution_count": 158,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "type(fgrad)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Conjugate Gradient"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 159,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([0, 0])\nres = minimize(f, x0, method='CG', jac=fgrad, options={'disp': True})\nprint(res.x)",
- "execution_count": 159,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully.\n Current function value: -45.431122\n Iterations: 3\n Function evaluations: 8\n Gradient evaluations: 8\n[1.45419657 1.45419657]\n",
- "name": "stdout"
- }
- ]
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully.\n",
+ " Current function value: -45.431122\n",
+ " Iterations: 3\n",
+ " Function evaluations: 8\n",
+ " Gradient evaluations: 8\n",
+ "[1.45419657 1.45419657]\n"
+ ]
+ }
+ ],
+ "source": [
+ "x0 = np.array([0, 0])\n",
+ "res = minimize(f, x0, method='CG', jac=fgrad, options={'disp': True})\n",
+ "print(res.x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Broyden, Fletcher, Goldfarb, and Shanno (BFGS)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 160,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Broyden, Fletcher, Goldfarb, and Shanno (BFGS)"
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully.\n",
+ " Current function value: -45.431122\n",
+ " Iterations: 5\n",
+ " Function evaluations: 7\n",
+ " Gradient evaluations: 7\n",
+ "[1.45419657 1.45419657]\n"
+ ]
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([0, 0])\nres = minimize(f, x0, method='BFGS', jac=fgrad, options={'gtol': 1e-8, 'disp': True})\nprint(res.x)\nf(res.x)",
- "execution_count": 160,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully.\n Current function value: -45.431122\n Iterations: 5\n Function evaluations: 7\n Gradient evaluations: 7\n[1.45419657 1.45419657]\n",
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "execution_count": 160,
- "data": {
- "text/plain": "-45.43112199357746"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "-45.43112199357746"
]
- },
+ },
+ "execution_count": 160,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x0 = np.array([0, 0])\n",
+ "res = minimize(f, x0, method='BFGS', jac=fgrad, options={'gtol': 1e-8, 'disp': True})\n",
+ "print(res.x)\n",
+ "f(res.x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Newton-CG"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 161,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Newton-CG"
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully.\n",
+ " Current function value: -45.431122\n",
+ " Iterations: 5\n",
+ " Function evaluations: 9\n",
+ " Gradient evaluations: 13\n",
+ " Hessian evaluations: 5\n",
+ "[1.45419658 1.45419658]\n"
+ ]
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([0, 0])\nres = minimize(f, x0, method='Newton-CG', jac=fgrad, hess=fhess, options={'xtol': 1e-8, 'disp': True})\nprint(res.x)\nf(res.x)",
- "execution_count": 161,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully.\n Current function value: -45.431122\n Iterations: 5\n Function evaluations: 9\n Gradient evaluations: 13\n Hessian evaluations: 5\n[1.45419658 1.45419658]\n",
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "execution_count": 161,
- "data": {
- "text/plain": "-45.43112199357747"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "-45.43112199357747"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "### Maximum Likelihood"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "mu = 18\nsigma = 5\nn = 30\nS = np.random.normal(loc=mu, scale=sigma, size=n)",
- "execution_count": 162,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def likelihood(par):\n # par[0]=mu\n # par[1]=sigma\n \n v = 0\n \n for x in S:\n v += -.5*((x-par[0])/par[1])**2-np.log(par[1])\n \n return -v",
- "execution_count": 163,
- "outputs": []
- },
+ },
+ "execution_count": 161,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x0 = np.array([0, 0])\n",
+ "res = minimize(f, x0, method='Newton-CG', jac=fgrad, hess=fhess, options={'xtol': 1e-8, 'disp': True})\n",
+ "print(res.x)\n",
+ "f(res.x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Maximum Likelihood"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 162,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mu = 18\n",
+ "sigma = 5\n",
+ "n = 30\n",
+ "S = np.random.normal(loc=mu, scale=sigma, size=n)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 163,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def likelihood(par):\n",
+ " # par[0]=mu\n",
+ " # par[1]=sigma\n",
+ " \n",
+ " v = 0\n",
+ " \n",
+ " for x in S:\n",
+ " v += -.5*((x-par[0])/par[1])**2-np.log(par[1])\n",
+ " \n",
+ " return -v"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 164,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([1, 1])\nres = minimize(likelihood, x0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})",
- "execution_count": 164,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully.\n Current function value: 62.562558\n Iterations: 94\n Function evaluations: 186\n",
- "name": "stdout"
- }
- ]
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully.\n",
+ " Current function value: 62.562558\n",
+ " Iterations: 94\n",
+ " Function evaluations: 186\n"
+ ]
+ }
+ ],
+ "source": [
+ "x0 = np.array([1, 1])\n",
+ "res = minimize(likelihood, x0, method='nelder-mead', options={'xtol': 1e-8, 'disp': True})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 165,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "res.x",
- "execution_count": 165,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 165,
- "data": {
- "text/plain": "array([17.57308836, 4.88133418])"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "array([17.57308836, 4.88133418])"
]
- },
+ },
+ "execution_count": 165,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res.x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 166,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "S.mean()",
- "execution_count": 166,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 166,
- "data": {
- "text/plain": "17.573088308542683"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "17.573088308542683"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Consumer´s problem with CES utility"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def utility(x, *args):\n return -(x**.25+(args[0]-args[1]*x)**.25)",
- "execution_count": 167,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def demand(m, p):\n x = opt.minimize(utility, .3, args=(m, p), method=\"CG\").x[0]\n return (x, m-p*x)",
- "execution_count": 168,
- "outputs": []
- },
+ },
+ "execution_count": 166,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "S.mean()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Consumer´s problem with CES utility"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def utility(x, *args):\n",
+ " return -(x**.25+(args[0]-args[1]*x)**.25)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 168,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def demand(m, p):\n",
+ " x = opt.minimize(utility, .3, args=(m, p), method=\"CG\").x[0]\n",
+ " return (x, m-p*x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "demand(5, 2)",
- "execution_count": 169,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 169,
- "data": {
- "text/plain": "(1.1062334943922492, 2.7875330112155017)"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "(1.1062334943922492, 2.7875330112155017)"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "price = np.arange(.1, 5, .1)",
- "execution_count": 170,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Regressão Múltipla"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x1 = np.random.uniform(0, 100, size=20000)",
- "execution_count": 171,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x2 = np.random.uniform(0, 100, size=20000)",
- "execution_count": 172,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x2 = .9*x2+.1*x1",
- "execution_count": 173,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "sigma = 5\ny = 10+.4*x1+.7*x2+np.random.normal(loc=0, scale=sigma, size=20000)",
- "execution_count": 174,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def my_ols(beta): \n return np.sum((y-beta[0]-beta[1]*x1-beta[2]*x2)**2) ",
- "execution_count": 175,
- "outputs": []
- },
+ },
+ "execution_count": 169,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "demand(5, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 170,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "price = np.arange(.1, 5, .1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Regressão Múltipla"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x1 = np.random.uniform(0, 100, size=20000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 172,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x2 = np.random.uniform(0, 100, size=20000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 173,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x2 = .9*x2+.1*x1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 174,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sigma = 5\n",
+ "y = 10+.4*x1+.7*x2+np.random.normal(loc=0, scale=sigma, size=20000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 175,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def my_ols(beta): \n",
+ " return np.sum((y-beta[0]-beta[1]*x1-beta[2]*x2)**2) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 176,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "opt.minimize(my_ols, (10.1, .5, .6), method=\"CG\")",
- "execution_count": 176,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 176,
- "data": {
- "text/plain": " fun: 497096.51526724786\n jac: array([0.09375 , 0.31640625, 0.15625 ])\n message: 'Desired error not necessarily achieved due to precision loss.'\n nfev: 626\n nit: 24\n njev: 123\n status: 2\n success: False\n x: array([9.91014709, 0.4020818 , 0.70068662])"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ " fun: 497096.51526724786\n",
+ " jac: array([0.09375 , 0.31640625, 0.15625 ])\n",
+ " message: 'Desired error not necessarily achieved due to precision loss.'\n",
+ " nfev: 626\n",
+ " nit: 24\n",
+ " njev: 123\n",
+ " status: 2\n",
+ " success: False\n",
+ " x: array([9.91014709, 0.4020818 , 0.70068662])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "markdown",
- "source": "## OLS with matrices"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import io",
- "execution_count": 178,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "DATA = np.loadtxt(\"data/regression.csv\", delimiter=\";\")",
- "execution_count": 185,
- "outputs": []
- },
+ },
+ "execution_count": 176,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "opt.minimize(my_ols, (10.1, .5, .6), method=\"CG\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## OLS with matrices"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 178,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import io"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "DATA = np.loadtxt(\"data/regression.csv\", delimiter=\";\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "DATA",
- "execution_count": 186,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 186,
- "data": {
- "text/plain": "array([[ 19.1503647 , 19.86175115, 37.76143252],\n [ 74.48652608, 36.51600696, 118.1015082 ],\n [ 92.52296518, 65.04593036, 415.2253619 ],\n ...,\n [ 71.10202338, 84.71663564, 470.9957971 ],\n [ 57.05130161, 63.70372631, 382.7933641 ],\n [ 30.32013916, 58.94863735, 200.9883957 ]])"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "array([[ 19.1503647 , 19.86175115, 37.76143252],\n",
+ " [ 74.48652608, 36.51600696, 118.1015082 ],\n",
+ " [ 92.52296518, 65.04593036, 415.2253619 ],\n",
+ " ...,\n",
+ " [ 71.10202338, 84.71663564, 470.9957971 ],\n",
+ " [ 57.05130161, 63.70372631, 382.7933641 ],\n",
+ " [ 30.32013916, 58.94863735, 200.9883957 ]])"
]
- },
+ },
+ "execution_count": 186,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "DATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "DATA.shape",
- "execution_count": 187,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 187,
- "data": {
- "text/plain": "(500, 3)"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "(500, 3)"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "y = DATA[:, 2].reshape(500, 1)",
- "execution_count": 188,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "X = DATA[:, 0:2].reshape(500, 2)",
- "execution_count": 189,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "c = np.ones(500).reshape(500, 1)\nX = np.concatenate((c, X), axis=1)",
- "execution_count": 192,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def my_ols(y, X):\n \n results = {}\n \n (n, k) = X.shape\n results['n'] = n\n results['k'] = k\n \n beta = np.linalg.inv(X.T @ X) @ X.T @ y\n results['beta'] = beta\n \n e = y - X @ beta\n results['residuas'] = e\n \n SSE = sum([e**2 for e in e])[0]\n results['SSE'] = SSE\n \n sigma = np.sqrt(SSE/(n-k))\n results['sigma'] = sigma\n \n V = sigma**2*np.linalg.inv(X.T @ X)\n results['V'] = V\n \n stderr_beta = np.sqrt(np.diag(V))\n results['stderr_beta'] = stderr_beta\n \n t = beta/stderr_beta\n results['t'] = t\n \n # results['p-values'] = \n \n ybar = np.mean(y)\n SQT = sum([(q-ybar)**2 for q in y])[0]\n results['SQT'] = SQT\n \n results['R2'] = 1-(SSE/SQT)\n \n return results ",
- "execution_count": 193,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "res = my_ols(y, X)",
- "execution_count": 195,
- "outputs": []
- },
+ },
+ "execution_count": 187,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "DATA.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y = DATA[:, 2].reshape(500, 1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X = DATA[:, 0:2].reshape(500, 2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "c = np.ones(500).reshape(500, 1)\n",
+ "X = np.concatenate((c, X), axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def my_ols(y, X):\n",
+ " \n",
+ " results = {}\n",
+ " \n",
+ " (n, k) = X.shape\n",
+ " results['n'] = n\n",
+ " results['k'] = k\n",
+ " \n",
+ " beta = np.linalg.inv(X.T @ X) @ X.T @ y\n",
+ " results['beta'] = beta\n",
+ " \n",
+ " e = y - X @ beta\n",
+ " results['residuas'] = e\n",
+ " \n",
+ " SSE = sum([e**2 for e in e])[0]\n",
+ " results['SSE'] = SSE\n",
+ " \n",
+ " sigma = np.sqrt(SSE/(n-k))\n",
+ " results['sigma'] = sigma\n",
+ " \n",
+ " V = sigma**2*np.linalg.inv(X.T @ X)\n",
+ " results['V'] = V\n",
+ " \n",
+ " stderr_beta = np.sqrt(np.diag(V))\n",
+ " results['stderr_beta'] = stderr_beta\n",
+ " \n",
+ " t = beta/stderr_beta\n",
+ " results['t'] = t\n",
+ " \n",
+ " # results['p-values'] = \n",
+ " \n",
+ " ybar = np.mean(y)\n",
+ " SQT = sum([(q-ybar)**2 for q in y])[0]\n",
+ " results['SQT'] = SQT\n",
+ " \n",
+ " results['R2'] = 1-(SSE/SQT)\n",
+ " \n",
+ " return results "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "res = my_ols(y, X)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 196,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "res",
- "execution_count": 196,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 196,
- "data": {
- "text/plain": "{'R2': 0.5985995381650879,\n 'SQT': 9376178.724748027,\n 'SSE': 3763602.4703605347,\n 'V': array([[ 1.15445286e+02, -5.91775326e-01, -1.40469455e+00],\n [-5.91775326e-01, 2.16566265e-02, -1.01166076e-02],\n [-1.40469455e+00, -1.01166076e-02, 3.83194387e-02]]),\n 'beta': array([[46.56424501],\n [ 3.13088995],\n [ 1.65078469]]),\n 'k': 3,\n 'n': 500,\n 'residuas': array([[-101.5479714 ],\n [-221.95191746],\n [ -28.39493021],\n [ -55.33220907],\n [ 46.99151994],\n [ -61.49876145],\n [ -10.97375688],\n [ 56.04286631],\n [-107.07201378],\n [ -22.64234823],\n [ 18.65252702],\n [ 4.20478851],\n [ 58.73792368],\n [ -96.97502295],\n [ -32.86295192],\n [ -20.22262579],\n [ -67.86712849],\n [ 31.87090306],\n [-162.09171263],\n [ -30.01260059],\n [ 11.30891441],\n [ 158.79214349],\n [-114.42340488],\n [ 142.02318218],\n [ -7.57932036],\n [ -6.49910448],\n [ -44.32843848],\n [ 6.77717352],\n [ 27.23886701],\n [ 39.42746732],\n [-125.27544158],\n [-312.31561908],\n [ 35.88072314],\n [-104.09877123],\n [ -79.13277739],\n [ 62.99108447],\n [ -91.41741639],\n [ 18.04156839],\n [ 81.20209596],\n [ 167.03597417],\n [ 42.0640298 ],\n [ 105.40291713],\n [ 16.97150062],\n [ -44.58504449],\n [ 21.74017311],\n [-119.24943519],\n [ 44.37169876],\n [ 46.01439546],\n [ 76.43506709],\n [ -3.24526726],\n [-202.64255128],\n [ 31.20018425],\n [ 189.10460729],\n [ -23.35534431],\n [ 111.06580827],\n [ 122.03248408],\n [ 19.6059557 ],\n [ 85.72600805],\n [ 199.40993468],\n [ -15.16393386],\n [ 30.05152467],\n [ -24.64764002],\n [ -21.39643233],\n [ 109.15564929],\n [ -96.8452832 ],\n [ 10.6165261 ],\n [ 44.98996026],\n [ 17.5538346 ],\n [ 74.99139838],\n [ 57.08109974],\n [-103.42989143],\n [ -54.15445582],\n [ -80.42379658],\n [ 105.22613221],\n [ 17.60163826],\n [ -84.46223973],\n [ 58.74487388],\n [ -98.38843651],\n [ -57.53132956],\n [ -86.94008465],\n [ 74.25321121],\n [ 66.92698085],\n [ -59.01239301],\n [-182.26613088],\n [ -37.75723997],\n [ -28.90642743],\n [ 10.86710065],\n [ 141.34484921],\n [ 93.36643912],\n [ 79.22696845],\n [ -13.49699548],\n [ 31.19637282],\n [ 28.09608592],\n [ 107.61569733],\n [ 85.52565333],\n [ 67.63855529],\n [ 4.370889 ],\n [ 10.2535358 ],\n [-110.85158432],\n [ -99.42686928],\n [ 28.80679849],\n [ -41.13217022],\n [ 82.26697646],\n [ 0.84861706],\n [ -52.83297938],\n [ 104.87647745],\n [ -5.12211887],\n [ 31.24030526],\n [ -49.3991086 ],\n [-120.22473235],\n [ 67.42246154],\n [ 22.78784737],\n [ 62.42370371],\n [ -44.05909589],\n [ 33.27995053],\n [-123.29471171],\n [ -85.16575008],\n [ -75.75880457],\n [ -37.87498583],\n [ -62.96929899],\n [ 101.86481092],\n [ 94.23284647],\n [ 73.07195268],\n [-117.88512509],\n [ 79.72472231],\n [ -64.44538218],\n [ 14.22644226],\n [ -34.61251184],\n [ 85.21693507],\n [ -3.38182631],\n [ 159.57932115],\n [-133.65984906],\n [-220.12187744],\n [ -52.28391002],\n [ -62.61818894],\n [ -63.10637861],\n [ 14.74703647],\n [ -78.82130204],\n [ 10.9336829 ],\n [-108.21194236],\n [ 108.41923868],\n [ -93.71377032],\n [ 105.88677136],\n [ 36.01765966],\n [ -84.08827417],\n [ 79.33084495],\n [ -17.56642068],\n [ 1.61921415],\n [ 52.11176536],\n [ 21.24481943],\n [ -4.83874205],\n [ 34.4028412 ],\n [ -41.1694442 ],\n [ -71.97469513],\n [ -10.5282205 ],\n [ 132.42414377],\n [ -41.14052994],\n [ 93.85825104],\n [ 5.54528063],\n [-102.08421457],\n [-101.2525261 ],\n [ -26.34363365],\n [ -92.82507213],\n [ -95.64195275],\n [ 102.86431787],\n [-125.75170496],\n [ -61.04351189],\n [ 36.53242613],\n [ 63.19604717],\n [-121.94036996],\n [ -29.08640409],\n [ -37.81013073],\n [ 71.66432807],\n [ 139.07554448],\n [ 98.0285007 ],\n [ 13.75349943],\n [ 0.66487986],\n [ 80.80062849],\n [ 149.18500181],\n [-104.23506815],\n [ 35.42054448],\n [ 37.19662996],\n [ 75.85221312],\n [ 47.49472216],\n [ 99.36408343],\n [-124.56424503],\n [-136.76910575],\n [ -21.60461406],\n [ -2.85575289],\n [ 13.40534834],\n [ 6.87101313],\n [-144.10257391],\n [ -13.37941404],\n [ -31.98826158],\n [ 51.15112054],\n [ -56.68792921],\n [ 42.41272565],\n [ -6.59041779],\n [ 64.75262061],\n [ 30.59657478],\n [ 0.70872505],\n [ 34.5089948 ],\n [ 37.74967398],\n [-122.9368161 ],\n [ 51.1430415 ],\n [ 12.74621679],\n [ 109.12818117],\n [ -92.6956237 ],\n [ 1.44006582],\n [ 132.61012448],\n [-112.54238589],\n [ 154.62747078],\n [ -33.22687664],\n [ 106.4492505 ],\n [-137.45651495],\n [ 28.81481772],\n [ -67.06380283],\n [ 23.44887046],\n [ 10.0924554 ],\n [ 114.89782724],\n [ -20.31846722],\n [ 21.73272829],\n [ 149.54119515],\n [ 111.24471443],\n [ 99.48539882],\n [ -35.16836302],\n [-101.03350911],\n [ 5.97295888],\n [ 7.25257305],\n [ 51.40076171],\n [ -30.86662914],\n [ 18.5159811 ],\n [ 23.16362683],\n [-209.4508955 ],\n [ 18.32657647],\n [ -17.78768718],\n [ 123.10046595],\n [ -9.64742725],\n [ 69.10647314],\n [-164.90965008],\n [ 33.90077698],\n [ -8.34156276],\n [ 81.03494855],\n [ -91.18612226],\n [ -25.95547259],\n [ -57.68636868],\n [ 52.21787164],\n [ -79.80093395],\n [ -96.93575685],\n [ 40.20106337],\n [ -84.97110081],\n [-176.65211321],\n [ 8.84422442],\n [ 46.25082615],\n [ -78.30918897],\n [-160.69327075],\n [ 11.4988301 ],\n [ -68.91145975],\n [ 159.72108347],\n [ -96.1293634 ],\n [ 93.29661842],\n [ -3.34290725],\n [ -44.37403604],\n [ 72.78003375],\n [ 58.9726092 ],\n [-120.2722184 ],\n [ -10.23962428],\n [ -15.23178661],\n [ -72.45067441],\n [ -24.58103381],\n [ -52.95582732],\n [ -32.68445947],\n [ 22.92107052],\n [ 58.30793965],\n [ -1.94134787],\n [-195.81366884],\n [ -68.38699782],\n [-133.16039657],\n [ 176.34274647],\n [ 119.58028278],\n [ -11.16733305],\n [ -36.53320335],\n [ -29.89061742],\n [ -8.5470335 ],\n [ 253.78529229],\n [ 73.91284241],\n [ -56.34987242],\n [ -7.53272516],\n [ 32.47293837],\n [ 45.3525632 ],\n [ -62.21617915],\n [ 12.03373577],\n [ 71.69315111],\n [ 51.26931421],\n [ 82.19307397],\n [-161.8850339 ],\n [ 65.16107598],\n [ 55.05160744],\n [ 132.12975865],\n [ -7.72943068],\n [ 115.02356431],\n [ 62.30344601],\n [ 85.52811036],\n [-146.2041484 ],\n [-114.01867649],\n [-146.59243508],\n [ 24.68708032],\n [-166.22366955],\n [ 21.05365449],\n [-135.30194749],\n [ 128.71733593],\n [ 139.90881929],\n [ 84.5286062 ],\n [ -18.7346335 ],\n [-162.76454329],\n [ -83.63409885],\n [ -34.3897405 ],\n [ -2.30820206],\n [-142.94615367],\n [ 143.00421992],\n [ -30.33643127],\n [ 0.70105601],\n [ -81.80772148],\n [ -52.18366292],\n [ 131.82395509],\n [ 116.4002786 ],\n [ 87.21203659],\n [ 55.19493985],\n [ 0.73477336],\n [ 59.55495105],\n [ 154.46364059],\n [-225.37742167],\n [ 100.21140938],\n [ -98.4036096 ],\n [ 52.63610646],\n [ 11.21453164],\n [ 71.22375439],\n [ -20.14484612],\n [ -86.31817529],\n [ 81.97505105],\n [ 145.00287557],\n [ -27.14528074],\n [ -35.40432235],\n [-138.65037835],\n [ -50.8112898 ],\n [ 8.05796719],\n [ -86.45810587],\n [ -99.40024209],\n [ 54.44078033],\n [ 13.20265305],\n [ -83.12674952],\n [ 54.23072453],\n [ 142.61263906],\n [ -94.10693382],\n [ -51.6455085 ],\n [-167.74786399],\n [ -14.9176615 ],\n [ 124.56501798],\n [-147.92842575],\n [-123.26242741],\n [ 67.91845291],\n [ 85.94901879],\n [ 56.8292938 ],\n [ 36.38058081],\n [ 2.50780512],\n [ 30.39006654],\n [ 127.20394344],\n [-117.73165514],\n [ -2.91657795],\n [ 130.09466648],\n [ -65.3558783 ],\n [ -77.74367354],\n [ -93.52577826],\n [ 22.82638954],\n [ 97.91688948],\n [ 53.87450743],\n [ 13.75402425],\n [ -28.26171893],\n [ -99.63714579],\n [ 16.60563733],\n [ 69.64217385],\n [ -48.15398647],\n [-118.63089411],\n [ 111.87660506],\n [ 24.72343764],\n [ -78.08036474],\n [ -33.88756366],\n [ 33.82069537],\n [ 93.46996659],\n [-247.63913812],\n [ 125.80897024],\n [ 89.26976925],\n [ -3.17516635],\n [ 6.49234628],\n [ 50.69214318],\n [ -96.48176485],\n [ 64.27828339],\n [ 45.58814614],\n [ -57.13311006],\n [ -9.63702525],\n [ 97.76026444],\n [ 9.9760717 ],\n [ -61.11679856],\n [-172.90145046],\n [ 28.449908 ],\n [ 27.95965117],\n [ 97.41121182],\n [-111.4052245 ],\n [ 24.42075129],\n [ -6.03706554],\n [ 19.2155579 ],\n [ 79.78392442],\n [ 63.53156487],\n [ -30.25166355],\n [ 133.04310397],\n [-148.69858107],\n [ 29.30858162],\n [ 202.30977745],\n [ -8.43015243],\n [ -78.15001325],\n [ -3.32114832],\n [ 71.20823193],\n [ 49.14825274],\n [ -12.91143505],\n [ 17.58689208],\n [ -32.32333969],\n [ 68.64015904],\n [ -18.49234881],\n [-155.71407156],\n [ -53.08093331],\n [ -40.04314427],\n [ -96.77421987],\n [ 75.09998225],\n [-142.26316309],\n [ 144.07657567],\n [ -0.9142981 ],\n [ -46.88141109],\n [ 104.18149192],\n [ -7.3838574 ],\n [ 122.98792883],\n [ -25.1067871 ],\n [ -38.86438531],\n [ -29.94311814],\n [ -20.84379604],\n [ -45.63977493],\n [ 120.47849375],\n [ 54.38004088],\n [ -4.38531758],\n [ -33.28213529],\n [ 83.76194741],\n [ 141.38514588],\n [ 66.76231509],\n [-122.11997948],\n [ -34.56647166],\n [ 6.10989168],\n [-281.5787354 ],\n [ 176.19837602],\n [ 44.85378175],\n [ 88.58657353],\n [ 33.0908565 ],\n [ -38.92066434],\n [ 21.62952278],\n [ -4.22175343],\n [ -60.49997326],\n [-109.4640204 ],\n [ -60.48590219],\n [ -27.57076231],\n [ 62.39724201],\n [ 61.39945488],\n [-117.07550313],\n [ 31.65153877],\n [ 20.12100501],\n [ 85.92539889],\n [ -61.86124012],\n [ 61.49792896],\n [ 165.73461627],\n [ 37.26269992],\n [ -21.53092624],\n [ -65.38451959],\n [ -68.93437777],\n [ -99.90633439],\n [ 160.65240439],\n [ -5.26000289],\n [ 72.74214152],\n [ 85.47600172],\n [ -75.87006958],\n [ -82.28498281],\n [ -53.84139672],\n [ 32.14703738],\n [ 111.38677626],\n [ -36.82556496],\n [ 207.45035291],\n [ -75.70162734],\n [ -9.97591029],\n [ 104.25785348],\n [ 39.10952468],\n [ 35.37869775],\n [ 61.97001728],\n [ 52.44663671],\n [ -37.8163759 ]]),\n 'sigma': 87.02092153863731,\n 'stderr_beta': array([10.74454682, 0.14716191, 0.19575352]),\n 't': array([[4.33375607e+00, 3.16415072e+02, 2.37871820e+02],\n [2.91393392e-01, 2.12751386e+01, 1.59940420e+01],\n [1.53639303e-01, 1.12174729e+01, 8.43297595e+00]])}"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "{'R2': 0.5985995381650879,\n",
+ " 'SQT': 9376178.724748027,\n",
+ " 'SSE': 3763602.4703605347,\n",
+ " 'V': array([[ 1.15445286e+02, -5.91775326e-01, -1.40469455e+00],\n",
+ " [-5.91775326e-01, 2.16566265e-02, -1.01166076e-02],\n",
+ " [-1.40469455e+00, -1.01166076e-02, 3.83194387e-02]]),\n",
+ " 'beta': array([[46.56424501],\n",
+ " [ 3.13088995],\n",
+ " [ 1.65078469]]),\n",
+ " 'k': 3,\n",
+ " 'n': 500,\n",
+ " 'residuas': array([[-101.5479714 ],\n",
+ " [-221.95191746],\n",
+ " [ -28.39493021],\n",
+ " [ -55.33220907],\n",
+ " [ 46.99151994],\n",
+ " [ -61.49876145],\n",
+ " [ -10.97375688],\n",
+ " [ 56.04286631],\n",
+ " [-107.07201378],\n",
+ " [ -22.64234823],\n",
+ " [ 18.65252702],\n",
+ " [ 4.20478851],\n",
+ " [ 58.73792368],\n",
+ " [ -96.97502295],\n",
+ " [ -32.86295192],\n",
+ " [ -20.22262579],\n",
+ " [ -67.86712849],\n",
+ " [ 31.87090306],\n",
+ " [-162.09171263],\n",
+ " [ -30.01260059],\n",
+ " [ 11.30891441],\n",
+ " [ 158.79214349],\n",
+ " [-114.42340488],\n",
+ " [ 142.02318218],\n",
+ " [ -7.57932036],\n",
+ " [ -6.49910448],\n",
+ " [ -44.32843848],\n",
+ " [ 6.77717352],\n",
+ " [ 27.23886701],\n",
+ " [ 39.42746732],\n",
+ " [-125.27544158],\n",
+ " [-312.31561908],\n",
+ " [ 35.88072314],\n",
+ " [-104.09877123],\n",
+ " [ -79.13277739],\n",
+ " [ 62.99108447],\n",
+ " [ -91.41741639],\n",
+ " [ 18.04156839],\n",
+ " [ 81.20209596],\n",
+ " [ 167.03597417],\n",
+ " [ 42.0640298 ],\n",
+ " [ 105.40291713],\n",
+ " [ 16.97150062],\n",
+ " [ -44.58504449],\n",
+ " [ 21.74017311],\n",
+ " [-119.24943519],\n",
+ " [ 44.37169876],\n",
+ " [ 46.01439546],\n",
+ " [ 76.43506709],\n",
+ " [ -3.24526726],\n",
+ " [-202.64255128],\n",
+ " [ 31.20018425],\n",
+ " [ 189.10460729],\n",
+ " [ -23.35534431],\n",
+ " [ 111.06580827],\n",
+ " [ 122.03248408],\n",
+ " [ 19.6059557 ],\n",
+ " [ 85.72600805],\n",
+ " [ 199.40993468],\n",
+ " [ -15.16393386],\n",
+ " [ 30.05152467],\n",
+ " [ -24.64764002],\n",
+ " [ -21.39643233],\n",
+ " [ 109.15564929],\n",
+ " [ -96.8452832 ],\n",
+ " [ 10.6165261 ],\n",
+ " [ 44.98996026],\n",
+ " [ 17.5538346 ],\n",
+ " [ 74.99139838],\n",
+ " [ 57.08109974],\n",
+ " [-103.42989143],\n",
+ " [ -54.15445582],\n",
+ " [ -80.42379658],\n",
+ " [ 105.22613221],\n",
+ " [ 17.60163826],\n",
+ " [ -84.46223973],\n",
+ " [ 58.74487388],\n",
+ " [ -98.38843651],\n",
+ " [ -57.53132956],\n",
+ " [ -86.94008465],\n",
+ " [ 74.25321121],\n",
+ " [ 66.92698085],\n",
+ " [ -59.01239301],\n",
+ " [-182.26613088],\n",
+ " [ -37.75723997],\n",
+ " [ -28.90642743],\n",
+ " [ 10.86710065],\n",
+ " [ 141.34484921],\n",
+ " [ 93.36643912],\n",
+ " [ 79.22696845],\n",
+ " [ -13.49699548],\n",
+ " [ 31.19637282],\n",
+ " [ 28.09608592],\n",
+ " [ 107.61569733],\n",
+ " [ 85.52565333],\n",
+ " [ 67.63855529],\n",
+ " [ 4.370889 ],\n",
+ " [ 10.2535358 ],\n",
+ " [-110.85158432],\n",
+ " [ -99.42686928],\n",
+ " [ 28.80679849],\n",
+ " [ -41.13217022],\n",
+ " [ 82.26697646],\n",
+ " [ 0.84861706],\n",
+ " [ -52.83297938],\n",
+ " [ 104.87647745],\n",
+ " [ -5.12211887],\n",
+ " [ 31.24030526],\n",
+ " [ -49.3991086 ],\n",
+ " [-120.22473235],\n",
+ " [ 67.42246154],\n",
+ " [ 22.78784737],\n",
+ " [ 62.42370371],\n",
+ " [ -44.05909589],\n",
+ " [ 33.27995053],\n",
+ " [-123.29471171],\n",
+ " [ -85.16575008],\n",
+ " [ -75.75880457],\n",
+ " [ -37.87498583],\n",
+ " [ -62.96929899],\n",
+ " [ 101.86481092],\n",
+ " [ 94.23284647],\n",
+ " [ 73.07195268],\n",
+ " [-117.88512509],\n",
+ " [ 79.72472231],\n",
+ " [ -64.44538218],\n",
+ " [ 14.22644226],\n",
+ " [ -34.61251184],\n",
+ " [ 85.21693507],\n",
+ " [ -3.38182631],\n",
+ " [ 159.57932115],\n",
+ " [-133.65984906],\n",
+ " [-220.12187744],\n",
+ " [ -52.28391002],\n",
+ " [ -62.61818894],\n",
+ " [ -63.10637861],\n",
+ " [ 14.74703647],\n",
+ " [ -78.82130204],\n",
+ " [ 10.9336829 ],\n",
+ " [-108.21194236],\n",
+ " [ 108.41923868],\n",
+ " [ -93.71377032],\n",
+ " [ 105.88677136],\n",
+ " [ 36.01765966],\n",
+ " [ -84.08827417],\n",
+ " [ 79.33084495],\n",
+ " [ -17.56642068],\n",
+ " [ 1.61921415],\n",
+ " [ 52.11176536],\n",
+ " [ 21.24481943],\n",
+ " [ -4.83874205],\n",
+ " [ 34.4028412 ],\n",
+ " [ -41.1694442 ],\n",
+ " [ -71.97469513],\n",
+ " [ -10.5282205 ],\n",
+ " [ 132.42414377],\n",
+ " [ -41.14052994],\n",
+ " [ 93.85825104],\n",
+ " [ 5.54528063],\n",
+ " [-102.08421457],\n",
+ " [-101.2525261 ],\n",
+ " [ -26.34363365],\n",
+ " [ -92.82507213],\n",
+ " [ -95.64195275],\n",
+ " [ 102.86431787],\n",
+ " [-125.75170496],\n",
+ " [ -61.04351189],\n",
+ " [ 36.53242613],\n",
+ " [ 63.19604717],\n",
+ " [-121.94036996],\n",
+ " [ -29.08640409],\n",
+ " [ -37.81013073],\n",
+ " [ 71.66432807],\n",
+ " [ 139.07554448],\n",
+ " [ 98.0285007 ],\n",
+ " [ 13.75349943],\n",
+ " [ 0.66487986],\n",
+ " [ 80.80062849],\n",
+ " [ 149.18500181],\n",
+ " [-104.23506815],\n",
+ " [ 35.42054448],\n",
+ " [ 37.19662996],\n",
+ " [ 75.85221312],\n",
+ " [ 47.49472216],\n",
+ " [ 99.36408343],\n",
+ " [-124.56424503],\n",
+ " [-136.76910575],\n",
+ " [ -21.60461406],\n",
+ " [ -2.85575289],\n",
+ " [ 13.40534834],\n",
+ " [ 6.87101313],\n",
+ " [-144.10257391],\n",
+ " [ -13.37941404],\n",
+ " [ -31.98826158],\n",
+ " [ 51.15112054],\n",
+ " [ -56.68792921],\n",
+ " [ 42.41272565],\n",
+ " [ -6.59041779],\n",
+ " [ 64.75262061],\n",
+ " [ 30.59657478],\n",
+ " [ 0.70872505],\n",
+ " [ 34.5089948 ],\n",
+ " [ 37.74967398],\n",
+ " [-122.9368161 ],\n",
+ " [ 51.1430415 ],\n",
+ " [ 12.74621679],\n",
+ " [ 109.12818117],\n",
+ " [ -92.6956237 ],\n",
+ " [ 1.44006582],\n",
+ " [ 132.61012448],\n",
+ " [-112.54238589],\n",
+ " [ 154.62747078],\n",
+ " [ -33.22687664],\n",
+ " [ 106.4492505 ],\n",
+ " [-137.45651495],\n",
+ " [ 28.81481772],\n",
+ " [ -67.06380283],\n",
+ " [ 23.44887046],\n",
+ " [ 10.0924554 ],\n",
+ " [ 114.89782724],\n",
+ " [ -20.31846722],\n",
+ " [ 21.73272829],\n",
+ " [ 149.54119515],\n",
+ " [ 111.24471443],\n",
+ " [ 99.48539882],\n",
+ " [ -35.16836302],\n",
+ " [-101.03350911],\n",
+ " [ 5.97295888],\n",
+ " [ 7.25257305],\n",
+ " [ 51.40076171],\n",
+ " [ -30.86662914],\n",
+ " [ 18.5159811 ],\n",
+ " [ 23.16362683],\n",
+ " [-209.4508955 ],\n",
+ " [ 18.32657647],\n",
+ " [ -17.78768718],\n",
+ " [ 123.10046595],\n",
+ " [ -9.64742725],\n",
+ " [ 69.10647314],\n",
+ " [-164.90965008],\n",
+ " [ 33.90077698],\n",
+ " [ -8.34156276],\n",
+ " [ 81.03494855],\n",
+ " [ -91.18612226],\n",
+ " [ -25.95547259],\n",
+ " [ -57.68636868],\n",
+ " [ 52.21787164],\n",
+ " [ -79.80093395],\n",
+ " [ -96.93575685],\n",
+ " [ 40.20106337],\n",
+ " [ -84.97110081],\n",
+ " [-176.65211321],\n",
+ " [ 8.84422442],\n",
+ " [ 46.25082615],\n",
+ " [ -78.30918897],\n",
+ " [-160.69327075],\n",
+ " [ 11.4988301 ],\n",
+ " [ -68.91145975],\n",
+ " [ 159.72108347],\n",
+ " [ -96.1293634 ],\n",
+ " [ 93.29661842],\n",
+ " [ -3.34290725],\n",
+ " [ -44.37403604],\n",
+ " [ 72.78003375],\n",
+ " [ 58.9726092 ],\n",
+ " [-120.2722184 ],\n",
+ " [ -10.23962428],\n",
+ " [ -15.23178661],\n",
+ " [ -72.45067441],\n",
+ " [ -24.58103381],\n",
+ " [ -52.95582732],\n",
+ " [ -32.68445947],\n",
+ " [ 22.92107052],\n",
+ " [ 58.30793965],\n",
+ " [ -1.94134787],\n",
+ " [-195.81366884],\n",
+ " [ -68.38699782],\n",
+ " [-133.16039657],\n",
+ " [ 176.34274647],\n",
+ " [ 119.58028278],\n",
+ " [ -11.16733305],\n",
+ " [ -36.53320335],\n",
+ " [ -29.89061742],\n",
+ " [ -8.5470335 ],\n",
+ " [ 253.78529229],\n",
+ " [ 73.91284241],\n",
+ " [ -56.34987242],\n",
+ " [ -7.53272516],\n",
+ " [ 32.47293837],\n",
+ " [ 45.3525632 ],\n",
+ " [ -62.21617915],\n",
+ " [ 12.03373577],\n",
+ " [ 71.69315111],\n",
+ " [ 51.26931421],\n",
+ " [ 82.19307397],\n",
+ " [-161.8850339 ],\n",
+ " [ 65.16107598],\n",
+ " [ 55.05160744],\n",
+ " [ 132.12975865],\n",
+ " [ -7.72943068],\n",
+ " [ 115.02356431],\n",
+ " [ 62.30344601],\n",
+ " [ 85.52811036],\n",
+ " [-146.2041484 ],\n",
+ " [-114.01867649],\n",
+ " [-146.59243508],\n",
+ " [ 24.68708032],\n",
+ " [-166.22366955],\n",
+ " [ 21.05365449],\n",
+ " [-135.30194749],\n",
+ " [ 128.71733593],\n",
+ " [ 139.90881929],\n",
+ " [ 84.5286062 ],\n",
+ " [ -18.7346335 ],\n",
+ " [-162.76454329],\n",
+ " [ -83.63409885],\n",
+ " [ -34.3897405 ],\n",
+ " [ -2.30820206],\n",
+ " [-142.94615367],\n",
+ " [ 143.00421992],\n",
+ " [ -30.33643127],\n",
+ " [ 0.70105601],\n",
+ " [ -81.80772148],\n",
+ " [ -52.18366292],\n",
+ " [ 131.82395509],\n",
+ " [ 116.4002786 ],\n",
+ " [ 87.21203659],\n",
+ " [ 55.19493985],\n",
+ " [ 0.73477336],\n",
+ " [ 59.55495105],\n",
+ " [ 154.46364059],\n",
+ " [-225.37742167],\n",
+ " [ 100.21140938],\n",
+ " [ -98.4036096 ],\n",
+ " [ 52.63610646],\n",
+ " [ 11.21453164],\n",
+ " [ 71.22375439],\n",
+ " [ -20.14484612],\n",
+ " [ -86.31817529],\n",
+ " [ 81.97505105],\n",
+ " [ 145.00287557],\n",
+ " [ -27.14528074],\n",
+ " [ -35.40432235],\n",
+ " [-138.65037835],\n",
+ " [ -50.8112898 ],\n",
+ " [ 8.05796719],\n",
+ " [ -86.45810587],\n",
+ " [ -99.40024209],\n",
+ " [ 54.44078033],\n",
+ " [ 13.20265305],\n",
+ " [ -83.12674952],\n",
+ " [ 54.23072453],\n",
+ " [ 142.61263906],\n",
+ " [ -94.10693382],\n",
+ " [ -51.6455085 ],\n",
+ " [-167.74786399],\n",
+ " [ -14.9176615 ],\n",
+ " [ 124.56501798],\n",
+ " [-147.92842575],\n",
+ " [-123.26242741],\n",
+ " [ 67.91845291],\n",
+ " [ 85.94901879],\n",
+ " [ 56.8292938 ],\n",
+ " [ 36.38058081],\n",
+ " [ 2.50780512],\n",
+ " [ 30.39006654],\n",
+ " [ 127.20394344],\n",
+ " [-117.73165514],\n",
+ " [ -2.91657795],\n",
+ " [ 130.09466648],\n",
+ " [ -65.3558783 ],\n",
+ " [ -77.74367354],\n",
+ " [ -93.52577826],\n",
+ " [ 22.82638954],\n",
+ " [ 97.91688948],\n",
+ " [ 53.87450743],\n",
+ " [ 13.75402425],\n",
+ " [ -28.26171893],\n",
+ " [ -99.63714579],\n",
+ " [ 16.60563733],\n",
+ " [ 69.64217385],\n",
+ " [ -48.15398647],\n",
+ " [-118.63089411],\n",
+ " [ 111.87660506],\n",
+ " [ 24.72343764],\n",
+ " [ -78.08036474],\n",
+ " [ -33.88756366],\n",
+ " [ 33.82069537],\n",
+ " [ 93.46996659],\n",
+ " [-247.63913812],\n",
+ " [ 125.80897024],\n",
+ " [ 89.26976925],\n",
+ " [ -3.17516635],\n",
+ " [ 6.49234628],\n",
+ " [ 50.69214318],\n",
+ " [ -96.48176485],\n",
+ " [ 64.27828339],\n",
+ " [ 45.58814614],\n",
+ " [ -57.13311006],\n",
+ " [ -9.63702525],\n",
+ " [ 97.76026444],\n",
+ " [ 9.9760717 ],\n",
+ " [ -61.11679856],\n",
+ " [-172.90145046],\n",
+ " [ 28.449908 ],\n",
+ " [ 27.95965117],\n",
+ " [ 97.41121182],\n",
+ " [-111.4052245 ],\n",
+ " [ 24.42075129],\n",
+ " [ -6.03706554],\n",
+ " [ 19.2155579 ],\n",
+ " [ 79.78392442],\n",
+ " [ 63.53156487],\n",
+ " [ -30.25166355],\n",
+ " [ 133.04310397],\n",
+ " [-148.69858107],\n",
+ " [ 29.30858162],\n",
+ " [ 202.30977745],\n",
+ " [ -8.43015243],\n",
+ " [ -78.15001325],\n",
+ " [ -3.32114832],\n",
+ " [ 71.20823193],\n",
+ " [ 49.14825274],\n",
+ " [ -12.91143505],\n",
+ " [ 17.58689208],\n",
+ " [ -32.32333969],\n",
+ " [ 68.64015904],\n",
+ " [ -18.49234881],\n",
+ " [-155.71407156],\n",
+ " [ -53.08093331],\n",
+ " [ -40.04314427],\n",
+ " [ -96.77421987],\n",
+ " [ 75.09998225],\n",
+ " [-142.26316309],\n",
+ " [ 144.07657567],\n",
+ " [ -0.9142981 ],\n",
+ " [ -46.88141109],\n",
+ " [ 104.18149192],\n",
+ " [ -7.3838574 ],\n",
+ " [ 122.98792883],\n",
+ " [ -25.1067871 ],\n",
+ " [ -38.86438531],\n",
+ " [ -29.94311814],\n",
+ " [ -20.84379604],\n",
+ " [ -45.63977493],\n",
+ " [ 120.47849375],\n",
+ " [ 54.38004088],\n",
+ " [ -4.38531758],\n",
+ " [ -33.28213529],\n",
+ " [ 83.76194741],\n",
+ " [ 141.38514588],\n",
+ " [ 66.76231509],\n",
+ " [-122.11997948],\n",
+ " [ -34.56647166],\n",
+ " [ 6.10989168],\n",
+ " [-281.5787354 ],\n",
+ " [ 176.19837602],\n",
+ " [ 44.85378175],\n",
+ " [ 88.58657353],\n",
+ " [ 33.0908565 ],\n",
+ " [ -38.92066434],\n",
+ " [ 21.62952278],\n",
+ " [ -4.22175343],\n",
+ " [ -60.49997326],\n",
+ " [-109.4640204 ],\n",
+ " [ -60.48590219],\n",
+ " [ -27.57076231],\n",
+ " [ 62.39724201],\n",
+ " [ 61.39945488],\n",
+ " [-117.07550313],\n",
+ " [ 31.65153877],\n",
+ " [ 20.12100501],\n",
+ " [ 85.92539889],\n",
+ " [ -61.86124012],\n",
+ " [ 61.49792896],\n",
+ " [ 165.73461627],\n",
+ " [ 37.26269992],\n",
+ " [ -21.53092624],\n",
+ " [ -65.38451959],\n",
+ " [ -68.93437777],\n",
+ " [ -99.90633439],\n",
+ " [ 160.65240439],\n",
+ " [ -5.26000289],\n",
+ " [ 72.74214152],\n",
+ " [ 85.47600172],\n",
+ " [ -75.87006958],\n",
+ " [ -82.28498281],\n",
+ " [ -53.84139672],\n",
+ " [ 32.14703738],\n",
+ " [ 111.38677626],\n",
+ " [ -36.82556496],\n",
+ " [ 207.45035291],\n",
+ " [ -75.70162734],\n",
+ " [ -9.97591029],\n",
+ " [ 104.25785348],\n",
+ " [ 39.10952468],\n",
+ " [ 35.37869775],\n",
+ " [ 61.97001728],\n",
+ " [ 52.44663671],\n",
+ " [ -37.8163759 ]]),\n",
+ " 'sigma': 87.02092153863731,\n",
+ " 'stderr_beta': array([10.74454682, 0.14716191, 0.19575352]),\n",
+ " 't': array([[4.33375607e+00, 3.16415072e+02, 2.37871820e+02],\n",
+ " [2.91393392e-01, 2.12751386e+01, 1.59940420e+01],\n",
+ " [1.53639303e-01, 1.12174729e+01, 8.43297595e+00]])}"
]
- },
+ },
+ "execution_count": 196,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 197,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "res['R2']",
- "execution_count": 197,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 197,
- "data": {
- "text/plain": "0.5985995381650879"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "0.5985995381650879"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "",
- "execution_count": null,
- "outputs": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.4",
- "file_extension": ".py",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
+ },
+ "execution_count": 197,
+ "metadata": {},
+ "output_type": "execute_result"
}
+ ],
+ "source": [
+ "res['R2']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-II.ipynb" "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-II.ipynb"
old mode 100644
new mode 100755
index d051859..3900c73
--- "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-II.ipynb"
+++ "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-II.ipynb"
@@ -1,539 +1,665 @@
{
- "cells": [
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "# Optimization with equality constraints"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import math\nimport numpy as np\nfrom scipy import optimize as opt",
- "execution_count": 1,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "maximize $.4\\,\\log(x_1)+.6\\,\\log(x_2)$ s.t. $x_1+3\\,x_2=50$."
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "I = 50\np = np.array([1, 3])",
- "execution_count": 2,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "U = lambda x: (.4*math.log(x[0])+.6*math.log(x[1]))",
- "execution_count": 3,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = (I/len(p))/np.array(p)",
- "execution_count": 6,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "budget = ({'type': 'eq', 'fun': lambda x: I-np.sum(np.multiply(x, p))})",
- "execution_count": 8,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "opt.minimize(lambda x: -U(x), x0, method='SLSQP', constraints=budget, tol=1e-08, \n options={'disp': True, 'ftol': 1e-08})",
- "execution_count": 9,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully. (Exit mode 0)\n Current function value: -2.5798439652115133\n Iterations: 8\n Function evaluations: 32\n Gradient evaluations: 8\n",
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "execution_count": 9,
- "data": {
- "text/plain": " fun: -2.5798439652115133\n jac: array([-0.01999989, -0.06000018])\n message: 'Optimization terminated successfully.'\n nfev: 32\n nit: 8\n njev: 8\n status: 0\n success: True\n x: array([20.00008839, 9.99997054])"
- },
- "metadata": {}
- }
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Optimization with equality constraints"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "from scipy import optimize as opt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "maximize $.4\\,\\log(x_1)+.6\\,\\log(x_2)$ s.t. $x_1+3\\,x_2=50$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "I = 50\n",
+ "p = np.array([1, 3])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "U = lambda x: (.4*math.log(x[0])+.6*math.log(x[1]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x0 = (I/len(p))/np.array(p)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "budget = ({'type': 'eq', 'fun': lambda x: I-np.sum(np.multiply(x, p))})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully. (Exit mode 0)\n",
+ " Current function value: -2.5798439652115133\n",
+ " Iterations: 8\n",
+ " Function evaluations: 32\n",
+ " Gradient evaluations: 8\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ " fun: -2.5798439652115133\n",
+ " jac: array([-0.01999989, -0.06000018])\n",
+ " message: 'Optimization terminated successfully.'\n",
+ " nfev: 32\n",
+ " nit: 8\n",
+ " njev: 8\n",
+ " status: 0\n",
+ " success: True\n",
+ " x: array([20.00008839, 9.99997054])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def consumer(U, p, I):\n budget = ({'type': 'eq', 'fun': lambda x: I-np.sum(np.multiply(x, p))})\n x0 = (I/len(p))/np.array(p)\n sol = opt.minimize(lambda x: -U(x), x0, method='SLSQP', constraints=budget, tol=1e-08, \n options={'disp': False, 'ftol': 1e-08})\n if sol.status == 0:\n return {'x': sol.x, 'V': -sol.fun, 'MgU': -sol.jac, 'mult': -sol.jac[0]/p[0]}\n else:\n return 0",
- "execution_count": 16,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "consumer(U, p, I)",
- "execution_count": 19,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 19,
- "data": {
- "text/plain": "{'MgU': array([0.01999989, 0.06000018]),\n 'V': 2.5798439652115133,\n 'mult': 0.01999989151954651,\n 'x': array([20.00008839, 9.99997054])}"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "opt.minimize(lambda x: -U(x), x0, method='SLSQP', constraints=budget, tol=1e-08, \n",
+ " options={'disp': True, 'ftol': 1e-08})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def consumer(U, p, I):\n",
+ " budget = ({'type': 'eq', 'fun': lambda x: I-np.sum(np.multiply(x, p))})\n",
+ " x0 = (I/len(p))/np.array(p)\n",
+ " sol = opt.minimize(lambda x: -U(x), x0, method='SLSQP', constraints=budget, tol=1e-08, \n",
+ " options={'disp': False, 'ftol': 1e-08})\n",
+ " if sol.status == 0:\n",
+ " return {'x': sol.x, 'V': -sol.fun, 'MgU': -sol.jac, 'mult': -sol.jac[0]/p[0]}\n",
+ " else:\n",
+ " return 0"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'MgU': array([0.01999989, 0.06000018]),\n",
+ " 'V': 2.5798439652115133,\n",
+ " 'mult': 0.01999989151954651,\n",
+ " 'x': array([20.00008839, 9.99997054])}"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "delta=.01",
- "execution_count": 14,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "(consumer(U, p, I+delta)['V']-consumer(U, p, I-delta)['V'])/(2*delta)",
- "execution_count": 17,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 17,
- "data": {
- "text/plain": "0.020000000351583225"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "consumer(U, p, I)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "delta=.01"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.020000000351583225"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "delta=.001",
- "execution_count": null,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "numerador = (consumer(U,p+np.array([delta, 0]), I)['V']-consumer(U,p+np.array([-delta, 0]), I)['V'])/(2*delta)",
- "execution_count": 20,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "denominador = (consumer(U, p, I+delta)['V']-consumer(U, p, I-delta)['V'])/(2*delta)",
- "execution_count": 21,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "-numerador/denominador",
- "execution_count": 22,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 22,
- "data": {
- "text/plain": "20.000666372514335"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(consumer(U, p, I+delta)['V']-consumer(U, p, I-delta)['V'])/(2*delta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "delta=.001"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "numerador = (consumer(U,p+np.array([delta, 0]), I)['V']-consumer(U,p+np.array([-delta, 0]), I)['V'])/(2*delta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "denominador = (consumer(U, p, I+delta)['V']-consumer(U, p, I-delta)['V'])/(2*delta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "20.000666372514335"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Cost function"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# Production function\nF = lambda x: (x[0]**.8)*(x[1]**.2)",
- "execution_count": 23,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "w = np.array([5, 4])",
- "execution_count": 24,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "y = 1",
- "execution_count": 25,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "constraint = ({'type': 'eq', 'fun': lambda x: y-F(x)})",
- "execution_count": 26,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([.5, .5])",
- "execution_count": 30,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "cost = opt.minimize(lambda x: w@x, x0, method='SLSQP', constraints=constraint, tol=1e-08, \n options={'disp': True, 'ftol': 1e-08})",
- "execution_count": 31,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully. (Exit mode 0)\n Current function value: 7.886966805999761\n Iterations: 8\n Function evaluations: 33\n Gradient evaluations: 8\n",
- "name": "stdout"
- },
- {
- "output_type": "stream",
- "text": "/home/nbuser/anaconda3_420/lib/python3.5/site-packages/ipykernel/__main__.py:2: RuntimeWarning: invalid value encountered in double_scalars\n from ipykernel import kernelapp as app\n",
- "name": "stderr"
- }
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "-numerador/denominador"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Cost function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Production function\n",
+ "F = lambda x: (x[0]**.8)*(x[1]**.2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "w = np.array([5, 4])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y = 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "constraint = ({'type': 'eq', 'fun': lambda x: y-F(x)})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x0 = np.array([.5, .5])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully. (Exit mode 0)\n",
+ " Current function value: 7.886966805999761\n",
+ " Iterations: 8\n",
+ " Function evaluations: 33\n",
+ " Gradient evaluations: 8\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/nbuser/anaconda3_420/lib/python3.5/site-packages/ipykernel/__main__.py:2: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " from ipykernel import kernelapp as app\n"
+ ]
+ }
+ ],
+ "source": [
+ "cost = opt.minimize(lambda x: w@x, x0, method='SLSQP', constraints=constraint, tol=1e-08, \n",
+ " options={'disp': True, 'ftol': 1e-08})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.9999999999996633"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "F(cost.x)",
- "execution_count": 33,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 33,
- "data": {
- "text/plain": "0.9999999999996633"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "F(cost.x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ " fun: 7.886966805999761\n",
+ " jac: array([5., 4.])\n",
+ " message: 'Optimization terminated successfully.'\n",
+ " nfev: 33\n",
+ " nit: 8\n",
+ " njev: 8\n",
+ " status: 0\n",
+ " success: True\n",
+ " x: array([1.26191469, 0.39434834])"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "cost",
- "execution_count": 34,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 34,
- "data": {
- "text/plain": " fun: 7.886966805999761\n jac: array([5., 4.])\n message: 'Optimization terminated successfully.'\n nfev: 33\n nit: 8\n njev: 8\n status: 0\n success: True\n x: array([1.26191469, 0.39434834])"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cost"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercise"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = 2\n",
+ "u = lambda c: -np.exp(-a*c)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "R = 2\n",
+ "Z2 = np.array([.72, .92, 1.12, 1.32])\n",
+ "Z3 = np.array([.86, .96, 1.06, 1.16])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def U(x):\n",
+ " states = len(Z2)*len(Z3)\n",
+ " U = u(x[0])\n",
+ " \n",
+ " for z2 in Z2:\n",
+ " for z3 in Z3:\n",
+ " U += (1/states)*u(x[1]*R+x[2]*z2+x[3]*z3)\n",
+ " \n",
+ " return U"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p = np.array([1, 1, .5, .5])\n",
+ "I = 4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'MgU': array([0.08731231, 0.08730633, 0.04365353, 0.04365407]),\n",
+ " 'V': -0.13096546963056768,\n",
+ " 'mult': 0.08731230534613132,\n",
+ " 'x': array([2.43826386, 0.96156249, 0.40056072, 0.79978658])}"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Exercise"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "a = 2\nu = lambda c: -np.exp(-a*c)",
- "execution_count": 15,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "R = 2\nZ2 = np.array([.72, .92, 1.12, 1.32])\nZ3 = np.array([.86, .96, 1.06, 1.16])",
- "execution_count": 37,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def U(x):\n states = len(Z2)*len(Z3)\n U = u(x[0])\n \n for z2 in Z2:\n for z3 in Z3:\n U += (1/states)*u(x[1]*R+x[2]*z2+x[3]*z3)\n \n return U",
- "execution_count": 57,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "p = np.array([1, 1, .5, .5])\nI = 4",
- "execution_count": 35,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# a=1\nconsumer(U, p, I)",
- "execution_count": 39,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 39,
- "data": {
- "text/plain": "{'MgU': array([0.08731231, 0.08730633, 0.04365353, 0.04365407]),\n 'V': -0.13096546963056768,\n 'mult': 0.08731230534613132,\n 'x': array([2.43826386, 0.96156249, 0.40056072, 0.79978658])}"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# a=1\n",
+ "consumer(U, p, I)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'MgU': array([1.46733761e-05, 1.62503376e-05, 6.30933317e-06, 7.55005789e-06]),\n",
+ " 'V': -4.5597092009686085e-06,\n",
+ " 'mult': 1.467337608573871e-05,\n",
+ " 'x': array([ 2.54778275, -0.03185392, 1.48407021, 1.48407214])}"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# a=5\nconsumer(U, p, I)",
- "execution_count": 55,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 55,
- "data": {
- "text/plain": "{'MgU': array([1.46733761e-05, 1.62503376e-05, 6.30933317e-06, 7.55005789e-06]),\n 'V': -4.5597092009686085e-06,\n 'mult': 1.467337608573871e-05,\n 'x': array([ 2.54778275, -0.03185392, 1.48407021, 1.48407214])}"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# a=5\n",
+ "consumer(U, p, I)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'MgU': array([0.01213578, 0.01212819, 0.00606456, 0.00606509]),\n",
+ " 'V': -0.009099936642525175,\n",
+ " 'mult': 0.012135779834352434,\n",
+ " 'x': array([2.55237217, 1.15077956, 0.19958579, 0.39411074])}"
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# a=2\nconsumer(U, p, I)",
- "execution_count": 58,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 58,
- "data": {
- "text/plain": "{'MgU': array([0.01213578, 0.01212819, 0.00606456, 0.00606509]),\n 'V': -0.009099936642525175,\n 'mult': 0.012135779834352434,\n 'x': array([2.55237217, 1.15077956, 0.19958579, 0.39411074])}"
- },
- "metadata": {}
- }
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# a=2\n",
+ "consumer(U, p, I)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x = np.arange(0.0, 2.0, 0.01)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[]"
]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import matplotlib.pyplot as plt",
- "execution_count": 3,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x = np.arange(0.0, 2.0, 0.01)",
- "execution_count": 6,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "a = 2\nu = lambda c: -np.exp(-a*c)\nplt.plot(x, u(x))",
- "execution_count": 12,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 12,
- "data": {
- "text/plain": "[]"
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {}
- }
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "a = -2\nplt.plot(x, u(x))",
- "execution_count": 16,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 16,
- "data": {
- "text/plain": "[]"
- },
- "metadata": {}
- },
- {
- "output_type": "display_data",
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {}
- }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "a = 2\n",
+ "u = lambda c: -np.exp(-a*c)\n",
+ "plt.plot(x, u(x))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[]"
]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
},
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "markdown",
- "source": "# Optimization with inequality constraints"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "f = lambda x: -x[0]**3+x[1]**2-2*x[0]*(x[2]**2)",
- "execution_count": 13,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "constraints =({'type': 'eq', 'fun': lambda x: 2*x[0]+x[1]**2+x[2]-5}, \n {'type': 'ineq', 'fun': lambda x: 5*x[0]**2-x[1]**2-x[2]-2})",
- "execution_count": 8,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "constraints =({'type': 'eq', 'fun': lambda x: x[0]**3-x[1]})",
- "execution_count": 10,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "x0 = np.array([.5, .5, 2])\nopt.minimize(f, x0, method='SLSQP', constraints=constraints, tol=1e-08, \n options={'disp': True, 'ftol': 1e-08})",
- "execution_count": 18,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Optimization terminated successfully. (Exit mode 0)\n Current function value: -19.000000000000256\n Iterations: 11\n Function evaluations: 56\n Gradient evaluations: 11\n",
- "name": "stdout"
- },
- {
- "output_type": "execute_result",
- "execution_count": 18,
- "data": {
- "text/plain": " fun: -19.000000000000256\n jac: array([-21., 0., -12.])\n message: 'Optimization terminated successfully.'\n nfev: 56\n nit: 11\n njev: 11\n status: 0\n success: True\n x: array([ 1.0000000e+00, -2.6438182e-09, 3.0000000e+00])"
- },
- "metadata": {}
- }
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "",
- "execution_count": null,
- "outputs": []
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "file_extension": ".py",
- "version": "3.5.4",
- "pygments_lexer": "ipython3",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
+ ],
+ "source": [
+ "a = -2\n",
+ "plt.plot(x, u(x))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Optimization with inequality constraints"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "f = lambda x: -x[0]**3+x[1]**2-2*x[0]*(x[2]**2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "constraints =({'type': 'eq', 'fun': lambda x: 2*x[0]+x[1]**2+x[2]-5}, \n",
+ " {'type': 'ineq', 'fun': lambda x: 5*x[0]**2-x[1]**2-x[2]-2})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "constraints =({'type': 'eq', 'fun': lambda x: x[0]**3-x[1]})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Optimization terminated successfully. (Exit mode 0)\n",
+ " Current function value: -19.000000000000256\n",
+ " Iterations: 11\n",
+ " Function evaluations: 56\n",
+ " Gradient evaluations: 11\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ " fun: -19.000000000000256\n",
+ " jac: array([-21., 0., -12.])\n",
+ " message: 'Optimization terminated successfully.'\n",
+ " nfev: 56\n",
+ " nit: 11\n",
+ " njev: 11\n",
+ " status: 0\n",
+ " success: True\n",
+ " x: array([ 1.0000000e+00, -2.6438182e-09, 3.0000000e+00])"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
}
+ ],
+ "source": [
+ "x0 = np.array([.5, .5, 2])\n",
+ "opt.minimize(f, x0, method='SLSQP', constraints=constraints, tol=1e-08, \n",
+ " options={'disp': True, 'ftol': 1e-08})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-III.ipynb" "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-III.ipynb"
old mode 100644
new mode 100755
index ff00af2..c87fe18
--- "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-III.ipynb"
+++ "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-III.ipynb"
@@ -1,279 +1,582 @@
{
- "cells": [
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "# Dynamic Optimization"
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "Imagine an infinitely-living individual who has an endowment of capital at the beginning of each period. This endowment is used to produce more goods according, and a fraction of it depreciates. The individual then decides what fraction of the output to consume, and the remaining becomes the endowment of capital available on the next period. Notice that there is just one good in this economy, which can be consumed or used in production (as capital).\n\nThe objective in period $t$ is to *maximize* the intertemporal utility\n$$U_{t} = \\sum_{s=0}^{+\\infty} \\beta^{s}\\,u(c_{t+s})$$\nsubject to\n$$k_{t+s}\\,(1-\\delta) + f(k_{t+s}) = c_{t+s} + k_{t+s+1},\\, t\\in\\mathcal{N}$$\n$k_{t+s}$ is the capital stock at the beginning of period $t+s$, $c_{t+s}$ is the consumption, $f()$ is a production function, $\\delta$ is the depreciation rate, and the discount rate is such that $0<\\beta<1$.\n\nAccording to [Bellman's Principle of Optimality](https://youtu.be/_zE5z-KZGRw) the solution to this problem must also solve\n$$V(k) = \\max \\{u(c)+\\beta\\,V(k^{\\prime})\\}$$\n$$s.t.\\;k^{\\prime}=f(k)+(1-\\delta)k-c$$\n\n*We want to find:*\n* a *value function* $V(k)$ that satisfies the conditions above\n* the associated *policy function* $h(k)$ that indicates what is the (intertemporal) optimal consumption $c$ given the amount of capital at the beginning of the period.\n\nFunctions:\n* $f(k)=k^\\alpha$\n* $u(c)=\\ln(c)$\n\nFirst order condition (wrt $k^{\\prime}$): $-u^{\\prime}(c)+\\beta\\,V^{\\prime}(k^{\\prime})=0$\n\nBenveniste-Scheinkman condition: $V^{\\prime}(k)=u^{\\prime}(c)\\,(1-\\delta+f^{\\prime}(k))$\n\nRe-arranging terms: \n$$k^{\\prime}+c=k^{\\alpha}+(1-\\delta)k$$\n$$c^{\\prime}=\\beta\\,c\\,\\left[1-\\delta+\\alpha\\,(k^{\\prime})^{\\alpha-1}\\right]$$\n\nIn steady state: $c=c^{\\prime}$ and $k=k^{\\prime}$\n\n$$k^{\\ast}=\\left[\\frac{\\alpha\\beta}{1-\\beta(1-\\delta)}\\right]^{\\frac{1}{1-\\alpha}}$$\n$$c^{\\ast}=(k^{\\ast})^{\\alpha}-\\delta k^{\\ast}$$\n\nParameters:\n* $\\alpha = .4$\n* $\\beta = .8$\n* $\\delta = .05$"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import math\nimport numpy as np\nfrom scipy import stats, optimize\nimport time\nimport matplotlib.pyplot as plt",
- "execution_count": 2,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# parameters\nalpha = .4\nbeta = .8\ndelta = .05\npar = (alpha, beta, delta)",
- "execution_count": 3,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# utility function\nu = lambda c: math.log(c)",
- "execution_count": 4,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# production function\nf = lambda k: k**alpha",
- "execution_count": 5,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# function to calculate distance between two lists with the same indices\ndef dist(V, W):\n d = 0\n for (_, v), (_, w) in zip(V.items(), W.items()):\n d = d + (v-w)**2\n return math.sqrt(d)",
- "execution_count": 6,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 1: calculate steady-state"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "k_ss = (alpha*beta/(1-beta*(1-delta)))**(1/(1-alpha))\nc_ss = f(k_ss)-delta*k_ss\nprint(\"steady-state values:\\ncapital: {0:.1f}\\nconsumption: {1:.1f}\".format(k_ss, c_ss))",
- "execution_count": 7,
- "outputs": [
- {
- "output_type": "stream",
- "text": "steady-state values:\ncapital: 1.6\nconsumption: 1.1\n",
- "name": "stdout"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 2: define a grid for $k$ (and $k^{\\prime}$)"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "g_size = 1000\nkmin = 0\nkmax = k_ss*2\nstep = kmax/g_size\n\nk_grid = np.arange(kmin+step, kmax+step, step)",
- "execution_count": 8,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 3: define initial value function over grid"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# V0 is dictionary. V0(k)=k\nV0 = {}\nfor k in k_grid:\n V0[k] = math.log(k+1)",
- "execution_count": 9,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 4: construct maximizer function"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# given a value of k and a (proposed) value function V, find k' that maximizes V over grid of k. \n\ndef maximizer(k, V0, u, f, k_grid):\n \n i = 0\n for K in k_grid:\n \n c = f(k)+(1-delta)*k-K\n if c>0:\n i += 1\n v = u(c)+beta*V0[K]\n if i == 1:\n vmax = v\n cmax = c\n kmax = K\n elif v>vmax:\n vmax = v\n cmax = c\n kmax = K\n \n return (vmax, cmax, kmax)",
- "execution_count": 10,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 5: iteration over value function"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def bellman(V0, u, f, k_grid, eps=1e-3):\n \n T = {}\n T[0] = (1, 1)\n t0 = time.time()\n d = 1\n i = 0\n \n while d>eps:\n \n V = {}\n C = {}\n K = {}\n \n i += 1\n \n for k in k_grid:\n v = maximizer(k, V0, u, f, k_grid)\n V[k] = v[0]\n C[k] = v[1]\n K[k] = v[2]\n \n d = abs(dist(V, V0))\n V0 = V\n T[i] = (d, time.time()-t0)\n print('i: {0}, d = {1:.5f} ({2:.2%})'.format(i,d,(d/T[i-1][0])-1))\n \n print('i: {0}, d = {1:.5f})'.format(i,d))\n return (V, C, K, T)",
- "execution_count": 12,
- "outputs": []
- },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Dynamic Optimization"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Imagine an infinitely-living individual who has an endowment of capital at the beginning of each period. This endowment is used to produce more goods according, and a fraction of it depreciates. The individual then decides what fraction of the output to consume, and the remaining becomes the endowment of capital available on the next period. Notice that there is just one good in this economy, which can be consumed or used in production (as capital).\n",
+ "\n",
+ "The objective in period $t$ is to *maximize* the intertemporal utility\n",
+ "$$U_{t} = \\sum_{s=0}^{+\\infty} \\beta^{s}\\,u(c_{t+s})$$\n",
+ "subject to\n",
+ "$$k_{t+s}\\,(1-\\delta) + f(k_{t+s}) = c_{t+s} + k_{t+s+1},\\, t\\in\\mathcal{N}$$\n",
+ "$k_{t+s}$ is the capital stock at the beginning of period $t+s$, $c_{t+s}$ is the consumption, $f()$ is a production function, $\\delta$ is the depreciation rate, and the discount rate is such that $0<\\beta<1$.\n",
+ "\n",
+ "According to [Bellman's Principle of Optimality](https://youtu.be/_zE5z-KZGRw) the solution to this problem must also solve\n",
+ "$$V(k) = \\max \\{u(c)+\\beta\\,V(k^{\\prime})\\}$$\n",
+ "$$s.t.\\;k^{\\prime}=f(k)+(1-\\delta)k-c$$\n",
+ "\n",
+ "*We want to find:*\n",
+ "* a *value function* $V(k)$ that satisfies the conditions above\n",
+ "* the associated *policy function* $h(k)$ that indicates what is the (intertemporal) optimal consumption $c$ given the amount of capital at the beginning of the period.\n",
+ "\n",
+ "Functions:\n",
+ "* $f(k)=k^\\alpha$\n",
+ "* $u(c)=\\ln(c)$\n",
+ "\n",
+ "First order condition (wrt $k^{\\prime}$): $-u^{\\prime}(c)+\\beta\\,V^{\\prime}(k^{\\prime})=0$\n",
+ "\n",
+ "Benveniste-Scheinkman condition: $V^{\\prime}(k)=u^{\\prime}(c)\\,(1-\\delta+f^{\\prime}(k))$\n",
+ "\n",
+ "Re-arranging terms: \n",
+ "$$k^{\\prime}+c=k^{\\alpha}+(1-\\delta)k$$\n",
+ "$$c^{\\prime}=\\beta\\,c\\,\\left[1-\\delta+\\alpha\\,(k^{\\prime})^{\\alpha-1}\\right]$$\n",
+ "\n",
+ "In steady state: $c=c^{\\prime}$ and $k=k^{\\prime}$\n",
+ "\n",
+ "$$k^{\\ast}=\\left[\\frac{\\alpha\\beta}{1-\\beta(1-\\delta)}\\right]^{\\frac{1}{1-\\alpha}}$$\n",
+ "$$c^{\\ast}=(k^{\\ast})^{\\alpha}-\\delta k^{\\ast}$$\n",
+ "\n",
+ "Parameters:\n",
+ "* $\\alpha = .4$\n",
+ "* $\\beta = .8$\n",
+ "* $\\delta = .05$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "from scipy import stats, optimize\n",
+ "import time\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# parameters\n",
+ "alpha = .4\n",
+ "beta = .8\n",
+ "delta = .05\n",
+ "par = (alpha, beta, delta)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# utility function\n",
+ "u = lambda c: math.log(c)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# production function\n",
+ "f = lambda k: k**alpha"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# function to calculate distance between two lists with the same indices\n",
+ "def dist(V, W):\n",
+ " d = 0\n",
+ " for (_, v), (_, w) in zip(V.items(), W.items()):\n",
+ " d = d + (v-w)**2\n",
+ " return math.sqrt(d)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 1: calculate steady-state"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Shazam!"
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "steady-state values:\n",
+ "capital: 1.6\n",
+ "consumption: 1.1\n"
+ ]
+ }
+ ],
+ "source": [
+ "k_ss = (alpha*beta/(1-beta*(1-delta)))**(1/(1-alpha))\n",
+ "c_ss = f(k_ss)-delta*k_ss\n",
+ "print(\"steady-state values:\\ncapital: {0:.1f}\\nconsumption: {1:.1f}\".format(k_ss, c_ss))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 2: define a grid for $k$ (and $k^{\\prime}$)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "g_size = 1000\n",
+ "kmin = 0\n",
+ "kmax = k_ss*2\n",
+ "step = kmax/g_size\n",
+ "\n",
+ "k_grid = np.arange(kmin+step, kmax+step, step)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 3: define initial value function over grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# V0 is dictionary. V0(k)=k\n",
+ "V0 = {}\n",
+ "for k in k_grid:\n",
+ " V0[k] = math.log(k+1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 4: construct maximizer function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# given a value of k and a (proposed) value function V, find k' that maximizes V over grid of k. \n",
+ "\n",
+ "def maximizer(k, V0, u, f, k_grid):\n",
+ " \n",
+ " i = 0\n",
+ " for K in k_grid:\n",
+ " \n",
+ " c = f(k)+(1-delta)*k-K\n",
+ " if c>0:\n",
+ " i += 1\n",
+ " v = u(c)+beta*V0[K]\n",
+ " if i == 1:\n",
+ " vmax = v\n",
+ " cmax = c\n",
+ " kmax = K\n",
+ " elif v>vmax:\n",
+ " vmax = v\n",
+ " cmax = c\n",
+ " kmax = K\n",
+ " \n",
+ " return (vmax, cmax, kmax)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 5: iteration over value function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def bellman(V0, u, f, k_grid, eps=1e-3):\n",
+ " \n",
+ " T = {}\n",
+ " T[0] = (1, 1)\n",
+ " t0 = time.time()\n",
+ " d = 1\n",
+ " i = 0\n",
+ " \n",
+ " while d>eps:\n",
+ " \n",
+ " V = {}\n",
+ " C = {}\n",
+ " K = {}\n",
+ " \n",
+ " i += 1\n",
+ " \n",
+ " for k in k_grid:\n",
+ " v = maximizer(k, V0, u, f, k_grid)\n",
+ " V[k] = v[0]\n",
+ " C[k] = v[1]\n",
+ " K[k] = v[2]\n",
+ " \n",
+ " d = abs(dist(V, V0))\n",
+ " V0 = V\n",
+ " T[i] = (d, time.time()-t0)\n",
+ " print('i: {0}, d = {1:.5f} ({2:.2%})'.format(i,d,(d/T[i-1][0])-1))\n",
+ " \n",
+ " print('i: {0}, d = {1:.5f})'.format(i,d))\n",
+ " return (V, C, K, T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Shazam!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
{
- "metadata": {
- "scrolled": true,
- "trusted": true
- },
- "cell_type": "code",
- "source": "S = bellman(V0, u, f, k_grid)",
- "execution_count": 13,
- "outputs": [
- {
- "output_type": "stream",
- "text": "i: 1, d = 11.47116 (1047.12%)\ni: 2, d = 8.71175 (-24.06%)\ni: 3, d = 6.23321 (-28.45%)\ni: 4, d = 4.50341 (-27.75%)\ni: 5, d = 3.30647 (-26.58%)\ni: 6, d = 2.46702 (-25.39%)\ni: 7, d = 1.86775 (-24.29%)\ni: 8, d = 1.43191 (-23.33%)\ni: 9, d = 1.10911 (-22.54%)\ni: 10, d = 0.86617 (-21.90%)\ni: 11, d = 0.68077 (-21.40%)\ni: 12, d = 0.53760 (-21.03%)\ni: 13, d = 0.42600 (-20.76%)\ni: 14, d = 0.33841 (-20.56%)\ni: 15, d = 0.26932 (-20.42%)\ni: 16, d = 0.21461 (-20.31%)\ni: 17, d = 0.17118 (-20.24%)\ni: 18, d = 0.13663 (-20.18%)\ni: 19, d = 0.10912 (-20.14%)\ni: 20, d = 0.08718 (-20.11%)\ni: 21, d = 0.06967 (-20.08%)\ni: 22, d = 0.05569 (-20.07%)\ni: 23, d = 0.04452 (-20.05%)\ni: 24, d = 0.03560 (-20.04%)\ni: 25, d = 0.02847 (-20.03%)\ni: 26, d = 0.02277 (-20.03%)\ni: 27, d = 0.01821 (-20.02%)\ni: 28, d = 0.01456 (-20.02%)\ni: 29, d = 0.01165 (-20.01%)\ni: 30, d = 0.00932 (-20.01%)\ni: 31, d = 0.00745 (-20.01%)\ni: 32, d = 0.00596 (-20.01%)\ni: 33, d = 0.00477 (-20.00%)\ni: 34, d = 0.00382 (-20.00%)\ni: 35, d = 0.00305 (-20.00%)\ni: 36, d = 0.00244 (-20.00%)\ni: 37, d = 0.00195 (-20.00%)\ni: 38, d = 0.00156 (-20.00%)\ni: 39, d = 0.00125 (-20.00%)\ni: 40, d = 0.00100 (-20.00%)\ni: 41, d = 0.00080 (-20.00%)\ni: 41, d = 0.00080)\n",
- "name": "stdout"
- }
- ]
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "i: 1, d = 11.47116 (1047.12%)\n",
+ "i: 2, d = 8.71175 (-24.06%)\n",
+ "i: 3, d = 6.23321 (-28.45%)\n",
+ "i: 4, d = 4.50341 (-27.75%)\n",
+ "i: 5, d = 3.30647 (-26.58%)\n",
+ "i: 6, d = 2.46702 (-25.39%)\n",
+ "i: 7, d = 1.86775 (-24.29%)\n",
+ "i: 8, d = 1.43191 (-23.33%)\n",
+ "i: 9, d = 1.10911 (-22.54%)\n",
+ "i: 10, d = 0.86617 (-21.90%)\n",
+ "i: 11, d = 0.68077 (-21.40%)\n",
+ "i: 12, d = 0.53760 (-21.03%)\n",
+ "i: 13, d = 0.42600 (-20.76%)\n",
+ "i: 14, d = 0.33841 (-20.56%)\n",
+ "i: 15, d = 0.26932 (-20.42%)\n",
+ "i: 16, d = 0.21461 (-20.31%)\n",
+ "i: 17, d = 0.17118 (-20.24%)\n",
+ "i: 18, d = 0.13663 (-20.18%)\n",
+ "i: 19, d = 0.10912 (-20.14%)\n",
+ "i: 20, d = 0.08718 (-20.11%)\n",
+ "i: 21, d = 0.06967 (-20.08%)\n",
+ "i: 22, d = 0.05569 (-20.07%)\n",
+ "i: 23, d = 0.04452 (-20.05%)\n",
+ "i: 24, d = 0.03560 (-20.04%)\n",
+ "i: 25, d = 0.02847 (-20.03%)\n",
+ "i: 26, d = 0.02277 (-20.03%)\n",
+ "i: 27, d = 0.01821 (-20.02%)\n",
+ "i: 28, d = 0.01456 (-20.02%)\n",
+ "i: 29, d = 0.01165 (-20.01%)\n",
+ "i: 30, d = 0.00932 (-20.01%)\n",
+ "i: 31, d = 0.00745 (-20.01%)\n",
+ "i: 32, d = 0.00596 (-20.01%)\n",
+ "i: 33, d = 0.00477 (-20.00%)\n",
+ "i: 34, d = 0.00382 (-20.00%)\n",
+ "i: 35, d = 0.00305 (-20.00%)\n",
+ "i: 36, d = 0.00244 (-20.00%)\n",
+ "i: 37, d = 0.00195 (-20.00%)\n",
+ "i: 38, d = 0.00156 (-20.00%)\n",
+ "i: 39, d = 0.00125 (-20.00%)\n",
+ "i: 40, d = 0.00100 (-20.00%)\n",
+ "i: 41, d = 0.00080 (-20.00%)\n",
+ "i: 41, d = 0.00080)\n"
+ ]
+ }
+ ],
+ "source": [
+ "S = bellman(V0, u, f, k_grid)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "S[3]",
- "execution_count": 16,
- "outputs": [
- {
- "output_type": "execute_result",
- "execution_count": 16,
- "data": {
- "text/plain": "{0: (1, 1),\n 1: (11.471163339929898, 11.620864152908325),\n 2: (8.711751727405229, 24.175007581710815),\n 3: (6.233207992621637, 37.45667099952698),\n 4: (4.503406692265431, 50.7048454284668),\n 5: (3.306469822288683, 63.64902210235596),\n 6: (2.467018540510849, 76.81420135498047),\n 7: (1.8677475739998395, 89.01143765449524),\n 8: (1.4319148954993604, 100.75852632522583),\n 9: (1.1091069779636689, 113.11196255683899),\n 10: (0.86616526516008, 125.26574158668518),\n 11: (0.6807749115680007, 137.06682467460632),\n 12: (0.5375994977798054, 148.5941891670227),\n 13: (0.4260043505473527, 160.18138718605042),\n 14: (0.33841249069847884, 172.33310961723328),\n 15: (0.26931662426805536, 184.27857446670532),\n 16: (0.21460923643192942, 196.00503754615784),\n 17: (0.17117894724320826, 207.51750993728638),\n 18: (0.1366336975348204, 219.02280259132385),\n 19: (0.10911729721855218, 231.41397738456726),\n 20: (0.08717613476214513, 243.08990097045898),\n 21: (0.06966772355821278, 254.6827666759491),\n 22: (0.05568814245179515, 266.64171719551086),\n 23: (0.04452161208020133, 278.3515884876251),\n 24: (0.035598941252427484, 290.5835506916046),\n 25: (0.028467578026808594, 302.8230154514313),\n 26: (0.022766594712928367, 314.76684737205505),\n 27: (0.01820850416251944, 327.0457673072815),\n 28: (0.0145636707576875, 339.1297814846039),\n 29: (0.011649095366938398, 351.3482563495636),\n 30: (0.009317977551900567, 363.70199179649353),\n 31: (0.007453545960504198, 375.41989493370056),\n 32: (0.005962193499606321, 388.3381025791168),\n 33: (0.0047694662863360495, 400.3460953235626),\n 34: (0.0038154180630221098, 412.2888388633728),\n 35: (0.003052163370817199, 424.21188163757324),\n 36: (0.002441615428970485, 435.95243740081787),\n 37: (0.0019532613639854386, 448.54394912719727),\n 38: (0.0015626052734961952, 460.12600922584534),\n 39: (0.0012500874972857857, 472.09953689575195),\n 40: (0.0010000568097899912, 483.8269262313843),\n 41: (0.0008000134337702209, 495.6525139808655)}"
- },
- "metadata": {}
- }
+ "data": {
+ "text/plain": [
+ "{0: (1, 1),\n",
+ " 1: (11.471163339929898, 11.620864152908325),\n",
+ " 2: (8.711751727405229, 24.175007581710815),\n",
+ " 3: (6.233207992621637, 37.45667099952698),\n",
+ " 4: (4.503406692265431, 50.7048454284668),\n",
+ " 5: (3.306469822288683, 63.64902210235596),\n",
+ " 6: (2.467018540510849, 76.81420135498047),\n",
+ " 7: (1.8677475739998395, 89.01143765449524),\n",
+ " 8: (1.4319148954993604, 100.75852632522583),\n",
+ " 9: (1.1091069779636689, 113.11196255683899),\n",
+ " 10: (0.86616526516008, 125.26574158668518),\n",
+ " 11: (0.6807749115680007, 137.06682467460632),\n",
+ " 12: (0.5375994977798054, 148.5941891670227),\n",
+ " 13: (0.4260043505473527, 160.18138718605042),\n",
+ " 14: (0.33841249069847884, 172.33310961723328),\n",
+ " 15: (0.26931662426805536, 184.27857446670532),\n",
+ " 16: (0.21460923643192942, 196.00503754615784),\n",
+ " 17: (0.17117894724320826, 207.51750993728638),\n",
+ " 18: (0.1366336975348204, 219.02280259132385),\n",
+ " 19: (0.10911729721855218, 231.41397738456726),\n",
+ " 20: (0.08717613476214513, 243.08990097045898),\n",
+ " 21: (0.06966772355821278, 254.6827666759491),\n",
+ " 22: (0.05568814245179515, 266.64171719551086),\n",
+ " 23: (0.04452161208020133, 278.3515884876251),\n",
+ " 24: (0.035598941252427484, 290.5835506916046),\n",
+ " 25: (0.028467578026808594, 302.8230154514313),\n",
+ " 26: (0.022766594712928367, 314.76684737205505),\n",
+ " 27: (0.01820850416251944, 327.0457673072815),\n",
+ " 28: (0.0145636707576875, 339.1297814846039),\n",
+ " 29: (0.011649095366938398, 351.3482563495636),\n",
+ " 30: (0.009317977551900567, 363.70199179649353),\n",
+ " 31: (0.007453545960504198, 375.41989493370056),\n",
+ " 32: (0.005962193499606321, 388.3381025791168),\n",
+ " 33: (0.0047694662863360495, 400.3460953235626),\n",
+ " 34: (0.0038154180630221098, 412.2888388633728),\n",
+ " 35: (0.003052163370817199, 424.21188163757324),\n",
+ " 36: (0.002441615428970485, 435.95243740081787),\n",
+ " 37: (0.0019532613639854386, 448.54394912719727),\n",
+ " 38: (0.0015626052734961952, 460.12600922584534),\n",
+ " 39: (0.0012500874972857857, 472.09953689575195),\n",
+ " 40: (0.0010000568097899912, 483.8269262313843),\n",
+ " 41: (0.0008000134337702209, 495.6525139808655)}"
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Exploring the results"
- },
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "S[3]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exploring the results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 240,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "V = S[0]\nX = []\nY = []\nZ = []\n\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(V[k])\n Z.append(V0[k])\n \nplt.plot(X, Y, color=\"green\", linewidth=2, label=\"Optimum\")\nplt.plot(X, Z, \"--\", color=\"gray\", linewidth=1, label=\"Initial guess\")\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$V$\", fontsize=14)\nplt.title(\"Value Function\")\nplt.legend(loc='lower right')\nplt.show()",
- "execution_count": 240,
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "V = S[0]\n",
+ "X = []\n",
+ "Y = []\n",
+ "Z = []\n",
+ "\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(V[k])\n",
+ " Z.append(V0[k])\n",
+ " \n",
+ "plt.plot(X, Y, color=\"green\", linewidth=2, label=\"Optimum\")\n",
+ "plt.plot(X, Z, \"--\", color=\"gray\", linewidth=1, label=\"Initial guess\")\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$V$\", fontsize=14)\n",
+ "plt.title(\"Value Function\")\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 229,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "C = S[1]\nX = []\nY = []\nZ = []\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(C[k])\n Z.append(f(k)-delta*k)\n\nplt.plot(X, Y, color=\"blue\", linewidth=2, label=\"capital stock: $k$\")\nplt.plot(X, Z, \"--\", color=\"gray\", linewidth=1, label=\"net product: $f(k)-\\delta k$\")\nplt.plot([k_ss], [c_ss], marker='o', color='r')\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$c$\", fontsize=14)\nplt.title(\"Policy Function: $c$\")\nplt.legend(loc='lower right')\nplt.show()",
- "execution_count": 229,
- "outputs": [
- {
- "data": {
- "image/png": "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\nJfr163fiGWPefq4FbdiwgQEDBtC4cWMWLlxIgwYNTvR17NiRfv368cUXX5zy/S1evJjOnTvr9k1F\ns9ZW2S8gFrCJiYm2OElJSXbKlCl23759xR5zMp99Zm3duta6WSTW9upl7e7dpTqVSKWQmJhoT/X/\nXbAbN26crVatmk1KSir2mIyMjEJtS5YsscYY+9Zbb51omzJlijXG2BEjRngcO2nSJBsSEmKXL19u\nrbV2xowZNiQkxG7ZsuXEMc8880yhtpJev6jzFqV+/fr2tttuK7b/ZLVcfvnltmbNmnbz5s0n2nbt\n2mXDw8Ntv379TrR587lOmTLFhoSE2H379tnVq1fb5s2b2169etmDBw8WOjYkJMQOGDDgpO8r1y23\n3GInTZpkrbX2hx9+sA8++KBt2rTpic+/svHm/9PcY4BYW06/l3X75iSstfz444+0a9eOhg0blvj1\ny5a5OSTp6e777t3hiy+gnPZdE6kSevSAFi0q9qs8l+Jba5k9ezaXXXYZZ511VrHH1ahR48TfMzMz\n2b9/PzExMdSvX5+kpCSPY40xTJo0yaPttttuw1rLxx9/XKo6S3J9b9SvX58lS5awK/cetZeys7NZ\nuHAhI0aMoFWrVifamzZtypgxY/j2229JT0/3+nPNtXz5cvr160dMTAwLFy4kIiKi0DFZWVl8/vnn\nXtW5ePFi+vbty6JFi9i3bx/XXnst1lqys7O9f7NySrp9cxK7du1i9+7d9O/fv8Sv3bsXRo6E3Fu+\n7dq5eSXl+Pw+kSph927YscPfVXgvOTmZtLQ0OnfufNLjMjIyePzxx5kxYwY7duw4MRHUGENqamqh\n49u2bevx/emnn05ISAibN28uVZ0lvf6pPP3001x33XVER0cTFxfH0KFDGTduHG3atDnp65KTkzl8\n+DDt27cv1NexY0eys7PZtm0bjRo18upzBRcMhw0bRtOmTZk/f36pb73nSktLY+XKlWzYsIHIyEiG\n5my5vXv37jKdVwpTKDmJZcuWUbdu3UI/DE5lwwbo29f9MAWIjXXPt8n3DxMR8VLTppXjGgXdeuut\nvP7660yePJlevXoRERGBMYbRo0d79a/vsu7FUdbrF3TVVVdx/vnn88EHH7BgwQKeeeYZnnrqKT74\n4AMGDx5cplpLyhjDyJEjef3113nrrbe48cYby3S+77//noYNG7JmzRrWrl1Lq1ataNeuXTlVK/kp\n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\njB49ejBnzhxmzZrF7bffXqz763333UfdunUZOHAg8+fPJzk5mW7dupV4ae65556jadOm3HrrrTz5\n5JMsXryYpKQkrr/++sJRVsuqlw4dOpR6WawkmZmZHDp0iE6dOvmtv+aaa9i3b1+xyzh5eXmsX7+e\nm2++uXBdwX01OTk5xS6HHThwgJYtWwYcT6BuueUW9u3bx+nTpwFYvHgx99xzD3FxcUHHGBEqqhtP\nVXzg6xLctGmKgVnjxma5uaX2fhKRClBTugR7PB47ePCg3/olS5YU68KanZ1tjz32mF1xxRV28cUX\nW8uWLa1Xr172+uuv+207a9Ysu/zyywu72ZbVPbjg+BkZGTZ06FCLjY21xo0b2+OPP26nTp0KKFYz\ns40bN1rfvn0tJibG6tWrZ3feeaetW7euxGN+/fXX1rVrV4uKirK2bdvaokWLSuzqm5KSYh07drSo\nqCjr0KGD/fnPfy6xnJm3i+vo0aOtWbNmFh0dbW3btrVJkybZ6dOnz1svwXYJXr58uXXs2LHE1+69\n995iXZOzsrKsffv2hbHk5OTYgAEDbPr06bZly5Zi+3j66adt3rx5AccTjJSUFHvooYdsypQpNn78\n+ML/42BjLCpcXYKdWWiHL44kzrkuQNpFF6WSm3sL48fDq6+GOyqR6i09PZ34+HjS0tLo0qVLuMOp\nlpKSkpg5cybZ2dk0atQo3OFEtBkzZtC3b18++ugj8vLyeO6554qVWbFiBStXrmRW0TlIgtSrVy9+\n//vfF46yGukC+TstKAPEm1n5+68Xocs3QG7uxYB3WHkREakZDhw4QHJyMocOHSI1NZVx48aVWK5P\nnz588803xaYICNSePXswsyqTkISTkhIAHB4PFLnsJiIi1VxcXBxjx44lNTWVESNGlDgvT4EZM2aQ\nlJRUruO89NJLPP300+UNs0ZRl2CfG26AqjAtgIiIVJwFCxYEVO7GG29k165dfPnll9x2220B73/T\npk3k5ubSs2fP8oZYo6ilxMc3KaaISJU3Y8YM8vLydD9JBRsyZEhQCQl4Z+194YUXKimi6kctJT5K\nSkREpKJNnTo13CFUKWop8bnxxnBHICIiUrMpKQGioqDIgHgiIiISBkpKgDZtIAKnABAREalR9FWM\nNykRERGR8FJSAlx5ZbgjEBERESUlwIgR4Y5ARERE1CUYuOiicEcgUvNs3bo13CGISCnC9feppERE\n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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\nJfr163fiGWPefq4FbdiwgQEDBtC4cWMWLlxIgwYNTvR17NiRfv368cUXX5zy/S1evJjOnTvr9k1F\ns9ZW2S8gFrCJiYm2OElJSXbKlCl23759xR5zMp99Zm3duta6WSTW9upl7e7dpTqVSKWQmJhoT/X/\nXbAbN26crVatmk1KSir2mIyMjEJtS5YsscYY+9Zbb51omzJlijXG2BEjRngcO2nSJBsSEmKXL19u\nrbV2xowZNiQkxG7ZsuXEMc8880yhtpJev6jzFqV+/fr2tttuK7b/ZLVcfvnltmbNmnbz5s0n2nbt\n2mXDw8Ntv379TrR587lOmTLFhoSE2H379tnVq1fb5s2b2169etmDBw8WOjYkJMQOGDDgpO8r1y23\n3GInTZpkrbX2hx9+sA8++KBt2rTpic+/svHm/9PcY4BYW06/l3X75iSstfz444+0a9eOhg0blvj1\ny5a5OSTp6e777t3hiy+gnPZdE6kSevSAFi0q9qs8l+Jba5k9ezaXXXYZZ511VrHH1ahR48TfMzMz\n2b9/PzExMdSvX5+kpCSPY40xTJo0yaPttttuw1rLxx9/XKo6S3J9b9SvX58lS5awK/cetZeys7NZ\nuHAhI0aMoFWrVifamzZtypgxY/j2229JT0/3+nPNtXz5cvr160dMTAwLFy4kIiKi0DFZWVl8/vnn\nXtW5ePFi+vbty6JFi9i3bx/XXnst1lqys7O9f7NySrp9cxK7du1i9+7d9O/fv8Sv3bsXRo6E3Fu+\n7dq5eSXl+Pw+kSph927YscPfVXgvOTmZtLQ0OnfufNLjMjIyePzxx5kxYwY7duw4MRHUGENqamqh\n49u2bevx/emnn05ISAibN28uVZ0lvf6pPP3001x33XVER0cTFxfH0KFDGTduHG3atDnp65KTkzl8\n+DDt27cv1NexY0eys7PZtm0bjRo18upzBRcMhw0bRtOmTZk/f36pb73nSktLY+XKlWzYsIHIyEiG\n5my5vXv37jKdVwpTKDmJZcuWUbdu3UI/DE5lwwbo29f9MAWIjXXPt8n3DxMR8VLTppXjGgXdeuut\nvP7660yePJlevXoRERGBMYbRo0d79a/vsu7FUdbrF3TVVVdx/vnn88EHH7BgwQKeeeYZnnrqKT74\n4AMGDx5cplpLyhjDyJEjef3113nrrbe48cYby3S+77//noYNG7JmzRrWrl1Lq1ataNeuXTlVK/kp\n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\njB49ejBnzhxmzZrF7bffXqz763333UfdunUZOHAg8+fPJzk5mW7dupV4ae65556jadOm3HrrrTz5\n5JMsXryYpKQkrr/++sJRVsuqlw4dOpR6WawkmZmZHDp0iE6dOvmtv+aaa9i3b1+xyzh5eXmsX7+e\nm2++uXBdwX01OTk5xS6HHThwgJYtWwYcT6BuueUW9u3bx+nTpwFYvHgx99xzD3FxcUHHGBEqqhtP\nVXzg6xLctGmKgVnjxma5uaX2fhKRClBTugR7PB47ePCg3/olS5YU68KanZ1tjz32mF1xxRV28cUX\nW8uWLa1Xr172+uuv+207a9Ysu/zyywu72ZbVPbjg+BkZGTZ06FCLjY21xo0b2+OPP26nTp0KKFYz\ns40bN1rfvn0tJibG6tWrZ3feeaetW7euxGN+/fXX1rVrV4uKirK2bdvaokWLSuzqm5KSYh07drSo\nqCjr0KGD/fnPfy6xnJm3i+vo0aOtWbNmFh0dbW3btrVJkybZ6dOnz1svwXYJXr58uXXs2LHE1+69\n995iXZOzsrKsffv2hbHk5OTYgAEDbPr06bZly5Zi+3j66adt3rx5AccTjJSUFHvooYdsypQpNn78\n+ML/42BjLCpcXYKdWWiHL44kzrkuQNpFF6WSm3sL48fDq6+GOyqR6i09PZ34+HjS0tLo0qVLuMOp\nlpKSkpg5cybZ2dk0atQo3OFEtBkzZtC3b18++ugj8vLyeO6554qVWbFiBStXrmRW0TlIgtSrVy9+\n//vfF46yGukC+TstKAPEm1n5+68Xocs3QG7uxYB3WHkREakZDhw4QHJyMocOHSI1NZVx48aVWK5P\nnz588803xaYICNSePXswsyqTkISTkhIAHB4PFLnsJiIi1VxcXBxjx44lNTWVESNGlDgvT4EZM2aQ\nlJRUruO89NJLPP300+UNs0ZRl2CfG26AqjAtgIiIVJwFCxYEVO7GG29k165dfPnll9x2220B73/T\npk3k5ubSs2fP8oZYo6ilxMc3KaaISJU3Y8YM8vLydD9JBRsyZEhQCQl4Z+194YUXKimi6kctJT5K\nSkREpKJNnTo13CFUKWop8bnxxnBHICIiUrMpKQGioqDIgHgiIiISBkpKgDZtIAKnABAREalR9FWM\nNykRERGR8FJSAlx5ZbgjEBERESUlwIgR4Y5ARERE1CUYuOiicEcgUvNs3bo13CGISCnC9feppERE\n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\n",
+ "text/plain": [
+ ""
]
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "C = S[1]\n",
+ "X = []\n",
+ "Y = []\n",
+ "Z = []\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(C[k])\n",
+ " Z.append(f(k)-delta*k)\n",
+ "\n",
+ "plt.plot(X, Y, color=\"blue\", linewidth=2, label=\"capital stock: $k$\")\n",
+ "plt.plot(X, Z, \"--\", color=\"gray\", linewidth=1, label=\"net product: $f(k)-\\delta k$\")\n",
+ "plt.plot([k_ss], [c_ss], marker='o', color='r')\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$c$\", fontsize=14)\n",
+ "plt.title(\"Policy Function: $c$\")\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 220,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "K = S[2]\nX = []\nY = []\n\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(K[k])\n\nplt.plot(X, Y, color=\"black\", linewidth=2)\nplt.plot(X, X, \"--\", color=\"gray\", linewidth=1)\nplt.plot([k_ss], [k_ss], marker='o', color='r')\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$k^{\\prime}$\", fontsize=14)\nplt.title(\"Policy Function: $k^{\\prime}$\")\nplt.show()",
- "execution_count": 220,
- "outputs": [
- {
- "data": {
- "image/png": "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\nWUJ6ejoJCQl07tyZSpUqhWx/zjkWLFjALbfcwpVXXsmiRYtCtq+S0l05IiIiERTuviQ//fQTDzzw\nAO+//75/rEePHvznP/+hRo0aIdtvcSmYiIiIRIDH42HZsmVh6976zTff0L9/fxYuXBgwfsopp/D0\n009TvXr1kO27JBRMREREIuCHH35g1apVIa+SrF27lqeeeoq5c+cGXLdy5plnMmLECDp27EitWrVC\nsu/SUDARERGJgHPPPZe0tLSQhYLdu3fz1FNPMW7cODwej3+8cuXK3H///TzxxBOccsopIdl3WSiY\niIiIREgoQsn+/fsZNGgQU6ZMCRg3M/r06cMTTzzBySefHPT9BouCiYiISBz45ZdfePnll5k8eTL/\n+9///OOVKlVi8ODBPPLII1F1yqYwCiYiIiIhkp2dTeXKlUO+n7fffpu//OUvbN++3T9WuXJl7rjj\nDoYMGcLll18e8jkEi/qYiIiIBFlOTg5Llixh0qRJ7N+/PyT7cM7x8ssvc95553HnnXcGhJKUlBS+\n+uor5syZE1OhBFQxERERCarMzEzmzZvHzp07SU5OpmrVqkHdvsfjIT09nSlTpvD5558HvNamTRv6\n9+9PcnIyCQmxWXtQMBEREQmCcPQlWbt2Lb179+bjjz8OGG/UqBGjRo3i7rvvjvknDyuYiIiIlFGo\nu7euWbOGHj16sH79+oDxs88+mxdffJHWrVsHbV+RpmAiIiJSBjt27CA9PT0kVZLVq1fz4osvMnv2\n7IBeJI0aNWLixInccsstMXvKpjAKJiIiImVw+umnc+edd3LhhRcGrUqyb98+Bg4cyEsvvRQwXr9+\nfXr06MHDDz8c1b1IykLBREREpIwuueSSoGxn586dDBkyhFmzZpGdne0fr1SpEiNHjmTQoEEhfepw\nNFAwERERibDdu3fz2muv8dhjj7Fjxw7/eLVq1ejfvz/du3fnrLPOiuAMw0fBREREJEKys7OZPn06\ngwcPZt++fQGvdejQgfHjx9OwYcMIzS4y4uuKGRERkSDLzMxk1qxZHDx4MGjb9Hg8PPPMM9SuXZte\nvXoFhJL27duTlZXFO++8U+5CCahiIiIiUqCcnByWL1/u70ty6NChoFxwum7dOnr27Mknn3wSMN6m\nTRt69erFH//4x5jvRVIWCiYiIiL55O3eGqy+JJ9++impqanH9SK58cYb6d+/P3/84x/LtP14oWAi\nIiLik79KEoy+JIsXL2b48OHHVUjOP/98Zs6cybXXXlum7ccbBRMRERHg0KFDZGRkBK1K8tlnnzFh\nwgQyMjICxs866yxSU1N55JFHgv4cnXigYCIiIgJUqVKF8847j9tvv71MVZIdO3bQu3dv3nzzzYDx\nU045hf79+zNgwIC470VSFgomIiIigJnRqlWrUq+/ZcsWnn76aWbPns3evXv949WqVePpp5/mwQcf\njLv28aGgYCIiIlIGR48eZfr06QwaNCjgtt9TTjmFBx54gL/85S80aNAgchOMMQomIiIipeDxeBg/\nfjyPPvoohw4dCnjtjjvu4IUXXgjqA/3KC9WURESkXPB4PKxYsYLDhw+XaTuHDx9m1KhRJCYmMmjQ\noIBQ0rVrVzZv3sxbb72lUFJKqpiIiEjcy8rKYu7cuezcuZO6detywQUXlGo7q1evpmvXrnz11VcB\n4zfeeCMDBgzglltuCcZ0y7WorZiY2RAzW21me81sm5m9Y2bnF2O9P5vZ12Z2yMw2mtmt4ZiviIhE\nH4/Hw5IlS0hPTychIYEHHnigVKFk8eLFNG/enKuvvjoglFxzzTWsWrWKxYsXK5QESTRXTJKA54E1\neOc5FvjQzC5yzh0qaAUzuxZ4HRgELAI6AXPNrIlz7quC1hERkfiUt0qSnJxMUlJSifuSfP7550yY\nMIGZM2cGjDdr1oyMjAwuvfTSYE5ZiOJg4pxrnfd7M+sCbAeaASsLWS0NeM8596zv+5Fm1groDfQM\n0VRFRCSK5ObmsnTp0jJ1b/3pp5945JFHjutFUrt2bQYMGKBeJCEUtcGkALUBB+w6wTLNgfH5xj4A\n2odqUiIiEl3MjJ9//rlUVZItW7bQs2dPFi1aFDCuXiThExPBxLyPWXwOWFnEKZl6wLZ8Y9t84yIi\nUg6YGR07dizRE3r/+9//kp6ezpQpU47rRdK9e3d69uypXiRhEhPBBJgCXAy0iPREREQk+hU3lOTk\n5DB+/HhGjRrFkSNH/OM1atTg3nvvZfjw4brtN8yiPpiY2WSgNZDknMsqYvGfgcR8Y4m+8UL169eP\nWrVqBYx17NiRjh07lnC2IiISCw4fPswbb7zBxIkT2bBhQ8Br3bp1Y/z48dSuXTtCs4s+c+bMYc6c\nOQFje/bsCcm+zDkXkg0Hgy+UtAdSnHObi7H8G0BV51z7PGOrgI3OueMufjWzpsDatWvX0rRp0yDO\nXEREQikrK4tTTz2Vk046qUTrHTlyhAULFjBy5Ei+/vpr/7iZ0b17d3r37s3ll18e7OnGpXXr1tGs\nWTOAZs65dcHabtRWTMxsCtARaAccMLNjlZA9zrnDvmVeAbY654b6XpsILDWzh/HeLtwR7108D4R1\n8iIiEhI5OTksX76clStXct1115GcnFzsdT/66CO6d+/Oli1bAsbPP/98Zs6cybXXXhvs6UopRG0w\nAR7EexfO0nzjXYFZvn/XBzzHXnDO/dvM7gae8H1tAtqrh4mISOzL25ckJSWFFi2Kd9nhF198wfjx\n48nIyAgYb9KkCYMGDaJ9+/ZUqVIlBDOW0ojaYOKcK/J+LOfcDQWMvQW8FZJJiYhI2Hk8HpYtW1bi\nviRbt26lb9++/P3vfw8Yb9asGb169aJz585UrBi1vwbLLf0vIiIiUas03Vt//PFHevXqVWAvkmee\neYbU1FT1IoliCiYiIhK1PvroI/8zboqqkng8HqZNm8agQYOO60Vy//3306tXL/UiiQEKJiIiErXu\nvPNOqlSpcsIqybFeJH/96185dOi3R6nVqFGDzp07M3LkSBIT83eSkGilYCIiIlGrWrVqhb52+PBh\n/va3vzFx4kTWr18f8Fr37t0ZN27ccT2qJPopmIiISMxZvXo1Xbp0CehFAnD99dczePBgbr755gjN\nTMpKwURERCLG4/GQm5tb7Cf1fvTRRzz66KP861//Chi/4IILyMjI4JprrgnFNCWMdFmyiIhERFZW\nFtOmTeMf//hHkct+8cUXdO3alZtvvjkglDRt2pQ33niDDRs2KJTECVVMREQkrPL3JWncuHGhy2Zl\nZZGWlnZcL5JatWoxaNAgBgwYoF4kcUb/a4qISNjk797asmXLAu+4US+S8kvBREREQq643Vs3b95M\neno6kydPZv/+/f7xU045hW7dutG7d2/1IolzCiYiIhJyCxcu5LPPPiu0SpKTk8O4ceMYNWoU2dnZ\n/vEaNWpw7733MnLkSOrWrRvuaUsEKJiIiEjItWzZkquvvvq4Ksnhw4d58803mTBhAhs2bAh4Tb1I\nyicFExERCbnTTjvtuLFPPvmELl268J///Mc/lpCQ4D9lc8UVV4RzihIlFExERCSsPvzwQ/7617+q\nF4kUSMFERETC4ssvv2TcuHFkZGQEjDdt2pQBAwbQoUMHqlSpEpnJSdRQMBERkTI5dscNwA033HDc\n69u3b6dnz5689dZbAeM1a9Zk8ODB6kUiAfSTICIipZa/L0leP/zwAxMmTOCVV15hz549/vHq1asz\nbtw4evTogZmFe8oS5RRMRESkxE7UlyQ3N5epU6cycODAgF4ktWvXplu3bqSlpXHOOedEauoS5RRM\nRESkRPJWSZKTk0lKSqJChQrk5OTwzDPPMHr0aA4dOhSwzp/+9CdeeOEF9SKRIimYiIhIsa1du5ZF\nixYFVEkOHz7M66+/zoQJE1i/fn3A8t26dWPw4ME0atQoQjOWWKNgIiIixXbWWWcFdG8tqBcJQEpK\nCkOHDuXmm2+O0EwlVimYiIhIsSUmJpKYmMiHH37I6NGjWblyZcDrF154IRkZGVx99dURmqHEOgUT\nEREptr179/LII48wffr0gPGmTZvSv39/br/9dvUikTJRMBERkSJt376dkSNHMmvWrIALW2vUqMHQ\noUPp37+/epFIUOinSERE/LKyssjMzKRZs2YA7N+/n1mzZjFy5Eh++eUX/3LqRSKhomAiIiIBfUnO\nOOMMrrjiCqZPn86AAQMCepEAtGvXjkmTJqkXiYSEgomISDmXty9JUlISmzZt4sorr2Tjxo0By6kX\niYSDgomISDmVv3vr9ddfT79+/VizZk3Acrfeeiu9evWiTZs2EZqplCcKJiIi5dC2bdt4++232blz\nJw0bNmTSpEl8+umnAcucffbZTJ8+nVatWkVollIeKZiIiJRDHo+HhIQE9u/fz3333Udubq7/tQsv\nvJAnn3ySNm3a6E4bCTv9xImIlDN79uzhscceY+rUqQHjZ5xxBqmpqQwaNEi9SCRiFExERMqJX375\nhdmzZzN+/Hh++ukn/3jlypV57LHHeOSRR1QhkYjTT6CISJwrrBdJQkICHTp0YPTo0Vx88cURnKHI\nbxRMRETikMfjYcuWLbz//vsMHDjwuF4kN910E9OnT1cvEok6CiYiInEmMzOTOXPm8OuvvzJu3DgO\nHz7sf61NmzY89NBD3HzzzerYKlFJwUREJE54PB7+/ve/89VXX7Ft2zbmzp3rDyXqRSKxQsFERCQO\nLF68mCVLllCxYkWWL1/OihUryM3N5eyzz+bll1/mpptuivQURYpFwUREJIY45wJOwezfv58xY8ZQ\nqVIldu3axdy5c9m2bRvnnHMOPXr0oHfv3tSsWTOCMxYpGQUTEZEot2/fPsYNG8aqBQuodvQoBypV\n4sqbb6ZyYiKLFi2idevWLFu2jBUrVgAwePBgRo0apV4kEpMUTEREoti+ffu4s3lzHv76ax7NzcUA\nByyaNo0eQBbw7bffkp2dzbBhw+jVqxeJiYmRnbRIGSiYiIhEsXHDhvHw11/zxzwt4w1oC0wFOgMX\nXHwxM2fOVC8SiQsKJiIiUWzVggU8mieU5NUWuKxePZZ//LFu/ZW4kRDpCYiISME2b97MocxMCosc\nBpxaoUI4pyQScgomIiJR5osvvuDOO+/koosuYk9CAq6Q5RxwoFIlVUskriiYiIhEiZycHJ544gma\nNm3Kv//9b+6//37OvOwy3i1k+fcTEmjZrl1Y5ygSarrGREQkwg4dOsTTTz/N1KlT2b59O8nJySQl\nJbFt2zYaNm3KhP37SfjmG/6Y566c9xMSmHDRRbz1+OORnr5IUCmYiIhESE5ODgsXLmTQoEF8++23\nnHHGGfTo0YM6derg8XgYP3481apVY9++fYwfPpxn58/n5KNHOVipEi3ateOtxx+nRo0akX4bIkGl\nYCIiEgHvvfcePXr04KeffgKgVq1adO/enf3795OSksKNN97oX7ZGjRo8OnEiTJx4XOdXkXijYCIi\nEkbffvstY8aM4ZVXXgkYv/DCC0lJSeG6666jwgnutFEokXinYCIiEgbbtm2jZ8+evP322wHjTZo0\noWfPnnTp0oWKFfWRLKL/F4iIhNAPP/zA888/z4wZM/j111/94zVq1ODZZ5/l/vvvVxVEJI+ovV3Y\nzJLMbL6ZbTWzXDM74T1xZpbiWy7vl8fM6oZrziIix+Tm5jJlyhQuvfRSnn32WX8oqV27Nn369OGL\nL76ge/fuCiUi+URzxaQasAF4GXi7iGWPccD5wD7/gHPbgz81EZGCHT16lKeffpqnnnqKffv8H0Wc\nccYZdO7cmdTUVBo2bBjBGYpEt6gNJs6594H3Aaxkf1LscM7tDc2sREQK9/nnn9OlSxfWrVvnH6tQ\noQJpaWnUrl2bunXr6vZekSJEbTApJQM2mFkV4AvgUefcvyI8JxGJc//617/o27cvn376acD4rbfe\nyvXXX8/hw4dJSkoiKSnphHfciEh8BZMsIBVYA5wEPAAsNbM/OOc2RHRmIhKXDh48yIgRI5gwYQLO\n/fZEm0svvZTBgwfz3//+l5o1a9K5c2fq1asXwZmKxI64CSbOuW+Bb/MMfWxm5wL9gPsiMysRiUe/\n/vorgwYNIj09PSCQJCYm8pe//IXTTz+dzZs3+1vLq0oiUnxxE0wKsRpoUdRC/fr1o1atWgFjHTt2\npGPHjqGal4jEoF27dvHaa6/x1FNPsXXrVv/4SSedxOjRo3n44YepUKECK1asoFGjRqqSSNyYM2cO\nc+bMCRjbs2dPSPZledN+tDKzXKCDc25+Cdf7ENjrnPtTIa83BdauXbuWpk2bBmGmIhKPnHPMmTOH\nhx56iF27dvnHzYz27dszduxYLrzwwgjOUCT81q1bR7NmzQCaOefWFbV8cUVtxcTMqgHn4b2gFaCh\nmV0B7HLO/c/MxgJnOufu8y3fB/ge+BKogvcak+uBVmGfvIjEhdzcXP7xj38wYcIE3nvvvYDXbrnl\nFtLT06lfv36EZicSn6I2mABXAv/E25vEAeN9468A3YB6QN5PhMq+Zc4EDgKfATc655aHa8IiEj82\nb97M/fffz9KlSwPG27RpQ+/evbnlllvUHE0kBKK286tzbplzLsE5VyHfVzff612dczfkWf4Z51wj\n51w159zpzjmFEhEpsc8//5w///nPXHDBBQGhpG7durz11lvMnTuXKlWqBDRPE5HgieaKiYhI2Bw9\nepSnnnqKxx57jKNHj/rHzz77bPr27cu9997LkSNHSE9PZ+fOndSpU4dLL700gjMWiU8KJiJSrh08\neJBnnnmGadOmkZmZGfBaz549efLJJ6latSrLly9n5cqVJCYm8sADD+iOG5EQUTARkXLJ4/GwaNEi\n+vfvz6ZNm/zjFSpUYMCAAQwfPpxq1aqRmZnJq6++ys6dO9WXRCQMFExEpNx59913SU1N5aeffgoY\nb9asGS+99BJXXnklzjmWLFmiKolImCmYiEi58euvv9KvXz8yMjICxq+55hqmTZvGZZdd5h8zM/bt\n26cqiUiYKZiISNz7+eefGT16NLNnzw64m6Zx48b07NmTbt26FRg82rVrp1uCRcJMwURE4tahQ4d4\n5ZVXGDp0KLt37/aP16xZk2effZZu3bqdMHgolIiEn4KJiMSd3NxcpkyZwuDBgzlw4EDAa7fddhsv\nvPCCOraKRKmobbAmIlJSzjk++eQTbrjhBh566KGAUHLXXXexdetW5s+f7w8lmZmZ7N+/P1LTFZEC\nqGIiInHhs88+4/7772fNmjUB461atSItLY22bdv6x3Jycvx9Sa655hpuvvnmcE9XRAqhYCIiMW3N\n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\n+uuv+8dGjBjBX//616A3TcvMzGTevHnq3ioiInFLwaQMfvnlF1q1asX69esBqFSpEs8880xIOrku\nX76cpUuXqkoiIiJxTcGklLZv307btm39oaRixYrMmjWLu+66KyT7q1ixoqokIiIS9xRMSmHHjh20\na9eOTz/9FIDTTjuNDz74gGbNmoVsn9dee23Iti0iIhItFExKaPfu3dx6662sXbsWgLp167Jw4cKQ\nhhIREZHyQsGkBPbu3ct1113HZ599BkCdOnVYsGABV111VYRnJiIiEh8UTIpp7969tGjRgi+++AKA\n2rVr8+GHH9KkSZOgbD8rKwsz00WtIiJSrqnBWjH88ssvpKSk+ENJjRo1WL58eVBCicfjYcmSJf5m\naSIiIuWZKiZFyM3N5b777mPDhg0A1KpVixUrVnDZZZeVedtZWVnMnTuXnTt3kpycTFJSUpm3KSIi\nEssUTIrw5JNPsmjRIsB7983ixYvLHEo8Hg/Lli1T91YREZF8FExOYOzYsQwbNgwAM+P111+ncePG\nZdpmQVUS9SURERHxUjApxOLFi/2hBGD48OHcfPPNZd7uN998Q0JCgqokIiIiBVAwKUBWVhadOnXC\nOQf89uybYEhKSlKVREREpBAKJvl4PB7uvvtutm/fDsCtt97Ko48+GrRn3yiQiIiIFE63C+fz2GOP\nsXTpUgB+97vfMWvWLBISdJhERETCQb9x81i9ejWjR48GvJWNN954gzp16pRoGzk5OezduzcU0xMR\nEYl7OpXjk5uby5AhQ/zXlYwePZqWLVuWaBuZmZnMmzePSpUqcf/99wft9I+IiEh5oWDik56ezpIl\nSwBo0KAB/fv3L/a6+fuStG3bVqFERESkFBRMgCNHjvhP4QC89NJLVKpUqVjr5u1LkpKSQsuWLXWB\nq4iISCkpmADz5s1j69atALRv355bbrmlyHXUvVVERCT4FEyAGTNm+P89atSoYq2zevVqVq1ape6t\nIiIiQaRgAuzYsQPwVkuK+8Tgq666ioYNG5KYmBjKqYmIiJQrul04j4EDBxZ72YoVKyqUiIiIBJmC\nic/5559P8+bNIz0NERGRck3BxOeOO+447hbf3NzcCM1GRESkfIr6YGJmvczsezM7ZGYfm9lVRSz/\nZzP72rf8RjO7tTj7adu2rf/fHo+HJUuW8MorryichMCcOXMiPYVyR8c8/HTMw0/HPD5EdTAxs/8H\n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\ngDH+AP80qw+Kyq1jAAAAAElFTkSuQmCC\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\nWUJ6ejoJCQl07tyZSpUqhWx/zjkWLFjALbfcwpVXXsmiRYtCtq+S0l05IiIiERTuviQ//fQTDzzw\nAO+//75/rEePHvznP/+hRo0aIdtvcSmYiIiIRIDH42HZsmVh6976zTff0L9/fxYuXBgwfsopp/D0\n009TvXr1kO27JBRMREREIuCHH35g1apVIa+SrF27lqeeeoq5c+cGXLdy5plnMmLECDp27EitWrVC\nsu/SUDARERGJgHPPPZe0tLSQhYLdu3fz1FNPMW7cODwej3+8cuXK3H///TzxxBOccsopIdl3WSiY\niIiIREgoQsn+/fsZNGgQU6ZMCRg3M/r06cMTTzzBySefHPT9BouCiYiISBz45ZdfePnll5k8eTL/\n+9///OOVKlVi8ODBPPLII1F1yqYwCiYiIiIhkp2dTeXKlUO+n7fffpu//OUvbN++3T9WuXJl7rjj\nDoYMGcLll18e8jkEi/qYiIiIBFlOTg5Llixh0qRJ7N+/PyT7cM7x8ssvc95553HnnXcGhJKUlBS+\n+uor5syZE1OhBFQxERERCarMzEzmzZvHzp07SU5OpmrVqkHdvsfjIT09nSlTpvD5558HvNamTRv6\n9+9PcnIyCQmxWXtQMBEREQmCcPQlWbt2Lb179+bjjz8OGG/UqBGjRo3i7rvvjvknDyuYiIiIlFGo\nu7euWbOGHj16sH79+oDxs88+mxdffJHWrVsHbV+RpmAiIiJSBjt27CA9PT0kVZLVq1fz4osvMnv2\n7IBeJI0aNWLixInccsstMXvKpjAKJiIiImVw+umnc+edd3LhhRcGrUqyb98+Bg4cyEsvvRQwXr9+\nfXr06MHDDz8c1b1IykLBREREpIwuueSSoGxn586dDBkyhFmzZpGdne0fr1SpEiNHjmTQoEEhfepw\nNFAwERERibDdu3fz2muv8dhjj7Fjxw7/eLVq1ejfvz/du3fnrLPOiuAMw0fBREREJEKys7OZPn06\ngwcPZt++fQGvdejQgfHjx9OwYcMIzS4y4uuKGRERkSDLzMxk1qxZHDx4MGjb9Hg8PPPMM9SuXZte\nvXoFhJL27duTlZXFO++8U+5CCahiIiIiUqCcnByWL1/u70ty6NChoFxwum7dOnr27Mknn3wSMN6m\nTRt69erFH//4x5jvRVIWCiYiIiL55O3eGqy+JJ9++impqanH9SK58cYb6d+/P3/84x/LtP14oWAi\nIiLik79KEoy+JIsXL2b48OHHVUjOP/98Zs6cybXXXlum7ccbBRMRERHg0KFDZGRkBK1K8tlnnzFh\nwgQyMjICxs866yxSU1N55JFHgv4cnXigYCIiIgJUqVKF8847j9tvv71MVZIdO3bQu3dv3nzzzYDx\nU045hf79+zNgwIC470VSFgomIiIigJnRqlWrUq+/ZcsWnn76aWbPns3evXv949WqVePpp5/mwQcf\njLv28aGgYCIiIlIGR48eZfr06QwaNCjgtt9TTjmFBx54gL/85S80aNAgchOMMQomIiIipeDxeBg/\nfjyPPvoohw4dCnjtjjvu4IUXXgjqA/3KC9WURESkXPB4PKxYsYLDhw+XaTuHDx9m1KhRJCYmMmjQ\noIBQ0rVrVzZv3sxbb72lUFJKqpiIiEjcy8rKYu7cuezcuZO6detywQUXlGo7q1evpmvXrnz11VcB\n4zfeeCMDBgzglltuCcZ0y7WorZiY2RAzW21me81sm5m9Y2bnF2O9P5vZ12Z2yMw2mtmt4ZiviIhE\nH4/Hw5IlS0hPTychIYEHHnigVKFk8eLFNG/enKuvvjoglFxzzTWsWrWKxYsXK5QESTRXTJKA54E1\neOc5FvjQzC5yzh0qaAUzuxZ4HRgELAI6AXPNrIlz7quC1hERkfiUt0qSnJxMUlJSifuSfP7550yY\nMIGZM2cGjDdr1oyMjAwuvfTSYE5ZiOJg4pxrnfd7M+sCbAeaASsLWS0NeM8596zv+5Fm1groDfQM\n0VRFRCSK5ObmsnTp0jJ1b/3pp5945JFHjutFUrt2bQYMGKBeJCEUtcGkALUBB+w6wTLNgfH5xj4A\n2odqUiIiEl3MjJ9//rlUVZItW7bQs2dPFi1aFDCuXiThExPBxLyPWXwOWFnEKZl6wLZ8Y9t84yIi\nUg6YGR07dizRE3r/+9//kp6ezpQpU47rRdK9e3d69uypXiRhEhPBBJgCXAy0iPREREQk+hU3lOTk\n5DB+/HhGjRrFkSNH/OM1atTg3nvvZfjw4brtN8yiPpiY2WSgNZDknMsqYvGfgcR8Y4m+8UL169eP\nWrVqBYx17NiRjh07lnC2IiISCw4fPswbb7zBxIkT2bBhQ8Br3bp1Y/z48dSuXTtCs4s+c+bMYc6c\nOQFje/bsCcm+zDkXkg0Hgy+UtAdSnHObi7H8G0BV51z7PGOrgI3OueMufjWzpsDatWvX0rRp0yDO\nXEREQikrK4tTTz2Vk046qUTrHTlyhAULFjBy5Ei+/vpr/7iZ0b17d3r37s3ll18e7OnGpXXr1tGs\nWTOAZs65dcHabtRWTMxsCtARaAccMLNjlZA9zrnDvmVeAbY654b6XpsILDWzh/HeLtwR7108D4R1\n8iIiEhI5OTksX76clStXct1115GcnFzsdT/66CO6d+/Oli1bAsbPP/98Zs6cybXXXhvs6UopRG0w\nAR7EexfO0nzjXYFZvn/XBzzHXnDO/dvM7gae8H1tAtqrh4mISOzL25ckJSWFFi2Kd9nhF198wfjx\n48nIyAgYb9KkCYMGDaJ9+/ZUqVIlBDOW0ojaYOKcK/J+LOfcDQWMvQW8FZJJiYhI2Hk8HpYtW1bi\nviRbt26lb9++/P3vfw8Yb9asGb169aJz585UrBi1vwbLLf0vIiIiUas03Vt//PFHevXqVWAvkmee\neYbU1FT1IoliCiYiIhK1PvroI/8zboqqkng8HqZNm8agQYOO60Vy//3306tXL/UiiQEKJiIiErXu\nvPNOqlSpcsIqybFeJH/96185dOi3R6nVqFGDzp07M3LkSBIT83eSkGilYCIiIlGrWrVqhb52+PBh\n/va3vzFx4kTWr18f8Fr37t0ZN27ccT2qJPopmIiISMxZvXo1Xbp0CehFAnD99dczePBgbr755gjN\nTMpKwURERCLG4/GQm5tb7Cf1fvTRRzz66KP861//Chi/4IILyMjI4JprrgnFNCWMdFmyiIhERFZW\nFtOmTeMf//hHkct+8cUXdO3alZtvvjkglDRt2pQ33niDDRs2KJTECVVMREQkrPL3JWncuHGhy2Zl\nZZGWlnZcL5JatWoxaNAgBgwYoF4kcUb/a4qISNjk797asmXLAu+4US+S8kvBREREQq643Vs3b95M\neno6kydPZv/+/f7xU045hW7dutG7d2/1IolzCiYiIhJyCxcu5LPPPiu0SpKTk8O4ceMYNWoU2dnZ\n/vEaNWpw7733MnLkSOrWrRvuaUsEKJiIiEjItWzZkquvvvq4Ksnhw4d58803mTBhAhs2bAh4Tb1I\nyicFExERCbnTTjvtuLFPPvmELl268J///Mc/lpCQ4D9lc8UVV4RzihIlFExERCSsPvzwQ/7617+q\nF4kUSMFERETC4ssvv2TcuHFkZGQEjDdt2pQBAwbQoUMHqlSpEpnJSdRQMBERkTI5dscNwA033HDc\n69u3b6dnz5689dZbAeM1a9Zk8ODB6kUiAfSTICIipZa/L0leP/zwAxMmTOCVV15hz549/vHq1asz\nbtw4evTogZmFe8oS5RRMRESkxE7UlyQ3N5epU6cycODAgF4ktWvXplu3bqSlpXHOOedEauoS5RRM\nRESkRPJWSZKTk0lKSqJChQrk5OTwzDPPMHr0aA4dOhSwzp/+9CdeeOEF9SKRIimYiIhIsa1du5ZF\nixYFVEkOHz7M66+/zoQJE1i/fn3A8t26dWPw4ME0atQoQjOWWKNgIiIixXbWWWcFdG8tqBcJQEpK\nCkOHDuXmm2+O0EwlVimYiIhIsSUmJpKYmMiHH37I6NGjWblyZcDrF154IRkZGVx99dURmqHEOgUT\nEREptr179/LII48wffr0gPGmTZvSv39/br/9dvUikTJRMBERkSJt376dkSNHMmvWrIALW2vUqMHQ\noUPp37+/epFIUOinSERE/LKyssjMzKRZs2YA7N+/n1mzZjFy5Eh++eUX/3LqRSKhomAiIiIBfUnO\nOOMMrrjiCqZPn86AAQMCepEAtGvXjkmTJqkXiYSEgomISDmXty9JUlISmzZt4sorr2Tjxo0By6kX\niYSDgomISDmVv3vr9ddfT79+/VizZk3Acrfeeiu9evWiTZs2EZqplCcKJiIi5dC2bdt4++232blz\nJw0bNmTSpEl8+umnAcucffbZTJ8+nVatWkVollIeKZiIiJRDHo+HhIQE9u/fz3333Udubq7/tQsv\nvJAnn3ySNm3a6E4bCTv9xImIlDN79uzhscceY+rUqQHjZ5xxBqmpqQwaNEi9SCRiFExERMqJX375\nhdmzZzN+/Hh++ukn/3jlypV57LHHeOSRR1QhkYjTT6CISJwrrBdJQkICHTp0YPTo0Vx88cURnKHI\nbxRMRETikMfjYcuWLbz//vsMHDjwuF4kN910E9OnT1cvEok6CiYiInEmMzOTOXPm8OuvvzJu3DgO\nHz7sf61NmzY89NBD3HzzzerYKlFJwUREJE54PB7+/ve/89VXX7Ft2zbmzp3rDyXqRSKxQsFERCQO\nLF68mCVLllCxYkWWL1/OihUryM3N5eyzz+bll1/mpptuivQURYpFwUREJIY45wJOwezfv58xY8ZQ\nqVIldu3axdy5c9m2bRvnnHMOPXr0oHfv3tSsWTOCMxYpGQUTEZEot2/fPsYNG8aqBQuodvQoBypV\n4sqbb6ZyYiKLFi2idevWLFu2jBUrVgAwePBgRo0apV4kEpMUTEREoti+ffu4s3lzHv76ax7NzcUA\nByyaNo0eQBbw7bffkp2dzbBhw+jVqxeJiYmRnbRIGSiYiIhEsXHDhvHw11/zxzwt4w1oC0wFOgMX\nXHwxM2fOVC8SiQsKJiIiUWzVggU8mieU5NUWuKxePZZ//LFu/ZW4kRDpCYiISME2b97MocxMCosc\nBpxaoUI4pyQScgomIiJR5osvvuDOO+/koosuYk9CAq6Q5RxwoFIlVUskriiYiIhEiZycHJ544gma\nNm3Kv//9b+6//37OvOwy3i1k+fcTEmjZrl1Y5ygSarrGREQkwg4dOsTTTz/N1KlT2b59O8nJySQl\nJbFt2zYaNm3KhP37SfjmG/6Y566c9xMSmHDRRbz1+OORnr5IUCmYiIhESE5ODgsXLmTQoEF8++23\nnHHGGfTo0YM6derg8XgYP3481apVY9++fYwfPpxn58/n5KNHOVipEi3ateOtxx+nRo0akX4bIkGl\nYCIiEgHvvfcePXr04KeffgKgVq1adO/enf3795OSksKNN97oX7ZGjRo8OnEiTJx4XOdXkXijYCIi\nEkbffvstY8aM4ZVXXgkYv/DCC0lJSeG6666jwgnutFEokXinYCIiEgbbtm2jZ8+evP322wHjTZo0\noWfPnnTp0oWKFfWRLKL/F4iIhNAPP/zA888/z4wZM/j111/94zVq1ODZZ5/l/vvvVxVEJI+ovV3Y\nzJLMbL6ZbTWzXDM74T1xZpbiWy7vl8fM6oZrziIix+Tm5jJlyhQuvfRSnn32WX8oqV27Nn369OGL\nL76ge/fuCiUi+URzxaQasAF4GXi7iGWPccD5wD7/gHPbgz81EZGCHT16lKeffpqnnnqKffv8H0Wc\nccYZdO7cmdTUVBo2bBjBGYpEt6gNJs6594H3Aaxkf1LscM7tDc2sREQK9/nnn9OlSxfWrVvnH6tQ\noQJpaWnUrl2bunXr6vZekSJEbTApJQM2mFkV4AvgUefcvyI8JxGJc//617/o27cvn376acD4rbfe\nyvXXX8/hw4dJSkoiKSnphHfciEh8BZMsIBVYA5wEPAAsNbM/OOc2RHRmIhKXDh48yIgRI5gwYQLO\n/fZEm0svvZTBgwfz3//+l5o1a9K5c2fq1asXwZmKxI64CSbOuW+Bb/MMfWxm5wL9gPsiMysRiUe/\n/vorgwYNIj09PSCQJCYm8pe//IXTTz+dzZs3+1vLq0oiUnxxE0wKsRpoUdRC/fr1o1atWgFjHTt2\npGPHjqGal4jEoF27dvHaa6/x1FNPsXXrVv/4SSedxOjRo3n44YepUKECK1asoFGjRqqSSNyYM2cO\nc+bMCRjbs2dPSPZledN+tDKzXKCDc25+Cdf7ENjrnPtTIa83BdauXbuWpk2bBmGmIhKPnHPMmTOH\nhx56iF27dvnHzYz27dszduxYLrzwwgjOUCT81q1bR7NmzQCaOefWFbV8cUVtxcTMqgHn4b2gFaCh\nmV0B7HLO/c/MxgJnOufu8y3fB/ge+BKogvcak+uBVmGfvIjEhdzcXP7xj38wYcIE3nvvvYDXbrnl\nFtLT06lfv36EZicSn6I2mABXAv/E25vEAeN9468A3YB6QN5PhMq+Zc4EDgKfATc655aHa8IiEj82\nb97M/fffz9KlSwPG27RpQ+/evbnlllvUHE0kBKK286tzbplzLsE5VyHfVzff612dczfkWf4Z51wj\n51w159zpzjmFEhEpsc8//5w///nPXHDBBQGhpG7durz11lvMnTuXKlWqBDRPE5HgieaKiYhI2Bw9\nepSnnnqKxx57jKNHj/rHzz77bPr27cu9997LkSNHSE9PZ+fOndSpU4dLL700gjMWiU8KJiJSrh08\neJBnnnmGadOmkZmZGfBaz549efLJJ6latSrLly9n5cqVJCYm8sADD+iOG5EQUTARkXLJ4/GwaNEi\n+vfvz6ZNm/zjFSpUYMCAAQwfPpxq1aqRmZnJq6++ys6dO9WXRCQMFExEpNx59913SU1N5aeffgoY\nb9asGS+99BJXXnklzjmWLFmiKolImCmYiEi58euvv9KvXz8yMjICxq+55hqmTZvGZZdd5h8zM/bt\n26cqiUiYKZiISNz7+eefGT16NLNnzw64m6Zx48b07NmTbt26FRg82rVrp1uCRcJMwURE4tahQ4d4\n5ZVXGDp0KLt37/aP16xZk2effZZu3bqdMHgolIiEn4KJiMSd3NxcpkyZwuDBgzlw4EDAa7fddhsv\nvPCCOraKRKmobbAmIlJSzjk++eQTbrjhBh566KGAUHLXXXexdetW5s+f7w8lmZmZ7N+/P1LTFZEC\nqGIiInHhs88+4/7772fNmjUB461atSItLY22bdv6x3Jycvx9Sa655hpuvvnmcE9XRAqhYCIiMW3N\n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\n+uuv+8dGjBjBX//616A3TcvMzGTevHnq3ioiInFLwaQMfvnlF1q1asX69esBqFSpEs8880xIOrku\nX76cpUuXqkoiIiJxTcGklLZv307btm39oaRixYrMmjWLu+66KyT7q1ixoqokIiIS9xRMSmHHjh20\na9eOTz/9FIDTTjuNDz74gGbNmoVsn9dee23Iti0iIhItFExKaPfu3dx6662sXbsWgLp167Jw4cKQ\nhhIREZHyQsGkBPbu3ct1113HZ599BkCdOnVYsGABV111VYRnJiIiEh8UTIpp7969tGjRgi+++AKA\n2rVr8+GHH9KkSZOgbD8rKwsz00WtIiJSrqnBWjH88ssvpKSk+ENJjRo1WL58eVBCicfjYcmSJf5m\naSIiIuWZKiZFyM3N5b777mPDhg0A1KpVixUrVnDZZZeVedtZWVnMnTuXnTt3kpycTFJSUpm3KSIi\nEssUTIrw5JNPsmjRIsB7983ixYvLHEo8Hg/Lli1T91YREZF8FExOYOzYsQwbNgwAM+P111+ncePG\nZdpmQVUS9SURERHxUjApxOLFi/2hBGD48OHcfPPNZd7uN998Q0JCgqokIiIiBVAwKUBWVhadOnXC\nOQf89uybYEhKSlKVREREpBAKJvl4PB7uvvtutm/fDsCtt97Ko48+GrRn3yiQiIiIFE63C+fz2GOP\nsXTpUgB+97vfMWvWLBISdJhERETCQb9x81i9ejWjR48GvJWNN954gzp16pRoGzk5OezduzcU0xMR\nEYl7OpXjk5uby5AhQ/zXlYwePZqWLVuWaBuZmZnMmzePSpUqcf/99wft9I+IiEh5oWDik56ezpIl\nSwBo0KAB/fv3L/a6+fuStG3bVqFERESkFBRMgCNHjvhP4QC89NJLVKpUqVjr5u1LkpKSQsuWLXWB\nq4iISCkpmADz5s1j69atALRv355bbrmlyHXUvVVERCT4FEyAGTNm+P89atSoYq2zevVqVq1ape6t\nIiIiQaRgAuzYsQPwVkuK+8Tgq666ioYNG5KYmBjKqYmIiJQrul04j4EDBxZ72YoVKyqUiIiIBJmC\nic/5559P8+bNIz0NERGRck3BxOeOO+447hbf3NzcCM1GRESkfIr6YGJmvczsezM7ZGYfm9lVRSz/\nZzP72rf8RjO7tTj7adu2rf/fHo+HJUuW8MorryichMCcOXMiPYVyR8c8/HTMw0/HPD5EdTAxs/8H\n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\ngDH+AP80qw+Kyq1jAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Simulation"
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "K = S[2]\n",
+ "X = []\n",
+ "Y = []\n",
+ "\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(K[k])\n",
+ "\n",
+ "plt.plot(X, Y, color=\"black\", linewidth=2)\n",
+ "plt.plot(X, X, \"--\", color=\"gray\", linewidth=1)\n",
+ "plt.plot([k_ss], [k_ss], marker='o', color='r')\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$k^{\\prime}$\", fontsize=14)\n",
+ "plt.title(\"Policy Function: $k^{\\prime}$\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Simulation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 234,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "C = S[1]\nK = S[2]\n\nk0 = k_grid[30]\nX = [k0]\nY = [C[k0]]\nT = [0]\n\ns = 0\nt = 1\nwhile s<5:\n T.append(t)\n k = K[k0]\n X.append(k)\n c = C[k]\n Y.append(c)\n if k0 == k:\n s += 1\n k0 = k\n t += 1\n \nplt.plot(T, X, color=\"black\", linewidth=2, label=\"capital stock: $k_{t}$\")\nplt.plot(T, Y, color=\"red\", linewidth=1, label=\"consumption: $c_{t}$\")\nplt.plot([t], [k_ss], marker='o', color='black')\nplt.xlabel(\"$t$\", fontsize=14)\nplt.ylabel(\"$c_{t}$, $k_{t}$\", fontsize=14)\nplt.title(\"Path of $c$ and $k$ over time\")\nplt.legend(loc='lower right')\nplt.show()",
- "execution_count": 234,
- "outputs": [
- {
- "data": {
- "image/png": "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\neFJiIkeJj48PdgghQ/fCo/twhO6FR/fhCN0L/wq74cKBYmatgMTExER1YhIRESmGpKQk4uLiAOKc\nc0mlOZZqTERERCRkKDERERGRkKHEREREREKGEhMREREJGUpMREREJGQoMREREZGQocREREREQoYS\nExEREQkZSkxEREQkZCgxERERkZChxERERERChhITERERCRlKTERERCRkKDERERGRkKHEREREREKG\nEhMREREJGUpMREREJGQoMREREZGQocREREREcnHOBe3cSkxERESEvXv3cvfdd9O0aVNOOukkmjZt\nyt13383evXvLNI6wSEzM7AIzm21mW8ws08y6F2Gf48zscTPbYGYHzWydmd1SBuGKiIiElb1793L+\n+efz4osvsmHDBrZs2cKGDRt48cUXOf/888s0OQmLxASoAqwEBgJFrV+aCfwN6AOcBsQDPwYkOhER\nkTD2wAMPsGbNGjIzM3OVZ2ZmsmbNGkaNGlVmsVQqszOVgnNuPjAfwMzsWNub2aXABUAz59wuX/Gm\nwEUoIiKB4pzj4MGD7N+/n/3795Oamlro59TUVNLT04Mddsho0qQJt956a6HbzJkz56ikJEtmZiaz\nZ8/mueeeC0R4RwmLxKQEugHfACPM7EZgPzAb+Idz7mBQIxMRKWeccxw6dChXklBYAlHc5dTU1KB2\nxgx3HTp0KDQxcc6RlpZW6DHS0tJwzlGEuoFSK6+JSTO8GpODQA+gNvASUBO4LYhxiYiUuawvnpIk\nDEVJGvbv31/gX9sS+syMqKioQreJiooqk6QEym9iEgFkAr2dc/sAzOxeYKaZDXTOHQpqdCIixeSc\nY9euXSQnJ7N9+/Z831NSUgpMIDIyMoJ9CUUWExNDlSpVst/zfi5sXdbnY33RViQnnHDCMbfp1q0b\nL774Yr4JZkREBN27H3PMid+U18RkK7AlKynxWQMY0Aj4paAdhwwZQmxsbK6y+Ph44uPjAxGniFRQ\nzjn27NlTYJKRtywlJeWY1e1lJTo6usAkobjLeddFR0cTEREu4zLKj8cff5yFCxce1QE2IiKCFi1a\n8Nhjj2WXJSQkkJCQkGv/3bt3+y0WC7d2OzPLBHo452YXss0dwDNAXedcqq/sCuBdoGp+NSZm1gpI\nTExMpFWrVoEJXkTKLecce/fuLVKSkVV2+PDhgMQSHR1dotqGotRExMTEKHEop/bu3cuoUaOYPXs2\naWlpREVF0b17dx577DGqVatW6L5JSUnExcUBxDnnkkoTR1jUmJhZFaA5Xo0HQDMzOwvY6ZzbbGZP\nAg2cczf71r8FjAKmmNnDQB1gLPC6mnFEpDjS0tLYvHkzGzZsYOPGjWzbtq3AhCMQiUZUVBR169al\nTp061KlTJ/tzfu+1a9ematWqREZG+j0OKf+qVavGc889x3PPPVdmHV3zExaJCdAaWIQ3h4kDnvaV\nvwHcCtQHTsra2Dm338wuBp4HVgA7gBnAP8owZhEJA2lpafz6669s2LCBDRs2sH79+uzPWRNN+bNj\nZ6VKlfJNNApKNqpXrx60LwipuIL5MxcWiYlz7jMKmQzOOdcnn7L/AV0CGZeIhL709PRciUfeBOTX\nX38tVeIRGRmZb1KR3+e6desSGxurREOkEGGRmIiIFCQjIyN7+uz8aj02b95c4hEptWvXpkmTJtmv\nxo0b06BBg1xJR40aNdTnQsSPlJiISFjIyMhg/fr1/PDDD6xevTr7tXbtWg4eLNm8ibVq1cqVeOR9\nVa1a1c9XISLHosREREJKZmYmGzZsyJV8ZCUgBw4cKNaxTjjhBJo2bZpv0tG4cWOqV68eoKsQkZJS\nYiIiQZORkcHatWv5+uuvWbFiBStWrGD16tVFTkAiIyM59dRTOeOMM45KQBo3bnzUnEQiEvqUmIhI\nmXDOsWnTJr7++uvsRCQxMZF9+/Ydc9+IiAiaN29Oy5Ytc71OO+00jj/++DKIXkTKihITEQmIlJSU\n7FqQrGQkOTm50H3MjFNOOeWoBOT0008nOjq6jCIXkWBSYiIifrF9+3YWL16c/VqzZs0x9zn55JNp\n06YN5557Lm3atCEuLk79PkQqOCUmIlIiycnJfPbZZyxatIjFixfzww8/FLp9zZo1cyUhbdq0oX79\n+mUUrYiECyUmIlIkKSkpfPbZZyxevJhFixaxevXqAreNjIykdevWtG3bNjsRadasmSYWE5FjUmIi\nIvk6fPgwn3/+OfPmzWPBggV8//33BW6blYh07NiRjh070q5du2M+9EtEJD9KTEQk29atW5k3bx5z\n587lk08+KXDETERERK5EpH379kpERMQvlJiIVGCZmZmsWLGCuXPnMnfuXJKS8n9aeUREBHFxcbkS\nEXVSFZFAUGIiUsHs2rWLjz/+mLlz5/Kf//ynwCG8tWvX5rLLLqNr165ccsklnHDCCWUcqYhUREpM\nRCqAffv2MWvWLKZNm8bnn39Oenp6vtudc845dO3ala5du9KmTRsiIyPLOFIRqeiUmIiUU845vvji\nC6ZOnco777zD/v37j9qmSpUqXHzxxXTt2pXLL7+cBg0aBCFSEZEjlJiIlDObNm3ijTfeYOrUqaxb\nt+6o9c2aNaNbt2507dqVCy+8UFO6i0hIUWIiUg6kpqby/vvvM2XKFBYuXIhzLtf66tWr06tXL265\n5RbOO+88zSciIiFLiYlImHLO8dVXXzFlyhRmzJjB3r17c603Mzp37kyfPn3o0aMHMTExQYpURKTo\nlJiIhJn9+/czZcoUnn/+ef73v/8dtf6UU07hlltu4aabbuLkk08OQoQiIiWnxEQkTCQnJ/Piiy/y\nwgsvsGPHjlzrqlatyrXXXsstt9xC+/bt1VQjImFLiYlIiFu3bh0TJkzgn//8JwcOHMi1rkOHDvTp\n04errrqKqlWrBilCERH/UWIiEqISExMZN24cM2fOJDMzM7s8MjKSXr16MWzYMM4666wgRigi4n9K\nTERCiHOOjz/+mHHjxvHpp5/mWhcTE8Mdd9zBkCFDaNy4cZAiFBEJLCUmIiEgLS2NmTNnMnbsWFat\nWpVrXZ06dbjnnnsYMGAANWvWDFKEIiJlIywSEzO7ABgGxAEnAj2cc7OLuG87YDHwvXOuVcCCFCmB\ntLQ0XnvtNZ566ik2btyYa13z5s0ZOnQoN910E5UrVw5ShCIiZSssEhOgCrASeB14r6g7mVks8Aaw\nAKgXmNBEis85x3vvvcfIkSP56aefcq1r06YNI0aMoEePHnpWjYhUOGGRmDjn5gPzAax44yBfBt4E\nMoErAhCaSLF98cUXDB8+nGXLluUqv/zyyxk+fDgXXnihhvuKSIUVEewAAsXM+gBNgdHBjkUEYM2a\nNVxxxRVceOGFuZKSDh06sHz5cubOnUuHDh2UlIhIhRYWNSbFZWanAk8A7Z1zmfpFL8H022+/8fDD\nD/P666/nGvbbsmVLnnrqKS6//HIlIyIiPuUuMTGzCLzmm4ecc79kFRd1/yFDhhAbG5urLD4+nvj4\neP8FKRXCnj17GDduHBMmTCA1NTW7vEGDBjz66KPcfPPN6kMiImEnISGBhISEXGW7d+/22/Et71NI\nQ52ZZVLIqBxfh9c/gHSOJCQRvs/pwCXOucX57NcKSExMTKRVKw3ekZI7fPgwkydP5tFHHyU5OTm7\nvHr16tx///3cc889eqCeiJQrSUlJxMXFAcQ555JKc6xyV2MC7AHOzFM2CPgbcBWwoawDkooha6TN\niBEj+OWXX7LLo6KiGDhwIKNGjaJ27dpBjFBEJPSFRWJiZlWA5hypAWlmZmcBO51zm83sSaCBc+5m\n51UB/ZBn/+3AQefcmjINXCqMbdu20b9/fz744INc5fHx8Tz22GM0a9YsSJGJiISXsEhMgNbAIsD5\nXk/7yt8AbgXqAycFJzSpyJxzzJgxgzvvvDPXE387derEU089RevWrYMYnYhI+AmLxMQ59xmFDG12\nzvU5xv6j0bBh8bPt27czcOBAZs2alV1Wp04dXnrpJXr27KmRNiIiJVBu5zERCaSZM2fSsmXLXEnJ\ntddey+rVq7nqqquUlIiIlFBY1JiIhIrk5GQGDRrEzJkzs8tq167NpEmTuOaaa4IYmYhI+aDERKSI\nZs2axYABA3INAb7qqquYNGkSdevWDWJkIiLlh5pyRI4hJSWFXr16cfXVV2cnJbVq1eLtt99m5syZ\nSkpERPxINSYihXj//ffp378/27dvzy678soreemll6hXTw+sFhHxN9WYiORj165dXH/99fTs2TM7\nKTnhhBN48803mTVrlpISEZEAUY2JSB6rV6+mR48e/Pzzz9ll3bp1Y/LkyZx44olBjExEpPxTjYlI\nDu+++y5//etfs5OSGjVqMG3aND788EMlJSIiZUA1JiJARkYGo0aNYsyYMdllZ599Nu+//z5NmjQJ\nXmAiIhWMEhOp8Hbu3El8fDwff/xxdtkNN9zA5MmT9RRgEZEypqYcqdBWrVpF69ats5OSyMhInnvu\nOaZNm6akREQkCFRjIhVWQkICt912GwcOHAC859y88847dOzYMbiBiYhUYKoxkQonPT2d++67j969\ne2cnJa1btyYxMVFJiYhIkKnGRCqU5ORkevXqxcKFC7PL+vTpw6RJk4iOjg5iZCIiAkpMpAJJTEyk\nZ8+ebNq0CYBKlSoxceJE+vfvr6cBi4iECCUmUiFMmzaNvn37cujQIQDq16/PzJkzad++fZAjExGR\nnNTHRMo15xzDhg3j5ptvzk5Kzj//fBITE5WUiIiEICUmUm5lZmYycOBAxo8fn13Wr18/Fi1aRIMG\nDYIYmYiIFERNOVIuZWRkcNttt/HGG28AYGZMmjSJ/v37BzkyEREpjBITKXfS0tK48cYbmTFjBuBN\n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\nqlatGugIRUTCwk033cSBAwdyzSS6dOlSHnnkEXbt2hXEyEIvlpJ46qmnyMzMDLuHxCoxKY4DB2Do\nUOjWDbp0OebmKSkpvPrqq4D3jIE777wz0BGKiIQNMzuqads5F6RojhZKsZREZGQkP/74Y9jNmaXE\npDjGj4fffoOnny7S5i+88AIHDhwA4I477qB27dqBjE5EpFR+++03brvtNho2bEh0dDTNmjVj4MCB\n2bW+mzZtYuDAgZxxxhnExMRQu3Ztrr32WjZu3JjrOFl9Jn788UeuvfZaYmNjqV27NoMHD+bQoUPZ\n2+XtCzJ69GiGDx8OQJMmTYiIiCAyMjJ7fVHPX1T79u1j8ODBNG3alOjoaOrVq8cll1zCt99+e8xY\nAL799lsuu+wyYmNjqVatGhdddBHLly8v9n3Nz8aNG2nevDl/+ctfSE5Ozi7/8ccfsx9rciwbNmxg\n27ZttG3btqi3JCSExaickLB5szfD65AhcOqpx9x83759PP/88wBUqlSJe++9N9ARioiU2NatW2nT\npg179uyhX79+nH766WzZsoV3332X1NRUqlevzooVK1i2bBnx8fE0atSIDRs2MGnSJP72t7/xww8/\nEB0dDZDdX+Laa6+ladOmjBkzhmXLljFx4kR27drF1KlTs7fL2bfiqquu4n//+x9vv/02zz33HLVq\n1QKgjm+QQVHPX1T9+vXjvffe46677qJFixbs2LGDL7/8krVr1x4zlh9++IELL7yQ2NhY7r//fipV\nqsTkyZPp2LEjn3/+OW3atCnyfc3rl19+oVOnTtSpU4dPPvmEE044IXtdixYt6NixIwsXLjzm9S1Z\nsoSWLVuGXVMOzjm9vOq6VoBLTEx0+YqPd65ePed2785/fR7PPPOMAxzgbrrppiLtIyKhKzEx0RX6\nOyKPuLg417Bhw4C+4uLi/HZ9N910k6tUqZJLSkoqcJuDBw8eVbZ8+XJnZm769OnZZQ8//LAzM3fl\nlVfm2nbQoEEuIiLCff/9984556ZOneoiIiLcxo0bs7cZP378UWXFPX9+x81PjRo13F133VXg+sJi\n6dGjh4uOjnYbNmzILtu6daurXr2669ixY3ZZUe7rww8/7CIiItyOHTvcmjVrXMOGDd15553ndu3a\nddS2ERERrlOnToVeV5YBAwa4QYMGOeecW7ZsmRs1apSrX79+9v0vjmP9/GetB1q5Un4fq8akKL78\n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\ntqNHjzJ27Fjatm1LfHw87du3Z8KECfz73/8Oltm1axf9+/cnKSmJiy66iNtuu42tW7eWuM7MmTPx\n+XwcPHiQzMxMmjVrRnJyMmPGjOHMmTPBcl999RWTJ08mLS2N+Ph4WrVqxe233877778fLJOZmUla\nWlqpWIvuEW7fgQMHGD16NMnJyVx88cX88pe/BODIkSMMHjyYpKQkLrnkEpYsWRL2/NzcXO68806S\nkpJISUlh8uTJnD3rvaI4a9YsHnnkEQAuv/xyfD4fcXFxwV717OxsfD5fcDvSOqtMvYE3p9aRI0dK\nXaM+qCs9JjjnngGeKePYLSHbpVvxeQidTG327NnVcVkRkZiTl5fH9ddfz6lTp7j33nvp1KkTn376\nKatWreL06dMkJibyj3/8g549e5KUlMS0adNo1KgRWVlZ9O7dm3fffZfrr/cm2C56x+LOO++kffv2\nzJ8/n507d7Js2TJatWrF448/DsC9997La6+9xn333Ud6ejqff/45f/3rX9m7dy/f/e53g9cK985G\nuP1F2yNGjKBz584sWLCAN998k7lz59K8eXOysrK49dZbWbhwIcuXL+fhhx/me9/7HjfffHOpuNPS\n0pg/fz7vvfceS5cu5cSJE2RnZzN06FD279/PypUreeqpp2jRogUALVu2DBvXnj17IqqzytQbQHp6\nOr179+aPf/zjef17xzTnnD5et9x1gNuxY4crMmjQIAc4wM2ePduJSMO1Y8cOF/o3oj7JyMhwjRo1\ncjt37iyzzODBg118fLw7fPhwcF9eXp5LTEx0vXv3Du6bOXOmMzP305/+tMT5Q4cOdS1btgxuJycn\nu/vuu6/cuDIzM11aWlqp/TNnznQ+n6/UPjNzP/vZz4L7CgsLXWpqqouLi3OLFi0K7j9x4oRLSEhw\n99xzT6nzhwwZUuK6EydOdD6fz33wwQfOOecWL17sfD6f++c//1kqruzs7BLHIq2z4vevqN6cc87n\n87lbbrml1P3DOXHihHvooYfc7Nmz3dy5c11WVlZE5xVXUfsvOg5c56r4fVxnekxqW+hkag888ECU\nIxKROuX0adi3r2bvceWVUA3zKTnnWLt2LQMHDqRr165hy/j9fjZu3MiQIUO47LLLgvtbt27NXXfd\nxbJly/jqq69o2rQp4P3f/7333lviGj169GDNmjXBcsnJyWzdupW8vDwuuaTKK4YE7zt27Njgts/n\n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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiYAAAGMCAYAAADuoWlTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xd4VGXax/HvnRANoQTpAkoRC4u7KgFXAYUFFZUXRGwE\nKxaqBZQiK6tiRUBUVBTLgiwaEbHAwqIiYAFBTARdBFeliggJSA0l5Xn/OJOQhCSkzGRmkt/nuuaa\nOc9p9zmEzJ2nHXPOISIiIhIKIoIdgIiIiEgWJSYiIiISMpSYiIiISMhQYiIiIiIhQ4mJiIiIhAwl\nJiIiIhIylJiIiIhIyFBiIiIiIiFDiYmIiIiEDCUmIkFiZg+bWaaZ1SyDc7U2syVmts/MMszsL4E+\nZyBk3bNgxxGqzOwW38/UycGORaSklJiI5GFmN/t+uWe9DpjZj2b2vJnVLcHxzjezh8ysep5VzvcK\nKDOrBLwLnAAMBm4ENgb6vAFSpHtmZuPN7BMzm1gGMZW5YP9MiQSSEhOR/DlgFHADMAhYAgwAlppZ\ndDGP1RZ4EKjh1wiL7hTgZGCcc+4159xbzrndQYqlrIzA+/22J9iBBEhBP1PTgMrOuU1lH5KIfygx\nESnYfN+X+D+dc7cCzwJNgSuKeRzzf2jFUs/3Xt6TkWzOuQzgdODLYMdSUmYWU9jq/Aqd53CAQhIp\nE0pMRIpuId4XQlMAMzvZzCaZ2VozSzWzFDN7x8waZ+1gZg8BY32LG3xNQxl5+gCcYGZTzewPM9tl\nZv8saq2MmZ1jZv8xs91mttfMFpjZX3OsnwIsxqsBetd3/oWlugtHx3DM++DbLqtPzSlFuV4za29m\nK3xNaT+ZWd9ixNQELyFbWsxrKfR++ra5yncdF+Szfz/fuj/5lhv4ru93MztoZv81sz757Jd1b1qY\n2VtmthP4ooAYC/yZyq+PSY5jn2pm0333fLuZPeJbf5KZfeC75q1mdm8+5yzSdYj4Q6VgByASRpr7\n3nf43tsA5wEJwK9AE2AgsMjM/uScOwjMAk4DegH35Ng32fduwDvAOuB+oBVwO7ANGFlYML4vv8/x\nakLGAOlAP2CxmV3onFsBvOyL7QHgOWCF79j+VJT7AEf6Phzzes3sTOAjYDtek0UU8LBvuSjaAaud\nc0Vuyini/QSYC+wDruXo5OFa4L/OuR98/ZGWAxnARCAFuAx43cyqOedy9n/Jujczgf/h3YuCatoK\n+5nKr49J1vIM4Ae8Zq6uwAO+BKgf8CkwHLgeGGdmXzvnvvTdl+Jch0jpOef00kuvHC/gZrxfwn8D\nagENgevwfvHvA070bXd8PvueC2QC1+cou893vJPzbPuQb9tX8pTPArYXIc73gQNA4xxl9fG+WBfl\nKOvgO0/PIl5/LDAO+Afwd6DvMbYv6n0o8vX6rm0/0DBH2elAGpBRhGuYBLzg+/xX4FFgK3Bmae+n\nr/xN3/EsR1k9vGTm777l1/AStRp59n0L2JnzvuW4N/8q4r9RQT9TN+ctz3HsSTnKIoBNvniH5vm3\n3w/8M0dZka9DL7388VJTjkj+DO+vyGRgM94v4T1AD+fcVgDn3KHsjc0qmTfsdx2wC68moCgcMDlP\n2RdALTOrWmBwZhHAxcD7zrnsETbOud99sbYvbP9CjnuC7/wLnHOP4v01PqbQCyjefTjm9fqu7RLf\ntW3JcZ4f8WpRiqId8KWZZSWX/8L7N833d14J7ucMoC7QMUfZNb5zzPAt9wTmAJFmVivrBXyMlwAU\n5d74iwNez15wLhP4xhfvP3OU7wZ+BJrl2Le41yFSKmrKEcmfw2uO+Anvr8ptvi/GbL5+EX8HbsGr\nVbEc+8YW41x5R1D84Xs/Aa+GJj91gBi8av+81uB9AZ/k+1wcz+E1RWQlAFuA0YXtUIL7cKzrrQNU\nBn7OZ98f8ZoRCounOtASbzRSinNunm9V/UJ2K+79nI+XqF4HLPKVXQusdM79YmZ18EbM9MVrKsnL\n4SU2ea0vJMbSynvfdwMHnXM78ymvCVCK6xApMSUmIgVb4ZxLKmT9C3hV588Ay/B+oTu8v5iLUxuZ\nUUB5mY7mMbMTgXigS1aZc+7fRdi1uPch0Nd7Pl4TwxnA6Wa20Tn3k5+ODYBz7rCZfQBcaWYDgRPx\namnu922Sdd3TgTcKOMx3+ZQd8GeceeR334/1b1HS6xApMSUmIiV3FTDVOTc8q8DMjufouSUCMeFV\nMpCK1+8irxZ4fQo2F/OYbXzvxRrJQtHvQ1El431Bn5rPujOKsH874FPn3I1mNhyYDbQwswhfE0ZB\n5yzu/ZwB3AR0xquhAa9jb9bx9gKRzjm/joLyKatJ1AJ9HSJHUR8TkZLL4Oj/Q3cDkXnK9vve/TbB\nmu8L9mPgijxDQ+vh1Xp84ZwrqBmoIBHAbndkFE3WMZuZN3tsQYp6H4rEd20fAT3MrFGOOFrg9T05\nlnZ4NTcAq/H6mAAMMrPKhZyzuPdzAV4zVC+8Zpyvs/qn+I43C7jKzFrm2Q8zq12E6yiM33+m8lMG\n1yFyFNWYiOSvKM0K/wZuNLM9eMMwz8f76zklz3aJvuM9YWZv440smeOHGEcBFwFLzGwSXoLQFzgO\nb+hncX0G3peNcy7F9/lMoLdz7u+F7FfU+1AcDwGX4nVgnYQ3XPhO4L9Agc/5MbNIvBFBOYdaZ/VV\nqeycK6yppFj30zmXbmbv4SUmMXgjZXK6H69z7HIzexXv3tQE4oBOQGm+1PP7mZpdiuMVJpDXIXIU\nJSYi+StKVfndeB1jewPReLOMXoT31372/s65b8xsFNAfr/9GBL5J2koVoDdXxgXAk3hfHhF4NQW9\nnXPf5N28CMf7w8yuAp41szV4NR6bjpGUQBHvQ3E45743s0uACXidb3/Fm8+kAYUkJnidWLcAWX2D\nPgX6mtmjePOsFHbO4tzPLDOA2/CaembmOd52MzvXF/eVeI802IFXi1OSxDHnsf31M1XQv0/On9+A\nXYdIfsw5Pe9JREREQkNY9DExswvMbLaZbfFNrdy9CPtcb2YrzWy/mf1mZq9bGTxeXkREREouLBIT\noAqwEm9eiaI88rwd3tC2V4E/AVfjtTu/EsAYRUREpJTCoo+Jc24+3oRGmFlROiWeB6x3zr3oW95o\nZpNRe6iIiEhIC5cak+L6CjjJzC6D7CF/V+M9fEtERERCVLlMTJxzS4EbgBlmdhjvYVu78IYbioiI\nSIgKi6ac4vI9vvw5vMekf4w3XfR4vAdk3V7APrXwht1tAA7mt42IiIjkKxpoAnzknNtRmgOF3XBh\nM8vEe8JrgZMJmdk0vEdxX5ejrB3eU0xPdM5ty2ef3niPMhcREZGSud4591ZpDlAua0zwZmFMy1OW\niTeip6DOsxsApk+fTosWLQIXWRgYMmQIzzzzTLDDCAm6Fx7dhyN0Lzy6D0foXsCaNWu44YYbwPdd\nWhphkZiYWRWgOUeSimZmdhaw0zm32cyeBBo45272rZ8DvGJm/fFmn2yA9+TT5c653ws4zUGAFi1a\n0KpVq0BdSliIjY2t8Pcgi+6FR/fhCN0Lj+7DEboXuZS6K0RYJCZAa2ARXo2HA572lb8B3ArUB07K\n2tg594aZVQUG4fUt2YU3NfX9iIiISMgKi8TEOfcZhYwgcs71yafsReDFfDYXERGREFUuhwuLiIhI\neFJiIkeJj48PdgghQ/fCo/twhO6FR/fhCN0L/wq74cKBYmatgMTExER1YhIRESmGpKQk4uLiAOKc\nc0mlOZZqTERERCRkKDERERGRkKHEREREREKGEhMREREJGUpMREREJGQoMREREZGQocREREREQoYS\nExEREQkZSkxEREQkZCgxERERkZChxERERERChhITERERCRlKTERERCRkKDERERGRkKHEREREREKG\nEhMREREJGUpMREREJGQoMREREZGQocREREREcnHOBe3cSkxERESEvXv3cvfdd9O0aVNOOukkmjZt\nyt13383evXvLNI6wSEzM7AIzm21mW8ws08y6F2Gf48zscTPbYGYHzWydmd1SBuGKiIiElb1793L+\n+efz4osvsmHDBrZs2cKGDRt48cUXOf/888s0OQmLxASoAqwEBgJFrV+aCfwN6AOcBsQDPwYkOhER\nkTD2wAMPsGbNGjIzM3OVZ2ZmsmbNGkaNGlVmsVQqszOVgnNuPjAfwMzsWNub2aXABUAz59wuX/Gm\nwEUoIiKB4pzj4MGD7N+/n/3795Oamlro59TUVNLT04Mddsho0qQJt956a6HbzJkz56ikJEtmZiaz\nZ8/mueeeC0R4RwmLxKQEugHfACPM7EZgPzAb+Idz7mBQIxMRKWeccxw6dChXklBYAlHc5dTU1KB2\nxgx3HTp0KDQxcc6RlpZW6DHS0tJwzlGEuoFSK6+JSTO8GpODQA+gNvASUBO4LYhxiYiUuawvnpIk\nDEVJGvbv31/gX9sS+syMqKioQreJiooqk6QEym9iEgFkAr2dc/sAzOxeYKaZDXTOHQpqdCIixeSc\nY9euXSQnJ7N9+/Z831NSUgpMIDIyMoJ9CUUWExNDlSpVst/zfi5sXdbnY33RViQnnHDCMbfp1q0b\nL774Yr4JZkREBN27H3PMid+U18RkK7AlKynxWQMY0Aj4paAdhwwZQmxsbK6y+Ph44uPjAxGniFRQ\nzjn27NlTYJKRtywlJeWY1e1lJTo6usAkobjLeddFR0cTEREu4zLKj8cff5yFCxce1QE2IiKCFi1a\n8Nhjj2WXJSQkkJCQkGv/3bt3+y0WC7d2OzPLBHo452YXss0dwDNAXedcqq/sCuBdoGp+NSZm1gpI\nTExMpFWrVoEJXkTKLecce/fuLVKSkVV2+PDhgMQSHR1dotqGotRExMTEKHEop/bu3cuoUaOYPXs2\n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\nvHr16tx///3cc889eqCeiJQrSUlJxMXFAcQ555JKc6xyV2MC7AHOzFM2CPgbcBWwoawDkooha6TN\niBEj+OWXX7LLo6KiGDhwIKNGjaJ27dpBjFBEJPSFRWJiZlWA5hypAWlmZmcBO51zm83sSaCBc+5m\n51UB/ZBn/+3AQefcmjINXCqMbdu20b9/fz744INc5fHx8Tz22GM0a9YsSJGJiISXsEhMgNbAIsD5\nXk/7yt8AbgXqAycFJzSpyJxzzJgxgzvvvDPXE387derEU089RevWrYMYnYhI+AmLxMQ59xmFDG12\nzvU5xv6j0bBh8bPt27czcOBAZs2alV1Wp04dXnrpJXr27KmRNiIiJVBu5zERCaSZM2fSsmXLXEnJ\ntddey+rVq7nqqquUlIiIlFBY1JiIhIrk5GQGDRrEzJkzs8tq167NpEmTuOaaa4IYmYhI+aDERKSI\nZs2axYABA3INAb7qqquYNGkSdevWDWJkIiLlh5pyRI4hJSWFXr16cfXVV2cnJbVq1eLtt99m5syZ\nSkpERPxINSYihXj//ffp378/27dvzy678soreemll6hXTw+sFhHxN9WYiORj165dXH/99fTs2TM7\nKTnhhBN48803mTVrlpISEZEAUY2JSB6rV6+mR48e/Pzzz9ll3bp1Y/LkyZx44olBjExEpPxTjYlI\nDu+++y5//etfs5OSGjVqMG3aND788EMlJSIiZUA1JiJARkYGo0aNYsyYMdllZ599Nu+//z5NmjQJ\nXmAiIhWMEhOp8Hbu3El8fDwff/xxdtkNN9zA5MmT9RRgEZEypqYcqdBWrVpF69ats5OSyMhInnvu\nOaZNm6akREQkCFRjIhVWQkICt912GwcOHAC859y88847dOzYMbiBiYhUYKoxkQonPT2d++67j969\ne2cnJa1btyYxMVFJiYhIkKnGRCqU5ORkevXqxcKFC7PL+vTpw6RJk4iOjg5iZCIiAkpMpAJJTEyk\nZ8+ebNq0CYBKlSoxceJE+vfvr6cBi4iECCUmUiFMmzaNvn37cujQIQDq16/PzJkzad++fZAjExGR\nnNTHRMo15xzDhg3j5ptvzk5Kzj//fBITE5WUiIiEICUmUm5lZmYycOBAxo8fn13Wr18/Fi1aRIMG\nDYIYmYiIFERNOVIuZWRkcNttt/HGG28AYGZMmjSJ/v37BzkyEREpjBITKXfS0tK48cYbmTFjBuBN\n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\nqlatGugIRUTCwk033cSBAwdyzSS6dOlSHnnkEXbt2hXEyEIvlpJ46qmnyMzMDLuHxCoxKY4DB2Do\nUOjWDbp0OebmKSkpvPrqq4D3jIE777wz0BGKiIQNMzuqads5F6RojhZKsZREZGQkP/74Y9jNmaXE\npDjGj4fffoOnny7S5i+88AIHDhwA4I477qB27dqBjE5EpFR+++03brvtNho2bEh0dDTNmjVj4MCB\n2bW+mzZtYuDAgZxxxhnExMRQu3Ztrr32WjZu3JjrOFl9Jn788UeuvfZaYmNjqV27NoMHD+bQoUPZ\n2+XtCzJ69GiGDx8OQJMmTYiIiCAyMjJ7fVHPX1T79u1j8ODBNG3alOjoaOrVq8cll1zCt99+e8xY\nAL799lsuu+wyYmNjqVatGhdddBHLly8v9n3Nz8aNG2nevDl/+ctfSE5Ozi7/8ccfsx9rciwbNmxg\n27ZttG3btqi3JCSExaickLB5szfD65AhcOqpx9x83759PP/88wBUqlSJe++9N9ARioiU2NatW2nT\npg179uyhX79+nH766WzZsoV3332X1NRUqlevzooVK1i2bBnx8fE0atSIDRs2MGnSJP72t7/xww8/\nEB0dDZDdX+Laa6+ladOmjBkzhmXLljFx4kR27drF1KlTs7fL2bfiqquu4n//+x9vv/02zz33HLVq\n1QKgjm+QQVHPX1T9+vXjvffe46677qJFixbs2LGDL7/8krVr1x4zlh9++IELL7yQ2NhY7r//fipV\nqsTkyZPp2LEjn3/+OW3atCnyfc3rl19+oVOnTtSpU4dPPvmEE044IXtdixYt6NixIwsXLjzm9S1Z\nsoSWLVuGXVMOzjm9vOq6VoBLTEx0+YqPd65ePed2785/fR7PPPOMAxzgbrrppiLtIyKhKzEx0RX6\nOyKPuLg417Bhw4C+4uLi/HZ9N910k6tUqZJLSkoqcJuDBw8eVbZ8+XJnZm769OnZZQ8//LAzM3fl\nlVfm2nbQoEEuIiLCff/9984556ZOneoiIiLcxo0bs7cZP378UWXFPX9+x81PjRo13F133VXg+sJi\n6dGjh4uOjnYbNmzILtu6daurXr2669ixY3ZZUe7rww8/7CIiItyOHTvcmjVrXMOGDd15553ndu3a\nddS2ERERrlOnToVeV5YBAwa4QYMGOeecW7ZsmRs1apSrX79+9v0vjmP9/GetB1q5Un4fq8akKL78\nEhISYMoUKELmefjwYZ7O0dyTVR0oIhXH77//zpYtW4IdRpE45/jwww/p3r0755xzToHbHZ9jhuv0\n9PPdQykAABxjSURBVHT27NlDs2bNqFGjBklJSVx//fXZ682MQYMG5dr/rrvuYtKkScybN48zzzyz\n2HH+f3v3Hh5Vdf97/P2doA0BkwBBEAwa5AcGLxTBHq1yUyuXY7kVBCzmidAihYrgDfBXy+UAchN/\nco7WKMfGKoF6UEArFrC1tQWEcrE/oRAQoaJEnqAFVILYzDp/7MmQTCbJhFxmknxezzPP49577b2/\nWaxkvq6911qVuX8kkpOT2bp1K3l5eVxyySURn+f3+9m4cSNDhgzhsssuC+5v3bo1d911F8uWLeOr\nr76iSZMmEdVrkQ8++IARI0bQsWNH1q1bF3awRGFhYcRxbtq0ienTp/POO+9QUFDA3XffzfPPP4/f\n74/4GtGgxKQihYUwaRJ07w4ZGRGdkpOTwyeffALAwIEDuaqCxf1EpP5p3bp1nblHfn4+p06dqvBv\n1ZkzZ5g3bx7Z2dl8+umnwZdDzSzsWikdOnQosX3FFVfg8/k4fPjwecVZ2ftXZOHChWRmZpKamkq3\nbt0YMGAAGRkZpKWllXtefn4+p0+fpmPHjqWOpaen4/f7OXLkCC1atIioXsFLDn/4wx/SunVrfv/7\n35OQkFDpn6e4U6dOsWfPHg4ePEhKSgoDBgwAvIQ51ikxqcivfw27dsHmzRDBNPJ+v7/E9PPTIljc\nT0Tqn+3bt1dcqI75+c9/zosvvsiUKVO44YYbSEpKwswYMWJERP8XXtW5Oqp6/1DDhw+nZ8+erF69\nmg0bNrB48WIWLFjA6tWr6RvByMvqZGYMGzaMF198kZdffplx48ZV6XpbtmyhefPm7Nu3j9zcXC67\n7DL+I+T9yD59+vDOO+9U6T41QYlJeU6ehEcfhdGjI1oPB+D1119n3759APTs2ZMbIzxPRCRaWrZs\nSWJiIrt37y633KuvvkpmZmaJ2ay/+eabMuf5OHDgQIlHHR9++CF+v5/LL7+8zHuUl7xU9v6RaNWq\nFePHj2f8+PEcP36crl27MnfuXPr27VtmLC1btiQhIYHc3NxSx/bu3YvP5yM1NZUmTZpEVK9FFi1a\nRFxcHBMmTCAxMZGRI0ee98+1adMmbr31Vl566SUWLlzIwIED2bt3L36/PzhiqmUEM5dHg4YLl2f2\nbDh9GubPj6i4c475xcqqt0RE6gIzY/Dgwbzxxhvs3LmzzHJxcXGleiaWLl0a9r0H5xxPP/10qbJm\nRv/+/cu8R5MmTQDCJhuVuX9F/H5/qRldU1JSaNOmTXBIc1mx+Hw+br/9dtauXVti+PCxY8dYsWIF\nPXr0oGnTphHXaxEz47nnnmPYsGFkZGTwu9/9rlSZSIcLb9q0iRtuuAGAq666is8//xyAp59+mnXr\n1jF16lSSk5NZs2ZNhdeqbeoxKUtuLixd6q2H07ZtRKe8++67wTHs1157Lf369avJCEVEqs28efPY\nuHEjPXv2ZNy4caSnp3P06FFWrVrFpk2bSExM5I477uCll14iMTGRzp07s2XLFv7whz+UOUfToUOH\nGDRoEP369WPz5s0sX76c0aNHc80115QZR7du3XDO8eijjzJy5EguuOACBg4cSOPGjSt9//J8+eWX\nXHrppQwbNowuXbrQtGlTNm7cyPbt21myZEmFscyZM4e3336bm266iQkTJhAXF8dzzz3H2bNnS/To\nRFKvxZkZL7/8MoMHD2b48OGsW7eOPn36BI9HMly4sLCQbdu28fjjjwf3Fb3vU1BQwIABA3j++eeZ\nNm0a7du3r3Td1biqDuupLx9Chwv37+9cWppzBQVhh0aF069fv+AQ4eXLl0d8nojEvsoOF66Ljhw5\n4jIzM12rVq1c48aNXYcOHdykSZPct99+65xz7uTJk27s2LHu4osvdomJiW7AgAFu//79Li0tzY0Z\nMyZ4naLhr/v27XPDhw93SUlJrkWLFu7+++9333zzTbBcWcN6586d61JTU12jRo1KHD9x4kRE949k\nuPDZs2fd1KlTXdeuXV1SUpK76KKLXNeuXV1WVlZEsTjn3Pvvv+/69+/vEhMTXdOmTd1tt93mtm7d\nWul6LT5cuEhBQYHr06ePS0xMdNu2bQvuj2S4cF5enuvUqVPw+gUFBW7gwIHuF7/4hduzZ4/z+/2u\nS5cu5V4jVG0OF456QhArnxKJyZtvelXz2mvl/kMVt2vXrmBScvnllwcbhIjUDw0hMaku4b5oJXbs\n2rXLZWRkOL/f7956662IzqnNxETvmIT69ltvdtdbboHBgyM+rfhInIcffphGjfSUTEREYk+LFi2I\nj48nJyeHXr16RTucUvTtGWrlSvjwQ1i1CiIc2nbw4EFeeeUVwHtb+5577qnJCEVERM5bamoqWVlZ\n0Q6jTOoxCfX88/Czn0E5L2eFeuKJJ4Jvik+ePJnGjRvXVHQiIiL1mhKTUD6fNxInQseOHeOFF14A\n4KKLLmLChAk1FZmISJ0wY8YMCgsLad68ebRDkTpIiUmoCRMgsIpkJJ566qngmPfx48eTnJxcU5GJ\niIjUe0pMQg0dGnHRkydPBicQuvDCC5k8eXJNRSUiItIgKDEJVYnRNFlZWcGZAzMyMmjTpk1NRSUi\nItIgKDE5TwUFBTz55JOAN1Pfww8/HOWIRERE6j4lJudp6dKlweWjhw4dGnb5axEREakcJSbnIT8/\nn3nz5gHeYk6zKjGKR0RERMpWZxITM5toZofMrMDM3jOz68sp+xMze9fMvgh8NpZXvrJmzZoVfLfk\nJz/5CVdddVV1XVpERKRBqxOJiZmNAJ4AZgBdgb8D682srCUlewE5QG/gBuAIsMHMLqlqLLm5uTz7\n7LOAtyS2ektERESqT51ITIApQJZz7jfOuX3AeOA0MCZcYefc3c65Z51z/+2c2w/8BO9nvbWqgUyd\nOpXCwsLgf7du3bqqlxQREZGAmE9MzOwCoBvwh6J9zjkHvA3cGOFlmgAXAF9UJZY///nPrF27FoA2\nbdrw4IMPVuVyIiIiEiLmExMgBYgDjoXsPwZE2l2xAPgUL5k5L36/v0QiMnfuXBISEs73ciIiIhJG\nvV9d2MymAXcCvZxzZysqP2XKFJKSkkrsGzVqFH6/nx07dgDQpUsX7r777poIV0RE6rDs7GzGjBnD\n4cOHadeuXbTDqRErVqxgxYoVJfadPHmy2q5fFxKT40Ah0Cpkfyvgs/JONLOHgEeAW51zeyK52ZNP\nPsl1111XYl9BQQFXXnllcHvx4sXExcVFcjkREalntmzZwoYNG5gyZQqJiYkljpkZZhalyGrHqFGj\nGDVqVIl9O3fupFu3btVy/Zh/lOOc+xbYQbEXV837V78V2FzWeWb2CPCfQF/n3K6qxLB06VI+/vhj\nAPr3789tt91WlcuJiEgdtnnzZmbPns2JEydKHcvIyKCgoKDe9pbUhrrQYwKwBMg2sx3ANrxROglA\nNoCZ/Qb4xDn3aGB7KjALGAV8bGZFvS1fOee+rsyNQydTW7hwYdV/GhERqbO88RfhmRkXXnhhLUZT\n/8R8jwmAc+4V4CFgNrALuBavJyQ/UORSSr4IOx5vFM4q4GixT6WH0RSfTG3s2LFcffXV5/lTiIjE\ntqNHjzJ27Fjatm1LfHw87du3Z8KECfz73/8Oltm1axf9+/cnKSmJiy66iNtuu42tW7eWuM7MmTPx\n+XwcPHiQzMxMmjVrRnJyMmPGjOHMmTPBcl999RWTJ08mLS2N+Ph4WrVqxe233877778fLJOZmUla\nWlqpWIvuEW7fgQMHGD16NMnJyVx88cX88pe/BODIkSMMHjyYpKQkLrnkEpYsWRL2/NzcXO68806S\nkpJISUlh8uTJnD3rvaI4a9YsHnnkEQAuv/xyfD4fcXFxwV717OxsfD5fcDvSOqtMvYE3p9aRI0dK\nXaM+qCs9JjjnngGeKePYLSHbpVvxeQidTG327NnVcVkRkZiTl5fH9ddfz6lTp7j33nvp1KkTn376\nKatWreL06dMkJibyj3/8g549e5KUlMS0adNo1KgRWVlZ9O7dm3fffZfrr/cm2C56x+LOO++kffv2\nzJ8/n507d7Js2TJatWrF448/DsC9997La6+9xn333Ud6ejqff/45f/3rX9m7dy/f/e53g9cK985G\nuP1F2yNGjKBz584sWLCAN998k7lz59K8eXOysrK49dZbWbhwIcuXL+fhhx/me9/7HjfffHOpuNPS\n0pg/fz7vvfceS5cu5cSJE2RnZzN06FD279/PypUreeqpp2jRogUALVu2DBvXnj17IqqzytQbQHp6\nOr179+aPf/zjef17xzTnnD5et9x1gNuxY4crMmjQIAc4wM2ePduJSMO1Y8cOF/o3oj7JyMhwjRo1\ncjt37iyzzODBg118fLw7fPhwcF9eXp5LTEx0vXv3Du6bOXOmMzP305/+tMT5Q4cOdS1btgxuJycn\nu/vuu6/cuDIzM11aWlqp/TNnznQ+n6/UPjNzP/vZz4L7CgsLXWpqqouLi3OLFi0K7j9x4oRLSEhw\n99xzT6nzhwwZUuK6EydOdD6fz33wwQfOOecWL17sfD6f++c//1kqruzs7BLHIq2z4vevqN6cc87n\n87lbbrml1P3DOXHihHvooYfc7Nmz3dy5c11WVlZE5xVXUfsvOg5c56r4fVxnekxqW+hkag888ECU\nIxKROuX0adi3r2bvceWVUA3zKTnnWLt2LQMHDqRr165hy/j9fjZu3MiQIUO47LLLgvtbt27NXXfd\nxbJly/jqq69o2rQp4P3f/7333lviGj169GDNmjXBcsnJyWzdupW8vDwuuaTKK4YE7zt27Njgts/n\n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\n",
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "file_extension": ".py",
- "version": "3.5.4",
- "pygments_lexer": "ipython3",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
- }
+ ],
+ "source": [
+ "C = S[1]\n",
+ "K = S[2]\n",
+ "\n",
+ "k0 = k_grid[30]\n",
+ "X = [k0]\n",
+ "Y = [C[k0]]\n",
+ "T = [0]\n",
+ "\n",
+ "s = 0\n",
+ "t = 1\n",
+ "while s<5:\n",
+ " T.append(t)\n",
+ " k = K[k0]\n",
+ " X.append(k)\n",
+ " c = C[k]\n",
+ " Y.append(c)\n",
+ " if k0 == k:\n",
+ " s += 1\n",
+ " k0 = k\n",
+ " t += 1\n",
+ " \n",
+ "plt.plot(T, X, color=\"black\", linewidth=2, label=\"capital stock: $k_{t}$\")\n",
+ "plt.plot(T, Y, color=\"red\", linewidth=1, label=\"consumption: $c_{t}$\")\n",
+ "plt.plot([t], [k_ss], marker='o', color='black')\n",
+ "plt.xlabel(\"$t$\", fontsize=14)\n",
+ "plt.ylabel(\"$c_{t}$, $k_{t}$\", fontsize=14)\n",
+ "plt.title(\"Path of $c$ and $k$ over time\")\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-IV.ipynb" "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-IV.ipynb"
old mode 100644
new mode 100755
index 3f03ee6..b264fe8
--- "a/0-pre-requisitos/2-math/otimiza\303\247\303\243o-IV.ipynb"
+++ "b/0-pre-requisitos/2-math/otimiza\303\247\303\243o-IV.ipynb"
@@ -1,315 +1,633 @@
{
- "cells": [
- {
- "metadata": {
- "collapsed": true
- },
- "cell_type": "markdown",
- "source": "# Dynamic Optimization with Uncertainty"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "import math\nimport numpy as np\nfrom scipy import stats, optimize\nimport time\nimport matplotlib.pyplot as plt",
- "execution_count": 2,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# parameters\nalpha = .4\nbeta = .8\ndelta = .05\ntheta_H = 1.2\ntheta_L = .8\npi_H = .75\npi_L = .65",
- "execution_count": 3,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# utility function\nu = lambda c: math.log(c)",
- "execution_count": 4,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# production function\nf = lambda k, A: A*k**alpha",
- "execution_count": 5,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# function to calculate distance between two dictionaries with the same indices\ndef dist(V, W):\n d = 0\n for (_, v), (_, w) in zip(V.items(), W.items()):\n d = d + (v-w)**2\n return math.sqrt(d)",
- "execution_count": 17,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "nomes = ['Ana', 'Vitória', 'Elisa', 'Rayne']\nnumeros = [3, 6, 9]",
- "execution_count": 9,
- "outputs": []
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "for nome, num in zip(nomes, numeros):\n print(nome)\n print(num)",
- "execution_count": 10,
- "outputs": [
- {
- "output_type": "stream",
- "text": "Ana\n3\nVitória\n6\nElisa\n9\n",
- "name": "stdout"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 1: calculate steady-state"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def steadystate(alpha, beta, delta, theta, f):\n k_ss = (theta*alpha*beta/(1-beta*(1-delta)))**(1/(1-alpha))\n c_ss = f(k_ss, 1)-delta*k_ss\n return (k_ss, c_ss)\n\nk_ss_L = steadystate(alpha, beta, delta, theta_L, f)[0]\nk_ss_H = steadystate(alpha, beta, delta, theta_H, f)[0]\nk_ss = (pi_L*k_ss_L+pi_H*k_ss_H)/(pi_L+pi_H)\nc_ss = (pi_L*f(k_ss, theta_L)+pi_H**f(k_ss, theta_H))/(pi_L+pi_H)-delta*k_ss\nprint(\"steady-state values:\\ncapital: {0:.1f}\\nconsumption: {1:.1f}\".format(k_ss, c_ss))",
- "execution_count": 11,
- "outputs": [
- {
- "output_type": "stream",
- "text": "steady-state values:\ncapital: 1.7\nconsumption: 0.8\n",
- "name": "stdout"
- }
- ]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 2: define a grid for $k$ (and $k^{\\prime}$)"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "g_size = 1000\nkmin = 0\nkmax = max([k_ss_H, k_ss_L])*2\nstep = (kmax-kmin)/g_size\n\nk_grid = np.arange(kmin+step, kmax+step, step)",
- "execution_count": 12,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 3: construct maximizer function"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# given a value of k, a state A and a (proposed) value function V,\n# find k' that maximizes V over grid of k. \n\ndef maximizer(k, A, V0, u, f, k_grid):\n \n pi = pi_H\n if A == theta_L:\n pi = pi_L\n \n i = 0\n for K in k_grid:\n \n c = f(k, A)+(1-delta)*k-K\n if c>0:\n i += 1\n v = u(c)+beta*(pi*V0[(K,A)]+(1-pi)*V0[(K,2-A)])\n if i == 1:\n vmax = v\n cmax = c\n kmax = K\n elif v>vmax:\n vmax = v\n cmax = c\n kmax = K\n \n return (vmax, cmax, kmax)",
- "execution_count": 13,
- "outputs": []
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 4: define initial value function over grid"
- },
- {
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "# V0 is dictionary. V0(k)=log(k+1)\nV0 = {}\nfor k in k_grid:\n V0[(k, theta_L)] = math.log(k+1)\n V0[(k, theta_H)] = math.log(k+2)",
- "execution_count": 14,
- "outputs": []
- },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Dynamic Optimization with Uncertainty"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import math\n",
+ "import numpy as np\n",
+ "from scipy import stats, optimize\n",
+ "import time\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# parameters\n",
+ "alpha = .4\n",
+ "beta = .8\n",
+ "delta = .05\n",
+ "theta_H = 1.2\n",
+ "theta_L = .8\n",
+ "pi_H = .75\n",
+ "pi_L = .65"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# utility function\n",
+ "u = lambda c: math.log(c)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# production function\n",
+ "f = lambda k, A: A*k**alpha"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# function to calculate distance between two dictionaries with the same indices\n",
+ "def dist(V, W):\n",
+ " d = 0\n",
+ " for (_, v), (_, w) in zip(V.items(), W.items()):\n",
+ " d = d + (v-w)**2\n",
+ " return math.sqrt(d)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nomes = ['Ana', 'Vitória', 'Elisa', 'Rayne']\n",
+ "numeros = [3, 6, 9]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Step 5: iteration over value function"
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Ana\n",
+ "3\n",
+ "Vitória\n",
+ "6\n",
+ "Elisa\n",
+ "9\n"
+ ]
+ }
+ ],
+ "source": [
+ "for nome, num in zip(nomes, numeros):\n",
+ " print(nome)\n",
+ " print(num)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 1: calculate steady-state"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": true
- },
- "cell_type": "code",
- "source": "def bellman(V0, u, f, k_grid, eps=1e-3):\n \n T = {}\n T[0] = (1, 1)\n t0 = time.time()\n d = 1\n i = 0\n \n while d>eps:\n \n V = {}\n C = {}\n K = {}\n \n i += 1\n \n for k in k_grid:\n for A in [theta_L, theta_H]:\n v = maximizer(k, A, V0, u, f, k_grid)\n V[(k, A)] = v[0]\n C[(k, A)] = v[1]\n K[(k, A)] = v[2]\n \n d = abs(dist(V, V0))\n V0 = V\n T[i] = (d, time.time()-t0)\n print('i: {0}, d = {1:.5f} ({2:.2%})'.format(i,d,(d/T[i-1][0])-1))\n \n print('i: {0}, d = {1:.5f})'.format(i,d))\n return (V, C, K, T)",
- "execution_count": 15,
- "outputs": []
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "steady-state values:\n",
+ "capital: 1.7\n",
+ "consumption: 0.8\n"
+ ]
+ }
+ ],
+ "source": [
+ "def steadystate(alpha, beta, delta, theta, f):\n",
+ " k_ss = (theta*alpha*beta/(1-beta*(1-delta)))**(1/(1-alpha))\n",
+ " c_ss = f(k_ss, 1)-delta*k_ss\n",
+ " return (k_ss, c_ss)\n",
+ "\n",
+ "k_ss_L = steadystate(alpha, beta, delta, theta_L, f)[0]\n",
+ "k_ss_H = steadystate(alpha, beta, delta, theta_H, f)[0]\n",
+ "k_ss = (pi_L*k_ss_L+pi_H*k_ss_H)/(pi_L+pi_H)\n",
+ "c_ss = (pi_L*f(k_ss, theta_L)+pi_H**f(k_ss, theta_H))/(pi_L+pi_H)-delta*k_ss\n",
+ "print(\"steady-state values:\\ncapital: {0:.1f}\\nconsumption: {1:.1f}\".format(k_ss, c_ss))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 2: define a grid for $k$ (and $k^{\\prime}$)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "g_size = 1000\n",
+ "kmin = 0\n",
+ "kmax = max([k_ss_H, k_ss_L])*2\n",
+ "step = (kmax-kmin)/g_size\n",
+ "\n",
+ "k_grid = np.arange(kmin+step, kmax+step, step)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 3: construct maximizer function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# given a value of k, a state A and a (proposed) value function V,\n",
+ "# find k' that maximizes V over grid of k. \n",
+ "\n",
+ "def maximizer(k, A, V0, u, f, k_grid):\n",
+ " \n",
+ " pi = pi_H\n",
+ " if A == theta_L:\n",
+ " pi = pi_L\n",
+ " \n",
+ " i = 0\n",
+ " for K in k_grid:\n",
+ " \n",
+ " c = f(k, A)+(1-delta)*k-K\n",
+ " if c>0:\n",
+ " i += 1\n",
+ " v = u(c)+beta*(pi*V0[(K,A)]+(1-pi)*V0[(K,2-A)])\n",
+ " if i == 1:\n",
+ " vmax = v\n",
+ " cmax = c\n",
+ " kmax = K\n",
+ " elif v>vmax:\n",
+ " vmax = v\n",
+ " cmax = c\n",
+ " kmax = K\n",
+ " \n",
+ " return (vmax, cmax, kmax)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 4: define initial value function over grid"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# V0 is dictionary. V0(k)=log(k+1)\n",
+ "V0 = {}\n",
+ "for k in k_grid:\n",
+ " V0[(k, theta_L)] = math.log(k+1)\n",
+ " V0[(k, theta_H)] = math.log(k+2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Step 5: iteration over value function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def bellman(V0, u, f, k_grid, eps=1e-3):\n",
+ " \n",
+ " T = {}\n",
+ " T[0] = (1, 1)\n",
+ " t0 = time.time()\n",
+ " d = 1\n",
+ " i = 0\n",
+ " \n",
+ " while d>eps:\n",
+ " \n",
+ " V = {}\n",
+ " C = {}\n",
+ " K = {}\n",
+ " \n",
+ " i += 1\n",
+ " \n",
+ " for k in k_grid:\n",
+ " for A in [theta_L, theta_H]:\n",
+ " v = maximizer(k, A, V0, u, f, k_grid)\n",
+ " V[(k, A)] = v[0]\n",
+ " C[(k, A)] = v[1]\n",
+ " K[(k, A)] = v[2]\n",
+ " \n",
+ " d = abs(dist(V, V0))\n",
+ " V0 = V\n",
+ " T[i] = (d, time.time()-t0)\n",
+ " print('i: {0}, d = {1:.5f} ({2:.2%})'.format(i,d,(d/T[i-1][0])-1))\n",
+ " \n",
+ " print('i: {0}, d = {1:.5f})'.format(i,d))\n",
+ " return (V, C, K, T)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Shazam!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
{
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Shazam!"
- },
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "i: 1, d = 19.71450 (1871.45%)\n",
+ "i: 2, d = 12.85047 (-34.82%)\n",
+ "i: 3, d = 8.91404 (-30.63%)\n",
+ "i: 4, d = 6.43776 (-27.78%)\n",
+ "i: 5, d = 4.77451 (-25.84%)\n",
+ "i: 6, d = 3.61480 (-24.29%)\n",
+ "i: 7, d = 2.78258 (-23.02%)\n",
+ "i: 8, d = 2.16911 (-22.05%)\n",
+ "i: 9, d = 1.70649 (-21.33%)\n",
+ "i: 10, d = 1.35120 (-20.82%)\n",
+ "i: 11, d = 1.07450 (-20.48%)\n",
+ "i: 12, d = 0.85688 (-20.25%)\n",
+ "i: 13, d = 0.68456 (-20.11%)\n",
+ "i: 14, d = 0.54748 (-20.02%)\n",
+ "i: 15, d = 0.43812 (-19.98%)\n",
+ "i: 16, d = 0.35071 (-19.95%)\n",
+ "i: 17, d = 0.28078 (-19.94%)\n",
+ "i: 18, d = 0.22480 (-19.94%)\n",
+ "i: 19, d = 0.17998 (-19.94%)\n",
+ "i: 20, d = 0.14408 (-19.95%)\n",
+ "i: 21, d = 0.11533 (-19.95%)\n",
+ "i: 22, d = 0.09232 (-19.96%)\n",
+ "i: 23, d = 0.07389 (-19.96%)\n",
+ "i: 24, d = 0.05913 (-19.97%)\n",
+ "i: 25, d = 0.04732 (-19.97%)\n",
+ "i: 26, d = 0.03787 (-19.98%)\n",
+ "i: 27, d = 0.03030 (-19.98%)\n",
+ "i: 28, d = 0.02424 (-19.99%)\n",
+ "i: 29, d = 0.01940 (-19.99%)\n",
+ "i: 30, d = 0.01552 (-19.99%)\n",
+ "i: 31, d = 0.01242 (-19.99%)\n",
+ "i: 32, d = 0.00993 (-19.99%)\n",
+ "i: 33, d = 0.00795 (-19.99%)\n",
+ "i: 34, d = 0.00636 (-20.00%)\n",
+ "i: 35, d = 0.00509 (-20.00%)\n",
+ "i: 36, d = 0.00407 (-20.00%)\n",
+ "i: 37, d = 0.00326 (-20.00%)\n",
+ "i: 38, d = 0.00261 (-20.00%)\n",
+ "i: 39, d = 0.00208 (-20.00%)\n",
+ "i: 40, d = 0.00167 (-20.00%)\n",
+ "i: 41, d = 0.00133 (-20.00%)\n",
+ "i: 42, d = 0.00107 (-20.00%)\n",
+ "i: 43, d = 0.00085 (-20.00%)\n",
+ "i: 43, d = 0.00085)\n"
+ ]
+ }
+ ],
+ "source": [
+ "S = bellman(V0, u, f, k_grid)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exploring the results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "scrolled": true,
- "trusted": true
- },
- "cell_type": "code",
- "source": "S = bellman(V0, u, f, k_grid)",
- "execution_count": 18,
- "outputs": [
- {
- "output_type": "stream",
- "text": "i: 1, d = 19.71450 (1871.45%)\ni: 2, d = 12.85047 (-34.82%)\ni: 3, d = 8.91404 (-30.63%)\ni: 4, d = 6.43776 (-27.78%)\ni: 5, d = 4.77451 (-25.84%)\ni: 6, d = 3.61480 (-24.29%)\ni: 7, d = 2.78258 (-23.02%)\ni: 8, d = 2.16911 (-22.05%)\ni: 9, d = 1.70649 (-21.33%)\ni: 10, d = 1.35120 (-20.82%)\ni: 11, d = 1.07450 (-20.48%)\ni: 12, d = 0.85688 (-20.25%)\ni: 13, d = 0.68456 (-20.11%)\ni: 14, d = 0.54748 (-20.02%)\ni: 15, d = 0.43812 (-19.98%)\ni: 16, d = 0.35071 (-19.95%)\ni: 17, d = 0.28078 (-19.94%)\ni: 18, d = 0.22480 (-19.94%)\ni: 19, d = 0.17998 (-19.94%)\ni: 20, d = 0.14408 (-19.95%)\ni: 21, d = 0.11533 (-19.95%)\ni: 22, d = 0.09232 (-19.96%)\ni: 23, d = 0.07389 (-19.96%)\ni: 24, d = 0.05913 (-19.97%)\ni: 25, d = 0.04732 (-19.97%)\ni: 26, d = 0.03787 (-19.98%)\ni: 27, d = 0.03030 (-19.98%)\ni: 28, d = 0.02424 (-19.99%)\ni: 29, d = 0.01940 (-19.99%)\ni: 30, d = 0.01552 (-19.99%)\ni: 31, d = 0.01242 (-19.99%)\ni: 32, d = 0.00993 (-19.99%)\ni: 33, d = 0.00795 (-19.99%)\ni: 34, d = 0.00636 (-20.00%)\ni: 35, d = 0.00509 (-20.00%)\ni: 36, d = 0.00407 (-20.00%)\ni: 37, d = 0.00326 (-20.00%)\ni: 38, d = 0.00261 (-20.00%)\ni: 39, d = 0.00208 (-20.00%)\ni: 40, d = 0.00167 (-20.00%)\ni: 41, d = 0.00133 (-20.00%)\ni: 42, d = 0.00107 (-20.00%)\ni: 43, d = 0.00085 (-20.00%)\ni: 43, d = 0.00085)\n",
- "name": "stdout"
- }
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEbCAYAAADAsRPLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzt3Xd8VFX6x/HPQ0BC764iYECqFCkB6aCCIi0IKDYU3RXZdd2isrrrrmLXFdvvZ0HcnyIsKIKKDRuigqBgKNJRUErAQpEWapLz++OZSZ0kQ5KZO+V5v17zmszMnblnEpjvnHvueY445zDGGGPyK+d1A4wxxkQmCwhjjDEBWUAYY4wJyALCGGNMQBYQxhhjArKAMMYYE5AFhIkLIpIkIk5EynvdllAQkUki8i+v22FiiwWEiQoi8qGI3Bvg/hQR+cnLD34R2SIiR0TkUK5L/RDub4yIfJH7PufcOOfcfaHap4lPFhAmWkwBRouI5Lt/NDDdOZcR/iblMcQ5VzXXZafH7TGm1CwgTLSYA9QGevnvEJFawGBgqu/2IBFZISIHRGS7iEwo7MV83/r75bo9QUT+m+t2VxFZLCL7ROQbEel7sg0Wkb4iklbYfn37fE1EporIQRFZKyLJubZtKCJviMguEdkjIk+LSCtgEtDN11PZ59t2iojcn+u5N4jIJhHZKyJv5+7R+A61jROR70TkVxF5JkDwGmMBYaKDc+4I8BpwTa67LwM2OOe+8d1O9z1eExgE/F5Ehp3svkTkDOA94H40lG4DXheReiV/B4UaCryKtvlt4GlfGxKAd4GtQBJwBvCqc249MA740tdTqRmg/ecDD6G/n9N9r/Fqvs0GA52Bc3zbXVTWb8xEPwsIE01eBi4VkUq+29f47gPAOfeZc261cy7LObcKeAXoU4L9XA3Mdc7N9b3Wx0AqMLCI58zx9Tb2icick9jXF779ZALT0A9sgC5AfWC8cy7dOXfUOfdFoa+S11XAi8655c65Y8Df0R5HUq5tHnbO7XPObQM+BdqfRJtNnLCAMFHD9wG5C0gRkSboN+AZ/sdF5FwR+dR3SGY/+k27bgl2dSYaRP4P/H1AT/TbeGGGOedq+i4n02v5KdfPh4FE34B7Q2BrCcdW6qO9BgCcc4eAPWgvpLD9Vi3BfkyMi8lT/kxMm4r2HFoAHznnfs712Az0EM3FzrmjIvIkhQdEOlA51+3Tcv28HZjmnLuhlG3Nsw/fYaNgD1NtBxqJSPkAIVFcCeadaMj591sFqAPsCHLfxgDWgzDRZyrQD7iBXIeXfKoBe33h0AW4sojXWQlcLiIVfAPDI3M99l9giIhcJCIJIpLoG3BucJJt/RbtEQwSkQrAP4GKQT53KfAj8LCIVPG1oYfvsZ+BBiJySiHPnQFcJyLtRaQi8CCwxDm35STbb+KcBYSJKr4PucVAFXRQN7c/APeKyEHgLnRQuzD/As4CfgXuIdehKufcdiAF+Ad6SGs7MJ6T/P/inNvva9N/0G/v6UBakU/KeW4mMARoCmzzPW+U7+H5wFrgJxHZHeC5n/je3+toyJwFXH4ybTcGQGzBIGOMMYFYD8IYY0xAFhDGGGMCsoAwxhgTkAWEMcaYgKJ6HkTdunVdUlKS180wxpiosmzZst3OuWLn5ER1QCQlJZGamup1M4wxJqqIyNbit7JDTMYYYwoRMQHhK238qYis95U9/rPXbTLGmHgWSYeYMoBbnXPLRaQasExEPnbOrfO6YcYYE48ipgfhnPvRObfc9/NBYD15q08aY4wJo4gJiNx8des7AEsCPDZWRFJFJHXXrl3hbpoxxsSNiAsIEamKFhn7i3PuQP7HnXOTnXPJzrnkevVCscCXMcYYiLCA8JVEfh1dhP4Nr9tjjDHxLGIGqX2Lpv8fsN4597jX7THGmEiQlQVbt8L69Xkvv/0tXH99aPcdMQEB9ABGA6tFZKXvvn845+Z62CZjjAmLY8fgu+8KBsHGjXD0aMHt27ePo4DwrTcsXrfDGGNC6cCBgiGwfj18/732FgI5/XRo1UovLVvqddu2oW9rxASEMcbEkoMHYd06WLs27yWtkDUFy5WDpk0LBkHLllCzZnjb7mcBYYwxpXDokPYA8gfBtm2Bt09MhBYtcoLAHwLNmuljkcQCwhhjgnD4cOAg2LIl8PYVK+oHf+vWeS+NG0NCQlibXmIWEMYYk8vx4zowvHq1XvxB8MMP4FzB7StU0B5B7hBo0waaNIHyUf4JG+XNN8aYknEOdu7UEFi1KueyYQOcOFFw+/LloXnzgj2Cpk01JGKRBYQxJualp2svwB8C/lDYu7fgtiL6od+unfYE/EHQrBmcckr42+4lCwhjTMzIytLTRfMHwebNgQ8P1aqlQZD70ro1VKkS/rZHIgsIY0xUOnxYA2DlSlixQq9Xr9b78ytfXs8WatdO5w/4w6B+fe0xmMAsIIwxEW/37rxBsGKFDiQHmlh2xhl5Q6BdOx1EjrfDQ2XBAsIYEzGc09NG84dBoMllCQk6RtC+PXTooNfnnAN16oS92THLAsIY44mMDJ1XsHx53kDYv7/gtpUr64e/Pwg6dNCxgkqVwt/ueGIBYYwJucxMPX00NVUvy5ZpGBw5UnDbevU0AHKHQdOm0TO5LGQOHMiZlLFmDQwYoJcQsoAwxpSpzEz49tucIEhN1d5BoMHjxo2hY8e8gXD66XE+cJyenjNle82anOvt2/NuV66cBYQxJnJlZWmJan8Q+MPg0KGC2555JnTqBMnJeunYMc7HC06c0JH2VavyBkFhU7YrVtRTsfxTtfv2DXkTLSCMMUFxTgeLlyzRi7+HcPBgwW0bNiwYBnG7QnD+Kdv+6/Xri56y3aZNzkw9j2p3WEAYYwI6eFBDwB8IS5bAjz8W3K5+/Zwg6NRJL7/5TfjbGxHS07UXkLt+x+rVgadsg37o+6ds+8OgefOIOSc3ogJCRF4EBgO/OOfaeN0eY+JFZqYe4cgdBuvWFZxnUKMGdOkC556r18nJOmYQdzIzc6Zs5w6D778vfMq2f3KG/7p1a6hWLfxtPwkRFRDAFOBpYKrH7TAmpu3cCV99lfdwUXp63m3Kl9eB43PPzbk0a6Zjo3Hl4EH45hs97Wrlypwxg0CnYPmnbOeeqde2rc7ei8KR94gKCOfcAhFJ8rodxsSSzEz9krtokV4WL4atWwtul5SUNww6dIizeQbO6TE0fxD4J2Zs2hR4+zPOyBsCMThlO6ICIhgiMhYYC9CoUSOPW2NM5DlwQHsH/jD46quCZxVVq5Y3DLp0ibNxg8xMPf3KHwL+yy+/FNy2QoWcKdv+6dpt20Lt2uFvd5hFXUA45yYDkwGSk5MDHOwzJn74S1P4w2DRIu0t5D8M3qQJdO8OPXrodevWcTTxLHdVP3/PYNWqwIeIatTIW7ujfXs9ZBRDvYKTEXUBYUw88x8u+vxzWLhQQyH/mUUVKuhppf4w6N49jgaSDx3SEPBPzFi2rPCqfo0a5YSAPxTOPDMqxwpCxQLCmAh24oTWKlqwQC8LFxasVVSnTt7eQXJynIwdpKdrb2DZspxA2LChYPfJqvqVWEQFhIi8AvQF6opIGnC3c+7/vG2VMeFz7BgsXaph8Pnn2kPIf3ZRUhL06QO9ekHPnnrafMx/6U1PL9gz2LChYM+gfHkNA/+EjE6ddLwgLhKz7EVUQDjnrvC6DcaE0+HD8OWXGgYLFuiA8rFjebdp0QJ69865xPy5GYcPaxj4g2DZMp11nD8MEhK0J+Cfst2pk55JlJjoTbtjUEQFhDGx7sQJ7SF88olevvyyYLWFtm01CPy9hNNO86atYeEv87pkif5ilizRQZbMzLzbJSToh3/u6drt2lnPIMQsIIwJoawsnWP1yScwf772EnIfMhLRAeW+fTUUevaM8UPjO3bkBMHSpdpLyF/MqVw5TUl/GCQnWxh4xALCmDLknJa6nj9fQ+HTTwuW4WnVCi64AM4/X4OhVi1Pmhp6/mJOuQNhx46C2zVqlLd+R6dOUKVK+NtrCrCAMKaUdu2Cjz+Gjz6CefMKfgaeeWZOIJx/foyecpqVpcWbFi/OW8wp/xlFNWpA5845YdClS4wfQ4tuFhDGnKQTJ3Ts4MMP9bJ8ed7PwXr1NAj8odCkSQyeZXTggIbA4sU507UPHMi7TYUKOoicu3fQvHkcFnOKXhYQxgTh++9zAmH+/LyHzStW1PGDiy6CCy/UsyxjKhCc01+APwwWLw48XbtRI52I0bWrBkL79nZGUZSzgDAmgMOHNQg++EBDIX+9tlatNBAuukjDoXJlb9oZEkeP6qmluQMhf40i/3Rt/1Ttbt20eJ2JKRYQxvhs2wbvvQfvvqvhcPRozmM1a0K/fjmh0LChd+0sc3v3ahGnBQvgiy80HPKfe1uvXk4YdO+uA8l2VlHMs4AwcSszUw+jv/uuXlavzvt4584wcKAGQufOYV/tMXR27tSaHQsXaijkf+Mielpp7t7BWWfF2HEzE4xY+SdvTFD27dOzjd59F+bOhT17ch6rWlXHEAYPhosvjpGTa/zjB/4wWLAANm/Ou03Fijpm0KuXXrp1g+rVvWmviSgWECbmpaXBnDnw5pta0iL3JN0mTWDIEBg0SMcSKlb0rp1lwn+6ae7qfjt35t2mWjXtGfTurYHQubMNJpuALCBMTNq4UQPhzTd1fpZfQoKWsBg8WC8tWkT5kRPntFTFp5/qwMlnn+XtFoFOzfaHQe/eeuppzBwvM6Fk/0pMTHBO5yO88YaGwvr1OY9VqqTjCJdcoqEQ1QuB+Q8Z+QPh00/hp5/ybnPGGZqC/lBo1SrKU9B4xQLCRK2sLJ2wNmuWhsK2bTmP1ayph44uuUTDIapPQ92+PW8g5H6joGuFnneezso77zwbUDZlxgLCRBXn4OuvYeZMeO01HV/wq18fhg3TUOjTR0/Vj0q7d+dU95s/v+AkjNq1tYiTPxCsh2BCJKICQkQGAE8BCcB/nHMPe9wkEwGc04XD/KGwZUvOY40awWWXwciROtYalVUcjh/XyWgffaSX/LU7qlfXw0X+QGjXLkrfqIk2ERMQIpIAPAP0B9KAr0XkbefcOm9bZryyerWGwsyZeb9E168Pl14Ko0bp2ZlR91npH1j2B8Lnn+etAX7KKTp20K+fhkLHjjaobDwRSf/qugCbnHPfA4jIq0AKYAERR3buhBkzYNo0WLUq5/5TT9VewqhRumZC1IXC7t1a6vWjj7T0a+5jY6AFnC68EPr3j8HaHSZaRVJAnAFsz3U7DTjXo7aYMDp0SAeZp03TQ+/+lSVr1coJhT59ouxLdGamroXw3ns6Iy//YaNTT9UwuPBC7SnUr+9dW40pRCT9lws0yuYKbCQyFhgL0CjmF+eNXZmZGgbTpumpqYcP6/2nnKKnoo4erWUuTjnF23aelL17tbLf3Lla5W/37pzHKlbUw0b+ULBxBBMFIikg0oDcJdAaADvzb+ScmwxMBkhOTi4QICaybdoEL74IU6bAjz/m3N+jh4bCpZdG0TwF5/Q4mL+X8OWXOd0fgKQknaI9cKCedWSHjUyUiaSA+BpoJiKNgR3A5cCV3jbJlIUjR7SX8J//6ERfv6ZNNRSuvlpLXkSF9HQdQ5g7Vy+5l48rX16DYOBADYaon6Zt4l3EBIRzLkNE/gh8iJ7m+qJzbq3HzTKlsHKlhsL06VokD3RW86hR8Nvfaq8hKj4/f/4Z3nkH3npLB5pz1wE//fScQLjgAityZ2JKxAQEgHNuLjDX63aYkktP10CYPFmXFfBLTobf/Q4uv1yXJY54GzdqILz1lh46yj3A3LWrDpQMGqR1jaIi5Yw5eREVECZ6ffstPPusji3s36/31ayph5B++1v9HI1oWVm6rrI/FDZuzHmsYkXtHQwbpvU7YqIOuDHFs4AwJZaZqeOzzzyjp/f7desGf/gDjBgR4YuOnTihgyKzZ2so/PxzzmO1amkvISVFizlVrepZM43xigWEOWl79sALL8CkSbB1q95XqRJceSXcdBN06OBt+4p04oSeXzt7tk6+2Ls357GkJA2ElBSdjRe1xZyMKRsWECZo330HTzyhh5GOHNH7zjpLewvXXadfuiPS8eM6uDxrlvYUfv0157GWLfXc2uHDbTzBmHwsIEyRnNP17B97TD9b/WO1F18Mf/qTzvmKyPlex47pcS//4SP/wAhA69Y6RfvSS+Hssy0UjCmEBYQJKCND5y489ljOimynnKKDzrfcop+rEScrS5fZnDFDgyF3T6FtWw2EkSO1PLYxplgWECaPY8fg5Zfh4Yfhhx/0vtq19TDSTTdF4Ak8/lrgM2bAq6/mnbjWtq1Ouhg5UietGWNOigWEAXRM4T//gX//O6fQaNOm2lu49toIrBKxaRO88ooGw4YNOfcnJelo+RVXaIVUY0yJWUDEuUOH9GykiRNzzvJs0wbuvFOPyCQkeNu+PPbu1V7Cyy/nHPcCqFtXewpXXqnn2NqYgjFlwgIiTh06BP/zPzrG4D/Ts1Mn+Oc/YejQCBp4zsjQ2kcvvaSDzceP6/1Vq+raoldeqZPY7JRUY8qcBUScOXYMnn8eHngAfvlF7+vWDf71LxgwIIK+fG/YoOfTTpumqwiBNu7CC/WY17BhEXjcy5jYYgERJzIy9LN2wgTYtk3vO/dcuP9+/QIeEcGwf78eQpoyRcte+DVrBmPG6ClUDRsW9mxjTBmzgIhxzsHrr2sPwT+W26aN9iCGDImAYHBOxxMmTdLFp/0z8KpV03GFMWOge/cIaKgx8ccCIoZ9/TX89a860Q10zYV779WKqp4PPh84oGVfn38evvkm5/7zzoPrr9fxhSpVvGufMcYCIhalpcHf/w7//a/ePvVUuOcerarq+VhuaqqGwiuvaG1w0LOQrrsObrhBDycZYyKCBUQMSU+HRx/VuQxHjujM57/+Ff7xD4/XsTl6VMcWnn467yIRffrAjTdqHaSKFb1rnzEmoIgICBG5FJgAtAK6OOdSvW1RdHEO5syBP/8Ztm/X+y69FB55BBo39rBhO3fqIhHPPw+7d+t9tWrpuMLYsVoozxgTsSIiIIA1wHDgea8bEm1++AFuvlnXZQDo2BGefBJ69fKoQc7BkiXw1FNaDykjQ+9v314TbNSoCF8kwhjjFxEB4ZxbDyB2pkrQjh/XSW733aeHk6pXh4ce0iM2ngxAnzgBr72mwfD113pfuXJaB+lPf9L1Fezva0xUiYiAOBkiMhYYC9CoUSOPW+ONL7/UAef16/X2lVdqWHhSSO/gQS3i9MQTOce3atfWAec//AHi9G9kTCwIW0CIyDwg0EfYnc65t4J9HefcZGAyQHJysitm85hy5AjcdRc8/rhWtm7WTA/x9+vnQWN+/llrdTz7LOzbp/e1aqWj4lddZbOcjYkBYQsI55wXH2Mx46uvdGx340Y9cnPHHXD33ZCYGOaGfPeddlemTNG6HQA9esDtt8OgQRFUxMkYU1pRd4gp3hw/rrOgJ07UXkOrVvrZ3KVLmBuyZo0OeMyalbOsXEoKjB+vAWGMiTkR8XVPRC4RkTSgG/CeiHzodZsiwcaNWkjv3//W23fcAcuXhzkcVq3Sgea2bXUQunz5nAGQOXMsHIyJYRHRg3DOvQm86XU7IoVzWt365pvh8GGdyzBjBnTtGsZGrFypdTne9P1ZKlbUgefbb4cGDcLYEGOMVyIiIEyOAwd0DtnMmXr7qqt0HDhsM6FXrdLBjTlz9HZiojbo9tuhfv0wNcIYEwksICLIunVadWLjRl0P59lntcJ1WHz/vZ4iNWOGdmEqVYJx43SM4fTTw9QIY0wksYCIELNmab269HQtx/3GG2GqW/fzzzr4PHmyTnY75RT4/e91wMOTiRXGmEhhAeGxjAytvDpxot6+4gp44YUwVLrev193+sQTmkoiulLbhAmQlBTinRtjooEFhIcOHNDSRB98oCcHTZyoVSlCWpEiI0NnPv/rXzkF9FJSdGm5Nm1CuGNjTLSxgPDI9u06r2z1al0O4fXXoXfvEO/0k090pvPq1Xq7Z08t+dq9e4h3bIyJRhYQHli2TJf7/PFHaNFCK7GedVYId7hpE9x2G7zlq2iSlKTdleHDrYCeMaZQETFRLp58/LH2FH78Efr21cJ7IQuH9HQdbD77bA2HqlXhwQd1ktuIERYOxpgiWQ8ijN58U9eDPn5cT1/9z3/0pKGQePttnWm3bZsGwXXXwQMP2CmrxpigWQ8iTKZO1VXejh/XgegpU0IUDlu36qBzSoqGQ4cOWunvxRctHIwxJ8UCIgyefVbPIM3M1JOHnnwyBEVPMzJ0Qeqzz9beQ7VqunjP0qUeVPYzxsQCO8QUYpMnw0036c8TJ8Ktt4ZgJ2vX6iEk/0pul12m8xusNIYxphSsBxFC06ZptQrQtXXKPBwyMnTQuWNHDYcGDWDuXC3kZOFgjCkl60GEyGuv6QI/zulUg5tvLuMdrF6tvYZly/T2DTfoIaYaNcp4R8aYeGU9iBD45BOtwpqVpZUr/va3MnzxrCxd0a1TJw2HRo3gww/1WJaFgzGmDFkPooytWaPzzzIydNLyXXeV4Yv/+KOOdn/8sd4eO1Z7DWGrBW6MiScR0YMQkUdFZIOIrBKRN0WkptdtKomdO2HgQK2xNGKEDkqX2Vy0d9+Fdu00HOrU0TOVnn/ewsEYEzIRERDAx0Ab51w74Fvg7x6356Slp8PgwVpjqVs3HaAuk1NZjx3TiRNDhmhxvX79dFGfIUPK4MWNMaZwEREQzrmPnHMZvptfAVG1pqVzerRnxQpo2lS/3FeqVAYvvH271uX43/+FChX0cNKHH9oZSsaYsChyDEJEGjnntoWrMT7XAzMLe1BExgJjARo1ahSuNhXp6ad1IbYqVbTkUd26ZfCi8+bp4hC7d+tA9OzZ0LlzGbywMcYEp7gexAYRuUtEKpZ2RyIyT0TWBLik5NrmTiADmF7Y6zjnJjvnkp1zyfXq1Stts0pt0SK45Rb9+cUXdSJzqTgHDz0EF12k4XDhhXq2koWDMSbMijuL6S/AfcB1IvJX59ycku7IOdevqMdF5FpgMHCBc86VdD/h9OuvWnwvI0ND4rLLSvmCR47A9dfDq6/q7bvu0ktCQqnbaowxJ6vIHoRzbjLQDHgDmCkiH4pIi7JuhIgMAG4HhjrnDpf164eCc7p0c1oadO0KDz9cyhf8+Wc4/3wNh2rV4J134J57LByMMZ4pdpDaOXfAOXcr0BY4AawSkYkiUq0M2/E0UA34WERWisikMnztkJgxQytaVKkC//2vjiGX2OrVWlDvq6/gzDP1uNXgwWXWVmOMKYmgJ8o5574FBovIRcDjwFUicrtzbmppG+Gca1ra1winbdtyCvA99VQpF/z56COdNHHokHZF5syB3/ymTNppjDGlcdKnuTrnPgTaAQ8Bj4vI4jJvVQTzH1rav1+XXLj++lK82MyZ2lM4dEgHM+bPt3AwxkSMoHsQIlIVaIMeamrju5QDzg1N0yLT669rwdQaNWDSpFLMlH7uOe2GOKcj3I8+GoJFIowxpuSKmwfxEDmB0BAQYDewGlgF/Bf4JsRtjBj79+ukZtBB6dNOK8GLOKcluv/5T7390ENw++22PrQxJuIU14MYiAbBM77rVc65H0Peqgg1YYLWy+vaVWdOl/hF7r1XewuTJmmZbmOMiUBFBoRz7pxwNSTSbdoEzzyjX/Sfe66ER4PuuUfDISEBpk+HUaPKvJ3GGFNW7KB3kP7+dzhxQqttt29fghe4917tPZQrZ+FgjIkKFhBBWLxYSyFVqgT33VeCF3joIbj7bg2HadMsHIwxUcECIgj/+Ide33KLLvt8UiZP1hcQgZdfhiuvLPP2GWNMKFhAFGPRIvj8cz2tdfz4k3zyW2/ppAnQgYurry7z9hljTKhYQBTjwQf1+o9/PMklnxct0slvWVl6eOnGG0PSPmOMCRULiCKsWKGT4ipXhr/85SSeuGmTrvh29KieD3v33SFrozHGhIoFRBH8FVpvvPEkFgE6cEBrcPz6q5bRePZZmwRnjIlKFhCF2LFDy2qUL5+zIFCxsrJ0nGHdOl05aPp0K9dtjIlaFhCFeOEFyMyESy45iTOX7r5b13GoWVMHqKtXD2kbjTEmlCwgAjhxQs9OBfjDH4J80rvvwv3361yHmTOhaVRVMDfGmAIsIAJ45x2tudSqFfTpE8QT0tJgzBj9+aGHdB1pY4yJchERECJyn4is8q0m95GI1PeyPdOm6fXvfhfE+HJmJlx1FezZAxddBLfdFvL2GWNMOEREQACPOufaOefaA+8Cd3nVkF9/1VNby5WDK64I4gkPPAALFmjt76lTbU0HY0zMiIhPM+fcgVw3qwDOq7bMng3Hj8P558Pppxez8YoVWoRPRLsdp54aljYaY0w4BL2iXKiJyAPANcB+4LwithsLjAVo1KhRmbdj+nS9vuqqYjY8cULXG83M1FWE+vUr87YYY4yXxLnwfFkXkXlAoDXY7nTOvZVru78Dic65YqcfJycnu9TU1DJr4y+/6JGiU07Rn4s8S/X+++Ff/4LGjWH1aqhSpczaYYwxoSQiy5xzycVtF7YehHMu2K/YM4D3gLDXp3j/fV0R9LzzigmHtWv10BLohAkLB2NMDIqIMQgRaZbr5lBggxfteO89vR40qIiNnIObbtJDTDfcABdcEJa2GWNMuEXKGMTDItICyAK2AuPC3YATJ+DDD/XnIgNi1iyt/12nDjzySFjaZowxXoiIgHDOjfC6DV98oXX2zj5bhxUCSk/Pmefw4INQq1bY2meMMeEWEYeYIsH77+t1kb2HRx+F7duhY0f47W/D0i5jjPGKBYTP55/rdaFnq+7aBY89pj8/+aRVaTXGxDwLCODgQVi2TD/zu3UrZKOHH4ZDh2DgQOjVK6ztM8YYL1hAAF9+qfPdOnWCatUCbJCWBs88oz/ff39Y22aMMV6xgEBLKQH07l3IBg8+CMeOwaWXQocOYWuXMcZ4yQICWLpUr7t3D/DgL7/ASy/pzxMmhKtJxhjjubgPCOd0/AEgOdDE82eegaNHYcgQPQfWGGPiRNwHxNatsHcv1KsXYGnRw4dzxh7Gjw9724yOVLZtAAAVgklEQVQxxktxHxD+3kPHjgEWB5oyRRcC6tIFevYMd9OMMcZTFhC+gOjUKd8DzsFTT+nPt94axNJyxhgTW+I+IFat0usCJyctWADffgv168Pw4WFvlzHGeC3uA2KDr25sq1b5HnjhBb2+7jooHxElq4wxJqziOiCOHYMfftBlpJs2zfXA3r269ihYzSVjTNyK64DYvBmysrR6a8WKuR549VVNj/79iyjtaowxsS2uA2LjRr1u0SLfAzNn6vXo0WFtjzHGRJK4Dgj/+EOegNi5ExYu1C5FSoon7TLGmEgQUQEhIreJiBORuuHYX8AexOzZeorrxRcXszC1McbEtogJCBFpCPQHtoVrn99/r9d5Bqj9h5dGjQpXM4wxJiJFTEAATwB/A1y4drhjh15nl9j45RdYvFgPLw0eHK5mGGNMRIqIgBCRocAO59w3QWw7VkRSRSR1165dJd6nczkBccYZvjs//FCv+/aFqlVL/NrGGBMLwjYDTETmAacFeOhO4B/AhcG8jnNuMjAZIDk5ucS9jV9/1TNZq1fPlQUffKDXF19c0pc1xpiYEbaAcM4FXO1ZRNoCjYFvROsdNQCWi0gX59xPoWpPgd5DZmZOD2LAgFDt1hhjoobnNSScc6uBU/23RWQLkOyc2x3K/RYIiGXLtHJrUhI0bx7KXRtjTFSIiDEIL/gDon593x3+3sPFF1vlVmOMIQJ6EPk555LCsZ8CPQj/wtTnnx+O3RtjTMSL2x7Ezp16fcYZQEYGfPml3mELAxljDBDHAZGnB/HNN5CerjPmTgt0opUxxsSfuA2In3znR51+OrBokd7o0cOz9hhjTKSJ24DYu1eva9cm5/BS9+6etccYYyJN3AbEr7/qde3awIoVeiM52bP2GGNMpInLgMjMhH379Oea5Q/p2tPly0Pr1t42zBhjIkhcBsT+/VqLqUYNSFi7Sm+0bp1vWTljjIlvcRkQ/sNLtWoBy5frjQ4dPGuPMcZEorgMCP8Ada1awMqVesMCwhhj8ojLgMgzQL1+vd5o08az9hhjTCSKy4A4cECvq1dHB6gh37qjxhhj4jIg0tP1ukr5Y7B7N1SpkqtqnzHGGIjTgDh8WK+rZPjOdW3e3Cq4GmNMPnEZEP4eROXDe/QHW//BGGMKiMuAyO5BHPpZf7CAMMaYAuIyILLHIA74an5bQBhjTAERERAiMkFEdojISt9lYCj35+9BVD7g60E0bhzK3RljTFSKpBXlnnDOTQzHjgr0ILKXlTPGGOMXET2IcMsOiH2+gDj9dO8aY4wxESqSehB/FJFrgFTgVufcr4E2EpGxwFiARo0alWhH2YeY3CGoU8eK9JmgnDhxgrS0NI4ePep1U4wJSmJiIg0aNKBChQolen7YAkJE5gGB1vO8E3gOuA9wvuvHgOsDvY5zbjIwGSA5OdmVpC3ZPQjS7fCSCVpaWhrVqlUjKSkJsXkzJsI559izZw9paWk0LuE4a9gCwjnXL5jtROQF4N1QtiW7B8Fhm0Ftgnb06FELBxM1RIQ6deqwa9euEr9GRIxBiEjuQYBLgDWh3F+eHoQFhDkJFg4mmpT232ukjEH8W0Tao4eYtgA3hnJnbdpAxT07qfnjPgsIY4wpRET0IJxzo51zbZ1z7ZxzQ51zP4Zyf6+8AqmDJ9CI7TYGYaJKWloaKSkpNGvWjLPOOos///nPHD9+vMjn7Nu3j2effTb79s6dOxk5cmSomxqUzz77jMGDB3vdjEKVpn1z5sxh3bp12bfvuusu5s2bV+RzBg4cyL59+wr8zbwSEQHhiR079Np6ECZKOOcYPnw4w4YN47vvvuPbb7/l0KFD3HnnnUU+L/+HTf369Zk9e3aomxvRMjMzQ76P/AFx77330q9f0UOxc+fOpWbNmhYQnvvZN4v6tEAnVhlTDJHQXIowf/58EhMTue666wBISEjgiSee4MUXX+Tw4cNMmTKFlJQUBgwYQIsWLbjnnnsAuOOOO9i8eTPt27dn/PjxbNmyhTa+BbKmTJnCsGHDGDJkCI0bN+bpp5/m8ccfp0OHDnTt2pW9vuUX+/btS2pqKgC7d+8mKSnppJ4fjL179zJs2DDatWtH165dWbVqFQBt27Zl3759OOeoU6cOU6dOBWD06NEFvpF/9tln9O7dm0suuYSzzz6bcePGkZWVBUDVqlW56667OPfcc/nyyy/55JNP6NChA23btuX666/n2LFjAHzwwQe0bNmSnj178sYbb2S/9oQJE5g4MWcub5s2bdiyZQsAU6dOpV27dpxzzjmMHj2axYsX8/bbbzN+/Hjat2/P5s2bGTNmDLNnz+b999/nsssuy9PmIUOGAJCUlMTu3bsL/M1Gjx7NW2+9lf2cq666irfffjvo321JxW9A+P/h1q7tbTuMCdLatWvp1KlTnvuqV69Oo0aN2LRpEwBLly5l+vTprFy5klmzZpGamsrDDz/MWWedxcqVK3n00UcLvO6aNWuYMWMGS5cu5c4776Ry5cqsWLGCbt26ZX8YFyWY50+aNIlJkyYV+Tp33303HTp0YNWqVTz44INcc801APTo0YNFixaxdu1amjRpwsKFCwH46quv6Nq1a4HXWbp0KY899hirV69m8+bN2R/y6enptGnThiVLlpCcnMyYMWOYOXMmq1evJiMjg+eee46jR49yww038M4777Bw4UJ++umnYt//2rVreeCBB5g/fz7ffPMNTz31FN27d2fo0KE8+uijrFy5krPOOit7+/79+/PVV1+R7jtbZubMmYwaNSrPa+b/m/3ud7/jpZdeAmD//v0sXryYgQNDWpEIiOeA8K87WquWt+0w0cm50FyK3KULeFZK7vv79+9PnTp1qFSpEsOHD+eLL74o9q2cd955VKtWjXr16lGjRo3sb7Nt27bN/oZc2uePGzeOcePGFfk6X3zxBaNHjwbg/PPPZ8+ePezfv59evXqxYMECFixYwO9//3tWr17Njh07qF27NlWrVi3wOl26dKFJkyYkJCRwxRVXZP8OEhISGDFiBAAbN26kcePGNPcV6rz22mtZsGABGzZsoHHjxjRr1gwR4eqrry72/c+fP5+RI0dSt25dAGoX86WzfPnyDBgwgHfeeYeMjAzee+89UlJSinxOnz592LRpE7/88guvvPIKI0aMoHz50J9jFJ8BkZUF+/frzzVretsWY4LUunXr7MM8fgcOHGD79u3Z31DzB0gwpzlWzFVJoFy5ctm3y5UrR0ZGBqAfav5DNflnkgfz/GC4AAEpIvTu3ZuFCxey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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Exploring the results"
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "V = S[0]\n",
+ "X = []\n",
+ "Y = []\n",
+ "Z = []\n",
+ "\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(V[(k, theta_L)])\n",
+ " Z.append(V[(k, theta_H)])\n",
+ " \n",
+ "plt.plot(X, Y, color=\"red\", linewidth=2, label=\"Optimum: low productivity\")\n",
+ "plt.plot(X, Z, color=\"blue\", linewidth=2, label=\"Optimum: high productivity\")\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$V$\", fontsize=14)\n",
+ "plt.title(\"Value Function\")\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "V = S[0]\nX = []\nY = []\nZ = []\n\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(V[(k, theta_L)])\n Z.append(V[(k, theta_H)])\n \nplt.plot(X, Y, color=\"red\", linewidth=2, label=\"Optimum: low productivity\")\nplt.plot(X, Z, color=\"blue\", linewidth=2, label=\"Optimum: high productivity\")\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$V$\", fontsize=14)\nplt.title(\"Value Function\")\nplt.legend(loc='lower right')\nplt.show()",
- "execution_count": 12,
- "outputs": [
- {
- "data": {
- "image/png": "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KSnppJ4fjL179zJs2DDatWtH165dWbVqFQBt27Zl3759OOeoU6cOU6dOBWD06NEFvpF/9tln9O7dm0suuYSzzz6bcePGkZWVBUDVqlW56667OPfcc/nyyy/55JNP6NChA23btuX666/n2LFjAHzwwQe0bNmSnj178sYbb2S/9oQJE5g4MWcub5s2bdiyZQsAU6dOpV27dpxzzjmMHj2axYsX8/bbbzN+/Hjat2/P5s2bGTNmDLNnz+b999/nsssuy9PmIUOGAJCUlMTu3bsL/M1Gjx7NW2+9lf2cq666irfffjvo321JxW9A+P/h1q7tbTuMCdLatWvp1KlTnvuqV69Oo0aN2LRpEwBLly5l+vTprFy5klmzZpGamsrDDz/MWWedxcqVK3n00UcLvO6aNWuYMWMGS5cu5c4776Ry5cqsWLGCbt26ZX8YFyWY50+aNIlJkyYV+Tp33303HTp0YNWqVTz44INcc801APTo0YNFixaxdu1amjRpwsKFCwH46quv6Nq1a4HXWbp0KY899hirV69m8+bN2R/y6enptGnThiVLlpCcnMyYMWOYOXMmq1evJiMjg+eee46jR49yww038M4777Bw4UJ++umnYt//2rVreeCBB5g/fz7ffPMNTz31FN27d2fo0KE8+uijrFy5krPOOit7+/79+/PVV1+R7jtbZubMmYwaNSrPa+b/m/3ud7/jpZdeAmD//v0sXryYgQNDWpEIiOeA8K87WquWt+0w0cm50FyK3KULeFZK7vv79+9PnTp1qFSpEsOHD+eLL74o9q2cd955VKtWjXr16lGjRo3sb7Nt27bN/oZc2uePGzeOcePGFfk6X3zxBaNHjwbg/PPPZ8+ePezfv59evXqxYMECFixYwO9//3tWr17Njh07qF27NlWrVi3wOl26dKFJkyYkJCRwxRVXZP8OEhISGDFiBAAbN26kcePGNPcV6rz22mtZsGABGzZsoHHjxjRr1gwR4eqrry72/c+fP5+RI0dSt25dAGoX86WzfPnyDBgwgHfeeYeMjAzee+89UlJSinxOnz592LRpE7/88guvvPIKI0aMoHz50J9jFJ8BkZUF+/frzzVretsWY4LUunXr7MM8fgcOHGD79u3Z31DzB0gwpzlWzFVJoFy5ctm3y5UrR0ZGBqAfav5DNflnkgfz/GC4AAEpIvTu3ZuFCxey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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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4EFt166dfvTRR2nnmjJliqqq3nXXXfrII4+oqurHH3+sgwcPPuy9Wb16tdarVy/t+vr166eqqitWrNCqVavq3r179YknntCXXnpJt2/frrGxsdqpUydVVY2Li9NffvnlsPMBOmfOHFVVveaaa3TYsGGqqnrqqafqU089lXZsgwYNdMaMGaqqOnjwYL311lsP23/nnXemxTdq1Ki090ZV9cILL9Tp06frpk2btEqVKvrHH38c8vd98MEH014783ajRo30999/V1XVJ598Mu19yvieZ/y7rl69Wps0aaKqqklJSVqzZk3dvHnzYe9nVg75958CmK8BfHaH8k6iOfCbqv6hqgeAcUC3jAeo6nRV3ZOy+QNQJVTBrVljC8fFxMB996Xs/OUXq+SXkAAdOsCQLJfjdtEmv9JEDr799lu6d+9OhQoVADjhhBMA+P7777niiisAuOqqq5gzZ07acy655BKKFClC3bp1076NN2vWjFGjRjF06FB+/vlnygQwqu6iiy5CRGjQoAEnnngiDRo0oEiRItSrV481a9YAUKRIEXr27AnAlVdeeUgcWZk3bx5xcXFUrFiRY445hj59+jBr1iwAihUrRteuXQE466yz0l7j4osvTrsDyM6cOXPS7rLOPPNMTj31VFatWkXr1q2ZNWsWc+bM4cILL2TXrl3s2bOHNWvWcMYZZxx2nqpVq9KqVassryf1Ordv3862bdto27YtAH379mXWrFmH7U+NJyc//PADbdq0SZuLkPr3zcnll1/OhAkTABg/fnxaXNmpXr065cuXZ+HChXz55Zc0adKE8iEoHBrKJFEZWJdhOz5lX3YGAJ9n9YCIDBSR+SIyPyEhISjBvfaa/X/eowecfDJWwbV/f9izx9aiHj8eihYNymu5wkdVAxqKmPGYY4899pDnA7Rp04ZZs2ZRuXJlrrrqqrRO0IzPyzwmPvU8RYoUOeScRYoUITExMdc4srue7MTExKQ9v2jRotm+xpGct1mzZsyfP5/Zs2fTpk0bmjRpwuuvv85Z2ZTfzxx/xu1SuawImdPf6phjjiE5OTltO/W9DvTvm1HPnj2ZMGECq1atQkSoVatWrs+59tprGT16NKNGjaJ///5H9Hp5FcokkdU7mOW/CBG5EogFhmX1uKqOVNVYVY2tGIQSGP/8Y0kC4MYbsXKvt94K339vkyQ++siK9jmX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\n",
+ "text/plain": [
+ ""
]
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "C = S[1]\n",
+ "X = []\n",
+ "Y = []\n",
+ "Z = []\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(C[(k, theta_L)])\n",
+ " Z.append(C[(k, theta_H)])\n",
+ "\n",
+ "plt.plot(X, Y, color=\"red\", linewidth=2, label=\"consumption: low productivity\")\n",
+ "plt.plot(X, Z, color=\"blue\", linewidth=2, label=\"consumption: high productivity\")\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$c$\", fontsize=14)\n",
+ "plt.title(\"Policy Function: $c$\")\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "C = S[1]\nX = []\nY = []\nZ = []\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(C[(k, theta_L)])\n Z.append(C[(k, theta_H)])\n\nplt.plot(X, Y, color=\"red\", linewidth=2, label=\"consumption: low productivity\")\nplt.plot(X, Z, color=\"blue\", linewidth=2, label=\"consumption: high productivity\")\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$c$\", fontsize=14)\nplt.title(\"Policy Function: $c$\")\nplt.legend(loc='lower right')\nplt.show()",
- "execution_count": 13,
- "outputs": [
- {
- "data": {
- "image/png": "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4EFt166dfvTRR2nnmjJliqqq3nXXXfrII4+oqurHH3+sgwcPPuy9Wb16tdarVy/t+vr166eqqitWrNCqVavq3r179YknntCXXnpJt2/frrGxsdqpUydVVY2Li9NffvnlsPMBOmfOHFVVveaaa3TYsGGqqnrqqafqU089lXZsgwYNdMaMGaqqOnjwYL311lsP23/nnXemxTdq1Ki090ZV9cILL9Tp06frpk2btEqVKvrHH38c8vd98MEH014783ajRo30999/V1XVJ598Mu19yvieZ/y7rl69Wps0aaKqqklJSVqzZk3dvHnzYe9nVg75958CmK8BfHaH8k6iOfCbqv6hqgeAcUC3jAeo6nRV3ZOy+QNQJVTBrVljC8fFxMB996Xs/OUXq+SXkAAdOsCQLJfjdtEmv9JEDr799lu6d+9OhQoVADjhhBMA+P7777niiisAuOqqq5gzZ07acy655BKKFClC3bp1076NN2vWjFGjRjF06FB+/vlnygQwqu6iiy5CRGjQoAEnnngiDRo0oEiRItSrV481a9YAUKRIEXr27AnAlVdeeUgcWZk3bx5xcXFUrFiRY445hj59+jBr1iwAihUrRteuXQE466yz0l7j4osvTrsDyM6cOXPS7rLOPPNMTj31VFatWkXr1q2ZNWsWc+bM4cILL2TXrl3s2bOHNWvWcMYZZxx2nqpVq9KqVassryf1Ordv3862bdto27YtAH379mXWrFmH7U+NJyc//PADbdq0SZuLkPr3zcnll1/OhAkTABg/fnxaXNmpXr065cuXZ+HChXz55Zc0adKE8iEoHBrKJFEZWJdhOz5lX3YGAJ9n9YCIDBSR+SIyPyEhISjBvfaa/X/eowecfDJWwbV/f9izx9aiHj8eihYNymu5wkdVAxqKmPGYY4899pDnA7Rp04ZZs2ZRuXJlrrrqqrRO0IzPyzwmPvU8RYoUOeScRYoUITExMdc4srue7MTExKQ9v2jRotm+xpGct1mzZsyfP5/Zs2fTpk0bmjRpwuuvv85Z2ZTfzxx/xu1SuawImdPf6phjjiE5OTltO/W9DvTvm1HPnj2ZMGECq1atQkSoVatWrs+59tprGT16NKNGjaJ///5H9Hp5FcokkdU7mOW/CBG5EogFhmX1uKqOVNVYVY2tGIQSGP/8Y0kC4MYbsXKvt94K339vkyQ++siK9jmX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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "K = S[2]\n",
+ "X = []\n",
+ "Y = []\n",
+ "Z = []\n",
+ "W = []\n",
+ "\n",
+ "for k in k_grid:\n",
+ " if k < 1.5*k_ss:\n",
+ " X.append(k)\n",
+ " Y.append(K[(k, theta_L)])\n",
+ " Z.append(K[(k, theta_H)])\n",
+ " W.append(k)\n",
+ "\n",
+ "plt.plot(X, Y, color=\"red\", linewidth=2)\n",
+ "plt.plot(X, Z, color=\"blue\", linewidth=2)\n",
+ "plt.plot(X, W, '--', color=\"gray\", linewidth=1)\n",
+ "plt.xlabel(\"$k$\", fontsize=14)\n",
+ "plt.ylabel(\"$k^{\\prime}$\", fontsize=14)\n",
+ "plt.title(\"Policy Function: $k^{\\prime}$\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Simulation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def shox(A, pi_H, pi_L, theta_H, theta_L):\n",
+ " \n",
+ " if A == 1.5:\n",
+ " pi = pi_H\n",
+ " else:\n",
+ " pi = pi_L\n",
+ " \n",
+ " x = np.random.binomial(1,pi_H)\n",
+ " \n",
+ " return A*x+(2-A)*(1-x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "K = S[2]\nX = []\nY = []\nZ = []\nW = []\n\nfor k in k_grid:\n if k < 1.5*k_ss:\n X.append(k)\n Y.append(K[(k, theta_L)])\n Z.append(K[(k, theta_H)])\n W.append(k)\n\nplt.plot(X, Y, color=\"red\", linewidth=2)\nplt.plot(X, Z, color=\"blue\", linewidth=2)\nplt.plot(X, W, '--', color=\"gray\", linewidth=1)\nplt.xlabel(\"$k$\", fontsize=14)\nplt.ylabel(\"$k^{\\prime}$\", fontsize=14)\nplt.title(\"Policy Function: $k^{\\prime}$\")\nplt.show()",
- "execution_count": 14,
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
]
- },
- {
- "metadata": {},
- "cell_type": "markdown",
- "source": "## Simulation"
- },
- {
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "def shox(A, pi_H, pi_L, theta_H, theta_L):\n \n if A == 1.5:\n pi = pi_H\n else:\n pi = pi_L\n \n x = np.random.binomial(1,pi_H)\n \n return A*x+(2-A)*(1-x)",
- "execution_count": 15,
- "outputs": []
- },
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "np.random.seed(1910)\n",
+ "C = S[1]\n",
+ "K = S[2]\n",
+ "\n",
+ "k0 = k_grid[30]\n",
+ "a0 = theta_H\n",
+ "n = 200\n",
+ "\n",
+ "X = [k0]\n",
+ "Y = [C[(k0, a0)]]\n",
+ "A = [a0]\n",
+ "T = [0]\n",
+ "\n",
+ "s = 0\n",
+ "for t in np.arange(0,n):\n",
+ " T.append(t)\n",
+ " a0 = shox(a0, pi_H, pi_L, theta_H, theta_L)\n",
+ " A.append(a0)\n",
+ " k = K[(k0, a0)]\n",
+ " X.append(k)\n",
+ " c = C[(k, a0)]\n",
+ " Y.append(c)\n",
+ " k0 = k\n",
+ " \n",
+ "plt.plot(T, X, color=\"black\", linewidth=1.5, label=\"capital stock: $k_{t}$\")\n",
+ "plt.plot(T, Y, color=\"red\", linewidth=1, label=\"consumption: $c_{t}$\")\n",
+ "plt.xlabel(\"$t$\", fontsize=14)\n",
+ "plt.ylabel(\"$c_{t}$, $k_{t}$\", fontsize=14)\n",
+ "plt.title(\"Path of $c$ and $k$ over time\")\n",
+ "plt.legend(loc=\"lower center\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 164,
+ "metadata": {},
+ "outputs": [
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "np.random.seed(1910)\nC = S[1]\nK = S[2]\n\nk0 = k_grid[30]\na0 = theta_H\nn = 200\n\nX = [k0]\nY = [C[(k0, a0)]]\nA = [a0]\nT = [0]\n\ns = 0\nfor t in np.arange(0,n):\n T.append(t)\n a0 = shox(a0, pi_H, pi_L, theta_H, theta_L)\n A.append(a0)\n k = K[(k0, a0)]\n X.append(k)\n c = C[(k, a0)]\n Y.append(c)\n k0 = k\n \nplt.plot(T, X, color=\"black\", linewidth=1.5, label=\"capital stock: $k_{t}$\")\nplt.plot(T, Y, color=\"red\", linewidth=1, label=\"consumption: $c_{t}$\")\nplt.xlabel(\"$t$\", fontsize=14)\nplt.ylabel(\"$c_{t}$, $k_{t}$\", fontsize=14)\nplt.title(\"Path of $c$ and $k$ over time\")\nplt.legend(loc=\"lower center\")\nplt.show()",
- "execution_count": 16,
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\nSJKkbP0/5A0l25iCnOYAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
{
- "metadata": {
- "trusted": false
- },
- "cell_type": "code",
- "source": "import numpy.ma as ma\n\nmask_H = []\nmask_L = []\nK_H = []\nK_L = []\nB = list(A)\nB.append(B[n])\n\nY = []\n\nfor i, a in enumerate(A):\n \n b = B[i+1]\n \n if a == theta_H and b == theta_H:\n mask_H.append(0)\n mask_L.append(1)\n elif a == theta_L and b == theta_L:\n mask_H.append(1)\n mask_L.append(0)\n elif a != b:\n mask_H.append(0)\n mask_L.append(0)\n \n K_H.append(k_ss_H)\n K_L.append(k_ss_L)\n Y.append(f(X[i], a))\n\nX_H = ma.masked_array(X, mask=mask_H)\nX_L = ma.masked_array(X, mask=mask_L)\n\nY_H = ma.masked_array(Y, mask=mask_H)\nY_L = ma.masked_array(Y, mask=mask_L)\n\nplt.plot(T, X_H, color=\"blue\", lw=1)\nplt.plot(T, X_L, color=\"red\", lw=1)\nplt.plot(T, K_H, '--', color=\"blue\", lw=.5)\nplt.plot(T, K_L, '--', color=\"red\", lw=.5)\nplt.xlabel(\"$t$\", fontsize=14)\nplt.ylabel(\"$k_{t}$\", fontsize=14)\nplt.title(\"Path of $k$ over time\")\nplt.show()\n\nplt.plot(T, Y_H, color=\"blue\", lw=1)\nplt.plot(T, Y_L, color=\"red\", lw=1)\nplt.xlabel(\"$t$\", fontsize=14)\nplt.ylabel(\"$k_{t}$\", fontsize=14)\nplt.title(\"Path of $k$ over time\")\nplt.show()",
- "execution_count": 164,
- "outputs": [
- {
- "data": {
- "image/png": "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\nSJKkbP0/5A0l25iCnOYAAAAASUVORK5CYII=\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\nKVgRERGRUPs/+yZ/uz+HgI8AAAAASUVORK5CYII=\n",
- "text/plain": ""
- },
- "metadata": {},
- "output_type": "display_data"
- }
+ "data": {
+ "image/png": "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\nKVgRERGRUPs/+yZ/uz+HgI8AAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
]
+ },
+ "metadata": {},
+ "output_type": "display_data"
}
- ],
- "metadata": {
- "kernelspec": {
- "name": "python3",
- "display_name": "Python 3",
- "language": "python"
- },
- "language_info": {
- "mimetype": "text/x-python",
- "nbconvert_exporter": "python",
- "name": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.4",
- "file_extension": ".py",
- "codemirror_mode": {
- "version": 3,
- "name": "ipython"
- }
- }
+ ],
+ "source": [
+ "import numpy.ma as ma\n",
+ "\n",
+ "mask_H = []\n",
+ "mask_L = []\n",
+ "K_H = []\n",
+ "K_L = []\n",
+ "B = list(A)\n",
+ "B.append(B[n])\n",
+ "\n",
+ "Y = []\n",
+ "\n",
+ "for i, a in enumerate(A):\n",
+ " \n",
+ " b = B[i+1]\n",
+ " \n",
+ " if a == theta_H and b == theta_H:\n",
+ " mask_H.append(0)\n",
+ " mask_L.append(1)\n",
+ " elif a == theta_L and b == theta_L:\n",
+ " mask_H.append(1)\n",
+ " mask_L.append(0)\n",
+ " elif a != b:\n",
+ " mask_H.append(0)\n",
+ " mask_L.append(0)\n",
+ " \n",
+ " K_H.append(k_ss_H)\n",
+ " K_L.append(k_ss_L)\n",
+ " Y.append(f(X[i], a))\n",
+ "\n",
+ "X_H = ma.masked_array(X, mask=mask_H)\n",
+ "X_L = ma.masked_array(X, mask=mask_L)\n",
+ "\n",
+ "Y_H = ma.masked_array(Y, mask=mask_H)\n",
+ "Y_L = ma.masked_array(Y, mask=mask_L)\n",
+ "\n",
+ "plt.plot(T, X_H, color=\"blue\", lw=1)\n",
+ "plt.plot(T, X_L, color=\"red\", lw=1)\n",
+ "plt.plot(T, K_H, '--', color=\"blue\", lw=.5)\n",
+ "plt.plot(T, K_L, '--', color=\"red\", lw=.5)\n",
+ "plt.xlabel(\"$t$\", fontsize=14)\n",
+ "plt.ylabel(\"$k_{t}$\", fontsize=14)\n",
+ "plt.title(\"Path of $k$ over time\")\n",
+ "plt.show()\n",
+ "\n",
+ "plt.plot(T, Y_H, color=\"blue\", lw=1)\n",
+ "plt.plot(T, Y_L, color=\"red\", lw=1)\n",
+ "plt.xlabel(\"$t$\", fontsize=14)\n",
+ "plt.ylabel(\"$k_{t}$\", fontsize=14)\n",
+ "plt.title(\"Path of $k$ over time\")\n",
+ "plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
},
- "nbformat": 4,
- "nbformat_minor": 2
-}
\ No newline at end of file
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.6.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/0-pre-requisitos/3-sql/0_conectando_python_em_db_sql.ipynb b/0-pre-requisitos/3-sql/0_conectando_python_em_db_sql.ipynb
old mode 100644
new mode 100755
diff --git "a/1-analise-explorat\303\263ria-basica/01-lendo-dados-e-medidas-centralidade/aula.ipynb" "b/1-analise-explorat\303\263ria-basica/01-lendo-dados-e-medidas-centralidade/aula.ipynb"
new file mode 100755
index 0000000..46d1fb8
--- /dev/null
+++ "b/1-analise-explorat\303\263ria-basica/01-lendo-dados-e-medidas-centralidade/aula.ipynb"
@@ -0,0 +1,1211 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "toc": true
+ },
+ "source": [
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "A estatística descritiva é um ramo da estatística que aplica várias técnicas para descrever e sumarizar um conjunto de dados. Diferencia-se da estatística inferencial, ou estatística indutiva, pelo objectivo: organizar, sumarizar dados ao invés de usar os dados em aprendizado sobre a população. Esse princípio torna a estatística descritiva uma disciplina independente.\n",
+ "\n",
+ "Algumas medidas que são normalmente usadas para descrever um conjunto de dados são medidas de tendência central e medidas de variabilidade ou dispersão. Medidas de tendência central incluem média,mediana e moda. Medidas de variabilidade incluem desvio padrão,variância, o valor máximo e mínimo, obliquidade e curtose. \n",
+ "\n",
+ "A estatística descritiva fornece resumos simples sobre a amostra e sobre as observações que foram feitas. Tal resumo pode ser quantitativo ou visual. Esses resumos tanto podem formar a base da descrição inicial dos dados, como parte de uma análise estatística mais extensa, ou eles podem ser suficientes por si mesmos.\n",
+ "\n",
+ "Por exemplo, a porcentagem de arremessos no basquetebol é uma descrição estatística que resume a performance de um jogador ou time. Esse número é a quantidade de arremessos bem sucedidos dividido pelo o número de arremessos. Por exemplo, um jogador que consegue porcentagem de 33% faz aproximadamente um arremesso bem sucedido em cada três arremessos. A porcentagem descreve ou resume múltiplos eventos discretos. Considere também a média da. Esse número descreve a performance geral de um estudante em um curso.\n",
+ "\n",
+ "O uso de descrição e resumo estatísticos tem uma história intensiva e, de fato, a simples tabulação de populações e dados económicos foram a primeira forma em que a estatística apareceu. Mais recentemente, uma colecção de técnicas de resumos apareceram com o título de análise exploratória de dados, um exemplo dessas técnicas é o diagrama de caixa.\n",
+ "\n",
+ "No mundo dos negócios, estatística descritiva fornece um resumo útil de muitos tipos de dados. \n",
+ "\n",
+ "Já vimos as principais medidas de centralidade:\n",
+ "\n",
+ "- Média\n",
+ "- Mediana\n",
+ "- Moda\n",
+ "\n",
+ "Agora vamos estudar as principais medidas de dispersão:\n",
+ "\n",
+ "- Desvio Padrão\n",
+ "- Variância\n",
+ "\n",
+ "Em seguida veremos as principais medidas de associação:\n",
+ "\n",
+ "- Covariãncia\n",
+ "- Correlação"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Medidas de Dispersão\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "Em Estatística, dispersão (também chamada de variabilidade ou espalhamento) mostra o quão esticada ou espremida uma distribuição (teórica ou que define uma amostra) é, e sua representação gráfica de distribuição apresenta estas características. Exemplos comuns de medidas de dispersão estatística são a variância, o desvio padrão e a amplitude interquartil.\n",
+ "\n",
+ "Dispersão é contrastada com posição ou tendência central, e juntas elas são as propriedades de distribuições mais usadas. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Desvio Padrão\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "Em probabilidade, o desvio padrão ou desvio padrão populacional (comumente representado pela letra grega σ) é uma medida de dispersão em torno da média populacional de uma variável aleatória. O termo possui também uma acepção específica no campo da estatística, na qual também é chamado de desvio padrão amostral (comumente representado pela letra latina s) e indica uma medida de dispersão dos dados em torno de média amostral. Um baixo desvio padrão indica que os pontos dos dados tendem a estar próximos da média ou do valor esperado. Um alto desvio padrão indica que os pontos dos dados estão espalhados por uma ampla gama de valores. O desvio padrão populacional ou amostral é a raiz quadrada da variância populacional ou amostral correspondente, de modo a ser uma medida de dispersão que seja um número não negativo e que use a mesma unidade de medida dos dados fornecidos.\n",
+ "\n",
+ "Além de expressar a variabilidade da população, o desvio padrão comumente é usado para medir a confiança em cálculos estatísticos e geralmente permite sintetizar os resultados de uma experiência repetida várias vezes. Por exemplo, a margem de erro de um conjunto de dados é determinada pelo cálculo do desvio padrão da média ou do desvio padrão populacional inverso da raiz quadrada do tamanho da amostra, se a mesma pesquisa for repetida várias vezes.\n",
+ "\n",
+ "Esta derivação do desvio padrão geralmente é chamada de erro padrão da estimativa ou erro padrão da média (em referência à média). O erro padrão da média é calculado a partir do desvio padrão das médias, as quais poderiam ser computadas a partir de uma população se um número infinito de amostras e uma média para cada amostra fossem considerados. A margem de erro de uma pesquisa é calculada a partir do erro padrão da média (produto do desvio padrão populacional e do inverso da raiz quadrada do tamanho da amostra), e cerca do dobro do erro padrão da média é a metade da largura de 95% do intervalo de confiança para a média (populacional).\n",
+ "\n",
+ "O desvio padrão é calculado em todas as áreas que usam probabilidade e estatística, em particular biologia, finanças, física e pesquisas em geral. Em ciência, os pesquisadores comumente reportam o desvio padrão dos dados experimentais. Em geral, apenas os efeitos mais de dois desvios padrões distantes do esperado são considerados estatisticamente significativos – por meio de erro aleatório normal ou variação nas medições podem-se distinguir os efeitos prováveis dos efeitos genuínos. Quando apenas uma amostra dos dados da população está disponível, o termo desvio padrão amostral pode referir-se tanto à quantidade mencionada acima quanto a uma quantidade modificada que seja uma estimativa não enviesada do desvio padrão populacional. Quando o desvio padrão populacional não é conhecido, o seu valor é aproximado por meio do desvio padrão amostral.\n",
+ "\n",
+ "O **Desvio Padrão** é a raiz quadrada da variância, para \"retornar\" a variável para sua escala original.\n",
+ "\n",
+ "$$ \\sigma = \\sqrt {\\frac{1}{N}\\sum\\limits_{i = 1}^N {\\left( {x_i - \\bar x} \\right)^2 }} $$\n",
+ "\n",
+ "Uma vantagem do desvio padrão é que ele é expresso nas mesmas unidades que a distribuição. \n",
+ "(Por outro lado, a variância tem outras unidades, já que está elevada ao quadrado.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Variância\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "Na teoria da probabilidade e na estatística, a variância de uma variável aleatória ou processo estocástico é uma medida da sua dispersão estatística, indicando \"o quão longe\" em geral os seus valores se encontram do valor esperado.\n",
+ "\n",
+ "A variância de uma variável aleatória real é o seu segundo momento central e também o seu segundo cumulante (os cumulantes só diferem dos momentos centrais a partir do 4º grau, inclusive). Sendo o seu valor o quadrado do Desvio Padrão. \n",
+ "\n",
+ "A variância (ou segundo momento) tambem é definida como um valor numérico utilizado para descrever quanto variam os números de uma distribuição com relação à média deles. \n",
+ "\n",
+ "Por definição, a variância é o quadrado do Desvio Padrão:\n",
+ " \n",
+ "$$ \\sigma{_x}^{2} = \\frac{1}{N}\\sum\\limits_{i = 1}^N {\\left( {x_i - \\bar x} \\right)^2 } $$\n",
+ "\n",
+ "É a média da diferença elevada ao quadrado entre cada valor e a média. Em outras palavras ela mede o quanto os dados estão distantes de x_barra (média), quanto maior esse número, mais distante da média os valores estão, em média (dividido por n).\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Aplicando os conceitos em um exemplo real\n",
+ "\n",
+ "Vamos utilizar o mesmos dados já conhecidos para calcular e comparar as métricas aprendidas"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Analisando Dispersão dos dados do IBGE\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Medidas dispersão para a variável salário\n",
+ "\n",
+ "Evidentemente o desvio pacrão e a variância fazem sentido para as variáveis quatitativas ou qualitativas ordinais numéricas com várias categorias. Para nosso exemplo temos idade, anos de estudo e salário."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Média da coluna salario: 19706.79\n"
+ ]
+ }
+ ],
+ "source": [
+ "import csv \n",
+ "lista_com_salarios = []\n",
+ "lista_com_idades = list()\n",
+ "\n",
+ "with open(r'data/data.csv', 'r') as data_csv:\n",
+ " data = csv.reader(data_csv)\n",
+ " \n",
+ " lista_exemplo = []\n",
+ " somatorio = 0\n",
+ " contador = 0\n",
+ " for i, line in enumerate(data):\n",
+ " if i>0:\n",
+ " try: # para evitar os campos nulos\n",
+ " lista_com_idades.append(float(line[2]))\n",
+ " lista_com_salarios.append(float(line[6]))\n",
+ " \n",
+ " somatorio += float(line[6]) # coluna 6 é a coluna de salario\n",
+ " contador += 1\n",
+ " except:\n",
+ " pass\n",
+ "\n",
+ "\n",
+ "media = round(somatorio/contador,2)\n",
+ "\n",
+ "print(f'Média da coluna salario: {media}')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['66469',\n",
+ " '53117018102.0',\n",
+ " '37',\n",
+ " 'homem',\n",
+ " '5.0',\n",
+ " 'Preta',\n",
+ " '460.3500061035156',\n",
+ " '1.0',\n",
+ " 'centro-oeste']"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "line"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Fazer a formula com base no código acima e na função abaixo:\n",
+ "\n",
+ "$$ \\sigma{_x}^{2} = \\frac{1}{N}\\sum\\limits_{i = 1}^N {\\left( {x_i - \\bar x} \\right)^2 } $$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def calcula_variancia(lista_valores):\n",
+ " '''\n",
+ " Escrever o código para calcular a variância\n",
+ " '''\n",
+ " \n",
+ " return variancia"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plotando o histograma com matplotlib"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "\r\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "plt.hist(lista_com_salario)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Escolhendo a quantidade de bins (o que é bins?)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "\r\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.hist(lista_com_salario, bins=50)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Escolhendo o range de valores"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": [
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "\r\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.hist(lista_com_salario, bins=50, range=(-100, 75000))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Medidas dispersão para a variável idade"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Medidas dispersão para a variável anos_estudo"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exemplo de três curvas com a mesma média e diferentes dispersões"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import scipy\n",
+ "import scipy.stats as ss\n",
+ "from scipy.stats import norm\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "%matplotlib inline\n",
+ "%config InlineBackend.figure_formats=['svg']\n",
+ "\n",
+ "x_axis = np.arange(-4, 4, 0.001)\n",
+ "mean, std, std1, std2 = 0, 0.5, 1, 2\n",
+ "\n",
+ "plt.plot(x_axis, norm.pdf(x_axis,mean,std), label='std=0.5')\n",
+ "plt.plot(x_axis, norm.pdf(x_axis,mean,std1), label='std=1')\n",
+ "plt.plot(x_axis, norm.pdf(x_axis,mean,std2), label='std=2')\n",
+ "plt.legend(loc='upper left')\n",
+ "\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Medidas de Associação"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Correlação\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "Em probabilidade e estatística, correlação, dependência ou associação é qualquer relação estatística (causal ou não causal) entre duas variáveis e correlação é qualquer relação dentro de uma ampla classe de relações estatísticas que envolva dependência entre duas variáveis. Por exemplo, a correlação entre a estatura dos pais e a estatura dos pais e dos filhos. Embora seja comumente denotada como a medida de relação entre duas variáveis aleatórias, correlação não implica causalidade. Em alguns casos, correlação não identifica dependência entre as variáveis. Em geral, há pares de variáveis que apresentam forte dependência estatística, mas que possuem correlação nula. Para este casos, são utilizadas outras medidas de dependência.\n",
+ "\n",
+ "Informalmente correlação é sinônimo de dependência. Formalmente variáveis são dependentes se não satisfizerem a propriedade matemática da independência probabilística. Em termos técnicos, correlação refere–se a qualquer um dos vários tipos específicos de relação entre os valores médios. Existem diferentes coeficientes de correlação (ρ ou r) para medir o grau de correlação. Um dos coeficientes de correlação mais conhecidos é o coeficiente de correlação de Pearson, obtido pela divisão da covariância de duas variáveis pelo produto dos seus desvios padrão e sensível a uma relação linear entre duas variáveis. Entretanto, há outros coeficientes de correlação mais robustos que o coeficiente de correlação de Pearson. Isto é, mais sensíveis às relações não lineares.\n",
+ "\n",
+ "#### Tipos de correlação\n",
+ "\n",
+ "Linear:\n",
+ "- Pearson\n",
+ "\n",
+ "Não-lineares:\n",
+ "- Spearman\n",
+ "- Kendall (tau)\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "##### Correlação Linear de Pearson\n",
+ "\n",
+ "A correlação amostral trata da medida da direção e do grau com que as variáveis X {\\displaystyle X} {\\displaystyle X} e Y {\\displaystyle Y} {\\displaystyle Y} se associam linearmente em uma amostra. Karl Pearson desenvolveu o coeficiente amostral a partir de uma ideia semelhante, porém ligeiramente diferente da de Francis Galton. Então, o coeficiente amostral pode ser chamado de coeficiente produto–momento de Pearson, coeficiente de correlação de Pearson ou simplesmente coeficiente de correlação, que é a medida mais conhecida de dependência entre duas variáveis quantitativa.\n",
+ "\n",
+ "A correlação lineaar de Pearson é uma versão padronizada (dividida pelos desvios padrão) da covariância e sempre está entre 1 e -1, portanto pode ser comparada com variaveis que não tem necessáriamente a mesma escala.\n",
+ "\n",
+ "$$ \\rho = \\frac{{}\\sum_{i=1}^{n} (x_i - \\overline{x})(y_i - \\overline{y})}\n",
+ "{\\sqrt{\\sum_{i=1}^{n} (x_i - \\overline{x})^2(y_i - \\overline{y})^2}}$$\n",
+ "\n",
+ "##### Correlação de Spearman\n",
+ "\n",
+ "A correlação de postos de Spearman é utilizada para a relação entre dados não–lineares. Quando os dados de uma amostra são ordenados de forma crescente, obtém–se uma condição de ordem para que cada elemento ordenado seja um posto.\n",
+ "\n",
+ "##### Correlação de Kendall\n",
+ "\n",
+ "A correlação de postos de Kendall, também conhecido como τ de Kendall, é uma medida a partir de uma amostra de dados ordenados como a correlação de postos de Spearman. A vantagem de τ de Kendall é a generalização para um coeficiente de correlação parcial. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Covariância\n",
+ "\n",
+ " \n",
+ "\n",
+ " \n",
+ "\n",
+ "*fonte: Wikipedia*\n",
+ "\n",
+ "Em teoria da probabilidade e na estatística, a covariância, ou variância conjunta, é uma medida do grau de interdependência (ou inter-relação) numérica entre duas variáveis aleatórias. Assim, variáveis independentes têm covariância zero.\n",
+ "\n",
+ "A covariância ou variância conjunta é um momento conjunto de primeira ordem das variáveis aleatórias X e Y, centrados nas respectivas médias. É a média do grau de interdependência ou inter-relação numérica linear entre elas. \n",
+ "\n",
+ "A covariância é por vezes chamada de medida de dependência linear entre as duas variáveis aleatórias. \n",
+ "\n",
+ "Dessa forma, a covariância é definida como uma variância entre duas variáveis distintas.\n",
+ "\n",
+ "$$ cov_{x,y} = \\sum_{i=1}^{n} (x_i - \\bar{x})(y_i - \\bar{y})\\quad \\text{(covariance)} $$\n",
+ "\n",
+ "$$\\sigma{_x}^{2} = \\sum_{i=1}^{n} (x_i - \\bar{x})^2\\quad \\text{(variance)}\t$$\n",
+ "\n",
+ "Vale a pena reforçar o que já foi mencionado acima, que a correlação é uma versão padronizada (dividida pelos desvios padrão) da covariância e sempre está entre 1 e -1, portanto pode ser comparada com variaveis que não tem necessáriamente a mesma escala."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Exemplo com números gerados\n",
+ "\n",
+ "Vamos criar duas variáveis aleatórias para utilização nesta parte de cálculo das medidas de associação através no numpy.random, e a partir do gráfico de dispersão (scatter plot) iremos trazer os códigos das funções de cálculo seguidas nos comandos da bilbioteca Scipy.Stats. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "\r\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "x1 = [1.3, 2.1, 3.4, 3.7, 5.4, 6.3, 7.2, 8.1, 9.9]\n",
+ "x2 = [8.7, 8.5, 7.6, 6.1, 5.1, 5.7, 3.3, 3.8, 1.7]\n",
+ "\n",
+ "plt.scatter(x=x1,\n",
+ " y=x2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[(1.3, 8.7), (2.1, 8.5), (3.4, 7.6), (3.7, 6.1), (5.4, 5.1)]\n"
+ ]
+ }
+ ],
+ "source": [
+ "xy = list(zip(list(x1),list(x2)))\n",
+ "print(xy[:5])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "-0.9693785258717729\n"
+ ]
+ }
+ ],
+ "source": [
+ "metodo_nutella = scipy.stats.pearsonr(x1, x2)\n",
+ "print(metodo_nutella[0])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$$ \\rho = \\frac{{}\\sum_{i=1}^{n} (x_i - \\overline{x})(y_i - \\overline{y})}\n",
+ "{\\sqrt{\\sum_{i=1}^{n} (x_i - \\overline{x})^2(y_i - \\overline{y})^2}}$$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def corr_metodo_raiz(data):\n",
+ " n = len(data)\n",
+ " sumx = sum(i[0] for i in data)\n",
+ " sumy = sum(i[1] for i in data)\n",
+ " \n",
+ " sumxSq=sum([i[0]**2.0 for i in data])\n",
+ " sumySq=sum([i[1]**2.0 for i in data])\n",
+ " \n",
+ " pSum=sum([i[0]*i[1] for i in data])\n",
+ " \n",
+ " numerador=pSum-(sumx*sumy/n)\n",
+ " denominador=((sumxSq-pow(sumx,2)/n)*(sumySq-pow(sumy,2)/n))**.5\n",
+ " \n",
+ " if denominador==0:\n",
+ " r=0\n",
+ " else:\n",
+ " r=numerador/denominador\n",
+ " \n",
+ " return r"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-0.9693785258717726"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "corr_metodo_raiz(xy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Analisando correlação nos dados do IBGE\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "66470 47878\n",
+ "\n",
+ "\n",
+ "[53.0, 49.0, 22.0, 55.0, 56.0]\n",
+ "[63600.0, 4352.400390625, 96600.0, 157800.0, 88550.0]\n"
+ ]
+ }
+ ],
+ "source": [
+ "import numpy\n",
+ "\n",
+ "print(len(lista_com_idades), len(lista_com_salarios))\n",
+ "print('\\n')\n",
+ "print(lista_com_idades[:5])\n",
+ "print(lista_com_salarios[:5])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "47538"
+ ]
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "idade_estudo = []\n",
+ "\n",
+ "with open(r'data/data.csv', 'r') as data_csv:\n",
+ " data = csv.reader(data_csv)\n",
+ " for i, line in enumerate(data):\n",
+ " observação = [] # cria uma lista em branco a cada iteração\n",
+ " if i>0:\n",
+ " try: # para evitar os campos nulos\n",
+ " observação.append(float(line[2]))\n",
+ " observação.append(float(line[4]))\n",
+ " idade_estudo.append(observação)\n",
+ " except:\n",
+ " pass\n",
+ " \n",
+ "len(estudo_idade)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 95,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[[53.0, 5.0],\n",
+ " [49.0, 8.0],\n",
+ " [22.0, 11.0],\n",
+ " [55.0, 15.0],\n",
+ " [56.0, 15.0],\n",
+ " [30.0, 15.0],\n",
+ " [52.0, 5.0],\n",
+ " [29.0, 5.0],\n",
+ " [29.0, 11.0],\n",
+ " [46.0, 15.0]]"
+ ]
+ },
+ "execution_count": 95,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "idade_estudo[:10]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 97,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "-0.22316633803425154"
+ ]
+ },
+ "execution_count": 97,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "corr_metodo_raiz(idade_estudo)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lista_com_idades = []\n",
+ "lista_com_estudo = []\n",
+ "\n",
+ "for row in idade_estudo:\n",
+ " lista_com_idades.append(row[0])\n",
+ " lista_com_estudo.append(row[1]) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "