<?xml version="1.0" encoding="UTF-8"?>
<Worksheet><Version major="6" minor="1"/><View-Properties><Hide name="Section Range"/><Hide name="Group Range"/><Zoom percentage="100"/></View-Properties><Styles><Layout alignment="centred" bullet="none" linespacing="0.0" name="Author" spaceabove="8.0" spacebelow="8.0"/><Layout alignment="left" bullet="none" firstindent="0.0" leftmargin="0.0" linebreak="space" linespacing="0.0" name="Heading 1" rightmargin="0.0" spaceabove="7.9992003" spacebelow="4.0032"/><Layout alignment="left" firstindent="0.0" leftmargin="0.0" linebreak="space" linespacing="0.0" name="Normal" rightmargin="0.0" spaceabove="0.0" spacebelow="0.0"/><Layout alignment="centred" bullet="none" name="Maple Plot"/><Layout alignment="centred" bullet="none" firstindent="0.0" leftmargin="0.0" linebreak="space" linespacing="0.0" name="Title" rightmargin="0.0" spaceabove="12.0024" spacebelow="12.0024"/><Font background="[0,0,0]" bold="true" executable="true" family="Monospaced" foreground="[255,0,0]" name="Maple Input" opaque="false" size="12"/><Font background="[0,0,0]" family="Serif" foreground="[0,128,128]" hyperlink="true" name="Hyperlink" opaque="false" size="12" underline="true"/><Font background="[0,0,0]" bold="false" executable="false" family="Times New Roman" foreground="[0,0,0]" italic="false" name="Text" opaque="false" size="12" subscript="false" superscript="false" underline="false"/><Font background="[0,0,0]" executable="false" family="Times New Roman" foreground="[0,0,0]" name="2D Math" opaque="false" size="12"/><Font background="[0,0,0]" bold="true" family="Arial" foreground="[0,0,0]" italic="false" name="Heading 1" opaque="false" size="18" subscript="false" superscript="false" underline="false"/><Font background="[0,0,0]" family="Times New Roman" name="Author" opaque="false" size="12"/><Font background="[0,0,0]" bold="true" family="Arial" foreground="[0,0,0]" italic="false" name="Title" opaque="false" size="36" subscript="false" superscript="false" underline="false"/><Font background="[0,0,0]" bold="false" family="Times New Roman" foreground="[0,0,0]" italic="false" name="Normal" opaque="false" size="12" underline="false"/></Styles><Group><Input><Text-field layout="Title" style="Title"><Image height="78" width="800">TUZOV3RLVWI8b2I8Uj1NRExDZE5WWlpKOnROPkg6eFhWRXJwczo7Qk5TRE9FVGxNWGxnd2dpVzttRFtVVVVXVXNLaXRVZl1XZnZfaXZtaXhvWUtFVmNzSXl1eXZheXZVSXZfaW9peG9PV2tneHdpeXdPdmVDSHdnSXhpSXhteXFBWXNdSXdnWXRVaXVJWHBDSUZpU0lhQkFBc2E7R2JZeXZjaXhxeXhlWXdleXVZeXVXZE1XVHVVWXV5eXl5QTs6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpaamlmRHFFdGtdYE5cXEBOZFxcUWdxeEhgandoU1dEUVZ5UHhQTEFJWFVgd3l5eVNVdW5gcltETlpdV21ValB1SlpdWV9sU0xxcVdpb1N4d3d0TEVRbEBVTkdpT0NAWHlRalhMWWJJdk48eHdhTG5BdD11T1pkUW5BdEU8U0lkUW5RSkxZUklkcTpgeEpZcnlxSkJoeU5Gdkw/Xl5Zb09BW3lZZWxvZmlHYnQ/d1t3W1BoZEs/Z1NPXkRHcExZZUpwXXQ/ZmpIb1xcSV86eW87SF1cXGBcXDpHb0RGXWBocUVodD13W0ZfYWxTPXdVVG9UdE9IUHdDYm9yWVt3Oj1FcFlkUllyWU1DaEtkRT9CRG1pZEtHPVFzQ19ZUm1IblFCTFlyP1FlRV9YX2tyaWdlOltpQlljZl9ERGFHZVNzXFxlVFBPYl93WXJ3c1hpcmRJdmlHYk53R107VFllVEttZ3l3dkpHQnN5Q3ldVmxtRmV5RVF3Y1g9amp5eDpgc1FNUF5cXFlQaG9fVGs+eE1zbXRzSVBNaEttWUx3TVh3SVdYcU14cVBJVWtFUVQ/bW9EaHRIRW9fbFlAbVFIUXBaRHlMVXJZSHBuPHlSdXRuSFV2PGxweEtZUFd3SVhSX3BgSWBwWGZXT3l5PmVNeV9KV3U9cWFSPnBwVnhPXmZ1bnI/R2BIdl5RaWFddnV1b2NKcHdVUWRUZ2RgX21leF1UdmZcXHhmcmhkYlh2cEllX0hzW0lpSD5uVW9udkBiS3BpWkh0WGBpYmhmS09gSkZkUFBrSXF2eV5xPD9tQHZ1dkFba2BmRGhia1lkTnF4al9jPl9mT2Z2X3dkeF5fRT91WVh5UUBvbEZxWUlmO19lXUl5UFZxbm9zZlB5SkFePWFzdXFbamBaUj9rRV55akh0SFFnT0h4U25cXHdZb0loYFRZXFxGZ2BSeGBJcVtWd3E6QF1UeXliUXh2QF1rPmtpdmRhWVxcdWlcXGRXaXJuW1BxclRncFBZYnhedHZGZmtXWmJpaGxZYT5eYktAd1R3c1Fodk95YkA/XWdxaHdvbW5nXz5vZz0+d3BHYXJBY11oaWJBeVhAZUxvZ1FuaGx5a0Q/czxfY1xcPmJAUXV2QV5reG1ecHBBWHZqVlpzRl5BRm9eX25WVmZsaXhyaWZoYXFpP2JISVxcSmZfXU9dc15gbHlzc0FzcF9iPUlaXWFrZFBtSm5pQXZeUG5hTkF3OkdpPlZxbWZ2Ukl1eUZfW05tcFFqYz9wSXFeUFdqaUZkVVlyYz5nbFBxaFBbQj9qTE5xS0F3eXhuVmhxXFxhallRXlpGVlF4az9lO19mQFViSVNzPz9UPGFCdz1mS11VeVl5W29SQU15Uj1Id2l3RVVIZm1SUFN0eV1Uc1N0YkFIeFN1WU1zXnlHS1V1PUlCPVF4ZW1VQT1ycndJO2FJWD1CSj9iXnNzW19UWEVZVENlRWt1R2dDTmdlRUtZOnl4RUtCTFdibXVCSGt2ak9ndmFjSV9XPV9kR2t0UmVnWXdyXVdGUT95VEtCQlV3SVtIVFlyQnlHanlGXFxXYndndnddU3hhd2FhV3M7eUF3VENBU155eGQ/WGQ9c0JneVJhRFc9RGpzVDo9aFxcS2dtTUdbYXZcXEtkXXNUSkVjdltkVjtmdmNoO3dTOl9Ea1l1XVF3T0NkTztzZz15b2V5dFNHYGtJbXNGeW9nXj94RU9CTENGVmlESWdJQEd5XW90XmlyUDtISz9oWk9zamdTXFxvSD9FVVN1REdNVUF1RkpJSGlfRktTV1V3UlRbaG89U3VjY147SXNfVlRVRT1JQ29TSXN3Q1dxUlpRRzxfaVVhY3JDZWhPY2FJUld1c3BxUmZZVEBjY2ZNdWhzeUNXclltSVBLSWJRaGRDZWhxeFxcc3Q/XURHXUVxTUlGWWZXXXJnVUNicXZJR1Nnb2ZMV2dgYUhKS2RsdUVxRWV1PWl4a3dRU3RyU1d0V2djZ3dKU0lHa3Veb3hnS1Z5UVdaRXReZ0JlS0daS3hjZWQ9SWRUT2hKRWZSW3hyTUJrS2debUdKXUhjW3RyT1Q6X1I/ZUZkX0ZWQ1haQ0Q/UUNxU1hdWWV0R0Y8RXVRZVVmY0NMTWhqR3ZWS3NfU1RrVXdeXUNFVUVsW2Y8P2hORXdkb0g/TVdmXUZiZXNQS1Vda2dIXWJTRVM7UVZWP2hIcWRUPWNlP2JwX2g9R0d1cUdEW3lAU1U9SUZLRXhFZVVXQWhOTVhed2RSWUZJTWV2S2VIWVdTc0NsW0hHYXVbQUVaaVJfaVRKVURTXVlja1hzb1Y+XUdCcWJAO1ZNPURsdVZIZ1Z1UWVEcXhMVUVdXVdTQVJfb0I/b3hMZ3I9PXZxa1I/TWNQQUVHXVdCS1ZQW0hWT0k+SXJFdUJrVWNxU2NrQ3dwc0ZvX1JjP2VCW2hoQ1hZU3JGQ2hWQVN0W1VVV1dzXWNlWUJoeUQ+YVVUTVdaO3ZEb1I8TWlnUUR1X1R0Q1V1UWVUcVhMT0k+UVZfQ2lJXXdfQ3J1RUhvc1J3b0ZmP0VjUWlKP2JoPHJUdVhbWG0+UU4/WXROZHBQUU1TeFVNPExxPXFASU5CQUtFVEpCaHhTdExzRXE6XFxWbVlNY0VKdkxNYFxcam9BV0tsdkxgb1RFeGJxUmBgdVJxSzs9UFg8TEF1c0NoTz9AbU5FamVhUF1JU1docEB5V2xcXFdjPXk8UWxQWEpRdVN3bFc9eHRZeXZKSE9UdEs7VFc+bE9JRE9EVEpaeU5vVVBSTHhIbHdQZWxLeFQ7dG9SRXZcXEFsY11rYnBwZmB5b2x5dlB2T01reERLPl11XFxFVkNdTkFhbkFZYz1GXktfdWRnZFtRXlZpXkRyPlt0Uj1IXFxhR18/R1RbcnRTcnVbWEJ1R0RzVUthZz9RVUVHRUtDaWdjR01lWW9HQjxVUkJJYltlYnZZRkFLYkd5R0s9Q01RQ1FdQ15bVWtVVEZjWFZFaD1dZzxbVkRvQkFJZ095WENnc1FzZGBDRmM9dWpRSEtdWWM7eE9PaUBZeGxPRlhFYnhPR2VDczxraGFJUlZJZ09tcz1lVE9JeVB5cmZ5QnRxdFZ1eVJFeTpvclBjZVxcSWdxa2JWTVVaQVg+c0hzVXVPa1lxQWdDPXN5b1lBc3ZgS0NoQVheV1JdX3h2Y0Zfa1JnQWNeSWNQW1NJX0RbVWY9TWVyb2ZjUUdvWUJmY2NhW1RpRVR2YWU7PUhHY3RhcXZ1V0hkO0liQWlKRVlkeXRHP2hCb3JkVVRYV0M7ZWJjaXNMW1V4WURDW2drUXJITWdIcWVibXJpa3ZqP0hyU2lQeXJja3hrQ3dRQURDb0llRXZiVWJHQWJvUWhYRWhbO2RcXEtISG1iX09GdFd1X3liX1VjUk90bndiUVVIakV1TD1VcF9SYj1VWUFnVU1FPmdDQWdDaXlTRW9zRVFVR3FkV01XcT1jP0VyS01XSUdGd09DZUd3Xz9jQFlCTT1zYFFlcz9VYEd2RElHdV1EaF9VXFxhRUNRQ2tpZ2BLWV5JZDxVckZTR2RpZENRZD93dmpzZ2pvY2Bhdj9BQlVjQ3FrRGJnVVFtWWRXVHlVSElFSV4/dk89eHJJWUBfSVhLeHlleTpXeV1ZUnJ1eERpR2lTdj91aUhHYlZRbDpES1tIbXJwUEhQcV5QbEVcXGtBTWt2bUxMeWxGQW9rbGpjZXY9bHFpPFlXdFJMZXdxSVFQXW51VGpTcXZvXXhndHI6YFREZW9zYHFzWG9VdHNePFFWQUtkPWxIRXdSUU9WWXFFeVRvYFk6YVlOUEtoXFxWPkFzTlF4O1R4cmRXXllKXnRqYVxcdkhkbmxVa1Jla29ZSnZYT1Zlc09xbFVNTkBtUG5VUG9YbVRAanRtVWRwS29IeGhtdUQ9UUhld2tcXG5CbE9odXFXWG93eXM8XFxWUGRrWkFKZ0VSb2BSQGV2W2V2cFRxYGFTeDxOVUF2eVVyYV1udnRSaUh1QlRRSVRzXFxxVlxceUxsXXJhWHRcXEBQQ0hTQHRyO1xcWG1EUztYbUZwVlJ5WHVIaklNS0JgbVppdlc9TkhUU0FcXHNycHRnTW1JQU5xZXVZQHFKTU9GaHJ4RUxpXXZvbXJQQGtnXVRFTVNORVhyZWxteXJveGtVXFxZeU1sbT1LYEF2dmFYV21LUXFtQTxRVElVXklRaG13XklZSFFxXlxcc1dsbEVdc2tscz1RWXdBUnRwVVBIVldpbj5US3llcWBETGtZUEQ9Vll4T1VpdTxRVG89dT1QVWNZWEx5a0VNbUJIWXd1T1Nkc211dV9kUm1dV2xwTElcXHhLbHF5QEteQU86SUpcXGFvO1lzZEh4UkhwT0B5REBMP0lwTHhyZFVwX0h2Y3B2Z111RVFWS1h3dmRucGBWTnFWVkB0W2xMX2lvO3FPSVVOd0xTZmlKOm10PnlWVHFOZ01Wb2FvUF1STmlWRFFPYEBWRGlzZEh5d3RZO0BWZnRMcVlsc3RyRTx2aG1yQmltVU1yPkVrSkF1R3h2WWlZSm1XeHhZcWRqR3hLbF1UQFFQVllPWWBMSmBtYGFqTlxcTUJNVlFteXNMTkRZc3E8b3BZeVNEbWBBdlBAcUJIbFBpT1xcQXg8cW9cXEBZZVhyU0hQUkBWZVlWR0FTcnhRWllQR3R0c1BrXWVMRWhXbzxQR0FQP1F4WkxYWDx1Y01TXFxsSnlkU1NNd0dAa1FMdmpBTVdUeVV0b3hVTGtVUFhUdTxQUVxcaHNhUGtkUEtOaHVIZGtBdHVDUVBaUU1LRFN2UVZQWXlwTFJUeHlNVFBWTVVVaHFzbW1EcG5jWWxYPU5xbHFreFJwZFBPZWtSeE1wQGtTbFVdSFc7eHQ/PVNfTG09QXRuYExxVVFFRVZCQVdCVW5uPXRCTFh4cHRGYE5TQVRkVU5HSFRFPFdOSU5QeFdOSVJHZXdKVE53SHU9TVlWQHVFQEs8TU1fZVNHRWtfRFBAYVZAbWxAPUxcXEV1Q1B2Y3l3U3BrYUB1W3RRaERwPGVTQEF2bUBVXFxNdj1BUVpEVztNTXdVa1E9bT1hVE1BWV1Mb3V1UzpNTlxceVBzXFxRWG1QVkl3dnFKb1BNVElwckFzXlFSdmxzU110TmRLQ0VsP3hUd21uW3Byal1XTXhLT0ROSUlMXkBzbjxZZkVrWEhRTmRRTXRXTGFQTVFMcVVUP015WnRXVGFSQ1Vsa0BYO0BtV2RLP21uVkRsRkB4dnRMVlFRc0ltXlRXczxvWD1LYUV1RWhZRUx0YF1RckB5VEhYUnR4Qlh1dkRyWmR0Xk1uVkhYSWFSeHFMS0xTR0FTTUh3XUBqZHlyTlRNPT1zZV1yYF1vRzxLXFw9VlBgWUtEalh1VHVJakVAd0NRU3hkTV5Ad1BQUz1Nc2I9az5MT1tcXG87dHNtXVVDSUxkRVZqPFM7UFRFaU5VTVZNbW9QdUpHTFRIVE5HcFhLUEtnRHBKbFVUSEtzdW88UGNKbl9jeHBARndhZ1pOWV9XcGVNYHFBV2ddaFxcZklzQWBiWl5hdGl0dXdgPkFpYXloW1ByRVFpZ3BiTU93eXZhSnZ4OkhnYllnO1htPE9yTW9nZFB3XFw+Xj8/a05GYVZYcUdQXmR5WndGcldHeEtuW2tmZ0w+YEdZblBZa2R3YktxYllYcHBoaE9Hcz55W1tGc3VWXUF2Okd1VktHWD9ydG1iVT1VQXlCWFFWSU93RHFFS0lFc29lOmFkXWtYSmF2UkdkZFtCd01jdUVZXFxlRURleF1bZHhPZV1BdVJJZEJLdlNbRD5DWGdBVkhdQndVVUdzQllpeEJ5ZlZ3dnJrU2FdQm1HV2djZnFfaWw7aGdpZzxBUnVhckh1aE5RZHFrSGtLV3FBZHBFY0dvR0NNSV5pd2FXY1d5RlNtU2xxc0lfV21nR2NxZVZpc21xYm9XaFlXR2RXU0ZHQ253dmtPSD9rRlBDc2pvaGFhRG95Z0I7Y2VzUlI9SFBBY0FbaXZhck5nckdReWY7Y2VbY1NhYj5vRjxlWEpdYkE/cmdJVUpLZXRtc2NxQ3FFVUxtVTxNZmVRd3J5dEtzWHRzdmd3ZlI9c3NlZV1lVnI9aVhnVHVzUkVLSXJhd1ZhZXNvRFtdeXFBZ1Q9VkU7WHdnVFg7Q3NpY21zaFpJeWhddGY7RD5hZ1lrU1o7Y0VlZU9VYnBnQktdQ15jY2g9WFtXY3c/VEtdRF9rd1pjcl5hSU1haXZdZ0M/dVJbaUFlR249Z1dJUkRZeGFBZ0x5aVVbY29zZlRNc2BXSEVDZVdpaFpTaVtTU0g/dkRdQ0NTeUpTZUxhd3A9ZEJfeE9PeEtxZ0BjeV4/YmJfd0pTQ2BVWVRbYk5FR2RdSFppSU9BYlZPckplRWNLSWo/Rm5hV2dBZWxTQ0FfV0tddFxcQVVBcVNNTURoU1ZSZ2VwP0JGTXVda1JEa3ZPS3dgXWl5XVNzQXhuVXQ+U2ZpO0lXdXV1R2V2PXJoV2RAcWdnWUZIdWNyPWZmb3ZMUUJfW2U+PWllQXdqQWRcXGloRFV0T1NIRmVXXndpQWVXbk1DY3NYc21oXW94Qz9nXz9mWWdybnNTdmd1dU1iW0lmP0NmYG1SUEV2WXVzbDtYUT1TcW1EUkFzdWN0UEd2c2d4SGdCS3VpXFw7RnZdR0xBRF5bQ29NRT4/U09XVWlnVEtVWVRZRFRjSVZDR3Q7YEZPXVVma1dWXkd3a2FXYHVma0tQWnQ/XFxEd15vT19cXF5pd0Bibl9tdk5eXT92S3FjYHZgdFZzPEB5Zk5fZWBcXER2c0ZnYGlZY0xIdHdfYkt3WmteaEtWbmhWZm1nXFxzSXdRUGZBR2BQbmh1aWtqd3c9YXRYUGJkd2VOQGpOV3VHYGFnaWJeVmlZZmVhUGlyP2c7X1s9T3I6eFxcdnFpPWlxWmlaVHZrQGFmWHZwZHFsU1dcXGlweWRhcllHXFxKRm09WV94Z2U/X1pCcWNESF9Od3JOWHhrUG49V1tsWW49YV89SFpbaW4/UG5BYXlUP3l4dmlpeGJoWHI7aWdkSGlvb1FdZURXZmJpRkBTeD1jdHZ3dVtRV0lpSV5zRV1XclBbRWJNdWdXUm5zQmRbeVJbZD9ZVT1NeWJjaGFkcVI9bG9NdndEU1dZUFd4UlxcPUxPZFdqPExJbXVMXXc8WE5BRVJPaHdLSEx4bUtmdFN4WVVmPEtFTXh4dExObFlLeHI+dVF0cFRWWVV0XFxtdWRUYVxcdF1lblpEUXBgWWtxU0lAb11xT3BgbG9dUEN4eHhBa3J4eF9Ec1RJbVFIU2F5VGhhUkVcXEpMdHB0cVJBdVF5WE9OZFV5VU47YXhbTVdzeHhOPXQ/PUpfeVU/UEs/UXg6SG5fWU5rPFNMSXlcXFVVRFlPaGh2Ok11Zm1Na0lPclVKcVhzbERyVUB3WXFRRWhMS0FrW1hua3F2X114Y1VLbD1UYUVuVUVOUG12SGlwVnBTSFl0Y1BRS3hUSVV3YFhYZUFxW2lYeWhxWGRXXXF1U2xrdVVOVFF3W2h5V2FsUkVTUWhLdWRNUHVSTkhRVlRwWjxWQUhuc0hsWXh2Xm1tVkhKdERZb1R3XWF0XFxYWF5ZeTxMakpga1ZAb110Uz1YSnFNUV1FcHFgc1ZJSl5wV3RQS2NMbWtkTklodVo9V1l5dmhUTnJwVFBpTXdUUWFxcVpFUm5YamU9bklgVXg9cFB1dHRdWF5Ad0dVS0x4als9cUpRblldVk1MVUZNcnFgd0lEc1hoUGNAUVxcQXlydFR1SE49SWtmZFVlcU9bbExxUXBIdHY9cUo+cU5ObVJVVUxeXXdSVExEQHFdYHNXaHhrVEs8aE5eZHJ4UW1rQVJGUXJWQXBKWFlybExXaFZLcXNgcHhSTFR3dVFqZHFmPHdSPWxPbXVfXU5cXGFYQ2lzZ21KdERYc2RVdFVMPFBrYFhwXjxVUlB1RVxcVHlAVUdES1hNS2xRTTpwdDxgbkh5dmc8a0V5bl5sVkZJUT5xUG51d0JleXJ1VG1IWW1YSl91ckRwS3FJUnBQTEx4UlZdSnRMU2t1anhtb2tFbHhNdXhBWE5ZV2NoUD1oUlh4VWpwdnFxbkdFbnY9WWpRclpUUF5lcFRxamFcXFBGRFludWNTUGRpZmxWZ1tqd1tId1xcal5fb3d1VlBkZmdfQ1ZnZFhuSGhoa1F3TVZzaGdaVHhvbFliaGBvakhxd19gZVhaXFw+d1hPbmVgbT9nb0xfd09uYEJ3YGFfdmZ5eVhHdUpHdWdmc29gbWdpdnRIbVheY1NwbVFhZlxcXl1ueWg9b1p4X3dQWG5PaXRyaWI6WHdZT2hwV3ldcWRsV3Z1YGNYPl1KZ3NtPnRkcXNzbl9GP2FuZnlOaFpLZ2dcXE5nRHlwO0FoOl9saEFzW3Z0REZcXE13aFxcZ3dCQWxbeWJNWF4/V2VdWWRFblp3aHk6UXc+YXV0QF9sT2w6PmhmZ2FveHVGUWJLbmJZSHBIUW9id15DX25XQHFEbnBjUXFFR2F3VlxcYEBybnBjbGhjaz5eWEdkTkBxZEF1W0ZmVUledV9cXDpgcWZ2cT9fc29HXFxVZ3VBQVxcQW5da1BsRk5kQkBzS1ZwZE50SF5nQWZvaXBkYUdkRUdsUHdiSlB0W09zUW5eVU5gbUZaWnZsbm9iPnlnTF53V1ltXFxWaGVWZU1HalBockpIZW5JYnBAeFxcd2VdWG9jYGBocGVgeHA6dnVYd2VNWWdbUHFUcG5pSGBvb1tKZ110P3NpQGBwdm9mSXRzblxcXklkYG92VmFnQXFsYUl4VkBdalZdZHZhUUZhbF9oYm93QU94RGBfYVlqSmhsb3FrV1lsSl5mQWZiaT5sTVBgUU5mW2dyWD5yQF9uSF9qX2FeVE52b3hpSlZyc15ldVBjb0BcXFFPW09fcEU+Z1lQbUBfbW9QXlVRX0JwZkVOY0hgak1uWmlZdG14YFZPZ3h2XFxmT3Fob2RAeW9XQW9ITmteV2JDWWRzT2hyeWdKbmRLdnFWWGJSQF1pPmpBSHlXXl1oP11meGdDSWNObl1Jb15sTndIRmY+QGdZQWtRVmNEQGlCP1xcVUdyVFZeaGZqRGlmZ155dEF5SXZcXFFgbXlWeGB2X0RRWlxcSHh0YF5RcV9zUW1AaGRDbnRUQGM9eGZnQGBVWW9cXFl4eGZwZ1lqSElgZGdnWW9fcWB0aEleV2BhPUdyQmhlVVZvUHdraHh5ZEdaU15ucD95Rl5tR2hodmhdVElePHFod3FeSEZcXHNRcFZHdG9vW0dhYklWXFxmQGZCeXdDP2pPd29HRlxcY0Z5cW5tbU5oZXduOndrZnhvYU9pcGhvOndfXnddR1hpQF54aVFlcUZpT25fZ0Feb1ZwVVluPE54RWdsP0lpZ2lgWlFobEd1V292QV94bmFcXFhOczp5Yl9QcHJYXkdpdjtGaHF4ZzxJdGVeZERGYWpIZlN2b1FZaT9XeFpQZGNJX05HbT1pWl5JdmA+ZFk/cD1xaG1QcD0+XU9gYklRd05nZWxRZD9WYllAaV9PYFxcSWJESWVaZnJtcGJsdmxaZlp5XnN2bnNuSWhtTmhbYXBqVmJtVmZVZlpbQXQ9YGZCZ3ZLZmdXeGtiP2Nmb2pkR3ZyaGlMZnZgWV9DX2RpcGdYd29DWHRzSGxcXG5dTlBabU9geVdcXGVeaFRfeERGbGhgW1BJXlpucFdwbURnWj1fY0dmY2NWdlpubkpZa1ZvZmdeaGxXdz5wYVxcYGxNcGZIUGpDUGo+R2ZuT2BUPmljdl1bZmpAdmt0UHJvbnltUFRnZGJQcD55TmRUbnBkb3JRbVRheTpEb0N4cmBpUD5RTGNoTkBEWERUcnlYeUldakc8dUVoTEBUdUE9bGV5T2ZcXFhyUHRacE9pbVlpcVFnUXJxWHZybFdxdXF0TFB2UXlwXXI/UVlOdXJgdU5XZVJgeHFeSGpGaXBnVVlYRHNBWXhOVHJtQE9KcVBJWW46ZW9GTVhZRXRjTFBScUxHSHdLbG5hVU1wSG9jTXdOPXlaVmZFXl5fSXFcXEZuQ19jVEhobldzVz9vTkBuYlBdXWhydkdicz9vcW5tQl9hW3h2bj5mY0BfRU9pPlhoTmZwdVZhQHhoTkljXm9ybUlxZmZvRl9tZkhjZ3lkZ05dX192OkhbcEBfUl5eS2BdZWFvTWlqUldcXFpPeWBoaEFwZVVwbUJoYEBAbVFgbltmaE1xYlRfb09maEVwaHRBbGA/bG5pZGJAdmh3YnFeeFZHY21vYG5odUphdmtOWkleYDxnZ2hIb0Q/YGhfbUlReUlIcUZWZ1txX1Rfbl1YYl5IXFxTZl5dbnRgd2ZXb19WbnZMSGZTbmJzWXl1aWBBUWdjcV1EPnNLQGZxZltDaGlTX1p2ZmZbSHRCUmxnRmA/c09TU3JxdmRBSUg/eHRtVV11V11HR0RhUmlTRj9NVHBLdm9raGJZRj5RaGhLVU4/RHk9VmZ3dj1FVkdXaXZvZUtfdUxhZ0RdclZDdE0/ZD89cz1HUlFvWWZJWTs9VXFvZXJNRHNnSUxvUz5FWDxtQ2tfR0ZBWVxcaUV2SURnZ0VBcWVocWdkV2hTYVNPVWRBVUJxZXlNTWNvO2dmXXdPX3Nsc0dFYUlsVXRvZWdnP0VhSVRrU3VgUXJ3b3Z4S3lea2VMXXJdR3ZqW1dKc2hPX2lnQURCd2ddYHZTbUxMSXNSSG9DZExsSE1GUHhmcGtMUHJgXWptUE9GUXh2SWtkTG4+eFZReXNEdHNFTXB0eHZLYU5gYHRobFJsYHFJYFhpaW1TZUo6XFxTaUxVPG1SXUhyYl14QW11ZFRrV2VQUWl1UTxsb3Vydl10TXRXVWFqaXlvOnBuVz1QRT1vTERRXnlMPmBvR2BqWHRMcGx4c2BtamB0W0hPRFBua0RPdGV0dEhxVkhLVT1UZ2xOYWRSXnhVS1lSO1huOzxZR2BQdFFZWFRPbFB0U0RRTkVsaU13XmRzdklwZnRQVWlrSGFsPkxWcXhrWHhSU2hVQ2BUaXB2YUFOO3Bzc1BPRVFwdGxMXm1ySz1NS3lUQ2B1Yz1tRWRwUmB1PUFxZXhqckBSa1VQcVhVR0FMbl1sPkh2Y1hLREB5Y0l2O1FXS3RTVW1VX1VSQmBrUmBNQkRsWFRuYkxucT1ZWFVuVlB0dXR5T2BReGBKZm1VYm1RR3hLbFFtVFFsTFVNaT1SWlhtRmVOYGxYVTx1UWF0eERZWHFRTGFWVVhyZHlVS015QWhrTVFxVERqdXFTVHhwSlRLQnF2XlF5bmxLXWRYbEBzWHBvZ3hSXnFPWGR2R3htWVlXSU1uZlxcT1l1dWVMTT9pUm5lUnd5d2NRUnJQbkZMUEc9VlJQT15pS108UnFwTVlscXVBeFdwWXdxS211ZnlmaXE/XmNAX0RObm5Zd0BvXWs+W15pdUJmaFFJeXJOdUBpbmxwW19XZnVeX1lwXUVBYWxfeV52ZV9gYlBeYWdnYT1BZVJ3YUhBalFvZURPeVZeZV1vcVVHYHk/Y2h3XT1OeHhPXFx3VndabmRrP2JWPnBQVmpQWWpEbmdAeGM9cXBRX2NPSFxcUT5cXF9mYEdmbV5vZG5RYD5YWmRXZVxcR21GRnZzUHVhcHA9YGxGVnRoaVtCeWE9TnFxRnhZWWNtcVxccGZzYUd4O0FcXERRbGRQd0JQcU1mXFxVb25zVnVoSGhYXmZjTm9Rb2NlT2toSXN0aV47cXRaR3RPbnhYP152cWRZUHBqb11oUGw8cWNAVmtUaGVHT3dFb2tuQFtOYWl5Xm1CUWpcXElyY09tT25rPG9rXXF0PXFyPVZvSVZfZF9qWHZ1cWlvd1h3W25jeEhfTFlddGdwdW5kUE5lR3Bpaz52W2l2UkZ0X0d1S25xRkl3XFxuW0RwaHRgdmdJa1phdl9RXU5xdmJBa21IcUFxZ1VPcV9IXlpYakU+Y0BPYklYanRub2ZHbz9xcV5nZWs+dXRAaXVgdHA/bFxcSXBPaHdDYXNcXGFvbmZpSXZtP1BkcVFnTU5oVlFqRmdlREFkU0ZmXFxWZURBZ2hxbFJHXFxVRnFNWWVwcF54dmxQUHZeR15lQGRGP15MQG1LSXVyUV5eeXhLRmlLbm1YR2o6SXZSeW12PmxnT2xyP3E8aHRKSV1sd1tecXVMQF9cXEdmdWdwPD94R3dbbF93P2llZ19pam5cXEReXFxlSW5Cd1s8Z1puSFxcb1FfRkFiVm5hRmFhUmBfPkdgckhuYV5za1BbQEZqaGloPmBiQnBiZ3Z2ckFhQnhwPUFxb3FiQHdfal5xO3FhXFxWdUZxW0B4W1ZAWz9BZ0peW2t4ZXJQZW5ocWZXYWZXeUBxZm1xdmN3WmtuZ1thd3FAb25hXkVHXUtncmJZXV9gXU54XmZHWnJPeGVBYFJGaDpAd0ZOamZoWl1OY2dpcT1ZZGRXXFxiXm1AQGVyRmNncVtMUW1SQXBlQVtxQXhBPnJUR3JCSG1KcHhveGF5cXFpYWdWT2BjSW5bPlteWHJASWhLPmI6WXdtXmtvTnhxZ1tYYGc8UXlDX2dNYFt4X2Z5PnRcXEBmYnhiO0FgaF5oZFFpS1h1ZkZuRkhdTGhxY2hqXmZ5T2VDW2Zjb3dZc3ZScUk7a1dbO3RlR1ZeP1RJVXdXW2V0R0RPbWhsVWZbdWJmY3lpXUlNb2dpd0heVWg6b3dBd2ZXYVJwbXRDQ3U9SUZkQWVeT2hzS3J1ZWVaRVNaVUJeY2luTUlmd0VfbWZza3hKc0VuP2ZPYWNAP0dKPXVYa0RJaUI6cVlPV0JVS1I/PXU/cWdOYXRoP3ZkR0ZQP3VgVXl3XWZDY2NVT3R2VUdZY2k/Q3U9Z1hwXXhJY0l5T3JBbXl4WXhJY1VOS0ZwUURZWVI7Q3dCPXNQcWlGP2VGP0M+VVRZZWY+PVJKTVRcXEVCQ0dVRGloaEtVUl12Z0FlblV2WmlDZWliV2tDY1VCb3Fkb29jd3lDQ19yQGlmO1NzcWtzd19EVm9CdXlZO3lyZHFmdVNjaEFZQVVncVN5U2tnWnVXbWtEPVFjdll3WVtia3NySnNFYUtXaVd1TT11X2djOkVnX1lmTVl0bnFIb2dSaXNFaT14cHNYcV1ncklocldGaUVDeVNVOm1SZV94Z0VCc1tDXFx5Um8/YzpzaWZDZ25bWEhlRFVnV0tvaWljRVBZSXFxSHhrV3dBZ1ljaHFnRGpnSTthRnBLRFdRdl9PQlpZdD5Xd2RBVVl1Ukw7Y295cU51VmhdVXFwdGRpaztwWGR5a3hUUUdsVFF0dlhgWVY9cTpAVm1AcmZUcklUbFR5all0eG9Aam5VU1NIU3NdcV91eXFdc0NlV05NdUhtSz5cXGpXPWx3ZE5aZG9CYFdzcG9QRExvSW1CVUphYVhYbVhQYUxTZW9uPVV1YW1RcW1wRVVXSHNMVHl2RVhUZU9paVl5aXF5PXFxXVhIQVJIYE1fSVFjPFlBZW5IeVFUSW55TWxSWUtLeGtmRVh5QW1ZeVFUPXB0aHlbZHV4QW1DQW1BeVl3VW9zZHlBYFBrUWtVdE95eHJgSVJedG1NTHZlUEw7RFlaZW5yeXZ1PFlHdU5yYHhrUHFQeE1ybW1DPVNAXFx2YXlKa014bnV0Y2F2PkBqVkR2YGxxZG1MO2l3ZlRrQmVMcWxVV1FQZlVYUVh5WnVMZ21zT3lRPUhWQHVOeGVRdXVtckBRT015a0RNY0xtcz1PSEBzUUlVPUhRbV1yeHVqbHV5R3FweFl1TnFVRF1ZeGFyO2F2Q2BtSFxcVTt0UDtsV2t1UXNJSm14TUdNTHZNTmFZUFNgbXJZT2hxWUpAU3JlUXhdVGJIT3JIbGNJbT9FeXBJam5obGtFd2dZbkZ0WG9oSlNVc2xMcnc8a3FgWGNYdUhtUzpJUFBNV15cXG5lTE5yRVlURUxraHlXRFc6cHZAUFJOQVNBcW9xYFlMeFV5dFhaTXZyYFRqbG1rVXE9aFFQUVJ2ZHRTRVhUWVV1VUxxQFl4QVQ/eVNMbVVWZE5vUU5WXFxvS1F3b1VYPW15SkB2XnlyZklzSmRPUj1YPj1XWEBVUkhqeUlWSXVYSUxMU2Bua1xcTHNkTEp4VlhwbWpQcnB5SjpZcWdNU1V1ckZYcWVhV0R4cFdgWTo9UnBQTExhbz9UUU1ETmxgUGRZcDxtWD55WFhFTEVgd1FtVD5dUWV0eVpFVUV4a3I9Uj95cmFJWFRJWWp1dWZpbnJpS1xcQHlTcUtFeFheXXhdYHJYPVI6TFZocFBCbFBlWVlcXGRMYlVOVEBQWGVTXmF3Wml3QXVralhXPDxtZWRqd1BgcXdlWE5ya29oX1lvPWhia1ddd2B3RUBlTldibHdraFhcXGheck5vYk1Rcnl3aUtZa1l5YHlXdF1pZmh5bHReaHlBeFxceFxceUhrVFlrQnhza195akFoPWh2W19eeWZ1YV9kXFw/a3R4YXI+am93Yll5WmxRYVBWbWpeaXdQcT9gW0FIXl5RYHBBeWB3ZFpgY01weXZpXjtGcm14cXl3dFBwd1dOYHFxYVtRZGxYeEpfaHdnWkxfckh4a2lHYVpXcVxceHFNSHdgeHZOQWhJX3Bqd3NMQHBNV3J4Xm9ocWlaP29oeXdeeHg8T3RRV1tjcWxyRmNab2FcXE5dU1diS3dxP2h5a3dqPXldYF9mZU5zZl9aW0BpXnh2eFhgaXZed15mWFdkUXZgdD9icVl2ZlZecXBoa2dubV9oT0lsZm5cXGZ5bm1weFA/eWZ2cHVpZXBuaHlmcnV5aT8+cVlvXnJ4dXhBdTtoeGVpYV93eVlmW0l2XWBIaXE/bkhXeER5XklQWnlobT9RYVZvaldhcFBnbW5JX3hgbl95aW1AYGp5cj9PeXlXXFxgeHFBQHVYTmFIV1xcP3BkQXlrdXZlSUBjO0FxbUl5Q3dcXGVBZj9Pb1dhcFBHeElIcHh5alJmanlha05gZ1VGeGFPY1N2eVlBbD9xZWZudTtmdklgeHRvd0hIcnBXaF5pY1lPaXRxeTxwZHlPbVM+eWluYFxceWE9aG50dm9bZ3RtcHlZVmpreWlPP2J0RmZ1YXhlX2V0eWhsWFp5eVo/eHBBeHlcXD5rWUZ2O1BbdG9gYkl2bEBuX2lmTUlhXVBgSXl5YFBjd154anlxRW5rc19iOm9qZElpPGZ4cFZ5cVF0S1lyeXlhYkhzS3ZcXEU/bFlndmpvdXU+ZHdeZXRIeWpYYHM/eVRxWlVZdVJeXlhgWj95a3hvaXQ/cW4/c0xgXztobGo/XV54ZHNoZ3N5cW1Bb053W3deeXlOW0J2XzxBZ09mdGloYFNJYT1oX2ZwYnhAdUlBZEl2bEhWXmY/YmRZZkBod1NfXzp2aF5Jd19Jb3lQb1ZZYkl2XFw9Vl9KPnA7Rm1oWWVKPnhhbl1iWW94b2l0Q1ZbYkJLZXFxcm9lR0JDST1NSGxReWNJd1tRdjs/Y0FheEo9UnhheV9FZlhLWXJ5eTpveHZjZHI9VFZZQ0N1Q3c/WDpJWDtDSXJJaUFvRWhTRXRpV2txRXQ9dz90S3dcXHg8dmpYbml1XnlBdl1BWWNOaWVkUGdqRDo7al5QTmFMTlFFTmpENUI=</Image></Text-field></Input></Group><Text-field layout="Title" style="Title">Introduction to Fuzzy Controllers</Text-field><Group><Input><Text-field firstindent="0.0" layout="Author" leftmargin="0.0" linebreak="space" rightmargin="0.0" style="Author"><Font bold="false" executable="false" foreground="[0,0,0]" italic="false" subscript="false" superscript="false" underline="false">Douglas Wilhelm Harder
Department of Electrical and Computer Engineering, University of Waterloo
Waterloo, ON
dwharder@uwaterloo.ca</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Text"/></Input></Group><Section collapsed="true"><Title><Text-field layout="Heading 1" style="Heading 1">Introduction</Text-field></Title><Group><Input><Text-field layout="Normal" style="Text">This worksheet uses <Font italic="true">FuzzySets for Maple</Font> to demonstrate several examples solving fuzzy logic problems in Maple.</Text-field></Input></Group></Section><Section collapsed="true"><Title><Text-field layout="Heading 1" style="Heading 1">The Fuzzy Sets Package </Text-field></Title><Group><Input><Text-field layout="Normal" style="Normal">The fuzzy sets package contains five exports which are described below.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">with( FuzzySets );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Each section describes a separate portion of the package.</Text-field></Input></Group></Section><Section collapsed="true"><Title><Text-field layout="Heading 1" style="Heading 1">Example of a Fuzzy Controller for an Inverted Pendulum</Text-field></Title><Group><Input><Text-field layout="Normal" style="Normal">The classic example for demonstrating fuzzy sets is the control of an inverted pendulum mounted on a carriage.
We have control of the velocity of the carriage and the object is to control the system to keep the inverted pendulum from falling down.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">               </Text-field></Input></Group><Group><Input><Text-field alignment="centred"><Image height="289" width="259">TUZOV3RLVWI8b2I8Uj1NRExDZE5OWjtKO1hPPkg6cG1xWXFWS0A8T2BMb1xcanl5eXk7XFx2bEBvRmI8R1lMQ1RKY0RYb1h1dVhuP2ViT0Q+RVROUWVyeXl5X1VxcWNdS0NATUZSW1R0V1dneWRDb1JGT3RVT2dNaUNdR0RBW2RgeWNXPXI6O1BSXls6Vlo6QTo6OjpbWEdJaFBZdUdZcltraHNtZVI9WWFTQlBpQ0lJY3JleFk7aW1VSXhFeG5TeHFtaDpdckhxY0t5dXhvZUZnSG87VnJnZWVnRmJxZkA7cztLZFprVVNBWVI7eGNfR2thUnFbU0BIdVpxcWBlV3NcXHRhYVFGbVl0YFZxSG5ydXlZRHJIRVRodE5bcE9hZHZ3dExQVHlDWXZIRXVocXZYSHhZaHlxWXh3eUpGcFlCSG1BUW87PFBVXFxxeURuRFlTdlRzQ3lRXUhPUW1yXlBUVnB5R0hzRmBPYXRQaXhTVlRQbVhybVlOXFxxeE9dbXlhUkZwTXlsT21EUGhsTHF4WFhYc0xJVnZRUVF1c3ZUT3BFanJgdz9Bc0NxeXVweDpIdnFITT1xb0lYWWVRSktYUkdsTXlkdXZRUjtBWWVYd1JwVXBUTWh1T0lla015TnM9eFxcPE1qYHFOXXJcXFBVbGBZdHhscXlwZEBQZV1RcGhQZElZZzxwZWxuP0h5cklqa2BWbER1X2FZS01MblRNZl1Oa3B2RFFXdkBxWHVSYWlUWGVLOnVOQFxceVl4cUlJc3llWUg8VW1UTV89UmVVcDx4akk8WWQ9VG1EXUY+dWtRYDpBcF5WYHU/b1hvY29pY1BZdlluaFRIc1B3aHVGbHNAcmhvZj1GeT0/aUlBeXBGdHlgX112YVRveEN5bWFhWlFYdHZGaVdnbUZ5Z0xhdlphZT12bEdmd2NhcTpvY0FRYWhvcl1PaT94dEdJaz1Jc1RwY0Z3XWtOcW93dnNuZ0BZeWBhd11pd2VAc1twXFw+YWNDSGtrWWpgd3NFXndCX2tqSWtMUEhrSj08cjo8YFI6Ojo6Ojo6Ojo6Ojo6Ojo6OjpCeFtyS3FHUlNkQVdSTlNZRUlEQGdZdmt5YWdZXFxXSz08TkFcXGw/bUtibG0+THNneUtAPHM7PGw9THFYWHU/WUtxPHQ/TE1iQXdzQFlGdVRpPXI6aG1ZdHlrUE9XaW9YQVJIblo6d1xcUnljXFxZa3NRbXhAb2R4b1hBYkdyOmd1SVlCQXlYXnFyVTtQUjx0Sl1xQ3hUZj1yOjxQWmhtUjxQbXV1bVlNaj49QnQ9Zk1Zdz1LWG1nQ3R3VVtrd05BYlJVdz15Q1VbWGhBYmg7RkFUSmpZWHg8S0BCajxdS0lvWmF5d3dzaT9yOmh5QT5xVndwVj5gcUhiO3h5dz5uRT53PGZcXFRBcl1YX1xceGRpP3I6QlJpWUw7RXdhRF1vWHlTWU87eHdnQ0xHQldjc0BrR11LZWVPZHl1eHdBdmVLaVZLeE1BaT9hVVJ3Y1NHYnh3aDt1eDs/ZlV5c0k7Y21hQmlNSDxHZGVzSEppQmo9VD1LaURTQmtZVHZXY1NhV2JvQk5pRlI7Vk5FRUpZdTxFQjtbWDtbdEJNYnFZRzpReFg7VF5ZVD9xY0B5VUc7ZDtjdjpPV0c/VkV5YmtcXFg7cHZURXJseU9NTEtvPG5ydU5KaUp0bGRBTnNhQWpBbltyYV1bPmBaYGlSPm9rR3JqR3dUPl5GPnc8Xl1qaWk9eHhJZ1xcTk55aEhdQz9kUT5fSUd4SD94T0loZ1hrWWlhbD5dSkdzQUBmOkdpXFxwZkpebD1ec0BWcWdGeGVXeFdndGU+c3RpZUk+a09RYk5hcUhgcUZRa0pfX2pHZmJWWl9wbkFQaDphc1RBaklRXFw9VlpEcGQ7RmFaUHlKdm5UPlpvPm5qZ1pydmk+YWppcV1BUF1KX2taP2JTcV5KTmc6R2U7TmZwSWA7VUN5ZD5DZkBbeFJhQlZjeW9nQ2preXQ/cmw/aFJbS0A8OjtmZF1DWj1Sb01iOztWOjtFOjxMPlRTWlFLS1B1czxUR25aaj5ab0hsPW5nbD9mYkhaWj86O1JIO2dRP0I8R0I/VWZZYXhhQVY6RXNLeUVZWUVGO0d2a3lPU0U8X0ZibUdaX0J2dXlnZWZNXWJBVXJZXUlIO3lQSXVZZUlER0JXUUNaWVlBR2ZAW1hURUJQd0VUSXM6T3JnO2ZKYWRaeUM7S2NRR0JzO2Z0T0JGO2Q+Y0VLYUNqY0NiX0dHb0dab0JiRUJvd2Y+T1c6T01GPFJfQVByeXJyTG87PFY6Pjo7VG5LUmo7Ukc7Qj1COkI6PHFBPWBSYjtCWmtza0hvOlRKOkFaOkJOSVdhSURGO3dARWJydWVxW0tAXFx4S0FLPEhKWj1SX01qO2xSTkhKP2hMQkBWOkV3Y0RWYkhKWj1iR0BuRG9mYj55R1ZcXEtwanlwcDt2aUF4YEM+ZFNVOztkPkNmQDtPUjxWbllLVTxsQHFVSDxOOlRKOktvZEtCRVA6ZVtAPkpLZ1Q7dlVvQmA7VU9rZ3hFeWJvR1pXSz08YjxAXj1eWjtvWjpEUmR4YnBwXFxcXE5BTG87TGpaOk9mQz1IXz9CbzxNOj5iT1daZnhaY0haPEA+O0g6W0M6RVQ9W0I7ZXBaPHM6PGBSPmpLZmpIaVtESWpkP2paPnM6PkBTamJNTG5FalJQXUY+YltXWmZwWmJIWlo/alo+U2ZCSlI8TkJMYFI+alVPZ1ZIXWxpcWxOZzo+XTpCYlNXOmd2Wk94Qz1USFt0PztyOl5kb0I+Y3Q6QzpiXFxvQkJLYmQ9Ylo7O1trdWBYeW1XSmlKXFxNZ2pCPWBvO2xsPVBzYURSczxUUVpiTEpcXFQ9XFxKO21aPT5SY1JHOzxaWmNzTVl4c0hiUTo6OjpLPzo6Oj5Gd0JuTVloPXQ/S1ZkPUJSXFxbbHBaUm9bZHZtPmZ2OmdFU1pKZ3Q6RmJKZ1tKXlpTPlpAPmo7Pl9kP2JESFpkSzpRUnRZUWk8Vms8QlxcSjtbTkFaOz9EO1R2bUhic0JkR0JaPUJkUUVaO0NkPGI8PD5yX0liZEs6PmY/ZmVXeFxcamBdXnBaQk5KPlI+QlNzSWlCXkFSVz1CRmxaT0M7PVRHO0Q+Q106QmJLVzpXQz5hdDo7SDpbWzpWWj5Gcm9eeGxvaFJRbGpQPTxUc1hLQkVKZD1aOkdbWkNAO0puREpAPG50SEpEZ0BGYD1ebVJOaVRweVBnal9UUTtKWkBgbkZab1JjVUJOP0JvPlo/aFtKYVpORWVDSWQ/QmQ9QlI7WnM+YkY+dU1GcWJpdV5xXFxpR3liQV5SaXZyWXc8Zm5FP2I+UXVBaV49PnI6XmRxPm5sUWhKT0BHaTpVY0FjV0ZzST9peEhBZXNraWFHZmlrUm1HclZvVDs/ZXlNR29sWWtEeFJZeWthTEdscWJJeDtgeXF5anJwdXRwb0Jkdm5xeGN5eGFYVV15cHdldWRxdlhkUFpoalZRWVhMdXlVUld0UGNwT2l0SmRBb1J5bWhlcnFZanFJbz1BUkg8dUNlU0J4amRgVmZ0UWxYWHNgS2RXaDt4YEZHYXFvYV1ueU5RYj95cUB5XXlmcTtIZD55cz92c1NWYm1GdD9OXUJOWnNIYkl2dTxmZVp4cD5IbWVRZjpRcVQ+dnRecUdWbU1Jb1xcd2VdaHVEWWh3SV1kP1pSPmRcXGBnVnFfcXFhRGBxeVdjRVFvPEZyOnhzaFBaPmlocld4SFR2dVc9SWlnVURqc0RSSXRuPUZpYUN0XXZqT3ZVU3JgQ3ltXUhCZ2RDT2I7U3lTZUhCSXdbbVlSa3J2XVlAO0Zoc2ZCa2JPTXZyU1lsYVdIdXQ/S3Nld2hOYWVuU0V2TUhQeHB5aVNXPW5yTXFOaUpGbU5PQWpEWW55cHBjQW87ZHRLVUpwVVhycVdNQE09SEpHcHNDUVg9eHlBTHdkRFBtdXJhPGw9bHhMXUpAWFc/UGw7PGw+ZGo8bUpKQHZnbUxiUUp1SVM8dFBQXFxuVDxuTFxccV1ATGJISkxATmR1bDtsSk51bDp1TGJFUjxgVD1MV0ZtSmxZTE1ZUm88bnR0VWVdc2xlbVpxcVBgS05BakRIb0ptS0o9SlI8dGdBc195UnQ8cGg8VFdkUFpAWD08VjpFeUt5WT1ISnNxc3FReFxceVBKZFFIeHlFZUtCWVFxXVJVWGp5RXFXZG1HdHFePGtRaXQ6SHVJeXJFcFBlPHJlWXc6eWp4bFVoQXlAaXVxXFx5aExNV2x5cWxxO0BXdXBKXll2WXlSdVBKdkhyO3hwaGltXVl1cXV1eXhKP1VwPXl5XFx4dFl4bVRIWEJNakxAdmFsS1toTVFEal94b3lpTkFUV249VjptT3k9Vm5cXE86cXZpPXZtdU1NYVh2YXRIXFx1YUVNckF1QWB0eW1XWV1XVFhKUG1VS0FxbXlvZjx3eGl4RU1qUlF1OmBXd0FOVFVZT21YbDx2V1lxdnVXT2VRUzx0WVVVTmlKZHFuY3hWWE1TYFRKOkFKbVVRQDxMYUhWSHBYPkVYeGB5WT1yUVVwbWlRZkRLRE1qWl9saE9kVWFoY3h1PkZyV194Q2Fndml4ZUhaWj86W1liV2NrPF1GSlo9UkVhSj08YkhIXkA+ajs+ZjpAXFxQZ3dvWW87dnZrX1tvPnJYXmY6UF5ERUY7ZGJRZ09BaF1VZXVpdT49VklnVTphaEhlQ1pjY147Y0xxQj5VdkE/VE5dRztTVWlfdl5VdnU7SGVJRWp5dj15YktVc0dnaUk/d3JHeWRtV3BraT1TaFBBeUVNYkI/eUZJUk5BeWFXc3FdaHQ9eERXWHRFdXJxeUVRUl15eWRXaHRHdXJxQ0ZRSF15eTxZeHRJdXJxeUVRRV15R0NLdj93dHBhVl15UkptRGI7QkF3ZFlldU9nY2lxaWZhWXJ5Q2h3dz1fRTpBQmo7QkY7Qj06OjpCSllJeUlSSlVIQnd2VElUUmNbOj5aQ2diSF9iaFBiWk82Sg==</Image></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Let the angle <Equation input-equation="theta" style="2D Mat">NiMlJnRoZXRhRw==</Equation> be represented by the fuzzy sets <Equation input-equation="angleXY" style="2D Math">NiMlKGFuZ2xlWFlH</Equation>, the derivatives of <Equation input-equation="theta" style="2D Math">NiMlJnRoZXRhRw==</Equation> by the fuzzy sets <Equation input-equation="derivXY" style="2D Math">NiMlKGRlcml2WFlH</Equation> and the resulting acceleration by the fuzzy sets <Equation input-equation="accelerationXY;" style="2D Math">NiMlL2FjY2VsZXJhdGlvblhZRw==</Equation> where <Equation input-equation="XY" style="2D Math">NiMlI1hZRw==</Equation> may be one of:</Text-field><Text-field layout="Normal" style="Normal">    NL      negative large
    NM      negative medium
    NS      negative small
    AZ      approximately zero
    PS      positive small
    PM      positive medium
    PL      positive large</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">restart;</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">with( FuzzySets[RealDomain] ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">We define the following fuzzy sets describing the angles in degrees:</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  angleNL,
  angleNM, angleNS, angleAZ, anglePS, anglePM,
  anglePL
) := (
  L( -30, -20 ),
  Partition( -30, -20, -10, 0, 10, 20, 30 ),
  Gamma( 20, 30 )
): </Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( [
  angleNL, angleNM, angleNS, angleAZ, anglePS, anglePM, anglePL
], -40..40 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Next, we define the following sets which describe the rate of change of the angle in degrees per second:</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  derivNL,
  derivNM, derivNS, derivAZ, derivPS, derivPM,
  derivPL
) := (
  L( -30, -20 ),
  Partition( -30, -20, -10, 0, 10, 20, 30 ),
  Gamma( 20, 30 )
): </Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( [
  derivNL, derivNM, derivNS, derivAZ, derivPS, derivPM, derivPL
], -45..45 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Finally, we define the acceleration of the carriage carrying the pendulum in metres per second squared:</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  accelerationNL,
  accelerationNM, accelerationNS, accelerationAZ, accelerationPS, accelerationPM,
  accelerationPL
) := Partition( -16, -12, -8, -4, 0, 4, 8, 12, 16 ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( [
  accelerationNL, accelerationNM, accelerationNS, accelerationAZ,
  accelerationPS, accelerationPM, accelerationPL
], -17..17 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Now that we have partition the observable and control variables into fuzzy sets, we must generate a list of rules which map the observables onto the control variables.
For example, the first rule says:
     If the angle is negative and medium and the rate of change of angle is approximately zero, then accelerate the carriage in the negative direction approximately <Equation input-equation="8;" style="2D Math">NiMiIik=</Equation> m/s<Equation input-equation="``^2" style="2D Math">NiMqJCUhRyIiIw==</Equation>. </Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">Rules := Controller( { 
  [angleNM, derivAZ] = accelerationNM,
  [angleNS, derivAZ] = accelerationNS,
  [angleAZ, derivAZ] = accelerationAZ,
  [anglePS, derivAZ] = accelerationPS,
  [anglePM, derivAZ] = accelerationPM,

  [angleNM, derivPS] = accelerationNS,
  [angleNS, derivPS] = accelerationAZ,
  [angleAZ, derivPS] = accelerationPS,
  [anglePS, derivPS] = accelerationPM,

  [angleNS, derivNS] = accelerationNM,
  [angleAZ, derivNS] = accelerationNS,
  [anglePS, derivNS] = accelerationAZ,
  [anglePM, derivNS] = accelerationPS
}, inference = minimum ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Suppose we have an angle of <Equation input-equation="-13^o;" style="2D Math">NiMsJCkiIzglIm9HISIi</Equation> and the rate of change of the angle is <Equation input-equation="-2.1^o;" style="2D Math">NiMsJCktJSZGbG9hdEc2JCIjQCEiIiUib0dGKQ==</Equation>/s.  By applying the Mamdani form of fuzzy rules, the returned fuzzy set suggests what the acceleration should be.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">soln := Rules( -13, -2.1 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( soln, -17..1, view=[DEFAULT, 0..1], numpoints = 1000 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">We cannot use a fuzzy set to control the acceleration of the carriage, so we must interpret this fuzzy set as a single real value which we may use as the acceleration.  We can convert this fuzzy set into a real value using the routine <Hyperlink bold="false" executable="false" family="Times New Roman" italic="false" linktarget="Help:FuzzySets,RealDomain,Defuzzify" style="Hyperlink">Defuzzify</Hyperlink>:</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">Defuzzify( soln );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">Thus, we should accelerate the carriage backward at -5.34 m/s<Equation input-equation="``^2" style="2D Math">NiMqJCUhRyIiIw==</Equation>.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">The following routine simulates an inverted pendulum and returns an animation of the pendulum over time.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum := proc( initial_angle, initial_angular_velocity, controller, iterations )
  local position, velocity, angle, angular_velocity, dt, plotvehicle, plotlist, i, acceleration, angular_acceleration;

  position := 0;
  velocity := 0;
  angle := evalf( Pi*initial_angle/180 );
  angular_velocity := evalf( Pi*initial_angular_velocity/180 );

  dt := 60.0/1000.0;  # animations run at approximately 1000 frames per minute

  plotvehicle := proc( posn, a, angular_velocity )
    local x, y;

    x := sin(a);
    y := cos(a);
    plots[display](
      plots[pointplot]( [[posn, 0], [posn + x, y]], symbol = circle, symbolsize = 20 ),
      plots[pointplot]( [[-1, 0], [1, 0]] ),
      plottools[line]( [posn, 0], [posn + x, y] ),
      plots[textplot]( [0.5, 1.2, sprintf(
        "% 3d deg, % 3d deg/s",
        round( evalf( a*180/Pi ) ), round( evalf( angular_velocity*180/Pi ) )
      )] ),
      scaling = constrained
    );
  end proc;

  plotlist := Vector( 1..iterations + 1 );
  plotlist[1] := plotvehicle( position, angle, angular_velocity );

  for i from 2 to iterations + 1 do
    try
      acceleration := Defuzzify(
        controller( angle*180/3.14, angular_velocity*180/3.14 ),
        -100..100, evalf
      );
    catch:
      acceleration := 0;
    end try;

    angular_acceleration := 9.8 * sin( angle ) - acceleration * cos( angle );
    angular_velocity := angular_velocity + angular_acceleration * dt - 0.02 * angular_velocity;
    angle := angle + angular_velocity * dt;
    if i mod 100 = 0 then print( i ); end if;
    velocity := velocity + acceleration * dt;
    position := position + velocity * dt;
    plotlist[i] := plotvehicle( position, angle, angular_velocity );
  end do;

  plots[display]( seq( plotlist[i], i = 1..(i - 1) ), insequence = true, scaling = constrained );
end proc:</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">The following function call generates a simulation where the pendulum begins at -10 degrees and its initial angular speed is 40 degrees per second.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum( -10, 40, Rules, 100 );</Font></Text-field><Text-field layout="Maple Plot"/></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">This next example uses the product Mamdani inference.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">ProductRules := Controller( { 
  [angleNM, derivAZ] = accelerationNL,
  [angleNS, derivAZ] = accelerationNS,
  [angleAZ, derivAZ] = accelerationAZ,
  [anglePS, derivAZ] = accelerationPS,
  [anglePM, derivAZ] = accelerationPL,

  [angleNM, derivPS] = accelerationNS,
  [angleNS, derivPS] = accelerationAZ,
  [angleAZ, derivPS] = accelerationPS,
  [anglePS, derivPS] = accelerationPL,

  [angleNS, derivNS] = accelerationNL,
  [angleAZ, derivNS] = accelerationNS,
  [anglePS, derivNS] = accelerationAZ,
  [anglePM, derivNS] = accelerationPS
}, inference = product ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum( -10, 40, ProductRules, 100 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">solnP := ProductRules( -13, -2.1 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( solnP, -20..10, 0..1 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">This next example uses the Sugeno form of fuzzy rules.  The first rule may be interpreted as if the angle is negative and medium and the derivative is approximately zero, accelerate the cart at -12 m/s<Equation input-equation="``^2" style="2D Math">NiMqJCUhRyIiIw==</Equation>.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">SugenoRules := Controller( { 
  [angleNM, derivAZ] = -12,
  [angleNS, derivAZ] = -4,
  [angleAZ, derivAZ] = 0,
  [anglePS, derivAZ] = 4,
  [anglePM, derivAZ] = 12,

  [angleNM, derivPS] = -4,
  [angleNS, derivPS] = 0,
  [angleAZ, derivPS] = 4,
  [anglePS, derivPS] = 12,

  [angleNS, derivNS] = -12,
  [angleAZ, derivNS] = -4,
  [anglePS, derivNS] = 0,
  [anglePM, derivNS] = 4
}, rules = Sugeno ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum := proc( initial_angle, initial_angular_velocity, controller, iterations )
  local position, velocity, angle, angular_velocity, dt, plotvehicle, plotlist, i, acceleration, angular_acceleration;

  position := 0;
  velocity := 0;
  angle := evalf( Pi*initial_angle/180 );
  angular_velocity := evalf( Pi*initial_angular_velocity/180 );

  dt := 60.0/1000.0;  # animations run at approximately 1000 frames per minute

  plotvehicle := proc( posn, a, angular_velocity )
    local x, y;

    x := sin(a);
    y := cos(a);
    plots[display](
      plots[pointplot]( [[posn, 0], [posn + x, y]], symbol = circle, symbolsize = 20 ),
      plots[pointplot]( [[-1, 0], [1, 0]] ),
      plottools[line]( [posn, 0], [posn + x, y] ),
      plots[textplot]( [0.5, 1.2, sprintf( "% 3d deg, % 3d deg/s", round( evalf( a*180/Pi ) ), round( evalf( angular_velocity*180/Pi ) ) )] ),
      scaling = constrained
    );
  end proc;

  plotlist := Vector( 1..iterations + 1 );
  plotlist[1] := plotvehicle( position, angle, angular_velocity );

  for i from 2 to iterations + 1 do
    acceleration := controller( angle*180/3.14, angular_velocity*180/3.14 );
    
    if acceleration::'undefined' then
      acceleration := 0;
    end if;

    angular_acceleration := 9.8 * sin( angle ) - acceleration * cos( angle );
    angular_velocity := angular_velocity + angular_acceleration * dt - 0.02 * angular_velocity;
    angle := angle + angular_velocity * dt;
    if i mod 100 = 0 then print( i ); end if;
    velocity := velocity + acceleration * dt;
    position := position + velocity * dt;
    plotlist[i] := plotvehicle( position, angle, angular_velocity );
  end do;

  plots[display]( seq( plotlist[i], i = 1..(i - 1) ), insequence = true, scaling = constrained );
