{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  数式処理
2  式変形に関連したコマンド
2.1  簡単化(simplify)
2.2  展開(expand)
2.3  因数分解(factor)
2.4  約分・通分(normal)
2.5  項を変数でまとめる(collect)
2.6  分母,分子(denom,numer)
2.7  係数(coeff)
2.8  分数をそのまま使いたい
2.9  課題
2.9.1  因数分解
2.9.2  部分分数
2.9.3  分母の有理化
2.9.4  複合問題
2.9.5  解答例
3  式の変形の基本(BottomLine)
3.1  鉄則
3.2  数式変形の実践(大学入試センター試験の解法を通して)
3.2.1  数式処理問題の典型例:2次関数の頂点
3.2.2  解答例
3.3  課題
3.3.1  課題1
3.3.1.1  解答例
3.3.2  課題2
3.3.2.1  解答例
4  追記(ちょっとしたコツ)
4.1  式フォローのデフォルト
4.2  assumeの具体例:無限積分
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
\n", "式変形(equation manipulation)\n", "
\n", "
\n", "
\n", "file:/~/python/doing_math_with_python/equation_manipulation.ipynb\n", "
\n", "cc by Shigeto R. Nishitani 2017 \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 数式処理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "数式の変形は,手で直すほうが圧倒的に早くきれいになる場合が多い.しかし,テイラー展開や,複雑な積分公式,三角関数とexp関数の変換などの手間がかかるところを,数式処理ソフトは間違いなく変形してくれる.ここで示すコマンドを全て覚える必要は全くない.というか忘れるもの.ここでは,できるだけコンパクトにまとめて,悩んだときに参照できるようにする.初めての人は,ざっと眺めた後,鉄則からじっくりフォローせよ.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 式変形に関連したコマンド" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 簡単化(simplify) \n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7*x + 2*y" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import *\n", "x,y=symbols('x y')\n", "simplify(3*x+4*x+2*y)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4*sin(x)**3 - sin(x)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "exp1=3*sin(x)**3-sin(x)*cos(x)**2\n", "simplify(exp1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 展開(expand) \n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "x**2 + 2*x*y + y**2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "expand((x+y)**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 因数分解(factor) \n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2*(x - y)*(2*x - y)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(4*x**2-6*x*y+2*y**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 約分・通分(normal) \n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1/(x - 4*y)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify((x+y)/(x**2-3*x*y-4*y**2))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(x + y)/(x*y)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "together(1/x+1/y)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "?sqrtdenest" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 項を変数でまとめる(collect) \n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4*a*x**2 + y**2*(2 - 3/x) + y*(6*b*x + 3*c)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a,b,c = symbols('a b c')\n", "collect(4*a*x**2-3*y**2/x+6*b*x*y+3*c*y+2*y**2,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 分母,分子(denom,numer) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分数を英語でfractionというが,これでとり出せる.出力は,numerator(分子),denominator(分母)の順." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2\n", "(x + 1) \n", "a⋅(x - 1) + b⋅(x + 3)\n" ] } ], "source": [ "a,b,c, x = symbols('a b c x')\n", "frac = (1+x)**2/(a*(x-1)+b*(x+3))\n", "n,d = fraction(frac)\n", "pprint(n)\n", "pprint(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 係数(coeff) \n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2 \n", "a + b⋅x + c⋅x + x\n" ] }, { "data": { "text/plain": [ "b + 1" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq = a+x+b*x+c*x**2\n", "pprint(eq)\n", "eq.coeff(x)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "defaultdict(int, {a: 1, x: 1, b*x: 1, c*x**2: 1})" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq.as_coefficients_dict()" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[a, b + 1, c]\n" ] } ], "source": [ "eq0 = Poly(eq, x)\n", "coeffs = eq0.coeffs()\n", "print(coeffs[::-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 分数をそのまま使いたい\n", "\n", "方程式などで,係数として分数を使うとうまく扱ってくれません.\n", "そんなときは,Rationalで有理数と指定してしまいます." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0*(0.25*x - 0.5*y)*(0.25*x + 0.5*y)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(1/4*x**2-y**2)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(x - 2*y)*(x + 2*y)/4" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(Rational(1,4)*x**2-y**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 課題\n", "### 因数分解\n", "1. $x^3-8$\n", "1. $abc−abx−acx+ax^2+bcx−bx^2−cx^2+x^3$\n", "\n", "### 部分分数\n", "1. $ \\frac{x+1}{(x-1)(x^2+1)^2}$\n", "1. $ \\frac{3}{1-x^4} = \\frac{a}{x^2+1}+\\frac{b}{x+1}+\\frac{c}{x-1}$が常に成立する$a, b, c$を定めよ.\n", "\n", "### 分母の有理化\n", "$ \\frac{8}{3-\\sqrt{5}}-\\frac{2}{2+\\sqrt{5}}$を簡単化せよ.\n", "\n", "### 複合問題\n", "$ x^2+2kx+5-k=0$が重根をもつように$k$を定めよ.\n", "\n", "### 解答例" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAALoAAAAcBAMAAAAkZbgxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC+klEQVRIDZ2Vy2sTURTGv6RJmmYmaVR04aZR\nqjuh+gfYioMLUSl2aYUKYn1VxkUpYsWK+FiIduFCBDErXUkjKC4UOkKhCxFbEFwVC+rCVevKIrHp\nuec+5k6Y2ol3ce93zvmdb27uPAK0MJyBwRboVtGX+NxqSwK+VJXQKSyVE+AK8ROi3xR3Hl3VhC2E\nvUiIHjHcg8DIDYVTISQlptiRVseQDX/jcCy4TvIi5bfE1rYO7AfmZakr0IjTr5VaGWvKcVgicpTU\ngbiiO4fpKmZk6bUhdhklhcSakhzmeoAuIN28HS4WA3RMwvE5eKTbC7XCotR35CIxXQbysoESV8g9\nV0GuHBZD1TGE4ircSZEp1XX++92bgdTKXWK6bLmnusk924NtYc1Smbpwx2GRSvM1hHraaIiFhnJX\nmMzRbPbuZMi9fZKPfvba9qu+QZTI0Zb5xLN9gDs2//yNRSh3yhAWthv3HcK9UMc+aq2lh3NkER1T\nNaBbpNoI/IDd/mmrHrpP1ax27e76wr20irOAEzj1fNnqZTlC822hMnPAO0wHNzgtp9B9xG7X7g6E\ne+oPHtPeWVPbzBkxjrFBtp+WJSFzpAIc5CxPrzzvnOcdZU2Ybnc879BDz6O94L50XxHuQKfPqD2J\nV0G6i70Dv8Vkhtk7Y6Zd7d2t6b3TyZDLoulTIt+PTcAzEbE7naE9tLvETLtyzy8sfH3io/RL3NV8\ncB3tgd0M/AAuq7ta7AHutS9j3CK0u8Csdn3uQAc10TNDD93URC82W60kUxfenhwCTogsPbaFlbbl\nVEUEaih3xqz20L2T3OlFoR//cWz2eEX3yTXTaDSGAL7BtAX3y/joTptQ7oxZ7cbd6f1bEe9q/JdA\nOqXoAjT4xrMykz4Zk5DCuHOY8df5iklYfcX4fKI+76OhjtyyVmL9FAB77URUqy/wz2g2cbSHyPh/\nD7ZQFy5OJDaMgJcoSlVoih1p9TvdvtjyRsl0bSNC1m8lw5qofxxKhMxXI2HCYDAh99/YGn2CrFTa\n79q+AAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\left(x - 2\\right) \\left(x^{2} + 2 x + 4\\right)$$" ], "text/plain": [ " ⎛ 2 ⎞\n", "(x - 2)⋅⎝x + 2⋅x + 4⎠" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(x**3-8)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOAAAAAUBAMAAABmACzdAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nMqvFy5UvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACRklEQVRIDaWWwU8TQRTGvy1LaTub0GjigQPZ\nA8ZrNXhWk3IxYhpiwoGgcFG4kF4aEojakx4xmnAwHjiReLIxeiRZIoRwof4HBC94BE5Ee/DNzuzs\nTKfTsnGS3b73vt97M519nS3ghXCMXFkI1xy6CmcDr6s8yziJI15FCT82lWkYFmiomsPBB5rfZe7F\nvi+/KHcedxHStcHeHAjM1XTtre6A1bl7U4tdJvYgMOFggXlt/eiSg3c8b1Elo9RJbLOOBSZYj4o3\nUo0ssw4eUshbSAmm7AFgmmKBDdK8udlPAknkg1dj67Sf3yk6Ukuz/dNG80og2OpLB3iH4p/L/pkh\nB63ci/x9YIKiQ6GQ+L39KDgXnlyZC/SWMOkAl4DgPYYrhswi1imUgTcUzTeFxO8bEf4KT07oAost\n/HaAH4HhDvJ1kr9Vq8vVKu/8AH68gmOyi1vA3nM+pvEEAZ9wMPgsIqw3SBMWK2j/jIG0aUb5CpBM\nKERgCiX5w0geNnqDH5IMuyJtabuFDQmoOsfxCrYprG/pBd+NePQH431wgNQ07SYm+ROjIesUotcY\nieym+YPDkGMDwQug4ACp8/16boUZ8pfmPfAje44uVhMSv//CXenIlbnApwjmBWmBtGvB6c74miEf\nrR7MhBSZpqu0QDc59huhtGQdF8i+3nKB/Y42cchoR5ssQh9yQhnIApqH925akiwWt6p+eCv5P8Db\nqohliLfOkOgnS9UCmcA+L2CxFu0FrM1hmJlALzRyNSfbPwdK5I3dd1DFfyfkpTgV7ZXpAAAAAElF\nTkSuQmCC\n", "text/latex": [ "$$\\left(a + x\\right) \\left(- b + x\\right) \\left(- c + x\\right)$$" ], "text/plain": [ "(a + x)⋅(-b + x)⋅(-c + x)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = symbols('c')\n", "factor(a*b*c - a*b*x - a*c*x + a*x**2 + b*c*x - b*x**2 - c*x**2 + x**3)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAR4AAAAzBAMAAACzonq5AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnarIkSJZlS7\nme8N5bApAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD/klEQVRYCe1YS2hTQRS9aZImL7E1FFpxV6JU\nQaFBaVUEDe6l6aKKi9KqSEHQBrpQRLGgLlw1CiJdlBbdCYIi4qJ+QRBEMW4KSgtVN6408YOKizif\nd+fz/rR5QbGzmLlz7zkzJ/Puy5sZgP+mpN8F+akPM0FQy8Hc5eSOuar/KJFjo43SA/EAegCG/l09\nkYGRC1f815wh2vedPFDgWPN51X991sL1wpZgeiKlVE+0M2Q9l2A6cy+YHiNjVNPFkPVkYHMwNQAR\naHrMsJez2V3ZbBe1Q8jn72yOQNVqM3sAQssfiH0LJIWB+vKIDU3P7XgF+nEW7zadGYK4+U8Slp7k\n71WVxIy3DoxO3HoFp8xOWHoiR/oHb+CEPm3HQPvbGV1Py/EvR31YJDz3uQt5/uClIXB9lsauP2tN\n/YcMZcS/bd1W9Hg/5pX1qcf6tG2lZT1ALWipkGkFKwiPylS++57zeP+kukbDyB9j/vWSNYah5yoc\n8tIz9dL8xjuBwtCzDfqKTnNxn1Fs7nSPhqFnO5wdd58xWoz9cI+GoQfgke2JnJl/aoqIjid+6noS\nCy/y6BF6JAFDvHXzg1ca9OhjkK38MEyPozNtOZN2gCEU4ndfIyCRtG5+8EoDo6yMwMzmDLQuojNa\n4FbabA8CfMIYthoBnaS1+RMzPOqcBqkijd7kEKVuzUGz2PdPmQHU8wFgNK+AqakRlJjNf9oM2tOA\nBUZInSwl8yYKm6aq1JPC1UM93Rm7HpWAg9DW5t8gotY0AHpL00bCe2bvE8taolXg5/eLcJ7HUA/p\n7fYiWEYiA8kifhwApoH5SvBbGqMA8LlWkwRhTZT4+T22afYJd0o9yV8CJg0kSA+3JkqKJ1oUHUwD\n8YrSW5rIoohbjF7g5/fWWq3CQ1JPdNgCpl0kWEO9qmNMdMRKaXpgowDoRktZnt9pxMhm173PZocZ\naoHVeqUSlJ0CEL9SBoltSQNdD66awmEmJYI8v9OeWJ+4NgUNkeJAkH5m0eo5eSTsGkemga7nmoBq\nRroMJwDk+Z0GhZ4HkChqaBp0IDAS8wv0TrLS7BpHpoGu546AasZegP3q+Z0NXeCQWBniNj1OBAqn\nfk5j9UeyPniNQx3Klo7fOvYpYGkmdkzO5dTzOw3h+oxNTh2WUG45EkiI+RUw0WNNA319nPU0kf1n\nTj2/02FQT3et9pX21eJIIADmV4DkeVnTQNdzTgH7mKjHB+YZJvlsTQNdj0s+Ow0asSWNE8rbR15n\naxroet548+sdJY/Dmgaoh9/SkENRI4vyvcBpUQ/rJ3LobkwrvhJyOtzSMY9h/qfIcMjWM+/x6X6j\noQX3Yy6T+sh1YS3DjftV5yFSdXiFnUdWvX8AiCRupENEnLoAAAAASUVORK5CYII=\n", "text/latex": [ "$$- \\frac{x}{\\left(x^{2} + 1\\right)^{2}} - \\frac{x + 1}{2 x^{2} + 2} + \\frac{1}{2 x - 2}$$" ], "text/plain": [ " x x + 1 1 \n", "- ───────── - ────────── + ─────────\n", " 2 ⎛ 2 ⎞ 2⋅(x - 1)\n", " ⎛ 2 ⎞ 2⋅⎝x + 1⎠ \n", " ⎝x + 1⎠ " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apart((x+1)/((x-1)*(x**2+1)**2))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPQAAAAsBAMAAACgbIiPAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIom7VJlmdt1E7xDN\nMqsI8sYEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADkElEQVRYCe2YT0gUURzHfzNO7uyOupug1G1R\npKiDC9UhItygTlEuiF2C2C4S1GELREjIxYg8SEoQQRAGXrIiBi92CBPs4MHQS+fskkGgVtK/rabf\nzJvf7LxxnPcG9CK9w77f+/0+7/ud92Z2ZnYB+NbYcphPRI6UltZ8JOAvCqSVAnQW/Xx03ATat2ii\nWhVJJ9YhXa7iomggDz9EDNVF0skJeDVDsLh/MGr8FlOMkJCOs+EQY8PxAATSxqDsMhzuRVYeF0gr\n+8/LawE03jKlcbH0gVFpMQTViRi0SDr1NIYYwBP5ZUOktJKBmnV5690AHXlJXCSdrsSytkx5a5F0\nKgf6Z8llIDYOMJKRxEXStUXoLElqIdYD2ndZWih9r/uorBZyye4u+e9DPOkYR7EzUS3GJbDFO/Df\neos3VCS3szbcEjbcD3V+fu7Z/PwShukofg0BY24I2/AihhDFWjYg1XbWhvuX3HbE9A+5eHtXrWYa\nZjg7/2B7rfVM/ebP6u2wbuo67q5OH1V++hcKoHQfcq5UzPqs6ws8RaPQ/Fuq8r3NGkvQPkpprUIR\n66dBpYMxMl5Jz3khF4Tmb3KIN7DZBhNSjyijl1hES/yEb5xUq/bXOWtiAfg84xP4DhXWbDZVhoY/\nVGxzA5J7DLC6SEXqlSvh1oE8w5tnaRrXO2xdpWpdW3DrZL1ghlirdeHWgTyTyoZbE6tXYOrG3msl\nuAsP2QSyxtGI6R6O111Ea6Pv/f19AdbOB1ttBq2ZOFcidixrZGtv6zP1r08eC8hB8gs3BQdGCS0m\n4VJpmGedfBCegllg4lzFY++AaqoVLZOyrDVeDkBf4ubgQAW0Pgjt5gmedfJBOIvWTJyrELurAIYt\nR833mALopqzXn7FZEyXt5mOdvEexQFu0V03iL+1H2tAbLBHba2PpEoPZp3euEwV/2o6NLFPyXv1d\nlvIcPwnOIfLiVQ2tAPir7d2if45nfQrwVxrXtJWV1eclqPe+kC7r5jkWzq6s/FoOiuOdkWkA3umu\nauYAJMzqNLLG210iYI1QKgenE2vQz3hinXxVgqJxCIo7FdQAZbDlQnks3wHNBGNPcnta2j760m6Y\nziXXa9aUIhsSiycN5Ta0rxAUdxCbrcOXmPJ039S5om8WyS1Y1sY/p9SOv5eX+3t7XJ5YwLxfg5Vb\nrQ9BcbsQyjozPDk2P/IzDhspxIrGxhO86aw4LCfyD695QZJoKv7QAAAAAElFTkSuQmCC\n", "text/latex": [ "$$\\frac{3}{2 x^{2} + 2} + \\frac{3}{4 x + 4} - \\frac{3}{4 x - 4}$$" ], "text/plain": [ " 3 3 3 \n", "────────── + ───────── - ─────────\n", " ⎛ 2 ⎞ 4⋅(x + 1) 4⋅(x - 1)\n", "2⋅⎝x + 1⎠ " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apart(3/(1-x**4))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import *\n", "radsimp(8/(3-sqrt(5)))\n", "radsimp(2/(2+sqrt(5)))\n", "\n", "simplify(8/(3-sqrt(5))-2/(2+sqrt(5)))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-1/2 + sqrt(21)/2, -sqrt(21)/2 - 1/2]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k,x = symbols('k x')\n", "eq=x**2 +2*k*x+5-k\n", "sol = solve(eq,x)\n", "solve(sol[0]-sol[1],k)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 式の変形の基本(BottomLine)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "どうしても解かなければならない課題を前にコマンドリファレンスのあちこちを参照しながら解いていくのが数式処理を修得する最速法である.とびかかる前にちょっとした共通\n", "のコツがある.それをここでは示す.数式処理ソフトでの数式処理とは,数式処理ソフトが『自動的にやって』くれるのではなく,実際に紙と鉛筆で解いていく手順を数式処理ソ\n", "フトに『やらせる』ことであることを肝に銘じよ.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 鉄則 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "数式処理ソフトの習得にあたって初心者がつまづく共通の過ちを回避する鉄則がある.\n", "\n", "
\n", "
鉄則0:restart をかける
\n", "
\n", "続けて入力すると前の入力が生きている.違う問題へ移るときや,もう一度入力をし直すときには,Kernel->Restartを押して初期状態からはじめる.入力した順番が狂っている場合もある.頭から順にshift-returnをやり直す.\n", "さらに,\n", "\n", "``` python\n", "# kernel->Restart\n", "from sympy import *\n", "init_session()\n", "```\n", "\n", "として,sympyのimport,init_sessionによる綺麗な表示を強制しておく.\n", "
\n", "
鉄則1:出力してみる
\n", "
\n", "テキストではページ数の関係で出力を抑止しているが,初心者が問題を解いていく段階ではデータやグラフをできるだけ多く出力する.途中の結果を明示するためにpprint文を入れる.\n", "
\n", "
鉄則2:関数に値を代入してみる
\n", "
\n", "数値が返ってくるべき時に変数があればどこかで入力をミスっている.plotで以下のようなエラーが出た場合にチェック.\n", "\n", "``` python\n", "ValueError: The same variable should be used in \n", "all univariate expressions being plotted.\n", "```\n", "\n", "
\n", "
鉄則3:内側から順に入力する
\n", "
\n", "長い入力やfor-loopを頭から打ち込んではいけない!! 内側から順に何をしているか解読・確認しながら打ち込む.括弧が合わなかったり,読み飛ばしていたりというエラーが回避できる.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数式変形の実践(大学入試センター試験の解法を通して) \n", "\n", "今まで出てきたコマンドを使えば,典型的なセンター試験の問題を解くのも容易である.以下の例題を参照して課題を解いてみよ.使うコマンドは,unapply, solve, diff, expand(展開), factor(因数分解)とsubs(一時的代入)である.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 数式処理問題の典型例:2次関数の頂点 \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$a,b$を定数とし, $a \\neq 0$とする.2次関数\n", "\n", "$$\n", "y = a\\,x^2-b\\,x-a+b\\,\\cdots(1)\n", "$$\n", "のグラフが点 $(-2, 6)$ を通るとする.このとき\n", "\n", "$$\n", "b = -a+\\fbox{ ア }\n", "$$\n", "であり,グラフの頂点の座標を$a$を用いて表すと\n", "\n", "$$\n", "\\left(\\frac{-a+\\fbox{ イ }}{\\fbox{ ウ }\\,a}, -\\frac{(\\fbox{ エ }\\,a- \\fbox{ オ })^2}{\\fbox{ カ }\\,a}\\right)\n", "$$\n", "である (2008 年度大学入試センター試験数学 I 第2問より抜粋).\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 解答例 \n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IPython console for SymPy 1.0 (Python 3.6.1-64-bit) (ground types: python)\n", "\n", "These commands were executed:\n", ">>> from __future__ import division\n", ">>> from sympy import *\n", ">>> x, y, z, t = symbols('x y z t')\n", ">>> k, m, n = symbols('k m n', integer=True)\n", ">>> f, g, h = symbols('f g h', cls=Function)\n", ">>> init_printing()\n", "\n", "Documentation can be found at http://docs.sympy.org/1.0/\n", "-a + 2\n", "-a + 2\n", "──────\n", " 2⋅a \n", " 2 \n", "-(3⋅a - 2) \n", "────────────\n", " 4⋅a \n" ] } ], "source": [ "from sympy import *\n", "init_session()\n", "\n", "a,b,x = symbols('a b x')\n", "f = a*x**2-b*x-a+b\n", "bb = solve(f.subs({x:-2})-6,b)[0]\n", "pprint(bb)\n", "\n", "x0=solve(diff(f,x),x)[0].subs({b:bb})\n", "pprint(x0)\n", "y0=factor(f.subs({x:x0,b:bb}))\n", "pprint(y0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "解答の一例は以上のとおりであるが,これはだいぶ整理されたあとの記述になる.\n", "普通の答案ではここまで綺麗に初めから求まるものではない.\n", "\n", "そこで,綺麗な解答を導く一つ一つのステップをはしょることなくここで示しておく.\n", "今後巡り会うであろう解答例やコードサンプルにおいても,\n", "ここで示した導出のコンセプトを参考に数式処理コードを理解していってもらいたい.\n", "\n", "まずはRestartをかける.これもcodeに示しておくと忘れない.\n", "それとsympyのimportとinit_sessionによる綺麗なprint outを癖付けておく." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IPython console for SymPy 1.0 (Python 3.6.1-64-bit) (ground types: python)\n", "\n", "These commands were executed:\n", ">>> from __future__ import division\n", ">>> from sympy import *\n", ">>> x, y, z, t = symbols('x y z t')\n", ">>> k, m, n = symbols('k m n', integer=True)\n", ">>> f, g, h = symbols('f g h', cls=Function)\n", ">>> init_printing()\n", "\n", "Documentation can be found at http://docs.sympy.org/1.0/\n" ] } ], "source": [ "# kernel->Restart\n", "from sympy import *\n", "init_session()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "与えられた2次関数を$f(x)$で定義する" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'a' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\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[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] } ], "source": [ "f = a*x**2-b*x-a+b " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "すると早速エラー.sympyでは変数を明示的に宣言しないといけない." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a,b,x = symbols('a b x')\n", "f = a*x**2-b*x-a+b # 与えられた2次関数を$f(x)$で定義する" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "関数fが点(−2,6)を通る式を立てる.まずはx=-2を代入(subs)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAQBAMAAAC7Cw8kAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIom7VJlmdt1E7xDN\nMqsI8sYEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFElEQVQoFW3Qv0rDUBTH8V/a9I+9wRt8ACmd\niiB0cFEc8gYJ0trBwTxCNnErPoC4uLh0E6QOeYPb0SGIj9DN1UK3OPSce1Kai2bIn8/9JvcQ4Ghw\nhn8OZnUxoxUvQZz+LYSDFa10NtCzWuFn9kFYR/Rw8AaztCinqhCe54LOLlVBK8RDCdQDTXM1XTjf\nAJg/78ak3vAGeAmDH7dgVr+5CZlPntQrWiO3YPZL6D5zb9Eq0c3orlEUH+9FsWJlXsL04YVobnoj\nmC/LqCa1HCSYR9AlFVTGEuwKyzrFbQ56vbs2ES59O9OusKx5QLRTxFmQtR8bzi6WD9NmQvo8OYf6\nPj2+dwrh6XW1d/2y/6d1rd8rGWdPW9AuRQ/D6i6iAAAAAElFTkSuQmCC\n", "text/latex": [ "$$3 a + 3 b$$" ], "text/plain": [ "3⋅a + 3⋅b" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.subs({x:-2})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "こいつがy=-6をみたすのだから,yに前の式を代入して,左辺にまとめて見る." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAQBAMAAAD9vayOAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIom7VJlmdt1E7xDN\nMqsI8sYEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABi0lEQVQoFYWQPUvDUBSG36SpNr3FxoKrlIoo\nQqGgDorQ/IMWpQhaJJOrWTo4WQTBoWgWly4OiljrEBBBXOIiVAwi/gGdLDhZKVVpQW++6k0RPcs9\n533vw/kAYokp/BJcYkTG2XGvw48lAS6LjNLr0HoIQgu463HIDfJAfxPRIuMIqlNsyPgAmoxjpYEs\nJgGxAuOKcTymrJEOxDbjWOm+5Aq+2TwG1mx80f3iPbNuQjbpVvOLVaf8YS7iiNQLsvfdfjsPBY0m\n3PgyUJYir47ZZWJbOoxb0mAZ0lFwaAsTGjlCMNXDgK8go+PNx3zpWNItJVwNthFSacabZu3UNJ8s\nFTjR8yCUIbVtGqV7KtFTrmngJASa4RQMS6LhzTYIpOVriP5rlyijINqmjBFHxkG6DJ0iLbdAJ2Dj\nxe5DW4Qahow5QbJNr88BsCt94lJhETzSfYA+BRk1ovbt8I7pMasQ3vGMaR+CgTix7raXmwGpJ4fX\n/YyYW9BwXlD8DEZX3L1Z3evDav/lxFnrr2/fT6ZkUdOJmvwAAAAASUVORK5CYII=\n", "text/latex": [ "$$3 a + 3 b - 6$$" ], "text/plain": [ "3⋅a + 3⋅b - 6" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = f.subs({x:-2})\n", "y-6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これをeq1と置いて,bについて解く." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEYAAAAUBAMAAADCRlZLAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEECKZ72a7\nVKsAREe5AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA40lEQVQoFWMQMmHADzarMYThU9E55wgDUAU+\nNewPGOITcKm5CDGcr4CBawEBNVwKDHxfCKhh/o6hpjNSqgBiCdQuIIfpO4o5bCsY7CFKGBBq8gNQ\n1FRtYJiDoUYP4vdiJRAwYZhfwKAIUhNsbKxlbGwHVs45ATV81jCwf0E3RxIogBSG7F8ZeD+gqeGd\nwNCBouYvA4/BDYgimJs9GRgkkNUwGDJsehCAooZDNXSeAoqaOlGPhwkoapj///+PqgYiDSZhdoE5\nSG5GUsJQgczBoQZZCYp7UCSQOGEMQipIXGxMITUAqw46VUyAcrYAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left [ - a + 2\\right ]$$" ], "text/plain": [ "[-a + 2]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eq1 = y-6\n", "solve(eq1,b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これがbの表式.配列の一番目の要素となっているので,それを取り出しておく." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-a + 2\n" ] } ], "source": [ "bb = solve(eq1,b)[0]\n", "pprint(bb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "頂点の座標(x0,y0)で傾きが0になることを用いて解いていく.鉄則3を思い出して,中から見ていく.\n", "微分diffを思い出して," ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEMAAAAOBAMAAACGIrzyAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABD0lEQVQYGWNgVDJ2YMAFWC0XAKXCGNh/4FLB\nwMCdAJRLZWCYiVsJ/wWg3CwGhnwHnGr6A4BS+wPwKamCal4fwCBUdDKAIeaYxPEDqAZuO6MLEuD4\nzsAxkWE/A2sB3xquDShKWH8HxAsARbgSGCIfMCgzsAewf+UFCSAA71cG/gIgV4mBQT+AYQ0DKwO3\nAVg2ehUIbAGymTYwxAOV8CgwMExmYP0CFOE/ACSQAbcCQ/8FBoZLDIyi3xl4PwCl/B2Q5YFs/gcg\nC1gUGHhE/zIwb7jIG3CegScARRF/A+s8Bgap8qIshj0MrxIK+i/YM8ihqGBge8CsAAy6//9/MYQd\nd8xpCDsTo/cAVQmrjh4DAwAWD0Cho3ksxwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$2 a x - b$$" ], "text/plain": [ "2⋅a⋅x - b" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff(f,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これをxについて解く." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACYAAAAyBAMAAADCVLQQAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA74lUMhC73c2rRHaZ\nImaqCQggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABJ0lEQVQoFWOQ//+JARno///IIOziiizEEOJi\nyCACEWFNLIBJOcLEGDgmYIrxG2CKrQ/AFFOHCTEgzOvcfRgqChdj/REQfwEiCBdj/srAr4AmxtPA\nEI8uxnGAYT3UNXC9/A8YzkNdgxBbwCoHMQ7hFs4HbAfQxVhPn4MKIdTBBIA03LxBI/YfAejrvjvH\nUhCBAAkX1gkM+gvgghAxzgAGRgE0McYCBs4vaGIcXzHFgErYvzLwHjotClIMD/v1CgwLL3B8QBGr\nZADGL08CshjPAQaerwzsG5DF9jAwMCYwxDsgiTEfYLgLTFb2ICGYHT4MDHvjDRgymC/AxXiLlE4W\ncGzgq2RCqOMAhn0B62yVm7sQYiAWAsDdjBCC2YEkArcXTQxbXsWSpwHDO1c/sTb0PQAAAABJRU5E\nrkJggg==\n", "text/latex": [ "$$\\left [ \\frac{b}{2 a}\\right ]$$" ], "text/plain": [ "⎡ b ⎤\n", "⎢───⎥\n", "⎣2⋅a⎦" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(diff(f,x),x)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'list' object has no attribute 'subs'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\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[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdiff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbb\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'subs'" ] } ], "source": [ "solve(diff(f,x),x).subs({b:bb})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "oops. このエラーはlistに対してはsubsは使えないとのこと.\n", "先に中身を取り出しておいて,代入." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAD8AAAAqBAMAAAD2ap7EAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZiXbvRGa7\nVKtFbb1tAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABSUlEQVQ4EWNgwA1Y08444JYFysgxsP/CqoC3\nASL8kIFhJl4FkxkY3jtgUwEzQV8ARQFresZEiHKYAiDPXgBhwsoApg/oCri+I+QZZzOwHYBwESYw\nP2BgYFQ2BgIjB7aPDMwNQAXsSkrKk5SUgDJAkAYmIQTnAQZ5BwgTbgJHAkQATMoXMNyHcuEKrjGw\nBsCVyF9gOMQL4cIUsCQwcCAUMDVw27FDlMMUBJeXPYYbwMD4oiSuC1WB/v//nxEKkFgwE5CEUJmM\nCItRJYYw7z9+8GHIeY38vAjzKs68CFOAMy/CFKDlRZgwCg3Mi2FlnQIoYsgcYF7kmsqgjyyEygbm\nRckNDDmogsg8YF7MF2CwQBZCYYPy4hwGxi8ogsgcYF4M/M7AizMNgPJi4F8GHoWryLqQ2OC8qMGw\n+UEBkiAyE5wX5dpdXyxAEgUAK+lpQ8MABGcAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\frac{- a + 2}{2 a}$$" ], "text/plain": [ "-a + 2\n", "──────\n", " 2⋅a " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solve(diff(f,x),x)[0].subs({b:bb})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これが頂点x0.これをfに代入してやる.ついでにb=bbも..." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'x0' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\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[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mx0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mbb\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'x0' is not defined" ] } ], "source": [ "f.subs({x:x0,b:bb})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "せやった.x0に代入してない." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAL0AAAAzBAMAAAAwQxSrAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADAklEQVRYCbWVT0gUURzHv7PbmLPr2iIEggdj\nLIgIVpLAymgJ6qoiWbe2iyYELVF0q60IPAguUYKnhI4dsiKKgtoOBeUl6N+lcDHqrNQhA5neX+fN\nOju788b5HXbe79/nvX1v3neA2MwaPxMbm4Lv4Hqs/P0YHIpzgoM4PRcnH1jMxssfiBdvFTT5ZrVB\nYzs72F8NquqmT9bNkMTo+EXgJhmkyql8UGH93K76KRgl3J1DB6k4+v2r3vm2F/z4mQqLtmaRnodF\nnFeO41fXOJb0vTaCn+5F6x8Y840xdStGfDOCn1ihfOzxrWku+FYpMyfOPeSu4BMnuQLMKDVhh1eU\nhvtDiWXuuvwHZWBJqQk7POw2GC/RUqzl95PAR7cm9Og5YPT0EduXb1lBskIAlm33PLLtEmW1FMjP\nIB1pGuFLSxfRnefO+v6w44nCV/anu4xFMZfkZwo4AdyTK9B4Kufb/QEXMkOMIfnHgTfRzld59xKV\n9n6LL1HwzQOzZ3uBCY11yxblvxtTt0+99/ATjuMQ/k5ZLJ/m2OW8HKtPJodqgNwfviHeIOT+sLBJ\npvBaJ6x/3gjzuBx6E/76ZqizUn3z2jXghRr5xh0uh2qCjC/V+Btdqs9eewxM55WQ4HM5VOJ0GPh9\nYbUbV5DL+vKFHHonaPL76G0CjmQxOrOQ5WGxfuJQOdwMS60i9QQ5gXL5VA43w5IldFUxvoFP5VDf\nOqgQ9tHrMAacz2KAom7Z9iHb3s2oTA7hloFcoKZtmSHYT1sBeAqDfNuYre8Pk0MRjPL4AnN4FRk5\no+RzOYwC5r1bCmgbXsPWHZ+5L/lcDqPzR2ZnbmAvfpTE2yL4Qg6j83OO8xud745NzXnWL+QwOr+W\nIPenNu7rk80Na9vDNCSLYarD1y7EyzeX4uVbiXj5Pynfld7w+xvcYVQIX5He4OrwWQuE3+VKb3hC\ncMcnypfSG1yqkzXKlK9Irw4koCczOTn97LUivQG1mql00VCkVxMS0LatqEpvQKFeyrr6t6pIrx5E\nr+s/It/UjACOaN8AAAAASUVORK5CYII=\n", "text/latex": [ "$$- 2 a + 2 - \\frac{\\left(- a + 2\\right)^{2}}{4 a}$$" ], "text/plain": [ " 2\n", " (-a + 2) \n", "-2⋅a + 2 - ─────────\n", " 4⋅a " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x0=solve(diff(f,x),x)[0].subs({b:bb})\n", "f.subs({x:x0,b:bb})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "こいつを簡単化simplifyすればOK." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAK0AAAAzBAMAAAAX7ZVDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiKZu6uJRO92\nVGZ6zyUAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC2UlEQVRYCbWVTWgTURSFzyRO7CRNHApCoYtI\nVBARWixC1YpB0G1TitWdcdNYEAyiuNOoCF0UGkQDXRlw6cKKiKKgcaGg3Qj+bZSGiq4bdGEFGe+b\nmZh5L29I3qRzF+ncc8/9kr6ZnAAbXkbh9IYzGfA2roXC3YeJXBjgAzhVDYMLrJjhcMfDwRr5gFy9\n7rOYsm/YD59pR/mEzDFduADcoEm8HM/KDJ21nRKLVsKdKgZocuTr52D3LZWXcPtMJJZg1IAXliWZ\ndyFFZY99YgR9v6AtdbHvZ5mSDSINxsVu2axL7TX59NmzD0R7tAFURFGhv0zee7nImrhyvwysiqJC\nfwjQniNWFFfGSHgvigr9UyDWQLRGK9r2Uaq9WbYdy9PLBLsKWMRNFJHOCuvs2Hvi0jmky1gRsMk8\njgN3BVWlpfuWfofzyRy3dAx41dt9o2cpUkuNGRxW3794ZgSY5US1hv5Xbf7WybfcVsSyLOLu4ERq\n9JlLWVFjvR1T/ED6PXYsOqH5GoTxh1fszokpfiDNHcfCcoevq8Azr/LFaZyY8g7o+qLQt1qWk3w9\nBBayHsnlOjHl0dmlNNdtT/s7DptSrhtTPLjD7xBvBg6bmK4sm47sfl5qWEz1UvF1xB9h2EW0uCym\neqloCUN1FNq4LKbUa4AF0ih7nGeAcybGGeJmJnMwk9ll0+yYQssG+gJ0rDV71X7pzwOPodFviV3/\nz8GOKVcM8ucT9Ml1JJvv1OQ6MRUE6OxsyqN/8i82b/vo9E2uE1PBuVOLlevYg28l9+67XDemgnOH\nLesnBt8cna9yn9eNqeBccbN5DqLe1tMBqtTWbs3RYrdONd9yOFx9NRyuEQmH+51xWzGodob+bq1G\nXE8M+jvVJgaIO9SKQbVtf/cHxm3GoL9NdaKVGdcTg6oAH39ybm7hyUtPDPr4AsiJouaJwQAAn5Ut\nRW8M+pjUZePK77onBtUBahv/ABb9wMG1ZdlyAAAAAElFTkSuQmCC\n", "text/latex": [ "$$- 2 a + 2 - \\frac{\\left(a - 2\\right)^{2}}{4 a}$$" ], "text/plain": [ " 2\n", " (a - 2) \n", "-2⋅a + 2 - ────────\n", " 4⋅a " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(f.subs({x:x0,b:bb}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "あかん.ここは明示的に因数分解factorを指定する." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAzBAMAAAB8hdsWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiJmu5l2VO9E\niat+9JXfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACFElEQVRIDc2UP0gcQRTGv71j1/P+qNhZyAkm\n2KQ4lCARlcPKzoXgnybxsLKUoCkkxaYyKZRrBAsLwUKw8LTRRvDAJmDhgkoCIgkBAzbigSKYYvNm\nIMWbGZeb7l6xzPe999uZnZ15gFXklj5b1YviC/y2Zl5jzLeFBjFdtWWASps988YeyQWccUtcc+XJ\nj5/lJiaBd1eLiinl1NI8cE3DbJgtsoKXcANUSsyTwvmFn1W003hke4vtgReg+QmtBZ1paUNmF7ky\ncBRFLJ30kT1EvouZUmQKaLmHs6tn3krLtLZETTB4pTNrwnKGAHf5656aTtaAH6oJfCTLPaNze+In\n7tT0aQjMqCYwIK3LqrOP1JyaHiZjUzWBQ2ll9lI1JMs0drr7KHqLwk4F9BgTIx7EuD6anjJzyBd5\nCvJbDQytrbVGTD5ERUHSAcaBY8UlSXtAUyQf8hv4kPZZfhRYNe4BbaVXQqWcKHvDOYa4Q1crBWCZ\nmVKIqb99+QTn5vz9Oksnoigi5gUzpaCzExsuYWrQGY0NcUa1WNAcZoi7oAXdubgwvrKeux330obI\ntYvD20e/i/5bfXHXEOtu4EXQTbOOfmsCzQf2zESPPRPaM55PjKl1x8zeAWJMrTuGCYkxtu7nmXSR\nmP+t+/kylukEMabWzaq42Lm9/XtjaN28SlMHMLRurYobj9BbN6/Q1Pfoj966tao6jX/bMZpwfgFh\nUwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{\\left(3 a - 2\\right)^{2}}{4 a}$$" ], "text/plain": [ " 2 \n", "-(3⋅a - 2) \n", "────────────\n", " 4⋅a " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "factor(f.subs({x:x0,b:bb}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "でや?! これをまとめて表示すると," ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IPython console for SymPy 1.0 (Python 3.6.1-64-bit) (ground types: python)\n", "\n", "These commands were executed:\n", ">>> from __future__ import division\n", ">>> from sympy import *\n", ">>> x, y, z, t = symbols('x y z t')\n", ">>> k, m, n = symbols('k m n', integer=True)\n", ">>> f, g, h = symbols('f g h', cls=Function)\n", ">>> init_printing()\n", "\n", "Documentation can be found at http://docs.sympy.org/1.0/\n", "-a + 2\n", "-a + 2\n", "──────\n", " 2⋅a \n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAzBAMAAAB8hdsWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMiJmu5l2VO9E\niat+9JXfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACFElEQVRIDc2UP0gcQRTGv71j1/P+qNhZyAkm\n2KQ4lCARlcPKzoXgnybxsLKUoCkkxaYyKZRrBAsLwUKw8LTRRvDAJmDhgkoCIgkBAzbigSKYYvNm\nIMWbGZeb7l6xzPe999uZnZ15gFXklj5b1YviC/y2Zl5jzLeFBjFdtWWASps988YeyQWccUtcc+XJ\nj5/lJiaBd1eLiinl1NI8cE3DbJgtsoKXcANUSsyTwvmFn1W003hke4vtgReg+QmtBZ1paUNmF7ky\ncBRFLJ30kT1EvouZUmQKaLmHs6tn3krLtLZETTB4pTNrwnKGAHf5656aTtaAH6oJfCTLPaNze+In\n7tT0aQjMqCYwIK3LqrOP1JyaHiZjUzWBQ2ll9lI1JMs0drr7KHqLwk4F9BgTIx7EuD6anjJzyBd5\nCvJbDQytrbVGTD5ERUHSAcaBY8UlSXtAUyQf8hv4kPZZfhRYNe4BbaVXQqWcKHvDOYa4Q1crBWCZ\nmVKIqb99+QTn5vz9Oksnoigi5gUzpaCzExsuYWrQGY0NcUa1WNAcZoi7oAXdubgwvrKeux330obI\ntYvD20e/i/5bfXHXEOtu4EXQTbOOfmsCzQf2zESPPRPaM55PjKl1x8zeAWJMrTuGCYkxtu7nmXSR\nmP+t+/kylukEMabWzaq42Lm9/XtjaN28SlMHMLRurYobj9BbN6/Q1Pfoj966tao6jX/bMZpwfgFh\nUwAAAABJRU5ErkJggg==\n", "text/latex": [ "$$- \\frac{\\left(3 a - 2\\right)^{2}}{4 a}$$" ], "text/plain": [ " 2 \n", "-(3⋅a - 2) \n", "────────────\n", " 4⋅a " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# kernel->Restart\n", "from sympy import *\n", "init_session()\n", "\n", "a,b,x = symbols('a b x')\n", "f = a*x**2-b*x-a+b # 与えられた2次関数を$f(x)$で定義する\n", "y = f.subs({x:-2})\n", "eq1 = y-6\n", "bb = solve(eq1,b)[0]\n", "pprint(bb)\n", "\n", "x0=solve(diff(f,x),x)[0].subs({b:bb})\n", "pprint(x0)\n", "factor(f.subs({x:x0,b:bb}))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "あれれ...なんか途中が抜けとるで??\n", "\n", "途中の重要な結果は変数に置き換えて明示pprintしておくのが鉄則1.\n", "それを意識して修正すると," ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IPython console for SymPy 1.0 (Python 3.6.1-64-bit) (ground types: python)\n", "\n", "These commands were executed:\n", ">>> from __future__ import division\n", ">>> from sympy import *\n", ">>> x, y, z, t = symbols('x y z t')\n", ">>> k, m, n = symbols('k m n', integer=True)\n", ">>> f, g, h = symbols('f g h', cls=Function)\n", ">>> init_printing()\n", "\n", "Documentation can be found at http://docs.sympy.org/1.0/\n", "-a + 2\n", "-a + 2\n", "──────\n", " 2⋅a \n", " 2 \n", "-(3⋅a - 2) \n", "────────────\n", " 4⋅a \n" ] } ], "source": [ "# kernel->Restart\n", "from sympy import *\n", "init_session()\n", "\n", "a,b,x = symbols('a b x')\n", "f = a*x**2-b*x-a+b # 与えられた2次関数を$f(x)$で定義する\n", "bb = solve(f.subs({x:-2})-6,b)[0]\n", "pprint(bb)\n", "\n", "x0=solve(diff(f,x),x)[0].subs({b:bb})\n", "pprint(x0)\n", "y0=factor(f.subs({x:x0,b:bb}))\n", "pprint(y0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 課題" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 課題1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(例題1に続いて)\n", "\n", "さらに,2次関数(1)のグラフの頂点の$y$座標が-2であるとする.このとき,$a$は\n", "\\begin{equation*}\n", "\\fbox{ キ }\\,a^2-\\fbox{ クケ }\\,a+\\fbox{ コ } = 0\n", "\\end{equation*}\n", "を満たす.これより,$a$の値は\n", "\\begin{equation*}\n", "a = \\fbox{ サ }, \\frac{\\fbox{ シ }}{\\fbox{ ス }}\n", "\\end{equation*}\n", "である.\n", "以下,$a = \\frac{\\fbox{ シ }}{\\fbox{ ス }}$であるとする.\n", "\n", "このとき,2次関数(1)のグラフの頂点のx座標は$\\fbox{ セ }$であり,(1)のグラフと$x$軸の2交点の$x$座標は$\\fbox{ ソ },\\fbox{ タ }$である.\n", "\n", "また,関数(1)は$0 \\leqq x \\leqq 9$において\n", "\n", "$x = \\fbox{ チ }$のとき,最小値$\\fbox{ ツテ }$をとり,\n", "\n", "$x = \\fbox{ ト }$のとき,最大値$\\frac{\\fbox{ ナニ }}{\\fbox{ ヌ }}$をとる.\n", "\n", "\n", "(2008 年度大学入試センター試験数学 I より抜粋)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 解答例" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2 \n", "9⋅a - 20⋅a + 4\n", "[2/9, 2]\n", "2/9\n", "4\n", "[1, 7]\n" ] } ], "source": [ "# 実践の解答例に続けて...\n", "eq2 = expand((y0 +2)*(-4*a)) # -4aをかけて,展開\n", "pprint(eq2) # キクケコ\n", "s_a=solve(eq2,a) # 方程式を解く\n", "pprint(s_a) # サシス\n", "aa = min(s_a) #二つの解の小さい方が題意,シス\n", "pprint(aa)\n", "\n", "pprint(x0.subs({a:aa})) # セ\n", "eq3 = f.subs({b:bb}).subs({a:aa}) # fに得られたa,bを代入\n", "pprint(solve(eq3,x)) # そいつを解いてx軸との交点を,ソタ" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nEZGD/g/WboU6Zv1GtAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "plot(eq3, (x,0,9)) # 得られたeq3をplot" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-2\n", "32/9\n" ] } ], "source": [ "print(eq3.subs({x:4})) # min at x=4\n", "print(eq3.subs({x:9})) # 目視でmax at x=9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 課題2\n", "$P = x(x+3)(2x-3)$とする.\n", "また,$a$を定数とする.\n", "$x = a+1$のときの\n", "$P$の値は\n", "\\begin{equation*}\n", "2a^3+\\fbox{ ア }a^2+\\fbox{ イ }a-\\fbox{ ウ }\n", "\\end{equation*}\n", "である.\n", "\n", "$x=a+1$のときの$P$の値と,$x=a$のときの$P$の値が等しいとする.このとき,$a$は\n", "\\begin{equation*}\n", "3a^2+\\fbox{ エ }a-\\fbox{ オ } = 0\n", "\\end{equation*}\n", "を満たす.したがって\n", "\\begin{equation*}\n", "a = \\frac{\\fbox{ カキ }\\pm \\sqrt{\\fbox{ クケ }}}{\\fbox{ コ }}\n", "\\end{equation*}\n", "である.\n", "\n", " (2008 年度大学入試センター試験数学 I 第4問より抜粋)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 解答例 " ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 3 2 \n", "2⋅a + 9⋅a + 3⋅a - 4\n", " 2 \n", "3⋅a + 6⋅a - 2\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOkAAAA/BAMAAAD3fvLiAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMARM1UEN0y76uZdmaJ\nIrtG1WDAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADa0lEQVRYCe2ZP2hTQRzHf21eTZPmtREHceoj\nWBVRCGQQpzyUgnRpETsIgq5O0lJws3WS2qEFi7SLdhN0aDZBHQoiChYJ4lKptKJ7axuHavX5u8vr\nvX93934hIXHIDenv330/d793eS9poN9xLGjm2HKcPPQXCtlmQuFIoYjUpiI5LPl/U01HjO3Y5nwW\ntY60mLzX7lqu/d2YdZGpH2OE/GnT8nsSm0x9IJmsCqXyqowbp1KNkeqE0/bNOEmAQVdcWUylsuWf\nswEmnX1XUvOH9UVbTKUOgjE9i9Qz98saXDWFfYkpplLfo+AyUqeqwtrXTAnT2mIiFZcfI+RbB7+s\njaCmD5Y/8+KhT19uPmNhRlUWE/Z6GDW6DoS+w0aW2YrRwZKsL5yqLI6npsdR4+mBEEAvF2W+ZDyx\nANJLLMH2qiyOp35axvWL5QOk/jA5+TCHfrh9camK4ngqDG9Czwqj4PK7LcigsHIYfwFe8ay2mEDF\n9XbZTAmFkhakKlxV8fK4DFd4SltMoJp73vJT2EBLAeThjbmeFW4gVV1MoMKsLZZvzsHzso7aXan2\nhTVGXUyh3no9x0ALk6dKsPZuXgeFQ/vneV5fTKF2jttaUiB58njAlTthamIiWpfYi8aUkSLvizLN\nn0UQol5aqLgTEkvezLOeGWt1ai979VkUpkJaRo1F1VCApwzaVNYw/3VlfqNG6zt8YZSNE/iY4qcp\nk8sNjOdyU7jBPu9jvLDC+zYG2OzLN0BUeMY2Fgt1tFu/V7H69jtHtMI1jJ1whOzLrmvq3s5MVUD/\nzhm1yZhgIX8WRe5NoiZMNVc/5EUSEtq7LayvfvNqJVbo7u9VGCHdNUj89rIZz5RY+DgvliRxEVJS\nRYVrLOfhpxcb8kyJld6FvhFJXITI1KNZ/xHS7gQ6xmDYEgiJQabindnXYYlSMNSgDuN34ZWgsM4z\nrumy6jMcmbV+1Y7EVAHzzbwqxeM1dDgzplUKJt9mg37Qq4EKt+3gXJ2XnNBmqf9b+wKwldcp+XJm\nGXp3fX7EJO/VsenUvkqjqHcArpcji5YHkpvQpfm+Gf2MKJfB6EtI/FImQ4meEhSXQrGAS+5wx+Ij\n7bEMqB5b/Brwww6ZGp5Yl9+m1tU+wuR2hwlNqquk3eG62keY3LoOt+TXwYvN/3WwUP4HtyoWUuJk\nj5MAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left [ -1 + \\frac{\\sqrt{15}}{3}, \\quad - \\frac{\\sqrt{15}}{3} - 1\\right ]$$" ], "text/plain": [ "⎡ √15 √15 ⎤\n", "⎢-1 + ───, - ─── - 1⎥\n", "⎣ 3 3 ⎦" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import *\n", "a,b,x = symbols('a b x')\n", "P = x*(x+3)*(2*x-3) # $P$を$x$の関数として定義\n", "\n", "pprint(expand(P.subs({x:a+1}))) # $$P(a)$を形式的に出してみる.\n", "eq1 = expand(P.subs({x:a+1}) - P.subs({x:a})) #2式を差し引く\n", "pprint(eq1/2) # 出題にそろえるため2で割っている.\n", "solve(eq1,a) # eq1=0をaについて解く(solve)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 追記(ちょっとしたコツ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 式フォローのデフォルト \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "数式処理ソフトで実際に数式をいじる状況というのは,ほとんどの場合が既知の数式変形のフォローだろう.例えば,論文で「(1)式から(2)式への変形は自明である」とかいう\n", "文章で済ましている変形が本当にあっているのかを確かめたい時.一番単純なやり方は自明と言われた前後の式が一致していることを確かめるだけで十分である.\n", "最も単純な確認法は以下の通り,変形の前後の式を手入力してその差をexpandした結果が0か否かでする.\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOBAMAAADkjZCYAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEJmJZjLNVN0i77ur\nRHZ72Yd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVElEQVQIHWNgEDIxZWBgSGeQmMDAsoCBOYGB\n+wAD+0cG/gMMvN8Z5BUYeP8xzDdgYP3MMF8BREJEgLLs3xm4NzCwfATpYkpgYGhnkApgYBB+d5QB\nAPogE3QldevOAAAAAElFTkSuQmCC\n", "text/latex": [ "$$0$$" ], "text/plain": [ "0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import *\n", "x = symbols('x')\n", "\n", "ex1=(x-3)**4\n", "ex2 = x**4-12*x**3+54*x**2-108*x+81\n", "\n", "expand(ex1-ex2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "0ならば式の変形は保証されているので,その導出が間違いでなく誤植などもないことが確認できる.ただ,これだけでは変形の哲学や技法が身に付くわけではない.あくまでも\n", "苦し紛れのデフォルトであることは心に留めておくように.\n", "論理値(True or False)として確かめたいときには,==0で出てくる." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## assumeの具体例:無限積分 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下に示す積分を実行せよ.\n", "\n", "$$\n", "\\int _{-\\infty }^{\\infty }x \\exp(-\\beta c\\,{x}^{2}) \\left( 1+\\beta g\\,{x}^{3} \\right) {dx}\n", "$$\n", "最新版のMapleでは改良が施されていて,このような複雑な積分も一発で求まる.\n", "\n", "```maple\n", "> int(f1(x),x=-infinity..infinity);\n", "```\n", "$$\n", "\\left\\{\\, \\begin {array}{cc} { \\frac{3}{4}\\,\\frac {g \\sqrt{\\pi }}{\\beta\\,{c}^{2} \\sqrt{c\\beta}}}&csgn \\left( c\\beta \\right) =1\\\\ \\infty&otherwise\\end {array} \\right.\n", "$$\n", "ここでは,$c \\beta$が正の場合(csgn(beta c)=1)とそれ以外の場合(otherwise)に分けて答えを返している.しかしこのような意図したきれいな結果をいつも数式処理ソフトが返してくれるとは限らない.これだけしか知らないと,なにかうまくいかないときにお手上げになってしまう." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2\n", " ⎛ 3 ⎞ -β⋅c⋅x \n", "x⋅⎝β⋅g⋅x + 1⎠⋅ℯ \n", "⎧ 3⋅√π⋅g \n", "⎪───────────────────────────────────── for │periodic_argument(polar_lift(β)⋅p\n", "⎪ 3/2 3/2 \n", "⎪4⋅c⋅polar_lift (β)⋅polar_lift (c) \n", "⎪ \n", "⎪ ∞ \n", "⎨ ⌠ \n", "⎪ ⎮ 2 \n", "⎪ ⎮ ⎛ 3 ⎞ -β⋅c⋅x \n", "⎪ ⎮ x⋅⎝β⋅g⋅x + 1⎠⋅ℯ dx otherwise \n", "⎪ ⌡ \n", "⎪ -∞ \n", "⎩ \n", "\n", " π\n", "olar_lift(c), ∞)│ < ─\n", " 2\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n" ] } ], "source": [ "from sympy import *\n", "init_printing()\n", "\n", "\n", "x,beta,c,g = symbols('x beta c g')\n", "f1 = x*exp(-beta*c*x**2)*(1+beta*g*x**3)\n", "\n", "pprint(f1)\n", "pprint(integrate(f1,(x,-oo,oo)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この辺りの記述をやり直したけど,\n", "assumeのためにassumpitons moduleを使ってやったんだけど,\n", "どうもうまくいかない.\n", "``` python\n", "assumes = Q.positive(beta), Q.positive(c)\n", "with assuming(*assumes):\n", " print ask(beta*c, positive)\n", "```\n", "とかは通るけど,integrateの結果は変わらない.\n", "結局,symbols('x',positive = True)とかで初めに指定するとすっと通る.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "12px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_position": { "height": "581px", "left": "0px", "right": "844.184814453125px", "top": "105px", "width": "323px" }, "toc_section_display": "block", "toc_window_display": false, "widenNotebook": false } }, "nbformat": 4, "nbformat_minor": 2 }