diff --git a/Math/linear_algebra/lecture1.ipynb b/Math/linear_algebra/lecture1.ipynb index c29d448a..8029d6a5 100644 --- a/Math/linear_algebra/lecture1.ipynb +++ b/Math/linear_algebra/lecture1.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 127, "metadata": {}, "outputs": [ { @@ -11,7 +11,7 @@ "'Vectors. Python programming.'" ] }, - "execution_count": 2, + "execution_count": 127, "metadata": {}, "output_type": "execute_result" } @@ -22,13 +22,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 128, "metadata": {}, "outputs": [], "source": [ "# mypy: allow-untyped-defs\n", "# mypy: allow-untyped-calls\n", - "import numpy as np" + "import numpy as np\n", + "from matplotlib import pyplot as plt" ] }, { @@ -64,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 129, "metadata": {}, "outputs": [], "source": [ @@ -75,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 130, "metadata": {}, "outputs": [], "source": [ @@ -86,16 +87,16 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "14.422205101855956" + "np.float64(14.422205101855956)" ] }, - "execution_count": 6, + "execution_count": 131, "metadata": {}, "output_type": "execute_result" } @@ -106,16 +107,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "14.422205101855956" + "np.float64(14.422205101855956)" ] }, - "execution_count": 7, + "execution_count": 132, "metadata": {}, "output_type": "execute_result" } @@ -150,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 133, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 134, "metadata": {}, "outputs": [], "source": [ @@ -172,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 135, "metadata": {}, "outputs": [ { @@ -181,7 +182,7 @@ "array([0.31622777, 0.9486833 , 0. ])" ] }, - "execution_count": 10, + "execution_count": 135, "metadata": {}, "output_type": "execute_result" } @@ -192,14 +193,14 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 136, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\Dariana\\AppData\\Local\\Temp\\ipykernel_22876\\2410205260.py:4: RuntimeWarning: invalid value encountered in divide\n", + "C:\\Users\\Dariana\\AppData\\Local\\Temp\\ipykernel_31076\\2410205260.py:4: RuntimeWarning: invalid value encountered in divide\n", " return vt / norm_of_vector2\n" ] }, @@ -212,7 +213,7 @@ " [nan]])" ] }, - "execution_count": 11, + "execution_count": 136, "metadata": {}, "output_type": "execute_result" } @@ -235,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 137, "metadata": {}, "outputs": [], "source": [ @@ -247,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 138, "metadata": {}, "outputs": [ { @@ -256,7 +257,7 @@ "array([2., 0., 0.])" ] }, - "execution_count": 13, + "execution_count": 138, "metadata": {}, "output_type": "execute_result" } @@ -268,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 139, "metadata": {}, "outputs": [], "source": [ @@ -278,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 140, "metadata": {}, "outputs": [], "source": [ @@ -287,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 141, "metadata": {}, "outputs": [], "source": [ @@ -296,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 142, "metadata": {}, "outputs": [ { @@ -307,7 +308,7 @@ " [ 1.68, 52. , 32.9 ]])" ] }, - "execution_count": 17, + "execution_count": 142, "metadata": {}, "output_type": "execute_result" } @@ -318,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 143, "metadata": {}, "outputs": [ { @@ -327,7 +328,7 @@ "(3, 3)" ] }, - "execution_count": 18, + "execution_count": 143, "metadata": {}, "output_type": "execute_result" } @@ -349,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 144, "metadata": {}, "outputs": [ { @@ -379,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 145, "metadata": {}, "outputs": [ { @@ -410,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 146, "metadata": {}, "outputs": [ { @@ -440,20 +441,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 147, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "wwt = np.array([3, 5, 7])\n", "wt = np.array([1, 2, 3])\n", @@ -471,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 148, "metadata": {}, "outputs": [], "source": [ @@ -503,7 +493,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 149, "metadata": {}, "outputs": [ { @@ -552,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 150, "metadata": {}, "outputs": [ { @@ -580,11 +570,163 @@ "\n", "print(v_add)" ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[3 5]\n", + " [4 6]\n", + " [5 7]]\n", + "[[ 2 4]\n", + " [ 4 8]\n", + " [ 6 12]]\n" + ] + } + ], + "source": [ + "# Гибкость бродкастинга - разные математические операции в отличие от outer\n", + "# product\n", + "twt = np.array([[1, 2, 3]])\n", + "twwt = np.array([[2, 4]])\n", + "broadcasttwt = twt.T + twwt\n", + "print(broadcasttwt)\n", + "\n", + "outerttwt = np.outer(twt, twwt)\n", + "print(outerttwt)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "tw = np.random.randn(2)\n", + "rw = np.random.randn(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "tw_para = rw * (np.dot(tw, rw) / np.dot(rw, rw))\n", + "tw_perp = tw - tw_para\n", + "\n", + "# tw, tw_para + tw_perp\n", + "# array([ 0.82625583, -0.96648386]), array([ 0.82625583, -0.96648386])" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int(np.dot(tw_para, tw_perp)) # orto 10**(-17), 1/1000000000000000000 = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(6, 6))" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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llzzct5552nQoEGaOHGiVq9erc8++0y33HKLbrjhBvedRjt37tS5556r1atXS/o5uFxxxRUqLy/XwoUL5XK55HA45HA4VFVVZUWZACxmjNHixYvVvXt3n8ElIyNDhYWFGj9+PMEFQJ1Z1h5gyZIluuWWWzRgwADFxMTouuuu0xNPPOFef/ToUX3zzTc6ePCgJGnt2rXuO5HOOussj8/aunWrOnbsaFWpACxw4MABTZ48WUuXLvVaFxMTo3vuuUf33HPPSU8NA8CJLHnOSzDxnBcg+D7++GONHj3a5wX0Z5xxhhYvXqx+/foFoTIAoSroz3kBEJ2OHDmiadOm6bLLLvMZXMaMGaPCwkKCC4BGoas0AL/YvHmzRo4cqbVr13qta9mypZ5++mldf/31QagMQKRh5gVAoxhj9NRTT+nCCy/0GVx+/etfa/369QQXAH5DeAHQYHv27NFVV12lP/zhDzp06JDHuiZNmuiRRx7R+++/r/bt2wepQgCRiNNGABrk7bff1vjx470eSCn9/LiEF198UT169Ah8YQAiHjMvAOrl4MGDmjJlin7zm9/4DC633HKLCgoKCC4ALMPMC4A6W7dunUaMGOGzh1lqaqqeffZZDR48OAiVAYgmzLwAOKmqqio9/PDDysjI8Blchg4dqvXr1xNcAAQEMy8AalVUVKSsrCytXLnSa13Tpk312GOPadKkSTzeH0DAEF4A1GjZsmW6+eabdeDAAa91vXr10pIlS9S5c+fAFwYgqnHaCIAXl8ulrKws3XDDDV7BxWazKScnR6tWrSK4AAgKZl4AePjss880atQobdu2zWvd6aefrn/961+65JJLAl8YAPwfZl4ASPq50/u9996rSy65xGdwGTFihL766iuCC4CgY+YFgL777juNGjVKq1ev9lqXlJSkp556SiNGjAhCZQDgjZkXIIoZY7RgwQL16NHDZ3C5+OKLtX79eoILgJBCeAGiVElJia699lpNmjRJBw8e9FgXFxenBx98UB999JE6dOgQpAoBwDdOGwFR6N1339XYsWPlcDi81p1zzjlasmSJevfuHYTKAODkmHkBosjhw4c1depUDRo0yGdw+f3vf6+1a9cSXACENGZegCixfv16jRw5Ul9//bXXulatWmnhwoW66qqrglAZANQPMy9AhKuurtZjjz2mX/ziFz6Dy6BBg7RhwwaCC4CwwcwLEMF27dqlMWPG6IMPPvBal5iYqEceeURTpkyhLxGAsEJ4ASLUq6++qokTJ2r//v1e67p3764lS5bo/PPPD0JlANA4nDYCIkxZWZkmTJig6667ziu42Gw23XXXXfriiy8ILgDCFjMvQISpqKjQO++847X8tNNO0wsvvKBf//rXQagKAPyHmRcgwpx66ql6/vnnPZZdf/31Wr9+PcEFQEQgvAAR6PLLL9ftt9+u5s2b67nnntOyZcuUkpIS7LIAwC9sxhgT7CL8yeVyyW63y+l0KikpKdjlAEFz+PBh7d69W2eccUawSwGAk6rP729mXoAIlZiYSHABEJEILwAAIKwQXgAAQFghvAAAgLBCeAEAAGGF8AIAAMKKZeFl//79GjlypJKSkpScnKwJEyaorKysTtsaYzR48GDZbDa9/vrrVpUIAADCkGXhZeTIkdq4caPef/99vfXWW/rkk080adKkOm07d+5cutwCAACfLOlttGnTJq1YsUJffvmlevfuLUn6+9//riuvvFKzZ89Wu3btaty2sLBQjz76qNasWaO2bdtaUR4AAAhjlsy85OfnKzk52R1cJCkzM1MxMTH64osvatzu4MGDGjFihObNm6e0tLQ6fVdFRYVcLpfHCwAARC5LwovD4VCbNm08lsXFxSklJUUOh6PG7e644w7169dPV199dZ2/Kzc3V3a73f1KT09vcN0AACD01Su8TJs2TTabrdbX5s2bG1TIm2++qQ8//FBz586t13Y5OTlyOp3uV1FRUYO+HwAAhId6XfNy5513auzYsbWO6dSpk9LS0rRnzx6P5ZWVldq/f3+Np4M+/PBDff/990pOTvZYft111+niiy/WypUrfW6XkJCghIQE9/tjfSY5fQQAQPg49nu7Lv2iLekqvWnTJnXp0kVr1qxRr169JEnvvfeeBg0apB07dvi8YNfhcKikpMRjWdeuXfX4449r6NChdW4wt2PHDk4dAQAQpoqKitS+fftax1gSXiRp8ODBKi4u1vz583X06FGNGzdOvXv31osvvihJ2rlzpwYMGKAXXnhBffr08V2czabXXntNw4YNq/P3VldXa9euXWrRooVlt1u7XC6lp6erqKjopG27ww37Fr4ief/Yt/DEvoWnYO2bMUalpaVq166dYmJqv6rFklulJWnJkiW65ZZbNGDAAMXExOi6667TE0884V5/9OhRffPNNzp48KBfvzcmJuakic1fkpKSIu5/2mPYt/AVyfvHvoUn9i08BWPf7HZ7ncZZFl5SUlLcsyy+dOzY8aTntSyaFAIAAGGM3kYAACCsEF4aICEhQTNmzPC4yylSsG/hK5L3j30LT+xbeAqHfbPsgl0AAAArMPMCAADCCuEFAACEFcILAAAIK4QXAAAQVggvPvztb39Tv3791KxZM69eS74cPXpUd999t7p27apTTjlF7dq1U1ZWlnbt2uUxrmPHjl6NLGfNmmXRXtSsvvsn/fzMnenTp6tt27Zq2rSpMjMz9d1333mM2b9/v0aOHKmkpCQlJydrwoQJKisrs2APalbfGrZt21Zjk9GXX37ZPc7X+qVLlwZil9wa8ud76aWXetV98803e4zZvn27hgwZombNmqlNmzb64x//qMrKSit3xUt9923//v269dZb1blzZzVt2lSnn366brvtNjmdTo9xwThu8+bNU8eOHZWYmKiMjAytXr261vEvv/yyzj33XCUmJqpr165avny5x/q6/OwFUn32b8GCBbr44ovVsmVLtWzZUpmZmV7jx44d63WMBg0aZPVu+FSffXvuuee86k5MTPQYE0rHrj775uvvDZvNpiFDhrjHBP24GXiZPn26mTNnjsnOzjZ2u/2k4w8cOGAyMzPNsmXLzObNm01+fr7p06eP6dWrl8e4Dh06mPvvv9/s3r3b/SorK7NoL2pW3/0zxphZs2YZu91uXn/9dfPVV1+Zq666ypxxxhnm0KFD7jGDBg0y3bt3N59//rn5z3/+Y8466yxz4403WrQXvtW3hsrKSo/jsXv3bnPfffeZ5s2bm9LSUvc4SebZZ5/1GHf8vgdCQ/58+/fvbyZOnOhRt9PpdK+vrKw0F1xwgcnMzDTr1q0zy5cvN61atTI5OTlW746H+u7bhg0bzLXXXmvefPNNs2XLFpOXl2fOPvtsc91113mMC/RxW7p0qYmPjzeLFi0yGzduNBMnTjTJycmmuLjY5/jPPvvMxMbGmocfftj897//Nffcc49p0qSJ2bBhg3tMXX72AqW++zdixAgzb948s27dOrNp0yYzduxYY7fbzY4dO9xjxowZYwYNGuRxjPbv3x+oXXKr7749++yzJikpyaNuh8PhMSZUjl19923fvn0e+/X111+b2NhY8+yzz7rHBPu4EV5q8eyzz9b5l/uJVq9ebSSZH3/80b2sQ4cO5rHHHvNPcX5Q1/2rrq42aWlp5pFHHnEvO3DggElISDD//ve/jTHG/Pe//zWSzJdffuke88477xibzWZ27tzp99p98VcNPXr0MOPHj/dYJsm89tpr/iq13hq6b/379zdTp06tcf3y5ctNTEyMx1+6Tz31lElKSjIVFRV+qf1k/HXcXnrpJRMfH2+OHj3qXhbo49anTx8zZcoU9/uqqirTrl07k5ub63P87373OzNkyBCPZRkZGeb3v/+9MaZuP3uBVN/9O1FlZaVp0aKFef75593LxowZY66++mp/l1pv9d23k/39GUrHrrHH7bHHHjMtWrTw+Md2sI8bp40s4nQ6ZbPZvE7LzJo1S6eeeqp69uypRx55JODT8w2xdetWORwOZWZmupfZ7XZlZGQoPz9fkpSfn6/k5GT17t3bPSYzM1MxMTH64osvAlKnP2ooKChQYWGhJkyY4LVuypQpatWqlfr06aNFixYFtH1FY/ZtyZIlatWqlS644ALl5OR49BPLz89X165dlZqa6l42cOBAuVwubdy40f874oO//t9xOp1KSkpSXJxn15NAHbcjR46ooKDA4+ckJiZGmZmZ7p+TE+Xn53uMl37+8z82vi4/e4HSkP070cGDB3X06FGlpKR4LF+5cqXatGmjzp07a/Lkydq3b59faz+Zhu5bWVmZOnTooPT0dF199dUePzOhcuz8cdwWLlyoG264QaeccorH8mAeN8t6G0Wzw4cP6+6779aNN97o0dTqtttu04UXXqiUlBStWrVKOTk52r17t+bMmRPEak/O4XBIkscvuGPvj61zOBxq06aNx/q4uDilpKS4xwSizsbWsHDhQp133nnq16+fx/L7779fv/71r9WsWTO99957+sMf/qCysjLddtttfqu/Ng3dtxEjRqhDhw5q166d1q9fr7vvvlvffPONXn31Vffn+jqux9YFgj+OW0lJiR544AFNmjTJY3kgj1tJSYmqqqp8/nlu3rzZ5zY1/fkf/3N1bFlNYwKlIft3orvvvlvt2rXz+EU6aNAgXXvttTrjjDP0/fff689//rMGDx6s/Px8xcbG+nUfatKQfevcubMWLVqkbt26yel0avbs2erXr582btyo9u3bh8yxa+xxW716tb7++mstXLjQY3mwj1vUhJdp06bpoYceqnXMpk2bdO655zbqe44eParf/e53Msboqaee8liXnZ3t/u9u3bopPj5ev//975Wbm9voxzAHav+Coa771liHDh3Siy++qHvvvddr3fHLevbsqfLycj3yyCON/iVo9b4d/8u8a9euatu2rQYMGKDvv/9eZ555ZoM/ty4CddxcLpeGDBmiLl26aObMmR7rrDpuqL9Zs2Zp6dKlWrlypceFrTfccIP7v7t27apu3brpzDPP1MqVKzVgwIBglFonffv2Vd++fd3v+/Xrp/POO09PP/20HnjggSBW5l8LFy5U165d1adPH4/lwT5uURNe7rzzTo0dO7bWMZ06dWrUdxwLLj/++KM+/PDDk7YSz8jIUGVlpbZt26bOnTs36rut3L+0tDRJUnFxsdq2beteXlxcrB49erjH7Nmzx2O7yspK7d+/3719Q9V13xpbwyuvvKKDBw8qKyvrpGMzMjL0wAMPqKKiolHBM1D7dkxGRoYkacuWLTrzzDOVlpbmdddBcXGxJIXFcSstLdWgQYPUokULvfbaa2rSpEmt4/113Hxp1aqVYmNj3X9+xxQXF9e4H2lpabWOr8vPXqA0ZP+OmT17tmbNmqUPPvhA3bp1q3Vsp06d1KpVK23ZsiVg4aUx+3ZMkyZN1LNnT23ZskVS6By7xuxbeXm5li5dqvvvv/+k3xPw4xa0q23CQH0u2D1y5IgZNmyYOf/8882ePXvqtM3ixYtNTExMUK6sN6b+F+zOnj3bvczpdPq8YHfNmjXuMe+++25QLthtaA39+/f3ululJn/9619Ny5YtG1xrffnrz/fTTz81ksxXX31ljPnfBbvH33Xw9NNPm6SkJHP48GH/7UAtGrpvTqfTXHTRRaZ///6mvLy8Tt9l9XHr06ePueWWW9zvq6qqzGmnnVbrBbu/+c1vPJb17dvX64Ld2n72Aqm++2eMMQ899JBJSkoy+fn5dfqOoqIiY7PZzBtvvNHoeuujIft2vMrKStO5c2dzxx13GGNC69g1dN+effZZk5CQYEpKSk76HYE+boQXH3788Uezbt069y2z69atM+vWrfO4dbZz587m1VdfNcb8HFyuuuoq0759e1NYWOhx69ixOzZWrVplHnvsMVNYWGi+//57s3jxYtO6dWuTlZUV8vtnzM+3/CUnJ5s33njDrF+/3lx99dU+b5Xu2bOn+eKLL8ynn35qzj777KDcKl1bDTt27DCdO3c2X3zxhcd23333nbHZbOadd97x+sw333zTLFiwwGzYsMF899135sknnzTNmjUz06dPt3x/jlfffduyZYu5//77zZo1a8zWrVvNG2+8YTp16mQuueQS9zbHbpW+4oorTGFhoVmxYoVp3bp1UG6Vrs++OZ1Ok5GRYbp27Wq2bNni8TNXWVlpjAnOcVu6dKlJSEgwzz33nPnvf/9rJk2aZJKTk913c40ePdpMmzbNPf6zzz4zcXFxZvbs2WbTpk1mxowZPm+VPtnPXqDUd/9mzZpl4uPjzSuvvOJxjI79XVNaWmruuusuk5+fb7Zu3Wo++OADc+GFF5qzzz47YOG5oft23333mXfffdd8//33pqCgwNxwww0mMTHRbNy40WP/Q+HY1XffjvnVr35lhg8f7rU8FI4b4cWHMWPGGEler48++sg9Rv/3/AhjjNm6davP8cdvU1BQYDIyMozdbjeJiYnmvPPOMw8++GDAf0Absn/G/PyviHvvvdekpqaahIQEM2DAAPPNN994fO6+ffvMjTfeaJo3b26SkpLMuHHjPAJRIJyshmPH6vh9NcaYnJwck56ebqqqqrw+85133jE9evQwzZs3N6eccorp3r27mT9/vs+xVqrvvm3fvt1ccsklJiUlxSQkJJizzjrL/PGPf/R4zosxxmzbts0MHjzYNG3a1LRq1crceeedHrcbB0J99+2jjz6q8Wdu69atxpjgHbe///3v5vTTTzfx8fGmT58+5vPPP3ev69+/vxkzZozH+Jdeesmcc845Jj4+3px//vnm7bff9lhfl5+9QKrP/nXo0MHnMZoxY4YxxpiDBw+aK664wrRu3do0adLEdOjQwUycONHreSmBUp99u/32291jU1NTzZVXXmnWrl3r8XmhdOzq+//l5s2bjSTz3nvveX1WKBw3mzEBvN8TAACgkXjOCwAACCuEFwAAEFYILwAAIKwQXgAAQFghvAAAgLBCeAEAAGGF8AIAAMIK4QUAAIQVwgsAAAgrhBcAABBWCC8AACCsEF4AAEBY+f+QCxI+NcAt5QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot([0, tw[0]], [0, tw[1]], color=\"k\", linewidth=3, label=r\"t\")\n", + "plotwt = [0, rw[0]], [0, rw[1]]\n", + "plt.plot(plotwt, color=[0.7, 0.7, 0.7], linewidth=3, label=r\"r\")\n", + "plt.axis(\"equal\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9JUlEQVR4nO3de1yUZf7/8fdwxnRABUXzgFYoKuEBGclKvkZJtm3ut9TMNS3Tdh+L2Wl3tf1uttu3tVq37WT1sDarXdvKfmWtW7au5wMNoOBZC8M8gYgICCjH+/eHX2cbGFCQYbiH1/PxmMej++aamc/ckvP2uq77uiyGYRgCAAAwCR9PFwAAANAUhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqhBcAAGAqfp4uoKXV1tbq+PHj6tSpkywWi6fLAQAAl8AwDJ05c0Y9e/aUj0/jfSteF16OHz+u3r17e7oMAADQDEeOHFGvXr0abeN14aVTp06Szn94q9Xq4WoAAMClKCkpUe/evR3f443xuvByYajIarUSXgAAMJlLmfLBhF0AAGAqhBcAAGAqhBcAAGAqXjfnBQDQvtXU1KiqqsrTZcAFf39/+fr6XvbrEF4AAF6jtLRUR48elWEYni4FLlgsFvXq1UsdO3a8rNchvAAAvEJNTY2OHj2qDh06KDw8nIVK2xjDMHTy5EkdPXpU11xzzWX1wBBeAABeoaqqSoZhKDw8XMHBwZ4uBy6Eh4fr0KFDqqqquqzwwoRdAIBXocel7WqpPxvCCwAAMBXCCwAAMJVWCS+LFy9WZGSkgoKCZLPZlJaW1mDbPXv26M4771RkZKQsFotefPHF1igRAACYhNvDy4cffqhHH31UCxYs0Pbt2xUbG6tx48YpPz/fZfvy8nL1799fzz77rCIiItxdHgAAHpWYmKiHH37Y02WYitvvNnrhhRc0a9Ys3XfffZKkN954Q//85z/19ttva968efXajxw5UiNHjpQklz8HAKApTp482eznduzYscE7lwoKClyuJxMeHt7s9zODyspKBQQEeLQGt/a8VFZWatu2bUpKSvrPG/r4KCkpSampqe58awAAJEndunVr9uPtt99u8HWjo6NdPqcpZsyYoQ0bNuill16SxWKRxWJRWFiYFi1a5GgzYcIE+fv7q7S0VJJ09OhRWSwWZWdnX/T1IyMj9fTTT2vKlCm64oordOWVV2rx4sVObYqKivTAAw8oPDxcVqtVY8eO1Y4dOxw/f+qppzR06FC99dZb6tevn4KCgiSd7zFKSUlRSkqKQkJCFBYWpt/+9retskCgW8NLQUGBampq1L17d6fz3bt3V15eXou8R0VFhUpKSpweAACYwUsvvaSEhATNmjVLubm5ys3N1bRp07R+/XpJ5xd227Rpk0JDQ7V582ZJ0oYNG3TllVfq6quvvqT3+OMf/6jY2FhlZmZq3rx5mjt3rlavXu34+cSJE5Wfn68vv/xS27Zt0/Dhw3XTTTepsLDQ0SY7O1v/7//9P33yySfKyspynH/33Xfl5+entLQ0vfTSS3rhhRf01ltvXf6FuQjTL1K3cOFC/e53v/N0GQAANFlISIgCAgLUoUMHxzzPsWPHaunSpaqpqdHu3bsVEBCgyZMna/369UpOTtb69es1ZsyYS36P0aNHO6ZhREVFacuWLfrzn/+sm2++WZs3b1ZaWpry8/MVGBgoSVq0aJFWrFihjz/+WLNnz5Z0fiTlvffeqzck1rt3b/35z3+WxWLRgAEDtGvXLv35z3/WrFmzWuLyNMitPS9hYWHy9fXViRMnnM6fOHGixSbjzp8/X8XFxY7HkSNHWuR1AQDwhBtuuEFnzpxRZmamNmzYoDFjxigxMdHRG7NhwwYlJiZe8uslJCTUO963b58kaceOHSotLVXXrl3VsWNHxyMnJ0cHDx50PKdv374u5/KMGjXKaeG5hIQEffvtt6qpqWnCJ246t/a8BAQEaMSIEVqzZo0mTJggSaqtrdWaNWuUkpLSIu8RGBjoSIsAANTV0N2tl6KxDQT37dvnlvkdoaGhio2N1fr165Wamqqbb75ZN954oyZPnqxvvvlG3377bZN6XhpTWlqqHj16OIJR3TouuOKKK1rk/VqK24eNHn30UU2fPl1xcXGKj4/Xiy++qLKyMsfdR/fee6+uvPJKLVy4UNL5rqm9e/c6/vvYsWPKyspSx44dL3l8DwCAC9x1909YWFiLvE5AQEC9nooxY8Zo3bp1SktL0zPPPKMuXbooOjpazzzzjHr06KGoqKhLfv2vv/663nF0dLQkafjw4crLy5Ofn58iIyObXLvdbq/32pe76eKlcPs6L5MnT9aiRYv05JNPaujQocrKytKqVasck3gPHz6s3NxcR/vjx49r2LBhGjZsmHJzc7Vo0SINGzZMDzzwgLtLBQCg1UVGRsput+vQoUMqKChQbW2tEhMT9dVXX8nPz08DBw6UdP7unmXLljW512XLli16/vnn9c0332jx4sVavny55s6dK0lKSkpSQkKCJkyYoH/96186dOiQtm7dqt/85jfKyMi46GsfPnxYjz76qA4cOKC///3veuWVVxyv7U6tMmH3wq1UrtTtqoqMjGyV26wAAGgLHn/8cU2fPl2DBg3S2bNnlZOToxtuuEG1tbVOQSUxMVEvvfRSk+a7SNJjjz2mjIwM/e53v5PVatULL7ygcePGSTq/UeIXX3yh3/zmN7rvvvt08uRJRURE6MYbb6x3p7Ar9957r86ePav4+Hj5+vpq7ty5jkm+7mQxvCwplJSUKCQkRMXFxbJarZ4uBwDQSs6dO6ecnByntUjau8jISD388MNuWcE3MTFRQ4cObdI2Po39GTXl+5uNGQEAgKkQXgAAMKFNmzY53d5c9+HNTL9IHQAA7VFcXJzTareuHDp0yG3v7+r26tZCeAEAwISCg4Pb7RIiDBsBAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAABTIbwAAOBBiYmJblm+/3LMmDFDEyZM8HQZDWKdFwCAVzt58qTTcefOneXn5/rrr27b0NBQ+fv7u2xbUFDgtJFwSEiIAgICLrNaz6qpqZHFYvF0GRdFzwsAwKt169bN6XHgwIEG20ZGRjq1bWwF2+joaKe2W7dubXJtM2bM0IYNG/TSSy/JYrHIYrEoLCxMixYtcrSZMGGC/P39VVpaKkk6evSoLBaLsrOzL/r6p0+f1r333qvOnTurQ4cOuvXWW/Xtt986fv7OO+8oNDRUn3/+uQYNGqTAwEDdf//9evfdd/XZZ585arqwmu6uXbs0duxYBQcHq2vXrpo9e7ajrtZEeAEAwENeeuklJSQkaNasWcrNzVVubq6mTZvmCAuGYWjTpk0KDQ3V5s2bJUkbNmzQlVdeeUmr686YMUMZGRn6/PPPlZqaKsMwNH78eFVVVTnalJeX67nnntNbb72lPXv26OWXX9akSZOUnJzsqOm6665TWVmZxo0bp86dOys9PV3Lly/Xv//9b6WkpLjl2jSGYSMAADzkwlBThw4dFBERIUkaO3asli5dqpqaGu3evVsBAQGaPHmy1q9fr+TkZK1fv15jxoy56Gt/++23+vzzz7VlyxZdd911kqRly5apd+/eWrFihSZOnChJqqqq0muvvabY2FjHc4ODg1VRUeGoSZLeffddnTt3Tu+9956uuOIKSdKrr76q22+/Xc8995y6d+/eYtflYuh5AQCgDbnhhht05swZZWZmasOGDRozZowSExMdvTEbNmxQYmLiRV9n37598vPzk81mc5zr2rWrBgwYoH379jnOBQQE6Nprr72k14uNjXUEF0kaPXq0amtrGx2Kcwd6XgAAXi0/P9/puHPnzg22rbsLc2hoaINt9+3bV2/CbksIDQ1VbGys1q9fr9TUVN1888268cYbNXnyZH3zzTf69ttvL6nn5VIFBwebYpLuDxFeAABeLTw83C1tw8LCmlNOPQEBAaqpqXE6N2bMGK1bt05paWl65pln1KVLF0VHR+uZZ55Rjx49FBUVddHXjY6OVnV1tex2u2PY6NSpUzpw4IAGDRrU5Jqio6P1zjvvqKyszNH7smXLFvn4+GjAgAFN+ciXjWEjAAA8KDIyUna7XYcOHVJBQYFqa2uVmJior776Sn5+fho4cKCk8+vBLFu27JJ7Xa655hrdcccdmjVrljZv3qwdO3bopz/9qa688krdcccdF61p586dOnDggAoKClRVVaWpU6cqKChI06dP1+7du7Vu3TrNmTNH06ZNa9X5LhLhBQAAj3r88cfl6+urQYMGKTw8XIcPH9YNN9yg2tpap6CSmJiompqaS5rvcsHSpUs1YsQI/ehHP1JCQoIMw9AXX3zR4No1F8yaNUsDBgxQXFycwsPDtWXLFnXo0EFfffWVCgsLNXLkSN1111266aab9Oqrrzb3ozebxfjhgJ0XKCkpUUhIiIqLi2W1Wj1dDgCglZw7d045OTnq16+fgoKCPF0OXGjsz6gp39/0vAAAAFMhvAAAYEKbNm1Sx44dG3x4M+42AgDAhOLi4hrdvsCbEV4AADCh4ODgS9oiwBsxbAQA8Cpedh+KV2mpPxvCCwDAK/j6+kqSKisrPVwJGnLhz+bCn1VzMWwEAPAKfn5+6tChg06ePCl/f3/5+PDv87aktrZWJ0+eVIcOHeTnd3nxg/ACAPAKFotFPXr0UE5Ojr7//ntPlwMXfHx81KdPn8veS4nwAgDwGgEBAbrmmmsYOmqjAgICWqRHjPACAPAqPj4+rLDr5RgQBAAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAApkJ4AQAAptIq4WXx4sWKjIxUUFCQbDab0tLSGm2/fPlyDRw4UEFBQYqJidEXX3zRGmUCAAATcHt4+fDDD/Xoo49qwYIF2r59u2JjYzVu3Djl5+e7bL9161ZNmTJFM2fOVGZmpiZMmKAJEyZo9+7d7i4VAACYgMUwDMOdb2Cz2TRy5Ei9+uqrkqTa2lr17t1bc+bM0bx58+q1nzx5ssrKyrRy5UrHuVGjRmno0KF64403Lvp+JSUlCgkJUXFxsaxWa8t9EAAA3KikpETp6elKS0uT3W7XsGHDtGDBAk+X1Wqa8v3t1p6XyspKbdu2TUlJSf95Qx8fJSUlKTU11eVzUlNTndpL0rhx4xpsX1FRoZKSEqcHAABm88orrygpKUlPPPGEPvvsM33xxReO71E39zOYjlvDS0FBgWpqatS9e3en8927d1deXp7L5+Tl5TWp/cKFCxUSEuJ49O7du2WKBwCgBRiGocOHD2v58uV66623Gmxns9mcjtPT09WpUyfFxcUpJyfH3WWaiunvNpo/f76Ki4sdjyNHjni6JAAAJEmbNm1Sz5491bdvX02aNEnz589vsBdl5MiRslgsjmPDMFRZWSlJstvtrVKvWbg1vISFhcnX11cnTpxwOn/ixAlFRES4fE5EREST2gcGBspqtTo9AABoDdXV1dq3b1+DP+/Vq5fTyEFBQUGDvSghISG69tprNXLkSPXt29fpZxe7S7e9cWt4CQgI0IgRI7RmzRrHudraWq1Zs0YJCQkun5OQkODUXpJWr17dYHsAAFpTcXGxfvWrX2nMmDEKCQnRoEGDdPr0aZdtIyMjFR4e7nSusV6U7du3Ky0tTffff/8lP6c9cvuw0aOPPqo333xT7777rvbt26ef//znKisr03333SdJuvfeezV//nxH+7lz52rVqlX605/+pP379+upp55SRkaGUlJS3F0qAAAXFRwcrJdfflkbN25UeXm5pPPzU1yxWCyOuSydO3fWuHHjFBoa2uBr+/ic/1quO/9l+/btjiEktEJ4mTx5shYtWqQnn3xSQ4cOVVZWllatWuWYlHv48GHl5uY62l933XV6//33tWTJEsXGxurjjz/WihUrNGTIEHeXCgBox3bu3KklS5bogQceUExMjDIzM122CwgI0LBhw5zONTas84c//EEHDhzQqVOntGrVKt16660XrSU+Pt7puKKiQjt37ryET9E++LXGm6SkpDTYc7J+/fp65yZOnKiJEye6uSoAAP7jzjvvVHZ2tuP4wlorrsTHx+vrr792HB86dKjB142JiWlyLZ07d1ZUVJS++eYbp3ri4uKa/FreyPR3GwEA0JgzZ85o3bp1evbZZ7V169YG29UdqmlsnsmECRP029/+VitXrlR+fn6jt0A3V1PqaW8ILwAAr/Wzn/1MoaGhGjt2rObPn69PP/20wbZ1h2oaCwv/9V//pd///ve67bbb6k3IbSmEl4a1yrARAADucPToUZWXlysqKsrlz7t166ba2lrHcWMBYNSoUerXr59sNptsNptGjRrV4vU2Rd3w8s033+j06dPq3LmzhypqOwgvAABT+de//qXXX39daWlpOn78uH7yk5/ok08+cdm2bgDYtm2bqqur5edX/+svPj5e3333nVtqbo5rr71WgYGBqqiocJxLT0/XLbfc4sGq2gaGjQAAbU5je/nk5uZqxYoVOn78uKTGe1MuDAX5+flpxIgRmjFjhkpLS1u2WDdxdVcTQ0fn0fMCAPC4oqIirVmzRna7XXa7XdXV1dqyZYvLtnV7U44fP66jR4+qV69e9dqGh4crLS1NQ4YMUXBwsFtqdyebzeZ0VxPh5TzCCwDA43bv3q277rrLcezj46PS0lJ17NixXtuoqCiFhISouLhY0vll9b/77juX4UU6v2eQWbmatGsYhtMeSO0R4QUA4DY1NTXas2eP7Ha7MjMz9corr8jX17deu+HDh8vX11c1NTWSzm8ls23bNo0ZM6ZeWx8fHz399NMKCQlRfHy8oqKiHCvTepu64aW2tlb5+fmOhV7bK8ILAMAtTp8+rd69e6usrMxxLiUlRYMGDarXtkOHDrr22mudVrW12+0uw4skzZkzp+ULboP69eunX/7y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lnbt2qXvv/+e/X+Ai3j11Vf13HPPaf369SotLW1Xi9XR8wLgkr3//vv6+c9/rpKSEknSiBEjGlywrW54+f7773XixAl17969Xtvu3btryZIlLV8w4MXi4+O1cuVKxzHhBUC7VF5erpycnAbvyomIiHAEF+n8hoZnz55VcHBwvbaDBg1Sjx49NHDgQMXHx8tms6ljx45uqx1ob9rzDtOEF6CdO3TokJ577jnZ7Xbt3LlTISEhKigocDlsExcXJ4vF4ti0sLq6WpmZmbruuuvqtfX19dWxY8cY/gHc5IebhErnd5jesWNHvZ2nvRFzXoB2zmKx6I033lBmZqZqampUWFio7Oxsl22tVqsGDRokSerVq5fuvPPORv+VR3AB3Cc0NFQDBgxwOtdeho4IL4AXqqmp0ZYtW/TCCy/o7rvvVv/+/XXq1CmXbfv06VNvHkpjfwH+9a9/1bFjx3TkyBF9/PHHiouLa9HaAVy69rrDNMNGgBeqra1VUlKSzp075ziXnp6u5OTkem0tFotsNps+//xzSecXf/v+++8bfO1hw4a1fMEAmsVms+m9995zHDe24rQ3oecFMJn8/Hz94x//0P/8z/9o//79Ltv4+/trxIgRTuca+xfZ9OnTHbdcFhcX6ze/+U2L1gzAPer2vHzzzTc6ffq0h6ppPfS8ACZy880369///rfj+MLdPK7Ex8dry5YtjuPGwst///d/t1yRAFpNTEyMAgMDVVFR4TiXlpamcePGebAq96PnBWgjamtrtX//fh06dKjBNj169HA6biyQXHfddYqJidEDDzygN998U4sWLWqpUgG0EQEBARo+fLjTufYw74XwAnjY3/72N918883q0qWLoqOj9fLLLzfYtimT8+666y7t3LlTb775ph544AHHXUIAvEt7nLTLsBHQChrap0eSDh486DQUdCk7Kl9xxRWKi4vTqFGjVFtbKx8f/h0CtFeuwktjf+d4A8IL4AbHjx/X6tWrZbfbZbfb1a9fP3388ccu29b9i2f79u2qqqqSv79/vbaxsbHasWOHBg8eLF9fX7fUDsBc6v4dcurUKX333Xe66qqrPFSR+xFeADdYu3atZsyY4Tg+duxYg/8SqrtKZpcuXXT06FH169evXlt/f39de+21LV4vAPOKjIxUeHi4Tp486TiXlpZGeAFw3rlz57R9+3bZ7XYdO3as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SYlCQkJUXFwsq9V6WZ8BAID2yDAM9ezZU3l5eY5z7733nqZNm+a292zK97fbel5SU1MVGhrqCC6SlJSUJB8fnyZt9HThQzQUXCoqKlRSUuL0AAAAzdfWd5h2W3jJy8tTt27dnM75+fmpS5cuTkmuMQUFBXr66acbHWpauHChQkJCHI/evXtfVt0AAKD+0JGpw8u8efNksVgafezfv/+yCyspKdFtt92mQYMG6amnnmqw3fz581VcXOx4HDly5LLfGwCA9q5ueNmxY4fOnTvnoWqcNflW6ccee0wzZsxotE3//v0VERGh/Px8p/PV1dUqLCxUREREo88/c+aMkpOT1alTJ3366afy9/dvsG1gYKACAwMvuX4AAHBxcXFxslgsjruMqqqqlJWVpVGjRnm4smaEl/Dw8EvacTIhIUFFRUXatm2bRowYIUlau3atamtr66W5HyopKdG4ceMUGBiozz//XEFBQU0tEQAAXCar1aro6Gjt3bvXcc5ut7eJ8OK2OS/R0dFKTk7WrFmzlJaWpi1btiglJUV33323406jY8eOaeDAgY7Fb0pKSnTLLbeorKxMf/nLX1RSUqK8vDzl5eWppqbGXaUCAAAX2uq8F7eu87Js2TINHDhQN910k8aPH6/rr79eS5Yscfy8qqpKBw4cUHl5uSRp+/btstvt2rVrl66++mr16NHD8WAuCwAArauthhe3rfPiKazzAgBAy8jKytKwYcOczuXn51/S9JGmahPrvAAAAHMbMmSIOnTo4HSuLexzRHgBAAAu+fn5OW66uSAjI8ND1fwHu0oDAIAGTZw4UYMHD5bNZpPNZtOAAQM8XRLhBQAANGzOnDmeLqEeho0AAICpEF4AAICpEF4AAICpEF4AAICpEF4AAMAlKS8v16ZNm7Ro0SKP7jDN3UYAAKBR1dXVGjVqlLKyshx7DY4ePVoJCQkeqYeeFwAA0Cg/Pz+dO3fOaZNkT+5zRHgBAAAX1ZY2aSS8AACAi7oQXvr06aOJEyfqlltu8Vgt7CoNAAAuqqioSOfOnVNERIRbXr8p399M2AUAABcVGhrq6RIcGDYCAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACm4tbwUlhYqKlTp8pqtSo0NFQzZ85UaWlpo8958MEHddVVVyk4OFjh4eG64447tH//fneWCQAATMSt4WXq1Knas2ePVq9erZUrV2rjxo2aPXt2o88ZMWKEli5dqn379umrr76SYRi65ZZbVFNT485SAQCASVgMwzDc8cL79u3ToEGDlJ6erri4OEnSqlWrNH78eB09elQ9e/a8pNfZuXOnYmNjlZ2drauuuuqi7UtKShQSEqLi4mJZrdbL+gwAAKB1NOX72209L6mpqQoNDXUEF0lKSkqSj4+P7Hb7Jb1GWVmZli5dqn79+ql3794u21RUVKikpMTpAQAAvJfbwkteXp66devmdM7Pz09dunRRXl5eo8997bXX1LFjR3Xs2FFffvmlVq9erYCAAJdtFy5cqJCQEMejoZADAAC8Q5PDy7x582SxWBp9XO4E26lTpyozM1MbNmxQVFSUJk2apHPnzrlsO3/+fBUXFzseR44cuaz3BgAAbZtfU5/w2GOPacaMGY226d+/vyIiIpSfn+90vrq6WoWFhYqIiGj0+Rd6Ua655hqNGjVKnTt31qeffqopU6bUaxsYGKjAwMCmfgwAAGBSTQ4v4eHhCg8Pv2i7hIQEFRUVadu2bRoxYoQkae3ataqtrZXNZrvk9zMMQ4ZhqKKioqmlAgAAL+S2OS/R0dFKTk7WrFmzlJaWpi1btiglJUV33323406jY8eOaeDAgUpLS5Mkfffdd1q4cKG2bdumw4cPa+vWrZo4caKCg4M1fvx4d5UKAABMxK3rvCxbtkwDBw7UTTfdpPHjx+v666/XkiVLHD+vqqrSgQMHVF5eLkkKCgrSpk2bNH78eF199dWaPHmyOnXqpK1bt9ab/AsAANont63z4ims8wIAgPm0iXVeAAAA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j2jqdXNF7fBuI8No+rU7ePCg8Yc//MHIyMgwvv/+e2PLli3G7bffbnTp0sU4ceKEpz6GRzT12hUXFxs2m82IiYkxsrOzjdzcXMejurraUx+j1TXn/9fc3FwjMzPTePPNNw1JxsaNG43MzEzj1KlTnvgIreKDDz4wAgMDjXfeecfYu3evMXv2bCM0NNTIy8szDMMwpk2bZsybN8/RfsuWLYafn5+xaNEiY9++fcaCBQsMf39/Y9euXZ76CB5DeGllp06dMqZMmWJ07NjRsFqtxn333WecOXPG8fOcnBxDkrFu3TrDMAzj8OHDxo033mh06dLFCAwMNK6++mrjl7/8pVFcXOyhT+AZTb1urrTX8NLUa3fs2DHj1ltvNbp162b4+/sbvXr1Mu655x5j//79HvoEntPUa3eh18DVIycnxzMfwgOa8//rggULXF43b+/te+WVV4w+ffoYAQEBRnx8vPH11187fjZmzBhj+vTpTu0/+ugjIyoqyggICDAGDx5s/POf/2zlitsGi2EYRiuNUAEAAFw27jYCAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACmQngBAACm8v8BwLrjEp8+p1MAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plottwt = [0, tw_para[0]], [0, tw_para[1]]\n", + "plt.plot(plottwt, \"k--\", linewidth=3, label=r\"tw_perp\")\n", + "plt.plot([0, tw_perp[0]], [0, tw_perp[1]], \"k:\", linewidth=3, label=r\"tw_orto\")\n", + "plt.axis(\"equal\")\n", + "plt.legend()\n", + "plt.show()" + ] } ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -598,7 +740,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.12.8" } }, "nbformat": 4, diff --git a/Math/linear_algebra/lecture1.py b/Math/linear_algebra/lecture1.py index 729a3059..b464a200 100644 --- a/Math/linear_algebra/lecture1.py +++ b/Math/linear_algebra/lecture1.py @@ -6,6 +6,7 @@ # mypy: allow-untyped-defs # mypy: allow-untyped-calls import numpy as np +from matplotlib import pyplot as plt # ![image.png](attachment:image.png) @@ -173,3 +174,44 @@ def mag_vector(vct, mag): v_add = np.array(v_add, ndmin=2) print(v_add) + +# + +# Гибкость бродкастинга - разные математические операции в отличие от outer +# product +twt = np.array([[1, 2, 3]]) +twwt = np.array([[2, 4]]) +broadcasttwt = twt.T + twwt +print(broadcasttwt) + +outerttwt = np.outer(twt, twwt) +print(outerttwt) +# - + +tw = np.random.randn(2) +rw = np.random.randn(2) + +# + +tw_para = rw * (np.dot(tw, rw) / np.dot(rw, rw)) +tw_perp = tw - tw_para + +# tw, tw_para + tw_perp +# array([ 0.82625583, -0.96648386]), array([ 0.82625583, -0.96648386]) +# - + +int(np.dot(tw_para, tw_perp)) # orto 10**(-17), 1/1000000000000000000 = 0 + +plt.figure(figsize=(6, 6)) + +plt.plot([0, tw[0]], [0, tw[1]], color="k", linewidth=3, label=r"t") +plotwt = [0, rw[0]], [0, rw[1]] +plt.plot(plotwt, color=[0.7, 0.7, 0.7], linewidth=3, label=r"r") +plt.axis("equal") +plt.legend() +plt.show() + +plottwt = [0, tw_para[0]], [0, tw_para[1]] +plt.plot(plottwt, "k--", linewidth=3, label=r"tw_perp") +plt.plot([0, tw_perp[0]], [0, tw_perp[1]], "k:", linewidth=3, label=r"tw_orto") +plt.axis("equal") +plt.legend() +plt.show() diff --git a/log.ipynb b/log.ipynb index 2755a6d0..b4a72fb5 100644 --- a/log.ipynb +++ b/log.ipynb @@ -9,6 +9,74 @@ "\"\"\"Логирование уроков.\"\"\"" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "05/01/2025 Линейная алгебра\n", + "\n", + "\n", + "1. Понятие алгебраической структуры\n", + "\n", + "2. Полугруппа и ее аксиомы\n", + "\n", + "3. Моноид и его аксиомы\n", + "\n", + "4. Группа и ее аксиомы\n", + "\n", + "5. Кольцо и его аксиомы\n", + "\n", + "6. Поле и его аксиомы" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "02/01/2025 Линейная алгебра\n", + "\n", + "\n", + "1. Линейно-взвешенная комбинация\n", + "\n", + "2. Различие скалярного произведения и линейно-взвешенной комбинации (рез-т)\n", + "\n", + "3. L1, L2 нормы\n", + "\n", + "4. Линейная независимость и зависимость\n", + "\n", + "5. Тривиальное решение и уравнение линейной зависимости\n", + "\n", + "6. Вектор нулей и его линейная зависимость\n", + "\n", + "7. Векторные пространства\n", + "\n", + "8. Бинарная операция\n", + "\n", + "9. Коммутативность и ассоциативность алгебраических структур\n", + "\n", + "10. Единичный элемент и нейтральный элемент" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "29/12/2024 Линейная алгебра\n", + "\n", + "\n", + "1. Понятие ортогональности и орта\n", + "\n", + "2. Понятие ортогонального разложения\n", + "\n", + "3. Скалярное произведение ортогональных векторов\n", + "\n", + "4. Вычисление параллельной компоненты вектора t относительно вектора r\n", + "(математически и на Python)" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/log.py b/log.py index e38f29ef..0dfe3069 100644 --- a/log.py +++ b/log.py @@ -1,5 +1,58 @@ """Логирование уроков.""" +# +# 05/01/2025 Линейная алгебра +# +# +# 1. Понятие алгебраической структуры +# +# 2. Полугруппа и ее аксиомы +# +# 3. Моноид и его аксиомы +# +# 4. Группа и ее аксиомы +# +# 5. Кольцо и его аксиомы +# +# 6. Поле и его аксиомы + +# +# 02/01/2025 Линейная алгебра +# +# +# 1. Линейно-взвешенная комбинация +# +# 2. Различие скалярного произведения и линейно-взвешенной комбинации (рез-т) +# +# 3. L1, L2 нормы +# +# 4. Линейная независимость и зависимость +# +# 5. Тривиальное решение и уравнение линейной зависимости +# +# 6. Вектор нулей и его линейная зависимость +# +# 7. Векторные пространства +# +# 8. Бинарная операция +# +# 9. Коммутативность и ассоциативность алгебраических структур +# +# 10. Единичный элемент и нейтральный элемент + +# +# 29/12/2024 Линейная алгебра +# +# +# 1. Понятие ортогональности и орта +# +# 2. Понятие ортогонального разложения +# +# 3. Скалярное произведение ортогональных векторов +# +# 4. Вычисление параллельной компоненты вектора t относительно вектора r +# (математически и на Python) + # # 24/12/2024 Линейная алгебра #