end proc:</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum( -10, 40, SugenoRules, 100 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">solnP := SugenoRules( -13, -2.1 );</Font></Text-field></Input></Group></Section><Section collapsed="true"><Title><Text-field layout="Heading 1" style="Heading 1">A Faster Fuzzy Controller for an Inverted Pendulum</Text-field></Title><Group><Input><Text-field layout="Normal" style="Normal">The RealDomain package is designed to use symbolic algebra, and therefore will be relatively slow.  Generating a package which works with fuzzy subsets of a finite domain is significantly faster.  This example reproduces the example shown in the previous section without the commentary.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">restart;</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">FzS := FuzzySets[FiniteDomain]( i, i = -45..45 ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">with( FzS ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  angleNL,
  angleNM, angleNS, angleAZ, anglePS, anglePM,
  anglePL
) := (
  L( -30, -20 ),
  Partition( -30, -20, -10, 0, 10, 20, 30 ),
  Gamma( 20, 30 )
): </Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  derivNL,
  derivNM, derivNS, derivAZ, derivPS, derivPM,
  derivPL
) := (
  L( -30, -20 ),
  Partition( -30, -20, -10, 0, 10, 20, 30 ),
  Gamma( 20, 30 )
): </Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">(
  accelerationNL,
  accelerationNM, accelerationNS, accelerationAZ, accelerationPS, accelerationPM,
  accelerationPL
) := Partition( -16, -12, -8, -4, 0, 4, 8, 12, 16 ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">Rules := Controller( { 
  [angleNM, derivAZ] = accelerationNM,
  [angleNS, derivAZ] = accelerationNS,
  [angleAZ, derivAZ] = accelerationAZ,
  [anglePS, derivAZ] = accelerationPS,
  [anglePM, derivAZ] = accelerationPM,

  [angleNM, derivPS] = accelerationNS,
  [angleNS, derivPS] = accelerationAZ,
  [angleAZ, derivPS] = accelerationPS,
  [anglePS, derivPS] = accelerationPM,

  [angleNS, derivNS] = accelerationNM,
  [angleAZ, derivNS] = accelerationNS,
  [anglePS, derivNS] = accelerationAZ,
  [anglePM, derivNS] = accelerationPS
}, inference = minimum ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">soln := Rules( -13, -2.1 ):</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">plot( soln, -17..1 );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">Defuzzify( soln );</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">The defuzzified value is very close to the value found using fuzzy sets on the real domain:  <Equation input-equation="-5.338842975;" style="2D Math">NiMsJC0lJkZsb2F0RzYkIit2SCUpUWAhIiohIiI=</Equation>.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">evalf(%);</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum := proc( initial_angle, initial_angular_velocity, controller, iterations )
  local position, velocity, angle, angular_velocity, dt, plotvehicle, plotlist, i, acceleration, angular_acceleration;

  position := 0;
  velocity := 0;
  angle := evalf( Pi*initial_angle/180 );
  angular_velocity := evalf( Pi*initial_angular_velocity/180 );

  dt := 60.0/1000.0;  # animations run at approximately 1000 frames per minute

  plotvehicle := proc( posn, a, angular_velocity )
    local x, y;

    x := sin(a);
    y := cos(a);
    plots[display](
      plots[pointplot]( [[posn, 0], [posn + x, y]], symbol = circle, symbolsize = 20 ),
      plots[pointplot]( [[-1, 0], [1, 0]] ),
      plottools[line]( [posn, 0], [posn + x, y] ),
      plots[textplot]( [0.5, 1.2, sprintf( "% 3d deg, % 3d deg/s", round( evalf( a*180/Pi ) ), round( evalf( angular_velocity*180/Pi ) ) )] ),
      scaling = constrained
    );
  end proc;

  plotlist := Vector( 1..iterations + 1 );
  plotlist[1] := plotvehicle( position, angle, angular_velocity );

  for i from 2 to iterations + 1 do
    try
      acceleration := 1.5*Defuzzify( controller( angle*180/3.14, angular_velocity*180/3.14 ) );
    catch:
      acceleration := 0;
    end try;

    angular_acceleration := 9.8 * sin( angle ) - acceleration * cos( angle );
    angular_velocity := angular_velocity + angular_acceleration * dt - 0.02 * angular_velocity;
    angle := angle + angular_velocity * dt;
    if i mod 100 = 0 then print( i ); end if;
    velocity := velocity + acceleration * dt;
    position := position + velocity * dt;
    plotlist[i] := plotvehicle( position, angle, angular_velocity );
  end do;

  plots[display]( seq( plotlist[i], i = 1..(i - 1) ), insequence = true, scaling = constrained );
