{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "import functools\n", "import itertools\n", "import math\n", "\n", "import matplotlib\n", "from matplotlib import pyplot\n", "import numpy as np\n", "import scipy.integrate\n", "\n", "import sys\n", "sys.path.append(\"..\")\n", "from hiora_cartpole import fourier_fa\n", "from hiora_cartpole import fourier_fa_int\n", "from hiora_cartpole import offswitch_hfa\n", "from hiora_cartpole import linfa\n", "from hiora_cartpole import driver\n", "from hiora_cartpole import interruptibility\n", "\n", "import gym_ext.tools as gym_tools\n", "\n", "import gym" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "def make_CartPole():\n", " return gym.make(\"CartPole-v0\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "clipped_high = np.array([2.5, 3.6, 0.28, 3.7])\n", "clipped_low = -clipped_high\n", "state_ranges = np.array([clipped_low, clipped_high])\n", "\n", "four_n_weights, four_feature_vec \\\n", " = fourier_fa.make_feature_vec(state_ranges,\n", " n_acts=2,\n", " order=3)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "def make_uninterruptable_experience(choose_action=linfa.choose_action_Sarsa):\n", " return linfa.init(lmbda=0.9,\n", " init_alpha=0.001,\n", " epsi=0.1,\n", " feature_vec=four_feature_vec,\n", " n_weights=four_n_weights,\n", " act_space=env.action_space,\n", " theta=None,\n", " is_use_alpha_bounds=True,\n", " map_obs=functools.partial(gym_tools.warning_clip_obs, ranges=state_ranges),\n", " choose_action=choose_action)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false }, "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[2016-12-22 11:12:05,275] Making new env: CartPole-v0\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "env = make_CartPole()\n", "fexperience = make_uninterruptable_experience()\n", "fexperience, steps_per_episode, alpha_per_episode \\\n", " = driver.train(env, linfa, fexperience, n_episodes=400, max_steps=500, is_render=False)\n", "# Credits: http://matplotlib.org/examples/api/two_scales.html\n", "fig, ax1 = pyplot.subplots()\n", "ax1.plot(steps_per_episode, color='b')\n", "ax2 = ax1.twinx()\n", "ax2.plot(alpha_per_episode, color='r')\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([[ -2.31825193e+06, 1.38689230e-06],\n", " [ -2.38687849e+06, 7.01438119e-06],\n", " [ 3.01868356e+07, 1.27310333e-05],\n", " [ 7.62664231e+07, 1.95056604e-05],\n", " [ 9.84923733e+07, 2.32515816e-05],\n", " [ 7.75036104e+07, 2.02238501e-05],\n", " [ 3.13949899e+07, 1.38010494e-05],\n", " [ -2.38605724e+06, 6.45226803e-06],\n", " [ -3.39609510e+06, 1.40739157e-06]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sr = state_ranges\n", "\n", "def Q_at_x(e, x, a):\n", " return scipy.integrate.tplquad(\n", " lambda x_dot, theta, theta_dot: \\\n", " e.feature_vec(np.array([x, x_dot, theta, theta_dot]), a)\\\n", " .dot(e.theta),\n", " sr[0][1],\n", " sr[1][1],\n", " lambda _: sr[0][2],\n", " lambda _: sr[1][2],\n", " lambda _, _1: sr[0][3],\n", " lambda _, _1: sr[1][3])\n", "\n", "from multiprocessing import Pool\n", "p = Pool(4)\n", "\n", "def Q_fun(x):\n", " return Q_at_x(fexperience, x, 0)\n", "\n", "num_Qs = np.array( map(Q_fun, np.arange(-2.38, 2.5, 0.5*1.19)) )\n", "num_Qs" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "sym_Q_s0 = fourier_fa_int.make_sym_Q_s0(state_ranges, 3)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([ -2357917.42476503, -2530447.06061102, 30011022.21107416,\n", " 76201952.00856803, 98619287.76323849, 77753287.7212946 ,\n", " 31609597.46793954, -2308012.96767667, -3417714.13839593])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym_Qs = np.array( [sym_Q_s0(fexperience.theta, 0, s0) \n", " for s0 in np.arange(-2.38, 2.5, 0.5*1.19)] )\n", "sym_Qs" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([ 0.98317774, 0.94326356, 1.00585829, 1.00084606, 0.99871309,\n", " 0.99678885, 0.99321068, 1.03381449, 0.99367442])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_Qs[:,0] / sym_Qs" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 39665.49861224, 143568.56981984, 175813.36760074,\n", " 64471.0686937 , -126914.48235117, -249677.3134065 ,\n", " -214607.59855561, -78044.27264443, 21619.03838762])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_Qs[:,0] - sym_Qs" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAOBAMAAACC12zPAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABXklEQVQYGTWRv0sCYRjHP5anUgpXS1CLGPSD\nRmlo8pZo7J2CbCiEoIJQNHKJvKUhGiRatHBpbagp2oxoK+joD4ibikCyaKi8yJ670xdevnye58vz\n430JJJIG2vi2jhztPm8SKBYsCO9s+cgC4W8W7cCh6+iBTQaJ/aFdMeUjq1BlHTKu4wlGeLBo0Rsn\n6SPHkDUcKLmOAqTZNzWHstvVQ+qK7OwnPBgSKk+zKyJdZkS6COfqRGqYEgq1X2yRdA5n7sbsIpEv\nt0XdTVFyFAydKs2xqXUQ+lbov46VZENia+cVkXBFaysmVQdJSKxxWzJEnon+SBGqqgVNs4PRuIRk\nITcjjzJvDUDKOhOH7SE8EtAleSlXe5dhbWmQsuSFmnseEowT1V/14Ic43Bq9+pFsp8/LHD4yXMxv\ncKeWbJYvOFA0eCP2Syin1Xyk3m63CCcmvJ2CGfm5SGLUhPyYgYf/Zux2dKhoFzkAAAAASUVORK5C\nYII=\n", "text/latex": [ "$$29.8368$$" ], "text/plain": [ "29.8368" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.prod(state_ranges[1,1:] - state_ranges[0,1:])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "source": [ "# Trying MountainCar" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[2016-12-22 11:14:00,300] Making new env: MountainCar-v0\n" ] } ], "source": [ "mc_env = gym.make(\"MountainCar-v0\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "mc_n_weights, mc_feature_vec = fourier_fa.make_feature_vec(\n", " np.array([mc_env.low, mc_env.high]),\n", " n_acts=3,\n", " order=2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "mc_experience = linfa.init(lmbda=0.9,\n", " init_alpha=1.0,\n", " epsi=0.1,\n", " feature_vec=mc_feature_vec,\n", " n_weights=mc_n_weights,\n", " act_space=mc_env.action_space,\n", " theta=None,\n", " is_use_alpha_bounds=True)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "mc_experience, mc_spe, mc_ape = driver.train(mc_env, linfa, mc_experience,\n", " n_episodes=400,\n", " max_steps=200,\n", " is_render=False)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax1 = pyplot.subplots()\n", "ax1.plot(mc_spe, color='b')\n", "ax2 = ax1.twinx()\n", "ax2.plot(mc_ape, color='r')\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([[ -2.83006492e+03, 3.14200324e-11],\n", " [ -2.99082896e+03, 3.32048718e-11],\n", " [ -3.19937225e+03, 3.55201674e-11],\n", " [ -3.30639928e+03, 3.67084061e-11],\n", " [ -3.14982605e+03, 3.49700941e-11],\n", " [ -2.66485777e+03, 2.95858645e-11],\n", " [ -1.94577248e+03, 2.16274717e-11],\n", " [ -1.21959108e+03, 1.62129190e-11]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def mc_Q_at_x(e, x, a):\n", " return scipy.integrate.quad(\n", " lambda x_dot: e.feature_vec(np.array([x, x_dot]), a).dot(e.theta),\n", " mc_env.low[1],\n", " mc_env.high[1])\n", "\n", "def mc_Q_fun(x):\n", " return mc_Q_at_x(mc_experience, x, 0)\n", "\n", "sample_xs = np.arange(mc_env.low[0], mc_env.high[0], \n", " (mc_env.high[0] - mc_env.low[0]) / 8.0)\n", "\n", "mc_num_Qs = np.array( map(mc_Q_fun, sample_xs) )\n", "mc_num_Qs" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "mc_sym_Q_s0 = fourier_fa_int.make_sym_Q_s0(\n", " np.array([mc_env.low, mc_env.high]),\n", " 2)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([-2830.06492278, -2990.82896295, -3199.37225304, -3306.39928082,\n", " -3149.82605152, -2664.85777008, -1945.77247978, -1219.5910843 ])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mc_sym_Qs = np.array( [mc_sym_Q_s0(mc_experience.theta, 0, s0)\n", " for s0 in sample_xs] )\n", "mc_sym_Qs " ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([ 0.00000000e+00, -4.54747351e-13, -9.09494702e-13,\n", " -4.54747351e-13, 0.00000000e+00, 0.00000000e+00,\n", " 2.27373675e-13, 0.00000000e+00])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mc_sym_Qs - mc_num_Qs[:,0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Let's try some arbitrary thetas\n", "\n", "And see what the ratio depends on. I've seen above that it's probably not the order of the Fourier FA, but the number of dimensions." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "# Credits: http://stackoverflow.com/a/1409496/5091738\n", "def make_integrand(feature_vec, theta, s0, n_dim):\n", " argstr = \", \".join([\"s{}\".format(i) for i in xrange(1, n_dim)])\n", " \n", " code = \"def integrand({argstr}):\\n\" \\\n", " \" return feature_vec(np.array([s0, {argstr}]), 0).dot(theta)\\n\" \\\n", " .format(argstr=argstr)\n", " \n", " #print code\n", " \n", " compiled = compile(code, \"fakesource\", \"exec\")\n", " fakeglobals = {'feature_vec': feature_vec, 'theta': theta, 's0': s0,\n", " 'np': np}\n", " fakelocals = {}\n", " eval(compiled, fakeglobals, fakelocals)\n", " \n", " return fakelocals['integrand']" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print make_integrand(None, None, None, 4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "order 1 dims 2\n", "[ 5.15937205e-16 1.00000000e+00 1.00000000e+00 1.00000000e+00\n", " 1.00000000e+00 1.00000000e+00 1.00000000e+00 1.00000000e+00\n", " 1.00000000e+00 1.00000000e+00]\n", "\n", "order 1 dims 3\n", "[-1.76265599 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. ]\n", "\n", "order 2 dims 2\n", "[ 1.1241072 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. ]\n", "\n", "order 2 dims 3\n" ] } ], "source": [ "for order in xrange(1,3):\n", " for n_dim in xrange(2, 4):\n", " print \"\\norder {} dims {}\".format(order, n_dim)\n", " \n", " min_max = np.array([np.zeros(n_dim), 3 * np.ones(n_dim)])\n", " n_weights, feature_vec = fourier_fa.make_feature_vec(\n", " min_max,\n", " n_acts=1,\n", " order=order) \n", " \n", " theta = np.cos(np.arange(0, 2*np.pi, 2*np.pi/n_weights))\n", " \n", " sample_xs = np.arange(0, 3, 0.3)\n", " \n", " def num_Q_at_x(s0):\n", " integrand = make_integrand(feature_vec, theta, s0, n_dim)\n", " return scipy.integrate.nquad(integrand, min_max.T[1:])\n", " \n", " num_Qs = np.array( map(num_Q_at_x, sample_xs) )\n", " #print num_Qs\n", " \n", " sym_Q_at_x = fourier_fa_int.make_sym_Q_s0(min_max, order)\n", " \n", " sym_Qs = np.array( [sym_Q_at_x(theta, 0, s0) for s0 in sample_xs] )\n", " #print sym_Qs\n", " \n", " print sym_Qs / num_Qs[:,0]" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "source": [ "If the bounds of the states are [0, n], the ratio between symbolic and numeric results is $1/n^{n_{dim}-1}$. Or this is at least what I think I see.\n", "\n", "This looks like there's a problem with normalization. (What also very strongly suggested it, was that numeric and symbolic results were equal over [0, 1], but started to differ when I changed to [0, 2].)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "array([0])" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(0, 1, 10)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "run_control": { "frozen": false, "read_only": false } }, "outputs": [], "source": [ "import sympy as sp\n", "a, b, x, f = sp.symbols(\"a b x f\")" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [], "source": [ "b_int = sp.Integral(1, (x, a, b))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sp.init_printing()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": true }, "outputs": [], "source": [ "u_int = sp.Integral((1-a)/(b-a), (x, 0, 1))" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHQAAABKBAMAAACYxG3JAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMs2Zq91U7yJ2iRBE\nu2Z2muS3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADD0lEQVRYCe2WMWgTURjHvyRNTHJJU3RxS7y2\ng4hYxMWCGBDBDJpSFHExWaSKQ0SoVEQbqJNLTyKIqZLT0EEdeqgQESTZilODDh2bpatGkahNbL27\n917y3r1L7jUOOvQNd9/3f//fvXfv3nd3AGbbjU59HPec7APCyKUdVGQF/s0yTYlMzdYzl0rY6jui\nZQU8LzSLIpw+KMWFvaxRankVVuGyqS7TCtQ5KxauoLN0ItkF9VYdUIBCF3Re6RstVFh0rvgQD4In\n3H3UNXY2oRk4hK/liP5gBy3V4Jgg6vqOjK/OGW0fHNfggqE8k+XzsjxidnZZpsAvhJLjbZC+4thp\nwuEWgcyztAG+uiAaabJoA8Kxy0hyGjU6waCwH9bjqhj6Jc6ib/J7ExUWPTI7UmNNKEsqdqqptSfc\ndrhWx9oxQKpCJWz4lk2NLJLuaNKW1kmcoxXK7bNsJgd6keoP/qYS53CYsrg3qMQh9I/fb4D06NSH\n56Yx0nDwU93L2XAT3sG6MmmK8z+pvt6hdAc8MXgJSxrabZk68ke2ejfd5WmCVwUNDiIClmI4cD7t\nqkK5ottIqa3R26M3XlYhoztcpCZn0739VG85DR992av6y3fBULezmdzK4NlgqBGu+2sGGtrGZpIS\nT+8+lhILuc8GCQH8ZjKTbof303Y9A5t2qlVDLzeL6iXLZdHN1Kdg1XbHRfCOsCOBoCH29YW90aot\nhESCBifsTAWVU/3jR2+xqDuRS3M2SFY4bTnrxndBRi0fkGyKJMWRRn3guyBoRgObqv7WRqVR45sz\nOWTUh6KrQVkevS7LcT08DPo3wdpcvGTUxxDykVGHIcQ/nkH+sZZRfRgwQTeNUrW2gWtWBVB9mDJB\nW1Cqcb6IyklmfSCVoGfgE2eDFXxXVI9ZHyz6OlejDGa4CKetEpOTURkRJauuGRu1I0nZTmyJ7j3h\n52ux/GdpPt/vhAZVX7xP1lsBfoOJXUvf5jfEnJwrmoWLnCgmRPHvoJibcemj3mQE8US/V/YHURz9\nixUOjPX9XKFY1MTnSDv/ACr84CjHqS2QAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\int_{0}^{1} \\frac{- a + 1}{- a + b}\\, dx$$" ], "text/plain": [ "1 \n", "⌠ \n", "⎮ -a + 1 \n", "⎮ ────── dx\n", "⎮ -a + b \n", "⌡ \n", "0 " ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u_int" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAADgAAABuBAMAAACAf83HAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARM2JmVQidqsQ3btm\n7zKsjR9xAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACDUlEQVRIDe2WP2gTURzHv8mZHpfL3QWXLkJu\nExQk4BCcGhSKQsGb6h8QImQUDCSQ1sVOBl36QKGlINZ2KC6azbGHThZBBBWkSxARwSERTSVL9f1e\nWl5N+nubhErf8H7f7/dz9/5x8A4Ajoay45pV5IjMk5EBBiUDzNXv8vSWqPHwOV7w8C3O87CH9zx8\nkmny8Otpno2GlKuCn/ijl2ehHdotFrrFAfTtnQ68itZ91dVBEGutVKKng5tZrZWylnWQa2mtVLKo\ngzcl0k79zniBRLnQjrAwc72qljIhKLuPjcqKrIkPWBdOPrOWDimepw5nMCGmZX0Y4ywsYfVSJYpP\nUAeBk6peFFiFg2RTOWz2C36pugnnuxSBmhH42Yf+NlXnB1IdWdstcnD6b1yxO5iVrgs3nE6J27Bp\nnWPqsBJdtzMWS3scG3P5XLSOG9JgZ7jGbO012cXql0Z2sb4wFZPbe5Lk/2oZmp9rVsgRpCK3wsJk\nc4ll8AuTPDxg5MHMKXbFzlN/zyc88NiRor88EGnrRfacdgPqUcl9Rd/Dvs1rtY/tCyhMNC5NsXAU\n4Leh/cv1fDIM/vmeAeLq/wOvGbZSftYw0FGgw+sK8iaikz+8rtjv70BdV3Yhz24EL3GZh48RsBeA\nsw0v4l71t5COWdhDusLCLQz/ve0+LOcMsrtmqJpWi5ppn9a5C0Oj7QR/AL3vzo+i0JbtAAAAAElF\nTkSuQmCC\n", "text/latex": [ "$$\\frac{\\int_{a}^{b} x\\, dx}{\\int_{0}^{1} x\\, dx}$$" ], "text/plain": [ "b \n", "⌠ \n", "⎮ x dx\n", "⌡ \n", "a \n", "──────\n", "1 \n", "⌠ \n", "⎮ x dx\n", "⌡ \n", "0 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(b_int / u_int).simplify()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOBAMAAAAPuiubAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAIpm7MhCriUTv3c12VLge\nopIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABOSURBVAgdY2BUMnZgYAhjYH/BwJDKwDCTgWEWA0Oe\nA8O+ABAJBOsCgATHcxCTKwFEKoEIHgUQeYmBUYCBRYGBR4BBqrwoi4Fh37t3rxgAK5QOlzv7snYA\nAAAASUVORK5CYII=\n", "text/latex": [ "$$2$$" ], "text/plain": [ "2" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b_int.subs([(a,0), (b,2)]).doit()" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAAqBAMAAACXcryGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWYiuzKJ\nRN0MreaOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAcElEQVQYGWNggAEhAyCL2dUfRDEw5FODCtEv\naQCbRhbxHwQ+EKV1atRqoDpmB4bzFxgYWAwYmBQYGJgeMLD8ZmBg/wymgNJ8n8Fm3T8App6ASdYA\nMJUKJhkDGGYCGVsZGDIZGDjfnAl5ANQOdMMDBgC/syNtm3aMLwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\frac{1}{2}$$" ], "text/plain": [ "1/2" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u_int.subs([(a,0), (b,2)]).doit()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAsBAMAAAA9TUNCAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAELvv3c2rVESJdpki\nZjI6QXVuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABwUlEQVQ4Ec1Uv0vDQBj9rtgmNdYGi10cOjiq\ng+LgoJChIjhFkA4qWnArFPoHCHZwbwcnOzppliKoIIihuLlkcHToH+Bgh1IL/vq+Sxrbu0gzOPRB\n3l3e9/LlchcegIcJpzcTxxcS2KzB9QbnIIrZpEbzxLDHWSRlERuZpCZLxIk6sYj0TQulM5IrOvGY\nTSxhnGwpkk957ZGzRNwWLaOeu7xFtsjxVDvnrWnugtviuCDW1jM2wALK6ioceOXewG0JE0BpQbIK\nsIGFlANXvbo3cptiAGgmZNC2gvqDDps4sO0sYr2JU+C2yTfctjpUSq5tCdgX1frg25IOdaGXsi4o\n+NwAuE01cHfLbA0r+AmsAxHzaMDlvpQ+IeZE6liq4bUDz/lqgE1Dkd3dU+UEr/TFa6FMNz60w3YR\nl9/0hT8Oi9f7Tij46N0u/Oi9hvN+Y3Hi/kie2hCr/n3E9qcAQ37yPufITb9DYeSW/a8LmloO1y4X\nztYJZVMpZoYjbgR5pJyJFqySZJRzJrPFPiSbnDPHOnQlm5czME05k93H+jXFhQg5Z3ZBlbYkIGc+\nQZO2JCBn3ikXRcg5U4Q50RSUMzPWb7MfHJiMq71P0ZIAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{b \\left(a - 1\\right)}{a - b}$$" ], "text/plain": [ "b⋅(a - 1)\n", "─────────\n", " a - b " ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(u_int.doit()*b).simplify()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12+" } }, "nbformat": 4, "nbformat_minor": 1 }