8-SageCalculus.tex (77571B)
1 \documentclass[11pt]{article} 2 3 \usepackage[breakable]{tcolorbox} 4 \usepackage{parskip} % Stop auto-indenting (to mimic markdown behaviour) 5 6 \usepackage{iftex} 7 \ifPDFTeX 8 \usepackage[T1]{fontenc} 9 \usepackage{mathpazo} 10 \else 11 \usepackage{fontspec} 12 \fi 13 14 % Basic figure setup, for now with no caption control since it's done 15 % automatically by Pandoc (which extracts ![](path) syntax from Markdown). 16 \usepackage{graphicx} 17 % Maintain compatibility with old templates. Remove in nbconvert 6.0 18 \let\Oldincludegraphics\includegraphics 19 % Ensure that by default, figures have no caption (until we provide a 20 % proper Figure object with a Caption API and a way to capture that 21 % in the conversion process - todo). 22 \usepackage{caption} 23 \DeclareCaptionFormat{nocaption}{} 24 \captionsetup{format=nocaption,aboveskip=0pt,belowskip=0pt} 25 26 \usepackage[Export]{adjustbox} % Used to constrain images to a maximum size 27 \adjustboxset{max size={0.9\linewidth}{0.9\paperheight}} 28 \usepackage{float} 29 \floatplacement{figure}{H} % forces figures to be placed at the correct location 30 \usepackage{xcolor} % Allow colors to be defined 31 \usepackage{enumerate} % Needed for markdown enumerations to work 32 \usepackage{geometry} % Used to adjust the document margins 33 \usepackage{amsmath} % Equations 34 \usepackage{amssymb} % Equations 35 \usepackage{textcomp} % defines textquotesingle 36 % Hack from http://tex.stackexchange.com/a/47451/13684: 37 \AtBeginDocument{% 38 \def\PYZsq{\textquotesingle}% Upright quotes in Pygmentized code 39 } 40 \usepackage{upquote} % Upright quotes for verbatim code 41 \usepackage{eurosym} % defines \euro 42 \usepackage[mathletters]{ucs} % Extended unicode (utf-8) support 43 \usepackage{fancyvrb} % verbatim replacement that allows latex 44 \usepackage{grffile} % extends the file name processing of package graphics 45 % to support a larger range 46 \makeatletter % fix for grffile with XeLaTeX 47 \def\Gread@@xetex#1{% 48 \IfFileExists{"\Gin@base".bb}% 49 {\Gread@eps{\Gin@base.bb}}% 50 {\Gread@@xetex@aux#1}% 51 } 52 \makeatother 53 54 % The hyperref package gives us a pdf with properly built 55 % internal navigation ('pdf bookmarks' for the table of contents, 56 % internal cross-reference links, web links for URLs, etc.) 57 \usepackage{hyperref} 58 % The default LaTeX title has an obnoxious amount of whitespace. By default, 59 % titling removes some of it. It also provides customization options. 60 \usepackage{titling} 61 \usepackage{longtable} % longtable support required by pandoc >1.10 62 \usepackage{booktabs} % table support for pandoc > 1.12.2 63 \usepackage[inline]{enumitem} % IRkernel/repr support (it uses the enumerate* environment) 64 \usepackage[normalem]{ulem} % ulem is needed to support strikethroughs (\sout) 65 % normalem makes italics be italics, not underlines 66 \usepackage{mathrsfs} 67 68 69 70 % Colors for the hyperref package 71 \definecolor{urlcolor}{rgb}{0,.145,.698} 72 \definecolor{linkcolor}{rgb}{.71,0.21,0.01} 73 \definecolor{citecolor}{rgb}{.12,.54,.11} 74 75 % ANSI colors 76 \definecolor{ansi-black}{HTML}{3E424D} 77 \definecolor{ansi-black-intense}{HTML}{282C36} 78 \definecolor{ansi-red}{HTML}{E75C58} 79 \definecolor{ansi-red-intense}{HTML}{B22B31} 80 \definecolor{ansi-green}{HTML}{00A250} 81 \definecolor{ansi-green-intense}{HTML}{007427} 82 \definecolor{ansi-yellow}{HTML}{DDB62B} 83 \definecolor{ansi-yellow-intense}{HTML}{B27D12} 84 \definecolor{ansi-blue}{HTML}{208FFB} 85 \definecolor{ansi-blue-intense}{HTML}{0065CA} 86 \definecolor{ansi-magenta}{HTML}{D160C4} 87 \definecolor{ansi-magenta-intense}{HTML}{A03196} 88 \definecolor{ansi-cyan}{HTML}{60C6C8} 89 \definecolor{ansi-cyan-intense}{HTML}{258F8F} 90 \definecolor{ansi-white}{HTML}{C5C1B4} 91 \definecolor{ansi-white-intense}{HTML}{A1A6B2} 92 \definecolor{ansi-default-inverse-fg}{HTML}{FFFFFF} 93 \definecolor{ansi-default-inverse-bg}{HTML}{000000} 94 95 % commands and environments needed by pandoc snippets 96 % extracted from the output of `pandoc -s` 97 \providecommand{\tightlist}{% 98 \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} 99 \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} 100 % Add ',fontsize=\small' for more characters per line 101 \newenvironment{Shaded}{}{} 102 \newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} 103 \newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{{#1}}} 104 \newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} 105 \newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} 106 \newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{{#1}}} 107 \newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} 108 \newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} 109 \newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{{#1}}}} 110 \newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{{#1}}} 111 \newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} 112 \newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{{#1}}} 113 \newcommand{\RegionMarkerTok}[1]{{#1}} 114 \newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{{#1}}}} 115 \newcommand{\NormalTok}[1]{{#1}} 116 117 % Additional commands for more recent versions of Pandoc 118 \newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{{#1}}} 119 \newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} 120 \newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{{#1}}} 121 \newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{{#1}}} 122 \newcommand{\ImportTok}[1]{{#1}} 123 \newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{{#1}}}} 124 \newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} 125 \newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} 126 \newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{{#1}}} 127 \newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{{#1}}}} 128 \newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{{#1}}} 129 \newcommand{\BuiltInTok}[1]{{#1}} 130 \newcommand{\ExtensionTok}[1]{{#1}} 131 \newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{{#1}}} 132 \newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{{#1}}} 133 \newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} 134 \newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{{#1}}}}} 135 136 137 % Define a nice break command that doesn't care if a line doesn't already 138 % exist. 139 \def\br{\hspace*{\fill} \\* } 140 % Math Jax compatibility definitions 141 \def\gt{>} 142 \def\lt{<} 143 \let\Oldtex\TeX 144 \let\Oldlatex\LaTeX 145 \renewcommand{\TeX}{\textrm{\Oldtex}} 146 \renewcommand{\LaTeX}{\textrm{\Oldlatex}} 147 % Document parameters 148 % Document title 149 \title{Calculus and more with SageMath} 150 \author{Sebastiano Tronto - \texttt{sebastiano.tronto@uni.lu}} 151 \date{2021-05-07} 152 153 154 155 156 157 % Pygments definitions 158 \makeatletter 159 \def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax% 160 \let\PY@ul=\relax \let\PY@tc=\relax% 161 \let\PY@bc=\relax \let\PY@ff=\relax} 162 \def\PY@tok#1{\csname PY@tok@#1\endcsname} 163 \def\PY@toks#1+{\ifx\relax#1\empty\else% 164 \PY@tok{#1}\expandafter\PY@toks\fi} 165 \def\PY@do#1{\PY@bc{\PY@tc{\PY@ul{% 166 \PY@it{\PY@bf{\PY@ff{#1}}}}}}} 167 \def\PY#1#2{\PY@reset\PY@toks#1+\relax+\PY@do{#2}} 168 169 \expandafter\def\csname PY@tok@w\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} 170 \expandafter\def\csname PY@tok@c\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 171 \expandafter\def\csname PY@tok@cp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.74,0.48,0.00}{##1}}} 172 \expandafter\def\csname PY@tok@k\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 173 \expandafter\def\csname PY@tok@kp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 174 \expandafter\def\csname PY@tok@kt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} 175 \expandafter\def\csname PY@tok@o\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 176 \expandafter\def\csname PY@tok@ow\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} 177 \expandafter\def\csname PY@tok@nb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 178 \expandafter\def\csname PY@tok@nf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} 179 \expandafter\def\csname PY@tok@nc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} 180 \expandafter\def\csname PY@tok@nn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} 181 \expandafter\def\csname PY@tok@ne\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.82,0.25,0.23}{##1}}} 182 \expandafter\def\csname PY@tok@nv\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 183 \expandafter\def\csname PY@tok@no\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} 184 \expandafter\def\csname PY@tok@nl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.63,0.00}{##1}}} 185 \expandafter\def\csname PY@tok@ni\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.60,0.60,0.60}{##1}}} 186 \expandafter\def\csname PY@tok@na\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.49,0.56,0.16}{##1}}} 187 \expandafter\def\csname PY@tok@nt\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 188 \expandafter\def\csname PY@tok@nd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} 189 \expandafter\def\csname PY@tok@s\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 190 \expandafter\def\csname PY@tok@sd\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 191 \expandafter\def\csname PY@tok@si\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} 192 \expandafter\def\csname PY@tok@se\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.13}{##1}}} 193 \expandafter\def\csname PY@tok@sr\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.40,0.53}{##1}}} 194 \expandafter\def\csname PY@tok@ss\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 195 \expandafter\def\csname PY@tok@sx\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 196 \expandafter\def\csname PY@tok@m\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 197 \expandafter\def\csname PY@tok@gh\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} 198 \expandafter\def\csname PY@tok@gu\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} 199 \expandafter\def\csname PY@tok@gd\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} 200 \expandafter\def\csname PY@tok@gi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} 201 \expandafter\def\csname PY@tok@gr\endcsname{\def\PY@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} 202 \expandafter\def\csname PY@tok@ge\endcsname{\let\PY@it=\textit} 203 \expandafter\def\csname PY@tok@gs\endcsname{\let\PY@bf=\textbf} 204 \expandafter\def\csname PY@tok@gp\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} 205 \expandafter\def\csname PY@tok@go\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.53,0.53,0.53}{##1}}} 206 \expandafter\def\csname PY@tok@gt\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} 207 \expandafter\def\csname PY@tok@err\endcsname{\def\PY@bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}} 208 \expandafter\def\csname PY@tok@kc\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 209 \expandafter\def\csname PY@tok@kd\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 210 \expandafter\def\csname PY@tok@kn\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 211 \expandafter\def\csname PY@tok@kr\endcsname{\let\PY@bf=\textbf\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 212 \expandafter\def\csname PY@tok@bp\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} 213 \expandafter\def\csname PY@tok@fm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} 214 \expandafter\def\csname PY@tok@vc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 215 \expandafter\def\csname PY@tok@vg\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 216 \expandafter\def\csname PY@tok@vi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 217 \expandafter\def\csname PY@tok@vm\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} 218 \expandafter\def\csname PY@tok@sa\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 219 \expandafter\def\csname PY@tok@sb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 220 \expandafter\def\csname PY@tok@sc\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 221 \expandafter\def\csname PY@tok@dl\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 222 \expandafter\def\csname PY@tok@s2\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 223 \expandafter\def\csname PY@tok@sh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 224 \expandafter\def\csname PY@tok@s1\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} 225 \expandafter\def\csname PY@tok@mb\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 226 \expandafter\def\csname PY@tok@mf\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 227 \expandafter\def\csname PY@tok@mh\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 228 \expandafter\def\csname PY@tok@mi\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 229 \expandafter\def\csname PY@tok@il\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 230 \expandafter\def\csname PY@tok@mo\endcsname{\def\PY@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} 231 \expandafter\def\csname PY@tok@ch\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 232 \expandafter\def\csname PY@tok@cm\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 233 \expandafter\def\csname PY@tok@cpf\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 234 \expandafter\def\csname PY@tok@c1\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 235 \expandafter\def\csname PY@tok@cs\endcsname{\let\PY@it=\textit\def\PY@tc##1{\textcolor[rgb]{0.25,0.50,0.50}{##1}}} 236 237 \def\PYZbs{\char`\\} 238 \def\PYZus{\char`\_} 239 \def\PYZob{\char`\{} 240 \def\PYZcb{\char`\}} 241 \def\PYZca{\char`\^} 242 \def\PYZam{\char`\&} 243 \def\PYZlt{\char`\<} 244 \def\PYZgt{\char`\>} 245 \def\PYZsh{\char`\#} 246 \def\PYZpc{\char`\%} 247 \def\PYZdl{\char`\$} 248 \def\PYZhy{\char`\-} 249 \def\PYZsq{\char`\'} 250 \def\PYZdq{\char`\"} 251 \def\PYZti{\char`\~} 252 % for compatibility with earlier versions 253 \def\PYZat{@} 254 \def\PYZlb{[} 255 \def\PYZrb{]} 256 \makeatother 257 258 259 % For linebreaks inside Verbatim environment from package fancyvrb. 260 \makeatletter 261 \newbox\Wrappedcontinuationbox 262 \newbox\Wrappedvisiblespacebox 263 \newcommand*\Wrappedvisiblespace {\textcolor{red}{\textvisiblespace}} 264 \newcommand*\Wrappedcontinuationsymbol {\textcolor{red}{\llap{\tiny$\m@th\hookrightarrow$}}} 265 \newcommand*\Wrappedcontinuationindent {3ex } 266 \newcommand*\Wrappedafterbreak {\kern\Wrappedcontinuationindent\copy\Wrappedcontinuationbox} 267 % Take advantage of the already applied Pygments mark-up to insert 268 % potential linebreaks for TeX processing. 269 % {, <, #, %, $, ' and ": go to next line. 270 % _, }, ^, &, >, - and ~: stay at end of broken line. 271 % Use of \textquotesingle for straight quote. 272 \newcommand*\Wrappedbreaksatspecials {% 273 \def\PYGZus{\discretionary{\char`\_}{\Wrappedafterbreak}{\char`\_}}% 274 \def\PYGZob{\discretionary{}{\Wrappedafterbreak\char`\{}{\char`\{}}% 275 \def\PYGZcb{\discretionary{\char`\}}{\Wrappedafterbreak}{\char`\}}}% 276 \def\PYGZca{\discretionary{\char`\^}{\Wrappedafterbreak}{\char`\^}}% 277 \def\PYGZam{\discretionary{\char`\&}{\Wrappedafterbreak}{\char`\&}}% 278 \def\PYGZlt{\discretionary{}{\Wrappedafterbreak\char`\<}{\char`\<}}% 279 \def\PYGZgt{\discretionary{\char`\>}{\Wrappedafterbreak}{\char`\>}}% 280 \def\PYGZsh{\discretionary{}{\Wrappedafterbreak\char`\#}{\char`\#}}% 281 \def\PYGZpc{\discretionary{}{\Wrappedafterbreak\char`\%}{\char`\%}}% 282 \def\PYGZdl{\discretionary{}{\Wrappedafterbreak\char`\$}{\char`\$}}% 283 \def\PYGZhy{\discretionary{\char`\-}{\Wrappedafterbreak}{\char`\-}}% 284 \def\PYGZsq{\discretionary{}{\Wrappedafterbreak\textquotesingle}{\textquotesingle}}% 285 \def\PYGZdq{\discretionary{}{\Wrappedafterbreak\char`\"}{\char`\"}}% 286 \def\PYGZti{\discretionary{\char`\~}{\Wrappedafterbreak}{\char`\~}}% 287 } 288 % Some characters . , ; ? ! / are not pygmentized. 289 % This macro makes them "active" and they will insert potential linebreaks 290 \newcommand*\Wrappedbreaksatpunct {% 291 \lccode`\~`\.\lowercase{\def~}{\discretionary{\hbox{\char`\.}}{\Wrappedafterbreak}{\hbox{\char`\.}}}% 292 \lccode`\~`\,\lowercase{\def~}{\discretionary{\hbox{\char`\,}}{\Wrappedafterbreak}{\hbox{\char`\,}}}% 293 \lccode`\~`\;\lowercase{\def~}{\discretionary{\hbox{\char`\;}}{\Wrappedafterbreak}{\hbox{\char`\;}}}% 294 \lccode`\~`\:\lowercase{\def~}{\discretionary{\hbox{\char`\:}}{\Wrappedafterbreak}{\hbox{\char`\:}}}% 295 \lccode`\~`\?\lowercase{\def~}{\discretionary{\hbox{\char`\?}}{\Wrappedafterbreak}{\hbox{\char`\?}}}% 296 \lccode`\~`\!\lowercase{\def~}{\discretionary{\hbox{\char`\!}}{\Wrappedafterbreak}{\hbox{\char`\!}}}% 297 \lccode`\~`\/\lowercase{\def~}{\discretionary{\hbox{\char`\/}}{\Wrappedafterbreak}{\hbox{\char`\/}}}% 298 \catcode`\.\active 299 \catcode`\,\active 300 \catcode`\;\active 301 \catcode`\:\active 302 \catcode`\?\active 303 \catcode`\!\active 304 \catcode`\/\active 305 \lccode`\~`\~ 306 } 307 \makeatother 308 309 \let\OriginalVerbatim=\Verbatim 310 \makeatletter 311 \renewcommand{\Verbatim}[1][1]{% 312 %\parskip\z@skip 313 \sbox\Wrappedcontinuationbox {\Wrappedcontinuationsymbol}% 314 \sbox\Wrappedvisiblespacebox {\FV@SetupFont\Wrappedvisiblespace}% 315 \def\FancyVerbFormatLine ##1{\hsize\linewidth 316 \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ 317 \doublehyphendemerits\z@\finalhyphendemerits\z@ 318 \strut ##1\strut}% 319 }% 320 % If the linebreak is at a space, the latter will be displayed as visible 321 % space at end of first line, and a continuation symbol starts next line. 322 % Stretch/shrink are however usually zero for typewriter font. 323 \def\FV@Space {% 324 \nobreak\hskip\z@ plus\fontdimen3\font minus\fontdimen4\font 325 \discretionary{\copy\Wrappedvisiblespacebox}{\Wrappedafterbreak} 326 {\kern\fontdimen2\font}% 327 }% 328 329 % Allow breaks at special characters using \PYG... macros. 330 \Wrappedbreaksatspecials 331 % Breaks at punctuation characters . , ; ? ! and / need catcode=\active 332 \OriginalVerbatim[#1,codes*=\Wrappedbreaksatpunct]% 333 } 334 \makeatother 335 336 % Exact colors from NB 337 \definecolor{incolor}{HTML}{303F9F} 338 \definecolor{outcolor}{HTML}{D84315} 339 \definecolor{cellborder}{HTML}{CFCFCF} 340 \definecolor{cellbackground}{HTML}{F7F7F7} 341 342 % prompt 343 \makeatletter 344 \newcommand{\boxspacing}{\kern\kvtcb@left@rule\kern\kvtcb@boxsep} 345 \makeatother 346 \newcommand{\prompt}[4]{ 347 \ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip} 348 } 349 350 351 352 % Prevent overflowing lines due to hard-to-break entities 353 \sloppy 354 % Setup hyperref package 355 \hypersetup{ 356 breaklinks=true, % so long urls are correctly broken across lines 357 colorlinks=true, 358 urlcolor=urlcolor, 359 linkcolor=linkcolor, 360 citecolor=citecolor, 361 } 362 % Slightly bigger margins than the latex defaults 363 364 \geometry{verbose,tmargin=1in,bmargin=1in,lmargin=1in,rmargin=1in} 365 366 367 368 \begin{document} 369 370 \maketitle 371 372 373 374 375 \hypertarget{symbolic-expressions}{% 376 \section{Symbolic expressions}\label{symbolic-expressions}} 377 378 \textbf{Reference:} 379 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} 380 381 Last time we saw the basics of symbolic expressions: * How to define and 382 manipulate symbolic expressions * How to introduce new variables (in the 383 Mathematical sense) with \texttt{var()} * How to solve equations and 384 inequalities * Some of the Mathematical constants that are included in 385 Sage, and how to approximate them using \texttt{n()} 386 387 Here are some examples to remind you of these basic things: 388 389 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 390 \prompt{In}{incolor}{2}{\boxspacing} 391 \begin{Verbatim}[commandchars=\\\{\}] 392 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Define new variables (x is already defined by Sage)} 393 \PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{pi} 394 \PY{n}{g} \PY{o}{=} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{y} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0} 395 \PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)} 396 \PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{f}\PY{p}{,} \PY{n}{z}\PY{p}{)} \PY{p}{)} 397 \PY{n+nb}{print}\PY{p}{(} \PY{n}{solve}\PY{p}{(}\PY{n}{g}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} 398 \PY{n+nb}{print}\PY{p}{(} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{is approximately}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{n}\PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi} \PY{o}{+} \PY{n}{e}\PY{p}{)} \PY{p}{)} 399 \end{Verbatim} 400 \end{tcolorbox} 401 402 \begin{Verbatim}[commandchars=\\\{\}] 403 [ 404 x == -sqrt(-pi), 405 x == sqrt(-pi) 406 ] 407 [ 408 z == -sqrt(pi + x\^{}2), 409 z == sqrt(pi + x\^{}2) 410 ] 411 [[y < -2], [y > 1]] 412 2*pi + e is approximately 9.00146713563863 413 \end{Verbatim} 414 415 Now we will see some more details about solving equations and 416 manipulating their solutions. 417 418 \hypertarget{solving-equations-and-inequalities}{% 419 \subsection{Solving equations and 420 inequalities}\label{solving-equations-and-inequalities}} 421 422 \textbf{Reference} 423 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} 424 for the details of \texttt{solve()} and \texttt{find\_root()}, 425 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/relation.html\#solving}{2}{]} 426 for examples. 427 428 Other than equations and inequalities, we can also solve systems: it is 429 enough to give Sage a list of expressions and a list of variables with 430 respect to which we want to solve. For example the system 431 432 \begin{align*} 433 \begin{cases} 434 x + y = 2 \\ 435 2x - y = 6 436 \end{cases} 437 \end{align*} 438 439 Can be solved as 440 441 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 442 \prompt{In}{incolor}{40}{\boxspacing} 443 \begin{Verbatim}[commandchars=\\\{\}] 444 \PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)} 445 \end{Verbatim} 446 \end{tcolorbox} 447 448 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 449 \prompt{Out}{outcolor}{40}{\boxspacing} 450 \begin{Verbatim}[commandchars=\\\{\}] 451 [[x == (8/3), y == (-2/3)]] 452 \end{Verbatim} 453 \end{tcolorbox} 454 455 \textbf{Exercise.} Find the intersection of the circle of radius \(2\) 456 centered in the origin and the parabula of equation \(y=x^2-2x^2+1\). 457 458 \hypertarget{the-set-of-solutions}{% 459 \subsubsection{The set of solutions}\label{the-set-of-solutions}} 460 461 One would expect the result of \texttt{solve()} to be a list of 462 solutions, but it is actually a list of expressions (technically it is 463 not a list but a different type of Python collection, but this is not so 464 important) 465 466 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 467 \prompt{In}{incolor}{37}{\boxspacing} 468 \begin{Verbatim}[commandchars=\\\{\}] 469 \PY{n}{solutions} \PY{o}{=} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{==} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)} 470 \PY{n}{solutions}\PY{p}{[}\PY{l+m+mi}{0}\PY{p}{]} \PY{c+c1}{\PYZsh{} This is the expression \PYZsq{}x == \PYZhy{}3\PYZsq{}} 471 \end{Verbatim} 472 \end{tcolorbox} 473 474 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 475 \prompt{Out}{outcolor}{37}{\boxspacing} 476 \begin{Verbatim}[commandchars=\\\{\}] 477 x == -3 478 \end{Verbatim} 479 \end{tcolorbox} 480 481 To read the actual solution without the \texttt{x\ ==} part you can use 482 the \texttt{rhs()} or \texttt{lhs()} functions, which can be applied to 483 any expression containing a relation operator (like \texttt{==}, 484 \texttt{\textless{}}, \texttt{\textgreater{}=}\ldots) and return the 485 \emph{right hand side} and \emph{left hand side} of the expression, 486 respectively 487 488 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 489 \prompt{In}{incolor}{41}{\boxspacing} 490 \begin{Verbatim}[commandchars=\\\{\}] 491 \PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{==} \PY{l+m+mi}{2} 492 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{rhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{rhs}\PY{p}{(}\PY{p}{)}\PY{p}{)} 493 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{lhs:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{lhs}\PY{p}{(}\PY{p}{)}\PY{p}{)} 494 \end{Verbatim} 495 \end{tcolorbox} 496 497 \begin{Verbatim}[commandchars=\\\{\}] 498 rhs: 2 499 lhs: x 500 \end{Verbatim} 501 502 When you solve an inequality or a system, the set of solutions can be 503 more complicated to describe. In this case the result is a list 504 containing lists of expressions that have to be \texttt{True} at the 505 same time. It is easier to explain with an example: 506 507 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 508 \prompt{In}{incolor}{38}{\boxspacing} 509 \begin{Verbatim}[commandchars=\\\{\}] 510 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Simple inequality:}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)} 511 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{System of inequalities:}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{9} \PY{o}{\PYZgt{}} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{x} \PY{o}{\PYZlt{}} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)} 512 \end{Verbatim} 513 \end{tcolorbox} 514 515 \begin{Verbatim}[commandchars=\\\{\}] 516 Simple inequality: [[x < -3], [x > 3]] 517 System of inequalities: 518 [ 519 [3 < x, x < 6], 520 [x < -3] 521 ] 522 \end{Verbatim} 523 524 In the last example (system of inequalities), Sage is telling us that 525 the system \begin{align*} 526 \begin{cases} 527 x^2-9 > 9 \\ 528 x < 6 529 \end{cases} 530 \end{align*} has two solutions: * \(x\) is between \(3\) and \(6\); * 531 \(x\) is less than \(-3\). 532 533 Since in Sage (and in Python) expressions can have at most on relational 534 operator like \texttt{\textless{}}, the first solution requires two 535 expressions to be described. Hence the ``list of lists''. 536 537 \textbf{Exercise.} In the first exercise you were asked to solve a 538 system of equations, but some of its solutions were complex numbers. 539 Select only the real solutions and print them as pairs \((x,y)\). 540 541 When solving a system of equations (not inequalities), you can use the 542 option \texttt{solution\_dict=True} to have the solutions arranged as a 543 \emph{dictionary}, which is a type of Python collection that we did not 544 treat in this course 545 546 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 547 \prompt{In}{incolor}{44}{\boxspacing} 548 \begin{Verbatim}[commandchars=\\\{\}] 549 \PY{n}{solve}\PY{p}{(}\PY{p}{[}\PY{n}{x}\PY{o}{+}\PY{n}{y} \PY{o}{==} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{l+m+mi}{6}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{,} \PY{n}{solution\PYZus{}dict}\PY{o}{=}\PY{k+kc}{True}\PY{p}{)} 550 \end{Verbatim} 551 \end{tcolorbox} 552 553 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 554 \prompt{Out}{outcolor}{44}{\boxspacing} 555 \begin{Verbatim}[commandchars=\\\{\}] 556 [\{x: 8/3, y: -2/3\}] 557 \end{Verbatim} 558 \end{tcolorbox} 559 560 \hypertarget{alternative-method-for-real-roots-find_root}{% 561 \subsubsection{\texorpdfstring{Alternative method for real roots: 562 \texttt{find\_root()}}{Alternative method for real roots: find\_root()}}\label{alternative-method-for-real-roots-find_root}} 563 564 The \texttt{solve()} method is very useful when solving \emph{symbolic} 565 equations, for example when you have two variables and you want to solve 566 for one of them in terms of the other. However, it does not always find 567 explicit solutions. 568 569 When you want to find an explicit, even if approximate, solution, it can 570 be better to use \texttt{find\_root()}. This function works 571 \emph{numerically}, which means that it finds an approximation of the 572 root. It only works for real solutions and you need to specify an 573 interval where you want the root to be searched: 574 575 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 576 \prompt{In}{incolor}{52}{\boxspacing} 577 \begin{Verbatim}[commandchars=\\\{\}] 578 \PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} \PY{o}{+} \PY{n}{x} \PY{o}{\PYZhy{}} \PY{l+m+mi}{10} 579 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using solve():}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{solve}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{n}{x}\PY{p}{)}\PY{p}{)} 580 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Using find\PYZus{}root():}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{f}\PY{o}{.}\PY{n}{find\PYZus{}root}\PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{100}\PY{p}{)}\PY{p}{)} 581 \end{Verbatim} 582 \end{tcolorbox} 583 584 \begin{Verbatim}[commandchars=\\\{\}] 585 Using solve(): 586 [ 587 x == -e\^{}x + 10 588 ] 589 Using find\_root(): 2.070579904980303 590 \end{Verbatim} 591 592 \hypertarget{evaluating-functions}{% 593 \subsection{Evaluating functions}\label{evaluating-functions}} 594 595 If an expression contains only one variable you can evaluate it easily, 596 even if it is not a function. 597 598 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 599 \prompt{In}{incolor}{21}{\boxspacing} 600 \begin{Verbatim}[commandchars=\\\{\}] 601 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 602 \PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{\PYZhy{}}\PY{l+m+mi}{3} 603 \PY{n}{g} \PY{o}{=} \PY{n}{x} \PY{o}{\PYZgt{}} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} 604 605 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} 606 \PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{p}{(}\PY{l+m+mi}{3}\PY{o}{+}\PY{n}{y}\PY{p}{)}\PY{p}{)} 607 \end{Verbatim} 608 \end{tcolorbox} 609 610 \begin{Verbatim}[commandchars=\\\{\}] 611 1 612 y + 3 > (y + 3)\^{}2 613 \end{Verbatim} 614 615 If an expression contains more than one variable, you can specify a 616 value for each of them and they will be substituted in alphabetic order. 617 You can also specify a value only for some of the variables. 618 619 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 620 \prompt{In}{incolor}{38}{\boxspacing} 621 \begin{Verbatim}[commandchars=\\\{\}] 622 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{z}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 623 624 \PY{n}{f} \PY{o}{=} \PY{n}{y}\PY{o}{*}\PY{n}{z}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{n}{y} \PY{o}{==} \PY{n}{z} 625 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)} 626 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{z}\PY{o}{=}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{)} 627 \end{Verbatim} 628 \end{tcolorbox} 629 630 \begin{Verbatim}[commandchars=\\\{\}] 631 -2 == 0 632 3*y == 2 633 \end{Verbatim} 634 635 \hypertarget{symbolic-computations}{% 636 \subsection{Symbolic computations}\label{symbolic-computations}} 637 638 Sage can understand and simplify symbolic expressions such as sums 639 (finite or infinite) and products. In the following cell, we compute the 640 following sums using the 641 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.sum}{\texttt{sum()}} 642 function: 643 644 \begin{align*} 645 \begin{array}{llcc} 646 (1) & \sum_{k=0}^nk &=&\frac{n^2+n}{2}\\ 647 (2) & \sum_{k=0}^nk^4 &=&\frac{6n^5+15n^4+10n^3-n}{30}\\ 648 (3) & \sum_{k=0}^n\binom nk &=& 2^n\\ 649 (4) & \sum_{k=0}^\infty \frac1{k^2} &=& \frac{\pi^2}{6} 650 \end{array} 651 \end{align*} 652 653 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 654 \prompt{In}{incolor}{22}{\boxspacing} 655 \begin{Verbatim}[commandchars=\\\{\}] 656 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{n}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} \PY{c+c1}{\PYZsh{} Remember to declare all variables} 657 658 \PY{n}{s} \PY{o}{=} \PY{p}{[}\PY{p}{]} 659 \PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)} 660 \PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)} 661 \PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{n}{binomial}\PY{p}{(}\PY{n}{n}\PY{p}{,}\PY{n}{k}\PY{p}{)}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{n}\PY{p}{)} \PY{p}{)} 662 \PY{n}{s}\PY{o}{.}\PY{n}{append}\PY{p}{(} \PY{n+nb}{sum}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{/}\PY{n}{k}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{n}{k}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)} 663 664 \PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{s}\PY{p}{)}\PY{p}{)}\PY{p}{:} 665 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{(}\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{) }\PY{l+s+si}{\PYZob{}\PYZcb{}}\PY{l+s+s2}{\PYZdq{}}\PY{o}{.}\PY{n}{format}\PY{p}{(}\PY{n}{i}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{,} \PY{n}{s}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)}\PY{p}{)} 666 \end{Verbatim} 667 \end{tcolorbox} 668 669 \begin{Verbatim}[commandchars=\\\{\}] 670 (1) 1/2*n\^{}2 + 1/2*n 671 (2) 1/5*n\^{}5 + 1/2*n\^{}4 + 1/3*n\^{}3 - 1/30*n 672 (3) 2\^{}n 673 (4) 1/6*pi\^{}2 674 \end{Verbatim} 675 676 An alternative notation is \texttt{expression.sum(k,\ a,\ b)}. There is 677 an analogous 678 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.prod}{\texttt{prod()}} 679 for products. 680 681 Sometimes Sage tries to keep an expression in its original form without 682 expanding out sums and products. To change this behavior you can use the 683 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.expand}{\texttt{expand()}} 684 function: 685 686 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 687 \prompt{In}{incolor}{30}{\boxspacing} 688 \begin{Verbatim}[commandchars=\\\{\}] 689 \PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{)}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} 690 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{p}{)} 691 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{expand}\PY{p}{(}\PY{p}{)}\PY{p}{)} 692 \end{Verbatim} 693 \end{tcolorbox} 694 695 \begin{Verbatim}[commandchars=\\\{\}] 696 (x + 1)\^{}2 - (x - 1)\^{}2 697 4*x 698 \end{Verbatim} 699 700 \hypertarget{the-symbolic-ring}{% 701 \subsubsection{The Symbolic Ring}\label{the-symbolic-ring}} 702 703 \textbf{Reference:} 704 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/ring.html}{3}{]} 705 706 The symbolic expressions that we have seen so far live in a ring called 707 \emph{symbolic ring} and denoted by \texttt{SR} in Sage. This ring works 708 like the ring \texttt{ZZ} of integers or \texttt{RR} of reals numbers. 709 In particular, you can define matrices and other objects using it as a 710 ``basis''. 711 712 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 713 \prompt{In}{incolor}{45}{\boxspacing} 714 \begin{Verbatim}[commandchars=\\\{\}] 715 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{a}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{b}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{c}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{d}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 716 717 \PY{n}{M} \PY{o}{=} \PY{n}{matrix}\PY{p}{(}\PY{p}{[}\PY{p}{[}\PY{n}{a}\PY{p}{,}\PY{n}{b}\PY{p}{]}\PY{p}{,} \PY{p}{[}\PY{n}{c}\PY{p}{,}\PY{n}{d}\PY{p}{]}\PY{p}{]}\PY{p}{)} 718 \PY{n+nb}{print}\PY{p}{(}\PY{n}{M}\PY{o}{.}\PY{n}{determinant}\PY{p}{(}\PY{p}{)}\PY{p}{)} 719 720 \PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{SR}\PY{p}{[}\PY{p}{]} 721 \PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{a}\PY{o}{*}\PY{n}{x} \PY{o}{+} \PY{n}{a}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} 722 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{roots}\PY{p}{(}\PY{p}{)}\PY{p}{)} 723 \end{Verbatim} 724 \end{tcolorbox} 725 726 \begin{Verbatim}[commandchars=\\\{\}] 727 -b*c + a*d 728 [(-a, 2)] 729 \end{Verbatim} 730 731 \textbf{Exercise.} Compute the eigenvalues of the matrix \begin{align*} 732 \begin{pmatrix} 733 \cos \alpha & \sin \alpha\\ 734 -\sin\alpha & \cos \alpha 735 \end{pmatrix} 736 \end{align*} 737 738 \hypertarget{calculus}{% 739 \section{Calculus}\label{calculus}} 740 741 \textbf{Reference:} 742 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/index.html}{4}{]} 743 for an overview, but most functions are described in 744 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html}{1}{]} 745 746 \hypertarget{limits-and-series}{% 747 \subsection{Limits and series}\label{limits-and-series}} 748 749 \textbf{References:} 750 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/calculus.html\#sage.calculus.calculus.limit}{5}{]} 751 for limits, 752 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.series}{6}{]} 753 for series 754 755 You can compute limits 756 757 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 758 \prompt{In}{incolor}{54}{\boxspacing} 759 \begin{Verbatim}[commandchars=\\\{\}] 760 \PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} 761 \PY{c+c1}{\PYZsh{} print(f(0)) \PYZsh{} This one gives an error} 762 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)} 763 764 \PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{)}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{n}{infinity}\PY{p}{)} \PY{p}{)} 765 \end{Verbatim} 766 \end{tcolorbox} 767 768 \begin{Verbatim}[commandchars=\\\{\}] 769 1 770 0 771 \end{Verbatim} 772 773 \textbf{Exercise.} Compute the constant \(e\) using a limit. 774 775 You can also specify a direction for the limit. If you don't, Sage 776 assumes that you want to take a two-sided limit. 777 778 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 779 \prompt{In}{incolor}{55}{\boxspacing} 780 \begin{Verbatim}[commandchars=\\\{\}] 781 \PY{n}{f} \PY{o}{=} \PY{n+nb}{abs}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{o}{/}\PY{n}{x} \PY{c+c1}{\PYZsh{} 1 if x\PYZgt{}0, \PYZhy{}1 if x\PYZlt{}0} 782 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} undefined} 783 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{+}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)} 784 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{limit}\PY{p}{(}\PY{n}{x}\PY{o}{=}\PY{l+m+mi}{0}\PY{p}{,} \PY{n+nb}{dir}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{\PYZhy{}}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} \PY{p}{)} 785 \end{Verbatim} 786 \end{tcolorbox} 787 788 \begin{Verbatim}[commandchars=\\\{\}] 789 und 790 1 791 -1 792 \end{Verbatim} 793 794 There is also the alternative notation \texttt{limit(f,\ x,\ dir)} which 795 does the same as \texttt{f.limit(x,\ dir)}. 796 797 You can also compute series expansions up to any order. \textbf{Watch 798 out:} the notation uses \texttt{==} instead of \texttt{=} as 799 \texttt{limit()} does. 800 801 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 802 \prompt{In}{incolor}{56}{\boxspacing} 803 \begin{Verbatim}[commandchars=\\\{\}] 804 \PY{n}{f} \PY{o}{=} \PY{n}{e}\PY{o}{\PYZca{}}\PY{n}{x} 805 \PY{n}{g} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)} 806 \PY{n}{h} \PY{o}{=} \PY{n}{log}\PY{p}{(}\PY{n}{x}\PY{p}{)} 807 808 \PY{n+nb}{print}\PY{p}{(}\PY{n}{f}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} 809 \PY{n+nb}{print}\PY{p}{(}\PY{n}{g}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{7}\PY{p}{)}\PY{p}{)} 810 \PY{n+nb}{print}\PY{p}{(}\PY{n}{h}\PY{o}{.}\PY{n}{series}\PY{p}{(}\PY{n}{x}\PY{o}{==}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} 811 \end{Verbatim} 812 \end{tcolorbox} 813 814 \begin{Verbatim}[commandchars=\\\{\}] 815 1 + 1*x + 1/2*x\^{}2 + Order(x\^{}3) 816 (-2) + 1*x + 1*x\^{}2 + (-1/6)*x\^{}3 + (-1/12)*x\^{}4 + 1/120*x\^{}5 + 1/360*x\^{}6 + 817 Order(x\^{}7) 818 1*(x - 1) + (-1/2)*(x - 1)\^{}2 + Order((x - 1)\^{}3) 819 \end{Verbatim} 820 821 \hypertarget{derivatives}{% 822 \subsection{Derivatives}\label{derivatives}} 823 824 \textbf{References:} 825 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.derivative}{7}{]} 826 and 827 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functional.html\#sage.calculus.functional.derivative}{8}{]} 828 for derivatives, 829 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/functions.html\#sage.calculus.functions.jacobian}{9}{]} 830 for the Jacobian matrix and 831 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/expression.html\#sage.symbolic.expression.Expression.hessian}{10}{]} 832 for the Hessian. 833 834 When computing derivatives, you need to specify with respect to which 835 variables you want to derive, except in case there is only one. 836 837 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 838 \prompt{In}{incolor}{57}{\boxspacing} 839 \begin{Verbatim}[commandchars=\\\{\}] 840 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{y}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 841 \PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{+}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: derivative(f, y)} 842 \PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{+}\PY{l+m+mi}{2}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{p}{)} \PY{p}{)} 843 \end{Verbatim} 844 \end{tcolorbox} 845 846 \begin{Verbatim}[commandchars=\\\{\}] 847 8*y\^{}3 848 6*x\^{}2 - 1 849 \end{Verbatim} 850 851 You can also compute higher order derivatives: 852 853 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 854 \prompt{In}{incolor}{58}{\boxspacing} 855 \begin{Verbatim}[commandchars=\\\{\}] 856 \PY{n+nb}{print}\PY{p}{(} \PY{p}{(}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{)}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Same as (x\PYZca{}3).derivative(x, 2)} 857 858 \PY{n}{f} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{7}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{4}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{+} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{5} \PY{o}{+} \PY{n}{y} \PY{o}{+} \PY{l+m+mi}{2} 859 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{n}{y}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Twice in x, once in y} 860 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{derivative}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{n}{y}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} 4 times in x, twice in y} 861 \end{Verbatim} 862 \end{tcolorbox} 863 864 \begin{Verbatim}[commandchars=\\\{\}] 865 6*x 866 84*x\^{}5*y + 10*y\^{}4 + 24*x\^{}2*y 867 1680*x\^{}3 + 48 868 \end{Verbatim} 869 870 Jacobian and Hessian matrices are also easy to compute: 871 872 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 873 \prompt{In}{incolor}{59}{\boxspacing} 874 \begin{Verbatim}[commandchars=\\\{\}] 875 \PY{n}{f} \PY{o}{=} \PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{p}{,} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3}\PY{p}{,} \PY{n}{x}\PY{o}{+}\PY{n}{y}\PY{o}{+}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{p}{)} 876 \PY{n+nb}{print}\PY{p}{(} \PY{n}{jacobian}\PY{p}{(}\PY{n}{f}\PY{p}{,} \PY{p}{[}\PY{n}{x}\PY{p}{,}\PY{n}{y}\PY{p}{]}\PY{p}{)}\PY{p}{,} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+se}{\PYZbs{}n}\PY{l+s+s2}{\PYZdq{}} \PY{p}{)} 877 878 \PY{n}{g} \PY{o}{=} \PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{y} \PY{o}{+} \PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{3} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{x}\PY{o}{*}\PY{n}{y}\PY{o}{\PYZca{}}\PY{l+m+mi}{2} \PY{o}{\PYZhy{}}\PY{l+m+mi}{3} 879 \PY{n+nb}{print}\PY{p}{(} \PY{n}{g}\PY{o}{.}\PY{n}{hessian}\PY{p}{(}\PY{p}{)} \PY{p}{)} 880 \end{Verbatim} 881 \end{tcolorbox} 882 883 \begin{Verbatim}[commandchars=\\\{\}] 884 [-2*x + 2*y 2*x] 885 [ 0 3*y\^{}2] 886 [ y + 1 x + 1] 887 888 [ 2 -4*y + 1] 889 [ -4*y + 1 -4*x + 6*y] 890 \end{Verbatim} 891 892 \emph{Note:} the notation \texttt{f.jacobian({[}x,y{]})} is also valid, 893 but only if you specify that \texttt{f} is vector by declaring it as 894 \texttt{f\ =\ vector({[}...{]})}. 895 896 \hypertarget{integrals}{% 897 \subsection{Integrals}\label{integrals}} 898 899 \textbf{References:} 900 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/symbolic/integration/integral.html}{11}{]} 901 for symbolic integration and 902 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html}{12}{]} 903 for numerical methods. 904 905 You should remember from high school or from your first 906 calculus/analysis course that derivatives are easy, but integrals are 907 hard. When using a computer software to solve your integrals, you have 908 two choices: 909 910 \begin{enumerate} 911 \def\labelenumi{\arabic{enumi}.} 912 \tightlist 913 \item 914 You can try to compute a primitive function exactly, and then (if you 915 are computing a definite integral) substitute the endpoints of your 916 integration interval to get the result. We can call this 917 \emph{symbolic integration}. 918 \item 919 You can get an \emph{approximated} result with a \emph{numerical 920 method}. This method always gives some kind of result, but it cannot 921 be used to compute indefinite integrals. 922 \end{enumerate} 923 924 Sage can do both of these things, although people that work in numerical 925 analysis and use often the second method tend to prefer other programs, 926 such as Matlab (or its open-source clone Octave). 927 928 \hypertarget{symbolic-integration}{% 929 \subsubsection{Symbolic integration}\label{symbolic-integration}} 930 931 Symbolic integrals work more or less like derivatives. You must specify 932 an integration variable, but the endpoints of the integration interval 933 are optional. If they are not given you get an indefinite integral. 934 935 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 936 \prompt{In}{incolor}{60}{\boxspacing} 937 \begin{Verbatim}[commandchars=\\\{\}] 938 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{a}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{b}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 939 \PY{n}{f} \PY{o}{=} \PY{n}{x} \PY{o}{+} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} 940 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{)} \PY{p}{)} \PY{c+c1}{\PYZsh{} Alternative: integral(f, x)} 941 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,} \PY{l+m+mi}{10}\PY{p}{)} \PY{p}{)} 942 \PY{n+nb}{print}\PY{p}{(} \PY{n}{f}\PY{o}{.}\PY{n}{integral}\PY{p}{(}\PY{n}{x}\PY{p}{,} \PY{n}{a}\PY{p}{,} \PY{n}{b}\PY{p}{)} \PY{p}{)} 943 \end{Verbatim} 944 \end{tcolorbox} 945 946 \begin{Verbatim}[commandchars=\\\{\}] 947 1/2*x\^{}2 - cos(x) 948 0 949 -1/2*a\^{}2 + 1/2*b\^{}2 + cos(a) - cos(b) 950 \end{Verbatim} 951 952 Your endpoints can also be \(\pm\infty\): 953 954 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 955 \prompt{In}{incolor}{61}{\boxspacing} 956 \begin{Verbatim}[commandchars=\\\{\}] 957 \PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)} 958 \PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{n}{infinity}\PY{p}{,} \PY{n}{infinity}\PY{p}{)} \PY{p}{)} 959 \end{Verbatim} 960 \end{tcolorbox} 961 962 \begin{Verbatim}[commandchars=\\\{\}] 963 1 964 sqrt(pi) 965 \end{Verbatim} 966 967 The last function is also an example of an integral that perhaps you 968 might want to compute numerically. In fact: 969 970 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 971 \prompt{In}{incolor}{65}{\boxspacing} 972 \begin{Verbatim}[commandchars=\\\{\}] 973 \PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{)} \PY{p}{)} 974 \PY{n+nb}{print}\PY{p}{(} \PY{n}{integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{p}{)} 975 \end{Verbatim} 976 \end{tcolorbox} 977 978 \begin{Verbatim}[commandchars=\\\{\}] 979 1/2*sqrt(pi)*erf(x) 980 1/2*sqrt(pi)*erf(2) - 1/2*sqrt(pi)*erf(1) 981 \end{Verbatim} 982 983 Here \texttt{erf(x)} denotes the 984 \href{https://en.wikipedia.org/wiki/Error_function}{error function}. 985 986 \hypertarget{numerical-integration}{% 987 \subsubsection{Numerical integration}\label{numerical-integration}} 988 989 In order to get an explicit value for the computations above, we can use 990 a \emph{numerical} method. 991 992 The word ``numerical'' does not have much to do with numbers, but it 993 refers to the fact that we are trying to compute explicit results rather 994 than symbolic or algebraic ones. 995 \href{https://en.wikipedia.org/wiki/Numerical_analysis}{Numerical 996 analysis} is the branch of mathematics that studies methods to 997 approximate computations over the real or complex numbers. With these 998 methods there is usually a trade-off between speed and precision. 999 1000 The Sage function 1001 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.numerical_integral}{\texttt{numerical\_integral()}} 1002 takes as a parameter a real-valued one-variable function and the 1003 integration endpoints, and it returns both an approximate value for the 1004 integral and an error estimate. 1005 1006 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1007 \prompt{In}{incolor}{40}{\boxspacing} 1008 \begin{Verbatim}[commandchars=\\\{\}] 1009 \PY{n}{numerical\PYZus{}integral}\PY{p}{(}\PY{n}{e}\PY{o}{\PYZca{}}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} 1010 \end{Verbatim} 1011 \end{tcolorbox} 1012 1013 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1014 \prompt{Out}{outcolor}{40}{\boxspacing} 1015 \begin{Verbatim}[commandchars=\\\{\}] 1016 (0.13525725794999466, 1.5016572202374808e-15) 1017 \end{Verbatim} 1018 \end{tcolorbox} 1019 1020 The result above means, in symbols \begin{align*} 1021 \int_1^2 e^{-x^2}\mathrm dx = 0.13525725794999466 \pm 1.5016572202374808\times 10^{-15} 1022 \end{align*} 1023 1024 There is also a 1025 \href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/integration.html\#sage.calculus.integration.monte_carlo_integral}{\texttt{monte\_carlo\_integral()}} 1026 method for functions with more than one variable. 1027 1028 \textbf{Exercise.} Compute the area of the ellipse of equation 1029 \(y^2+\left(\frac x3\right)^2=1\). 1030 1031 \hypertarget{differential-equations}{% 1032 \subsection{Differential equations}\label{differential-equations}} 1033 1034 \textbf{Reference:} 1035 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]} 1036 1037 A 1038 \href{https://en.wikipedia.org/wiki/Differential_equation}{differential 1039 equation} is an equation involving an unknwon function and its 1040 derivatives. They can be of two kinds: \emph{ordinary} differential 1041 equations 1042 (\href{https://en.wikipedia.org/wiki/Ordinary_differential_equation}{ODE}) 1043 and \emph{partial} differential equations 1044 (\href{https://en.wikipedia.org/wiki/Partial_differential_equation}{PDE}). 1045 The latter involve multivariate functions and their partial derivatives. 1046 1047 Differential equations are in general hard to solve \emph{exactly} (or 1048 \emph{symbolically}): even a simple equation of the form \(f'(x)=g(x)\), 1049 where \(g(x)\) is someknown function, requires solving the integral 1050 \(\int g(x)\mathrm{d}x\) in order to find \(f\), which as we know is not 1051 always easy! 1052 1053 Theoretical results on differential equations usually ensure the 1054 existence and/or uniquess of a solution under certain conditions, but in 1055 general they do not give a way to solve them. There exits many methods 1056 to find approximate solutions, and some of them are implemented in Sage 1057 as well (see 1058 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/desolvers.html}{13}{]}). 1059 However we will focus on the simple ODEs that can be solved exactly. 1060 1061 Let's start with a simple example. Let's find all functions \(f(x)\) 1062 such that \(f'(x)=f(x)\). In order to do so, we need to use the 1063 \texttt{function()} construct, which allows us to define an ``unknwon'' 1064 function inside Sage, like we define variables with \texttt{var()}. 1065 1066 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1067 \prompt{In}{incolor}{4}{\boxspacing} 1068 \begin{Verbatim}[commandchars=\\\{\}] 1069 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{x}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1070 \PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{f}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1071 \PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)} 1072 \PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{c+c1}{\PYZsh{} f is the unknown function} 1073 \end{Verbatim} 1074 \end{tcolorbox} 1075 1076 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1077 \prompt{Out}{outcolor}{4}{\boxspacing} 1078 \begin{Verbatim}[commandchars=\\\{\}] 1079 \_C*e\^{}x 1080 \end{Verbatim} 1081 \end{tcolorbox} 1082 1083 As you can expect, they are all the functions \(Ce^x\) for some constant 1084 \(C\). The constant \(C\) plays the same role as the constant in the 1085 solution of an integral, but in this case Sage writes it explicitly. 1086 1087 We can also specify \emph{initial conditions} for our function. For 1088 example we can impose that \(f(0)=3\) as follows: 1089 1090 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1091 \prompt{In}{incolor}{5}{\boxspacing} 1092 \begin{Verbatim}[commandchars=\\\{\}] 1093 \PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{3}\PY{p}{)}\PY{p}{)} 1094 \end{Verbatim} 1095 \end{tcolorbox} 1096 1097 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1098 \prompt{Out}{outcolor}{5}{\boxspacing} 1099 \begin{Verbatim}[commandchars=\\\{\}] 1100 3*e\^{}x 1101 \end{Verbatim} 1102 \end{tcolorbox} 1103 1104 You can also solve \emph{second order} equations, that is equations 1105 where the second derivative also appears. In this case if you want to 1106 specify an initial condition you should write the triple of values 1107 \((x_0, f(x_0), f'(x_0))\). 1108 1109 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1110 \prompt{In}{incolor}{6}{\boxspacing} 1111 \begin{Verbatim}[commandchars=\\\{\}] 1112 \PY{n}{equation} \PY{o}{=} \PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{n}{x}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{)} \PY{o}{+} \PY{n}{x}\PY{o}{*}\PY{n}{derivative}\PY{p}{(}\PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{l+m+mi}{1} 1113 \PY{n}{desolve}\PY{p}{(}\PY{n}{equation}\PY{p}{,} \PY{n}{f}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)}\PY{p}{)} 1114 \end{Verbatim} 1115 \end{tcolorbox} 1116 1117 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1118 \prompt{Out}{outcolor}{6}{\boxspacing} 1119 \begin{Verbatim}[commandchars=\\\{\}] 1120 -1/2*I*sqrt(2)*sqrt(pi)*integrate(erf(1/2*I*sqrt(2)*x)*e\^{}(-1/2*x\^{}2), x) 1121 \end{Verbatim} 1122 \end{tcolorbox} 1123 1124 \textbf{Exercise.} Use Sage to find out the functions \(f(x)\) that 1125 satisfy \begin{align*} 1126 \begin{array}{rlcrl} 1127 (A) & 1128 \begin{cases} 1129 f(0) &= 1\\ 1130 f'(0) &= 0\\ 1131 f''(x) &= -f(x) 1132 \end{cases} 1133 & \qquad \qquad & 1134 (B) & 1135 \begin{cases} 1136 f(0) &= 0\\ 1137 f'(0) &= 1\\ 1138 f''(x) &= -f(x) 1139 \end{cases} 1140 \end{array} 1141 \end{align*} 1142 1143 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1144 \prompt{In}{incolor}{ }{\boxspacing} 1145 \begin{Verbatim}[commandchars=\\\{\}] 1146 1147 \end{Verbatim} 1148 \end{tcolorbox} 1149 1150 \hypertarget{a-real-world-example}{% 1151 \subsubsection{A real-world example}\label{a-real-world-example}} 1152 1153 Differential equations have countless applications in Science, so it 1154 would be a shame not to see at least a simple one. 1155 1156 Consider an object moving with constant acceleration \(a\). Its velocity 1157 at time \(t\) is described by the formula \(v(t) = v(0) + at\). For 1158 example an object falling from the sky has acceleration 1159 \(g\sim 9.8 m/s^2\) towards the ground, so its velocity is 1160 \(v(t) = -gt\). 1161 1162 However in the real world you need to take into account the air's 1163 resistance, which depends (among other things) on the velocity of the 1164 object. In this case the acceleration \(a(t)\) is not constant anymore, 1165 and it satisfies an equation of the form \(a(t)=-g -kv(t)\), where \(k\) 1166 is some constant that may depend on the shape and mass of the object (in 1167 practice it may be more complicated than this). 1168 1169 Since the acceleration is the derivative of the velocity, we have a 1170 differential equation \begin{align*} 1171 v'(t) = -g -kv(t) 1172 \end{align*} and we can try to solve it with Sage! 1173 1174 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1175 \prompt{In}{incolor}{7}{\boxspacing} 1176 \begin{Verbatim}[commandchars=\\\{\}] 1177 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1178 \PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1179 \PY{n}{g} \PY{o}{=} \PY{l+m+mf}{9.8} 1180 \PY{n}{k} \PY{o}{=} \PY{l+m+mf}{1.5} 1181 \PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0} 1182 \PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{)} 1183 \end{Verbatim} 1184 \end{tcolorbox} 1185 1186 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1187 \prompt{Out}{outcolor}{7}{\boxspacing} 1188 \begin{Verbatim}[commandchars=\\\{\}] 1189 -98/15*(e\^{}(3/2*t) - 1)*e\^{}(-3/2*t) 1190 \end{Verbatim} 1191 \end{tcolorbox} 1192 1193 If you want to solve this equation symbolically (that is, keeping \(g\) 1194 and \(k\) in symbols) you need to specify that \(t\) is the 1195 \emph{independent variable} of the equation: 1196 1197 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1198 \prompt{In}{incolor}{10}{\boxspacing} 1199 \begin{Verbatim}[commandchars=\\\{\}] 1200 \PY{n}{var}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{t}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{g}\PY{l+s+s1}{\PYZsq{}}\PY{p}{,} \PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{k}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1201 \PY{n}{function}\PY{p}{(}\PY{l+s+s1}{\PYZsq{}}\PY{l+s+s1}{v}\PY{l+s+s1}{\PYZsq{}}\PY{p}{)} 1202 \PY{n}{conditions} \PY{o}{=} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{)} \PY{c+c1}{\PYZsh{} Start with velocity 0} 1203 \PY{n}{desolve}\PY{p}{(}\PY{n}{derivative}\PY{p}{(}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{)} \PY{o}{==} \PY{o}{\PYZhy{}}\PY{n}{g} \PY{o}{\PYZhy{}}\PY{n}{k}\PY{o}{*}\PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{v}\PY{p}{(}\PY{n}{t}\PY{p}{)}\PY{p}{,} \PY{n}{conditions}\PY{p}{,} \PY{n}{ivar}\PY{o}{=}\PY{n}{t}\PY{p}{)} 1204 \end{Verbatim} 1205 \end{tcolorbox} 1206 1207 \begin{tcolorbox}[breakable, size=fbox, boxrule=.5pt, pad at break*=1mm, opacityfill=0] 1208 \prompt{Out}{outcolor}{10}{\boxspacing} 1209 \begin{Verbatim}[commandchars=\\\{\}] 1210 -(g*e\^{}(k*t) - g)*e\^{}(-k*t)/k 1211 \end{Verbatim} 1212 \end{tcolorbox} 1213 1214 \hypertarget{basic-data-analysis-and-visualization}{% 1215 \section{Basic data analysis and 1216 visualization}\label{basic-data-analysis-and-visualization}} 1217 1218 \hypertarget{statistics}{% 1219 \subsection{Statistics}\label{statistics}} 1220 1221 \textbf{References:} 1222 {[}\href{https://doc.sagemath.org/html/en/reference/stats/sage/stats/basic_stats.html}{14}{]} 1223 1224 Sage includes the most basic functions for statistical analysis. 1225 1226 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1227 \prompt{In}{incolor}{20}{\boxspacing} 1228 \begin{Verbatim}[commandchars=\\\{\}] 1229 \PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{6}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{4}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{2}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{4}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{]} 1230 1231 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Values:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{L}\PY{p}{)} 1232 1233 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mean:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mean}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)} 1234 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Median:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{median}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)} 1235 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Mode:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{mode}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)} 1236 1237 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Standard deviation:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{std}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)} 1238 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Variance:}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+se}{\PYZbs{}t}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{variance}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)} 1239 1240 \PY{n+nb}{print}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{Moving average (5):}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{moving\PYZus{}average}\PY{p}{(}\PY{n}{L}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{)} 1241 \end{Verbatim} 1242 \end{tcolorbox} 1243 1244 \begin{Verbatim}[commandchars=\\\{\}] 1245 Values: [1, 2, 3, 3, -6, -2, 4, -1, 0, 2, 3, -4, 0] 1246 Mean: 5/13 1247 Median: 1 1248 Mode: [3] 1249 Standard deviation: 2*sqrt(29/13) 1250 Variance: 116/13 1251 Moving average (5): [3/5, 0, 2/5, -2/5, -1, 3/5, 8/5, 0, 1/5] 1252 \end{Verbatim} 1253 1254 You can also compare your data to a probability distribution, see 1255 \href{https://doc.sagemath.org/html/en/reference/probability/sage/probability/probability_distribution.html}{this 1256 page}. If you need to do more advanced statistics you should consider 1257 using \href{https://www.r-project.org/}{R}; you can also use it inside 1258 Sage. 1259 1260 \hypertarget{plotting}{% 1261 \subsection{Plotting}\label{plotting}} 1262 1263 \textbf{Reference:} 1264 {[}\href{https://doc.sagemath.org/html/en/reference/plotting/index.html}{15}{]}, 1265 more specifically the subsection 1266 {[}\href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html}{16}{]}. 1267 1268 Some Sage objects can be plotted: 1269 1270 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1271 \prompt{In}{incolor}{21}{\boxspacing} 1272 \begin{Verbatim}[commandchars=\\\{\}] 1273 \PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} 1274 \PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{)} 1275 \end{Verbatim} 1276 \end{tcolorbox} 1277 1278 1279 \prompt{Out}{outcolor}{21}{} 1280 1281 \begin{center} 1282 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_75_0.png} 1283 \end{center} 1284 { \hspace*{\fill} \\} 1285 1286 1287 Sage's plotting functions are based on Python's 1288 \href{https://matplotlib.org/}{matplotlib}. 1289 1290 You can give a number of options to adjust the aspect of your plot, see 1291 \href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/plot.html\#sage.plot.plot.plot}{here}. 1292 Let's see some of them: 1293 1294 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1295 \prompt{In}{incolor}{67}{\boxspacing} 1296 \begin{Verbatim}[commandchars=\\\{\}] 1297 \PY{n}{f} \PY{o}{=} \PY{n}{sin}\PY{p}{(}\PY{n}{x}\PY{p}{)} 1298 \PY{n}{plot}\PY{p}{(}\PY{n}{f}\PY{p}{,} 1299 \PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{l+m+mi}{2}\PY{o}{*}\PY{n}{pi}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for x} 1300 \PY{n}{ymin} \PY{o}{=} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.7}\PY{p}{,} \PY{n}{ymax} \PY{o}{=} \PY{l+m+mf}{0.7}\PY{p}{,} \PY{c+c1}{\PYZsh{} bounds for y} 1301 \PY{n}{color} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} 1302 \PY{n}{title} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{The sin function}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} 1303 \PY{p}{)} 1304 \end{Verbatim} 1305 \end{tcolorbox} 1306 1307 1308 \prompt{Out}{outcolor}{67}{} 1309 1310 \begin{center} 1311 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_77_0.png} 1312 \end{center} 1313 { \hspace*{\fill} \\} 1314 1315 1316 Some of the options are not described precisely in Sage's documentation, 1317 but you can find them on 1318 \href{https://matplotlib.org/stable/contents.html}{matplotlib's 1319 documentation}. You can find many examples online for adjusting your 1320 plot as you like! 1321 1322 If you need to plot more than one object at the time, you can sum two 1323 plots and show them together with \texttt{show()}: 1324 1325 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1326 \prompt{In}{incolor}{36}{\boxspacing} 1327 \begin{Verbatim}[commandchars=\\\{\}] 1328 \PY{n}{cosine} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{cos}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{,}\PY{n}{pi}\PY{o}{/}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} 1329 \PY{n}{exponential} \PY{o}{=} \PY{n}{plot}\PY{p}{(}\PY{n}{exp}\PY{p}{(}\PY{n}{x}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{n}{x}\PY{p}{,}\PY{o}{\PYZhy{}}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mf}{0.5}\PY{p}{)}\PY{p}{)} 1330 1331 \PY{n}{show}\PY{p}{(}\PY{n}{cosine} \PY{o}{+} \PY{n}{exponential}\PY{p}{)} 1332 \end{Verbatim} 1333 \end{tcolorbox} 1334 1335 \begin{center} 1336 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_80_0.png} 1337 \end{center} 1338 { \hspace*{\fill} \\} 1339 1340 Finally, there are other types of plots that you can use, like 1341 \href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/scatter_plot.html\#sage.plot.scatter_plot.scatter_plot}{scatter 1342 plots} and 1343 \href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/bar_chart.html\#sage.plot.bar_chart.bar_chart}{bar 1344 charts}. You can also add 1345 \href{https://doc.sagemath.org/html/en/reference/plotting/sage/plot/text.html\#sage.plot.text.text}{text} 1346 to your plot: 1347 1348 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1349 \prompt{In}{incolor}{53}{\boxspacing} 1350 \begin{Verbatim}[commandchars=\\\{\}] 1351 \PY{n}{b} \PY{o}{=} \PY{n}{bar\PYZus{}chart}\PY{p}{(}\PY{n+nb}{range}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{)} 1352 \PY{n}{s} \PY{o}{=} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{p}{[}\PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{8}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{4}\PY{p}{,}\PY{l+m+mi}{7}\PY{p}{)}\PY{p}{]}\PY{p}{,} 1353 \PY{n}{marker} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{*}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{c+c1}{\PYZsh{} symbol} 1354 \PY{n}{markersize} \PY{o}{=} \PY{l+m+mi}{100}\PY{p}{,} 1355 \PY{n}{edgecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} 1356 \PY{n}{facecolor} \PY{o}{=} \PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}} 1357 \PY{p}{)} 1358 \PY{n}{t} \PY{o}{=} \PY{n}{text}\PY{p}{(}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{wow, such plot!}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{,} \PY{n}{fontsize}\PY{o}{=}\PY{l+m+mi}{20}\PY{p}{)} 1359 \PY{n}{show}\PY{p}{(}\PY{n}{b} \PY{o}{+} \PY{n}{s} \PY{o}{+} \PY{n}{t}\PY{p}{)} 1360 \end{Verbatim} 1361 \end{tcolorbox} 1362 1363 \begin{center} 1364 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_82_0.png} 1365 \end{center} 1366 { \hspace*{\fill} \\} 1367 1368 \hypertarget{interpolation}{% 1369 \subsection{Interpolation}\label{interpolation}} 1370 1371 \textbf{References:} 1372 {[}\href{https://doc.sagemath.org/html/en/reference/polynomial_rings/sage/rings/polynomial/polynomial_ring.html\#sage.rings.polynomial.polynomial_ring.PolynomialRing_field.lagrange_polynomial}{17}{]} 1373 and 1374 {[}\href{https://doc.sagemath.org/html/en/reference/calculus/sage/calculus/interpolation.html}{18}{]}. 1375 1376 When you need to work with a discrete set of data, like measurements of 1377 real-world quantities, it can be useful to visualize a ``smoothed out'' 1378 version of this data, for example by plotting a function that 1379 approximates it. 1380 1381 One way to do so is finding the lowest-degree polynomial that passes 1382 through all your points. This is called 1383 \href{https://en.wikipedia.org/wiki/Lagrange_polynomial}{Lagrange 1384 Polynomial}. 1385 1386 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1387 \prompt{In}{incolor}{65}{\boxspacing} 1388 \begin{Verbatim}[commandchars=\\\{\}] 1389 \PY{n}{points} \PY{o}{=} \PY{p}{[} \PY{p}{(}\PY{l+m+mi}{0}\PY{p}{,}\PY{l+m+mi}{1}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{2}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mf}{1.5}\PY{p}{,}\PY{l+m+mi}{0}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{2}\PY{p}{,}\PY{l+m+mi}{4}\PY{p}{)}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{3}\PY{p}{,}\PY{l+m+mi}{5}\PY{p}{)} \PY{p}{]} 1390 \PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{QQ}\PY{p}{[}\PY{p}{]} \PY{c+c1}{\PYZsh{} you need to specify a polynomial ring} 1391 \PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} 1392 \PY{n}{show}\PY{p}{(}\PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{,} \PY{n}{facecolor}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{red}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} 1393 \PY{o}{+} \PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{l+m+mi}{0}\PY{p}{,} \PY{l+m+mi}{3}\PY{p}{)} \PY{c+c1}{\PYZsh{} slightly different notation for polynomials} 1394 \PY{o}{+} \PY{n}{text}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{p}{(}\PY{l+m+mi}{1}\PY{p}{,}\PY{l+m+mi}{8}\PY{p}{)}\PY{p}{,} \PY{n}{color}\PY{o}{=}\PY{l+s+s2}{\PYZdq{}}\PY{l+s+s2}{black}\PY{l+s+s2}{\PYZdq{}}\PY{p}{)} 1395 \PY{p}{)} 1396 \end{Verbatim} 1397 \end{tcolorbox} 1398 1399 \begin{center} 1400 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_84_0.png} 1401 \end{center} 1402 { \hspace*{\fill} \\} 1403 1404 One can compute the Lagrange Polynomial over any base ring, and it has 1405 the advantage that it is a very ``nice'' function (continuous and 1406 differentiable as much as you like, with easily computable derivatives 1407 and primitives). 1408 1409 However, it does not always give you good approximation of your data: 1410 1411 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1412 \prompt{In}{incolor}{2}{\boxspacing} 1413 \begin{Verbatim}[commandchars=\\\{\}] 1414 \PY{n}{R} \PY{o}{=} \PY{p}{[}\PY{n}{x}\PY{o}{/}\PY{l+m+mi}{10} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{o}{\PYZhy{}}\PY{l+m+mi}{10}\PY{p}{,}\PY{l+m+mi}{10}\PY{p}{)}\PY{p}{]} 1415 \PY{n}{L} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{1}\PY{o}{/}\PY{p}{(}\PY{l+m+mi}{1}\PY{o}{+}\PY{l+m+mi}{25}\PY{o}{*}\PY{n}{x}\PY{o}{\PYZca{}}\PY{l+m+mi}{2}\PY{p}{)} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n}{R}\PY{p}{]} 1416 \PY{n}{points} \PY{o}{=} \PY{p}{[}\PY{p}{(}\PY{n}{R}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{,} \PY{n}{L}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{)} \PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n+nb}{len}\PY{p}{(}\PY{n}{L}\PY{p}{)}\PY{p}{)}\PY{p}{]} 1417 \PY{n}{polring}\PY{o}{.}\PY{o}{\PYZlt{}}\PY{n}{x}\PY{o}{\PYZgt{}} \PY{o}{=} \PY{n}{RR}\PY{p}{[}\PY{p}{]} 1418 \PY{n}{lp} \PY{o}{=} \PY{n}{polring}\PY{o}{.}\PY{n}{lagrange\PYZus{}polynomial}\PY{p}{(}\PY{n}{points}\PY{p}{)} 1419 1420 \PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{lp}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mf}{0.82}\PY{p}{,} \PY{l+m+mf}{0.72}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)} 1421 \end{Verbatim} 1422 \end{tcolorbox} 1423 1424 \begin{center} 1425 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_86_0.png} 1426 \end{center} 1427 { \hspace*{\fill} \\} 1428 1429 This particular example is called 1430 \href{https://en.wikipedia.org/wiki/Runge\%27s_phenomenon}{Runge's 1431 phenomenon}. For a better approximation you can use a 1432 \href{https://en.wikipedia.org/wiki/Spline_(mathematics)}{spline}, which 1433 is a \emph{piecewise} polynomial function: 1434 1435 \begin{tcolorbox}[breakable, size=fbox, boxrule=1pt, pad at break*=1mm,colback=cellbackground, colframe=cellborder] 1436 \prompt{In}{incolor}{90}{\boxspacing} 1437 \begin{Verbatim}[commandchars=\\\{\}] 1438 \PY{n}{show}\PY{p}{(}\PY{n}{plot}\PY{p}{(}\PY{n}{spline}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{,} \PY{o}{\PYZhy{}}\PY{l+m+mi}{1}\PY{p}{,} \PY{l+m+mi}{1}\PY{p}{)} \PY{o}{+} \PY{n}{scatter\PYZus{}plot}\PY{p}{(}\PY{n}{points}\PY{p}{)}\PY{p}{)} 1439 \end{Verbatim} 1440 \end{tcolorbox} 1441 1442 \begin{center} 1443 \adjustimage{max size={0.9\linewidth}{0.9\paperheight}}{output_88_0.png} 1444 \end{center} 1445 { \hspace*{\fill} \\} 1446 1447 A detailed explanation of splines is a good topic for a course of 1448 numerical analysis. For this course it is enough that you know that they 1449 exist and they can be plotted. 1450 1451 1452 % Add a bibliography block to the postdoc 1453 1454 1455 1456 \end{document}