end proc:</Font></Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">This command takes 25% the time of the RealDomain version to run.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum( -10, 40, Rules, 100 );</Font>
</Text-field></Input></Group><Group><Input><Text-field layout="Normal" style="Normal">On my computer, this takes approximately one minute to calculate and the animation runs for approximately one minute.  This should not be taken to imply that this package should be used for real-time systems.</Text-field></Input></Group><Group><Input><Text-field layout="Normal" prompt="&gt; " style="Maple Input"><Font italic="false" underline="false">InvertedPendulum( -10, 40, Rules, 100 );</Font></Text-field></Input></Group></Section><Group><Input><Text-field layout="Normal" style="Text"><Font italic="true">
Legal Notice: The copyright for this application is owned by the author(s). Neither Maplesoft nor the author are responsible for any errors contained within and are not liable for any damages resulting from the use of this material.. This application is intended for non-commercial, non-profit use only. Contact the author for permission if you wish to use this application in for-profit activities.</Font>
</Text-field></Input></Group><Group><Input><Text-field alignment="centred"><Image height="33" width="800">TUZOV3RLVWI8b2I8Uj1NRExDZE5WWlpKOkBMPkg6VEtHeE1rSjo8T2BMb1xcbFF4bFFXZE1XcHNIcVNobVdoWW9lWE9QbVRQbVZgbXZxeXhxPVhqPXhYcXVYYXhuYVhjRVdjPVVSPVV3ZVl3RUxLRExxdFBxPFI6PXJeYXZedVJBdXJaQG5adFZhdVZiPVdiTVl0TXl2YXl2WXl1WVl4bVl4cXl4cVl5dVl5RVlzRVlwbVhweXl5eXlwcXhwPUo6Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpkeTxUeXBDPnFVTENUSmNEWG9YdXNUPGF1cGtjZldNWEBKQ2VVYGROdVRtV3h5eXlwcHVQQ0RTU3VMQ2x1Pjx4VHBRbWxzYl1NaWhVT2BxVGVYU1FPO0BKeFZdd09sOkBzeUZ2PHdcXHRAdHNOblFuXFxWP3c8d1xcP0ZxSmlqWHluWlZ2bnlIRXJtaUJfX3RXaXRbTXl4WVJJSVh2V2d0U1M9O2dRTXdBSUNdSVlyR1hSb2djW0VwcVl0c3huPUJWU1VHdUVBW1d4S3JXYVNIc3NvWUJQa3luS2N0cWdteVVLQVlRWVV3X3JzPXdib1lUV1hJP0lRS3lvW1hAd3lkcXl0WVJHQXlgaXhzW1NseVhhU3lxdXk6bWVsPWRYcXlkSWZ2Z1JJZVNVa1VtVUJHd3VaaXRTO2VRP1M+QWRNYXNua3lTR2JEU3VpbWJTYWJqeXROQXlNdVhsYVRXYUNwO3k/YXQ7X3R4YVR3YXRoP2NqPUdiZ1lWR0NBW2VBa2heaWh5YUlHb1ZkR3h5V2VRYXRhbVZIWXg6U0VJZXd5YWNtY1NCQXZnT3l5c3NFeUJWV0N3UUZ0WVd4WWRNZ2NZX3leVXk/Z2NlW1dYUUNEY3dHdXdITXc/cXd4W2dhY3NjR3J3T3R1S0ZYS3NjW0ZaSUJPcUlySUlda3VJQ2ZSb3NNX3lUU0VXV2NLUXNfcUdIZUlpYVdCc3ZhQVhXb0ZzWVR5dUlZU2RXQ2V0W2ZacE9ZdHZbXFxYU012Tj1YaGx1eGVsXXlsdlVuO1BZc3F2a21tQ3hTRVFQc01PZVVwUUVLTmB5VkFxY3FSUXBZeEhyW3hVXFxBdGdQVmV4bUhIUVlEWHB0TDtleV9cXFhIeHlUcExRPXFKaEprbHFBPXdQeHFPdHBQbXdRPWtXZFNTWWp4aFF0PWxpPFg9UHJcXEhveE1LeHBwZFVQR3hsYDxSYWRXc0VNVWhuTWluYXF2eVxcdF1wSndcXFB0dHQ6bHdfaHk7UHh1RWxXcGZ5cGlReWc8SWJnSHFRP3dSd3ZGZ2NRbm10SV1sWFpvYXV2d1xcXVZpXFw/eXVJakdxeUFfXWpeY2lhXFxedmFZZm1YWXZWX2ZveWRfd1phP3lJUGZOWHBPaW1iSW53aWllUXlaQFtqZltwX2BzP1xcTkBxYXdbPGFfPXFwZEl1XT5nbkhwVWlcXF5hW0FHY1NfeV1wbkhnX29JaT1Ya01gYkteeVVXakZoaENwaWY/bGxoZWxoa0txaz1xZ0NxcUlva0phZFpAXUlPc3BIamdRZ1V2Xk1wXltha1hOb2t4Y0ZheE1YPkVmeD1HSnlZXT11S1dYdWVmY1lDVl9ETztYXW9lRHdJXVVyaElYaEtkdFlndj1zWU14eU1oRUFiZEtkRkVEO01CaW1VWWd2TnNmQnVEZ3F3XnNSWm9pZXlpWUVmRUFzWU9jVTt1Zl9DXjtnPkVJVW1XeV14WltIP1VUaXdoYXliPEVXVUFobWdoVWVlXU9ETHlma1lkT1FETk1zbGVnXW1IR2t5blVyclVoamdidnN0cklDc09pVT91cFVodE1FX2NWVWV5d1dyU2VTdkl3SHFzRVV2d2FTYG12X2tDRWdERUVWT295ZlNGWUdYaFt4ZTt3ZnN5YT9IYmN1X1NpSFVmclN0cXNnSUNVS21SO0lFR0dpRVV4U1Nld2tCUmNpYz9mW0dIc11XQkNlRlNYTWVjQHF3UVlpT0NGaTtiZF9lcGdoQ2NyU0liclVGZktYcE9FPkNkR1VWSF9zcz1HYUVGXFxNaF91REpjWGVXR1NrSUE9VGBbdWhPaUtPeTtJZG9fc0JRZ1BHYmlNeFpJeFs9Uk5RSENVd2xJaFZBcz5NeHY9dDtJZWtlY1tpVG9lQl1ZU1ZzSV1VR2tNZ0M9eE1fY3ZdckNrR2xPeUU9d1ZzeW1vUlBFUkdVV29Lcz4/ZE5HY3FPdkw9RGNnVVVpZD1TZEJZdGFjQmN5VDtzQz8/c1hzQkZFSVBLZHdVaWJVVXVvd3RDeExFUnhHVVBPYz1lZVdXREpfdEJJRmpbUk1XWG9hSW5pRkRZeXZJZkZZSDtFaWZhV0FBZGtRZ1N1SW9ZSFM/c1xcYVlua1ljQ1JYQXk7PXVyU3NVRUdYb3Zta2RVP2JJa3V2SWhmO2hIS1Jtc0lxa0drQ0lFR1NRaVV5P3JbY2h5XURXP1VKd2VvX0hJO0lbaVJQdVlDY2VdeUlRR1NSPVNGY1lASUhOYWJFeWhUO0hcXGdDW2lpRXViWElZWz9GaGtmQWFSeWNjUTtEPE1CTGtzVUd2TV1GT1NXWmFGbm1VVk9CXU1oYGd1XWV3OkNTWFtWVVtkXmlXQ0lUTWtpbmdWbWNZO0V1SWtGWmdldGFTbGtlRF9TbFVkP1NVW1doYF9JSGt1TmFJQkVZQEtoUVtJYlNmbF9DcGdWXUlCZ2NmOkNyT1dXbGlWUFNETXVFa3dCWVFiZ0t4R2lXZmNkZ19jQ29YRHlGb0FGPENZZF9mWlNVS09YbVVFcm12cFdnYVFJZVdHeU1pdU9maGVGWVtVV2dkR3dlWztYQFloPG93c2tUd1VnallkdkVoblRQYExKYXRVbXlvXXhsa1VwZ1BTSG1TT2lTWHRNP0hzSGhXZ2xudT15cE1vc21QV1F0WG1sTERSXmVyYXBwQVBxQFR3dVxcbWY8eXRNb190TlFEbXd1VUJhbFtUS01dVVpcXFZzVVBnXFxPaFhVXWl3PmxUPlR0b2xZVWVNXFxgcTppTkZRa01ldUI8WV55cVtUcXdMeHlZa15tUERoVVRFTFtteGRZVHJVd0hZcHBgUl10c3lobTxcXHJkaE5cXF1WR2VqRXlUQkxsWGhVaWRTa2xWY0lta3VKQVxcT0ZBSnhYVEpcXG9ScFVyXFxxbkVVZjxQT2FvY2lvWHhZVVRSeGhtS0hub1V1QmF2dnh0XUBvcmR5cUlsYHR5Y0V5Zz1TdDxWO0xZYERvREVsQ2hXWWRrcElrU01vcGhuaHFrZU1XPFFYXmRvZ0VtTTxreEFZTT1tcFBLbVRUTW1YZVFMbnVLP0hNZUlVYGBUcU1TZGVOcW14SGVMSz1PVXB4XkBraVlwYHhYVmRvVUBMPVBwckFQSXVSW1FwQFlsdlBXd1FUb01wR2BqT1h5Rmh4QUVUaWVSQURLZ2lvVlBPeVhVbFhUOkl3YzxOZ2VNTnVwXFxYV3JkUUZQUXZsUD1Ub3Nlbz5xWGJpV09cXHlFPVBVaVBBQVNnTHR4WExHPVNUQVNBeGo9QFdpeHdYYFhPQXRIbG9JZW9IaUx2eXVvdU10THRUeUpzQXhCWHJAVHFXWE9zRUtvcHVBRVU8dXlPXFxMVHlQQVhtPXRPVVFuZWFORF1LT1l5THlYYnR4dWhtY1lyWE1raFxceWxMb19lcWB0U2VBT0hdbHFVd2lQbmtQd2xIUGdIcmVoWV5wS2hQd0dQSjs8TzxgcVU9dE14VVVFUFdAUmRJVGZZamphb3dUcU1RalhISlNcXE08RXZhcHBUQG1XTUpAaU9WaHlMUUtxXVQ9RXljPVVocU5hXVBKXFxYXFxMdVtEc1FAT1tYUnc8UmJgUGB0U3VlamNlWVhAVU49ckZleHVIbURta11YUkxhWUVsUm1JUF1QZWNoYHJ4bWE/YXJhYUN4dldRW1xcYVpgeWlGQWo/Z3ZWVmReQG1HeVtoaGp4UXZqSXdNVndQR3lYV19FcGpETm5zeV5FaHZFX2Q6UG5rT2FEQV5DbnhFQW9DaF9ld2M7cGJbSVtad2NVP2twR3d4dmNWVlxcT1dhWUdaV3FiR0dealZrQVFdbVhja2Z3VFZmb3ZaVm5aTHdmb0llUz5lQEh0Y3ZzZ1BuPFlxRE94Y3FiZE5tUHh0cXdoc2ZhZz5teU9lZGhxQ0ZrTldxc3B5XUBfVlFySUl1XW5jTEliPl94ZFFeW3l3XmBeWXFiU3hleWdhPk9rVkBmcFZmZU5obXhlU3duXj9fR09rbGZgUXFnS195Sz95akBweHZ3Ykh0SWB5WWFpP0h2Sl53dlF2WW5nQVZvPVhod2NSZUJJTWZsS1RVX2JgcXJGUUM8VUdSV1k9a1ZXQWl2XVg8Q1N5TXljeXdlb0U+P3R0a3NWZ0JUbXRHSVh2S0RUO0RgYXRwYUdRRVZBPWVmb0hAXVRnc3dzQ2ZXR0ViQ0NMSVl0U3dHO3RSYUM/XWhpW1Rmd1NQVWNTUVlaQ3Vsb0VbS1RuT1NUdURQcWZwUVVfWXhbP1VaPWJgeUN1RVRVZWN0Y3JzYVdJR2hQVVZkQ1hvW0RuO0dUb2Y9QVZCY1lSR2dhYVlic3Z0PVVCdVZJT2VaS2dHbWhIUXJdXXVtc2lmeVRQV3RuZXlaS3lkbUhqb1dSQXNTUUhld0RTPUhqXUM+cWRIW1hISWdrd1RHdXZJX3NnWURnYWJTc2lMWXJiXUljW3VaVXVDZUdOXUlueXlqaVZuTXVKaWJxXUU+PXNIW3RoUURYZ1RcXHFoTndUVm1HZG9TaUtzRF1ERF1VT2tzTz1mWDtYdklkYlV3Umlpc0NFdj90RUFTP2VIW0VIaU95W21jRT9oWTtld0tDclt4O0VDcFVFYUl0Uk1VZU1JQHdGPUd1cUlkcmlYbUFpSG91Ql1VRWt2Ym9EYF1iRGV1XlVIT3N4d0tTb2dWRV9HTlFiQkFkdU1ZUTtZX11YYnFCZVtGRllHRj10WGd4cnlZcEFGRG9pZElSSGdVZj91WEdnXVdndUdpZ11VUlFycDt1PU1IWUlYeGNJYW1zcUVsPHVSPFBNd3R3Tk1xTllNQj9cXGFJaXF2Ym94aGtud0RPdl1ecjphXFxbV2hFeHNuX2NkUW9ATmddb3JMUG5DcHRFP3dKcWk6YWRgP2dqWFxcQm9sOkBkSmlzW3ZlbF5wSz5dVHBjSUhob1Nab1hKT2h3W1dnc2VzdUJmRWddPXV1VVk9cVhaV1ZZTVNaRUNIV0hxZVg8U3VeRXV2WVg7QUZRUUNdXUZsXVNOcUlPPUlMUXdoSXdab2VxRW9PcVZZQFRUcHJXQU5xWXN1eE5BQFdqbHB1YVh5dG1YTVJrZHBJXUtcXExUQD1QZFxcU3hISlNYTmh1bEZZUW10d0poV0k8UXN1UlVwd21cXHJRREx5dU1nTXY+QHBTQHBmdFJpVW5pVFY6dVJSaWw8bFJZPHdsdFNWaUxoSEtEQHZWaVNgRE9mYVR2QXN5TXVLbVFVaHZxbFF1TFdAcWxyYFJkZFJLSW1eUVlBYVh4ZFBcXFR1VmxrdE1ZbXlQQWB4Uml2UlVvTHhLbUFOYWxMYHFWYGVURElPO01ZXFxIb1FpWW5Na0hMTnFoeWxVSlxcdFNedUtKSU1LQVlbcXVmTXJ4QVhmeEp5WHhlYFJQcXhPaW9ybEpXXVhFSFh3XFxsSnFyPVh3TjxUPmBuRlBrbEh2XkxUZF1rdml1Oll3bGhXa1R5RHBMU1VWVXFRQ0F1VFRsaVBvcHVvVEhOU1F5UnRzPklxS1lLaFROUU1zZUFqb2FsclF2YklzbE1wPVxcb2pMVU1EdURReW1hb2lRdWxtUE1FTHdocHVwbG5JdnlwUGBYbENETT5MWUBgcmRxdG95bkBNTEZUVVVQb1xcVVdSXFxXTWV0T0FvRWV3TElVY3RSd0B0XUVSR0BYdHFLdUhRV3FqV0xxWmBMVFVPVHVzbUhQY1lrP0ROPXVUXFxhWFNlTE51S3J0dGZAa0l1blVUWENNdFl5UlVRcGxYd2BYdj1pWHBwdUxtUlVxd1RNbVtdcXhoTEVsdD5sTmlAcVE9UV9sUkw8TmdlcmhoWHdBcnlBTD1pd11JeFlUVXloajtwb3FYUG1VZ0hHXFxnYW5mV2ZGPmhyQXd0d3lbWXM8VnVHWGhTR3hlUGpNXmV4blxcdmFiSE5qVGZmRll3RE5yZUBxb2hlSFdtb1dgXVBcXGdmcV1Ja3h4XFw/dmtubmNcXGdpdXBvdkloTWFaT0lraklkVnF0dj9lZm5oZWBpPU9peFZ1ZVZvcHhqSk91TllgW1dcXGpYXFxTTmtlcXJRX3BVZ2hqTmlOUXRwR1xcQ0llX0lhYllzQHd3QndcXExgeE8/cmBxWmk/Y0BXc1dgXkBmam9nZXBwamtJcG5Ya0tQbmRHYWRHaWRvY0U+bT9GamZfYllmXFxcXD9wXUhpZU5xV2dnZUl1Q0FuaGlad2FlcFlua2dlRnlqdk9odV9bR1FrcGlvU05hP25kaXByVUZqY1ZcXHBRbmd3XVI/XVdGZVd4YD5pX0hAdEF3ZGJueTx4X19PYEZ5Z2dxdWpBdEpoYWlBblNBcz14d3RwXmFZbmxvbG4/ZVlRdEFebUp2d0Q/a1xcUWxdeHFNUGNgX3NqVl1ndnJlT3NJT2twUF5WeV5bVndgT1tnd21McWldTm1aQGhCQXJpUF1PPltASGRtWVp5aXJbTm48WXBlTmZvbnNvXl1kbmZJWXVYd2tFQWNVeW5eQWBdVmV5WXVsUG9nQW47P1xcSz9tdF5ncF5qWEd4Zj55c2Zac2d1PWBzZWJfYUlFU1NKY1dld3RtQ3JFQ2ZnRVJhcUVOQ2hCO2ZeSXZ4WUw9UFNdPXlLWG1HZU1ZTG1yVFNCcExfYFVBbG1YbVhsVVRYRW5eRXNTbW1meVJFWHNERXdlbHZRcWxRYVhAQHRqPHBrVFlrRFNOcXhQUWpsdXNpVEpFTFhRXFxSd2BzUGFTVVlKd1BqZGVzX1FzS2BqQElqX0R1Rm1KbVBMbWxsaDxTU1BLVjxXW2VPYWFUTkB3TGx0dj1xZEBPT0hyYzxLPmh1aFBQPUFwU1VSUF1tYklWU3VybERMcXBLdWFWbGlWPklvT3hKeEx5R1hPaHF0PVFQQlFWSXRSamRWP11QRlBQQ3l2c11ZQl1SWEFzUEx5c1FUXk11TFVPRE11ZURQPVVQcEhzRlV4OlhKYGhObEVZS3lrcVFMUUhTRXVyXmFYX1hKSF1VeXh0Z01SQ1h0anVvP0VRV01MW2FSU2lraWRvZUxzVWR1V0VNdGhZWnlRW3F3eEhUW3RPdTxWR3hxYmBxcDxPUUFXT2VZSUl3XlR2YEhyTnlQO0VLaERMaVRxY1hMcTxOWGVqc0VLc2VUO01ZQTxvc211ZkBVQHR4VU1KWWFNRnV2VmFqVWVsdl14WGBuY3VUaFR4Qlxcd3h0dkNpdUBIc1FVUTptc0p5VVZYTE9lVUFMbWRhWV1UTW91cUVFeFdgeEs9UVFMeUdBeWlIUFxceE9mXXRHPmNKd2BneHdeZl1tSWRKd2dYaXliWF1fXlxcXXhdd1hvb3ZmSmB2Z1FrbFdyaHFgc3hxVGhkX0F1WEhvdGF1eHF2VlBzPmZYUUVHX1lHeXVqR1dxYUNPeUU+V1hbd3VFd3lzTUhzQUNhd1lmc0lpcXZXaVdwV0dvR1ltcXdBZWg7X1hxR1N5W1lRVVc8a0ZhVUdtdWhxZVlFO3hkd2JEVURkV1Y8T1lqbXdjXXJMP1RwdXdGX3NuV3VtaWlhQUlueUJbYVVieXhcXHl5YGNTTG1IeHNJbndZTHdmPW9iX2t0eGdVSldUQl1UdEl2S2tERE1JQ01WWkNIPFdXRjt2WGV1T0dlXlFlTHdpa11Ia0NmclVYdV9EZ29DW09JeXVoX0l5YltlRWhxcnlRP013VGV4SXVOYnVtdjxzT2l3eV11Tz5pZT9vTlhwbkZiXWl5a3l2QHBuTT9eYlFiY09wXUBwTV93T0laXFxpXXRWcEdJdT1QZGJIZk14Y3hYYXQ/YVdQWnN3dz54YUR2djx3cVF2eWtecGlBcl9AZmRZeWZveHNhY3RXX3V2Z0JQbXF2bUtfWk1BclpXWnlBdkNQbXVZZFxcQWJacF1aTmdYd3J5WGF4dmE+d2ZZcGNaZ2VtPnV4aXVbR2lZbnV3UXU8YWlKbnM/XFxVTnBxSGdqZndocVtiYWhiQHhDR2JIVmtrX25UUGVpb2JmeWNVZmBYbmF4aWRsd2lUSGptaGVGP3N3PnFXWHhUV3lnUWJ1cFp0WXBncXBrd3dmV3ZjSFpjQXdbaXVNaXliXm1FZnloX3l5WHNJSW9zWGRKZnh2cV0+eWFSX1pWeHlcXGJTP0ViQXdzXXddd3ZjT0ZvTWh3U1VSYWd5Q1lkaVR3QUJ1QUVHV0Z1U0lHb0VrS1lJR0ZZVVlddXdgdXdYb0d1QUZWV2tHd3F5ZmJAcXJyaWZqP3NZcHU9QF9db249Z1tRQGx0UWJRTlpEZlxcRldlXFx5cXV3WzxwdV4+bHZReFxcWXc8d1xcPFZ4UlBuPXl4aU5bQ05nQl5pck9wd0duRWZ5eVdudHF3Omd3RWZaU3BpX0dcXDw/YFFueFY/d3lnbTxOWl5xeWFHcHh4aU1wa19PaHFZcld4XFx0QHQ/QHZBQVxcZXFfclFxdj51eUB0eWFgV3l5Onh2bXlzWHd5WWZbTVd4b1dtSWd2b0U6O0I6TVRLV0RLV2dKO2VaMTo=</Image></Text-field></Input></Group><Text-field/><Text-field/><Text-field/><Text-field/><Text-field/><Text-field/><Text-field/></Worksheet>