{"id":980,"date":"2014-05-12T12:00:30","date_gmt":"2014-05-12T17:00:30","guid":{"rendered":"https:\/\/blogs.mathworks.com\/cleve\/?p=980"},"modified":"2014-05-14T11:13:45","modified_gmt":"2014-05-14T16:13:45","slug":"ordinary-differential-equation-suite","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/cleve\/2014\/05\/12\/ordinary-differential-equation-suite\/","title":{"rendered":"Ordinary Differential Equation Suite"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p>MATLAB and Simulink have a powerful suite of routines for the numerical solution of ordinary differential equations.  Today's post offers an introduction.  Subsequent posts will examine several of the routines in more detail.<\/p><!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#457cc78b-fa31-4c8d-ae5a-4d84ee6dab02\">Simulation<\/a><\/li><li><a href=\"#629c12b9-63b1-44a2-9a1e-431690cdb4b0\">Larry Shampine<\/a><\/li><li><a href=\"#82d245e8-7920-433a-8efd-f2e458d0421b\">The Suite<\/a><\/li><li><a href=\"#7c8ee98f-8e90-491f-9a40-f02131c0bb9c\">ode2<\/a><\/li><li><a href=\"#81f8da78-ae1a-4e6d-905a-5c07ad013e88\">ode4, Classical Runge-Kutta<\/a><\/li><li><a href=\"#e65a85da-8d9d-4126-b0ac-94181edaea4e\">Lorenz graphic<\/a><\/li><\/ul><\/div><h4>Simulation<a name=\"457cc78b-fa31-4c8d-ae5a-4d84ee6dab02\"><\/a><\/h4><p>MATLAB started its life as a \"Matrix Laboratory.\"  The capability for the numerical solution of ordinary differential equations was soon added. This, together with the block diagram programming environment, provides the multidomain simulation companion product Simulink.  The linear equation solutions from the matrix library underlie the stiff solvers in the ode suite.<\/p><h4>Larry Shampine<a name=\"629c12b9-63b1-44a2-9a1e-431690cdb4b0\"><\/a><\/h4><p>Larry Shampine is a highly regarded mathematician and computational scientist.  He is a Professor, now Emeritus, at Southern Methodist University in Dallas.  Before SMU, Larry was with Sandia National Laboratory in Albuquerque.  He has been a consultant to the MathWorks for many years. He has written several books and many research and expository papers. His software, originally in Fortran and more recently in MATLAB, has been the basis for our ODE codes, as well as others in the industry.  Two of Larry's PhD students, Jacek Kierzenka and Michael Hosea, are on the staff of the MathWorks.<\/p><h4>The Suite<a name=\"82d245e8-7920-433a-8efd-f2e458d0421b\"><\/a><\/h4><p>There are seven routines in the MATLAB suite.  Their names all begin with \" <tt>ode<\/tt> \".  This is followed by two or three digits, and then perhaps one or two letters.  The digits indicate the <i>order<\/i>.  Roughly, higher order routines work harder and deliver higher accuracy per step.  A suffix \"s\", \"t\", or \"tb\" designates a method for <i>stiff<\/i> equations. Here is the list of the functions in the suite.<\/p><div><ul><li><tt>ode45<\/tt> --- The first choice for most nonstiff problems.<\/li><li><tt>ode23<\/tt> --- Less stringent accuracy requirements than <tt>ode45<\/tt>.<\/li><li><tt>ode113<\/tt> --- More stringent accuracy requirements than <tt>ode45<\/tt>.<\/li><li><tt>ode15s<\/tt> --- The first choice for most stiff problems.<\/li><li><tt>ode23s<\/tt> --- Less stringent accuracy requirements than <tt>ode15s<\/tt>.<\/li><li><tt>ode23t<\/tt> --- Moderately stiff problems without numerical damping.<\/li><li><tt>ode23tb<\/tt> --- Less stringent accuracy requirements than <tt>ode15s<\/tt>.<\/li><\/ul><\/div><h4>ode2<a name=\"7c8ee98f-8e90-491f-9a40-f02131c0bb9c\"><\/a><\/h4><p>Here is a simple code, <tt>ode2<\/tt>, which I will use to discuss <i>order<\/i> and the digits in the suite naming convention. It uses a fixed step size and evaluates the function defining the differential equation twice per step.  The first function evaluation at the start of the step provides the slope for a half-step to the midpoint of the interval.  The second function evaluation at the midpoint provides the slope for the step all the way across the interval.<\/p><pre class=\"codeinput\">   type <span class=\"string\">ode2<\/span>\r\n<\/pre><pre class=\"codeoutput\">\r\n   function ode2(F,t0,h,tfinal,y0)\r\n   % ODE2  A simple ODE solver.\r\n   %   ODE2(F,t0,h,tfinal,y0) uses a midpoint rule\r\n   %   with fixed step size h on the interval\r\n   %      t0 &lt;= t &lt;= tfinal\r\n   %   to solve\r\n   %      dy\/dt = F(t,y)\r\n   %   with y(t0) = y0.\r\n   \r\n      y = y0;\r\n      for t = t0 : h : tfinal-h\r\n         s1 = F(t,y);\r\n         ymid = y + h*s1\/2;\r\n         s2 = F(t+h\/2, ymid);\r\n         y = y + h*s2;\r\n         disp(y)\r\n      end\r\n<\/pre><p>At first glance you might think that the \"2\" in the name <tt>ode2<\/tt> just comes from the fact that the function <tt>F(t,y)<\/tt> is evaluated twice each step. But the reason for the 2 is deeper than that.  It is actually because this is a <i>second order<\/i> solver.  Let's see what <i>second order<\/i> means. Try solving one of the world's easiest differential equations,<\/p><p>$$ dy\/dt = 1 $$<\/p><p>With initial condition $y(0) = 0$, the solution is<\/p><p>$$ y(t) = t $$<\/p><p>I'm going to solve this on the interval $0 \\le t \\le 10$ with a step size $h = 1$, so the result displays as integers.<\/p><pre class=\"codeinput\">   format <span class=\"string\">short<\/span>\r\n   F = @(t,y) 1;\r\n   ode2(F,0,1,10,0)\r\n<\/pre><pre class=\"codeoutput\">     1\r\n     2\r\n     3\r\n     4\r\n     5\r\n     6\r\n     7\r\n     8\r\n     9\r\n    10\r\n<\/pre><p>Well, we got that right.  Now try<\/p><p>$$ dy\/dt = 2t $$<\/p><p>With initial condition $y(0) = 0$, the solution is<\/p><p>$$ y(t) = t^2 $$<\/p><pre class=\"codeinput\">   F = @(t,y) 2*t;\r\n   ode2(F,0,1,10,0)\r\n<\/pre><pre class=\"codeoutput\">     1\r\n     4\r\n     9\r\n    16\r\n    25\r\n    36\r\n    49\r\n    64\r\n    81\r\n   100\r\n<\/pre><p>Again, we got that right.  So try<\/p><p>$$ dy\/dt = 3t^2 $$<\/p><p>Do we generate<\/p><p>$$ y(t) = t^3 $$<\/p><pre class=\"codeinput\">   F = @(t,y) 3*t.^2;\r\n   ode2(F,0,1,10,0)\r\n<\/pre><pre class=\"codeoutput\">    0.7500\r\n    7.5000\r\n   26.2500\r\n    63\r\n  123.7500\r\n  214.5000\r\n  341.2500\r\n   510\r\n  726.7500\r\n  997.5000\r\n<\/pre><p>No, we do not get $t^3$ exactly.<\/p><p>So, our simple function <tt>ode2<\/tt> computes the exact answer for an ODE whose solution is a polynomial in $t$ of degree 2, but not 3. This is what we mean by a solver of <i>second<\/i> order.<\/p><p>Here's a homework exercise.  Write the other simple <tt>ode2<\/tt>, the one based on the trapezoid rule.  Evaluate <tt>F(t,y)<\/tt> at the start of the interval.  Then take a step all the way across.  Evaluate <tt>F(t,y)<\/tt> a second time at the other end of the interval.  Then use the average of the two slopes to take the actual step.  You should find that the trapezoid version of <tt>ode2<\/tt> has the save behavior as the midpoint version.  It solves polynomials of degree 1 and 2 exactly, but not polynomials of degree 3.<\/p><p>In both of these cases, it turns out that \"2\" is both the number of function evaluations per step and the order.  This is not always the case. In later posts, we will see that as we strive for higher accuracy and more efficient methods, the number of function evaluations required increases faster than the order.<\/p><h4>ode4, Classical Runge-Kutta<a name=\"81f8da78-ae1a-4e6d-905a-5c07ad013e88\"><\/a><\/h4><p>The classical Runge-Kutta method was developed independently by a famous German applied mathematician, Carl Runge, in 1895, and another German applied mathematician, who was not quite as famous, Wilhelm Kutta, in 1901. It was used extensively for hand computations and is still probably in widespread use on digital computers today.  You can see from this MATLAB version, a function called <tt>ode4<\/tt>, that it evaluates <tt>F(t,y)<\/tt> four times per step.<\/p><pre class=\"codeinput\">   type <span class=\"string\">ode4<\/span>\r\n<\/pre><pre class=\"codeoutput\">\r\n   function ode4(F,t0,h,tfinal,y0)\r\n   % ODE4  Classical Runge-Kutta ODE solver.\r\n   %   ODE4(F,t0,h,tfinal,y0) uses the classsical Runge-Kutta\r\n   %   method with fixed step size h on the interval\r\n   %      t0 &lt;= t &lt;= tfinal\r\n   %   to solve\r\n   %      dy\/dt = F(t,y)\r\n   %   with y(t0) = y0.\r\n   \r\n      y = y0;\r\n      for t = t0 : h : tfinal-h\r\n         s1 = F(t,y);\r\n         s2 = F(t+h\/2, y+h*s1\/2);\r\n         s3 = F(t+h\/2, y+h*s2\/2);\r\n         s4 = F(t+h, y+h*s3);\r\n         y = y + h*(s1 + 2*s2 + 2*s3 + s4)\/6;\r\n         disp(y)\r\n      end\r\n<\/pre><p>You will find that this function integrates $1$, $t$, $t^2$ and $t^3$ exactly. But how about $t^4$?<\/p><pre class=\"codeinput\">   format <span class=\"string\">long<\/span> <span class=\"string\">e<\/span>\r\n   F = @(t,y) 5*t^4;\r\n   ode4(F,0,1,10,0)\r\n<\/pre><pre class=\"codeoutput\">     1.041666666666667e+00\r\n     3.208333333333334e+01\r\n     2.431250000000000e+02\r\n     1.024166666666667e+03\r\n     3.125208333333333e+03\r\n     7.776250000000000e+03\r\n     1.680729166666666e+04\r\n     3.276833333333333e+04\r\n     5.904937500000000e+04\r\n     1.000004166666667e+05\r\n<\/pre><p>The exact solution would be the integers, $t^5$, but we didn't quite get them. So, classical Runge-Kutta computes the exact answer for an ODE whose solution is a polynomial in $t$ of degree 4, but not 5. This is what we mean by a solver of <i>fourth<\/i> order, and is the reason why this function is called <tt>ode4<\/tt>.<\/p><p>The name of <tt>ode4<\/tt> has only one digit, not two, and classical Runge-Kutta does not qualify for a spot in the MATLAB suite because the method has a fixed step size.  There is no error estimate.  Modern numerical methods, and modern mathematical software, include error estimates and automatic step size control.  This is the subject of my next blogs.<\/p><h4>Lorenz graphic<a name=\"e65a85da-8d9d-4126-b0ac-94181edaea4e\"><\/a><\/h4><p>I want to include some graphics in today's blog, so here let's use <tt>ode23<\/tt> to plot the three components of the Lorenz chaotic differential equation described in <a href=\"https:\/\/blogs.mathworks.com\/cleve\/2014\/04\/28\/periodic-solutions-to-the-lorenz-equations\/\">my previous blog post<\/a>.<\/p><pre class=\"codeinput\">   type <span class=\"string\">lorenzplot<\/span>\r\n\r\n   lorenzplot\r\n<\/pre><pre class=\"codeoutput\">\r\n   function lorenzplot\r\n   \r\n      % LORENZPLOT  Plot the three components of the solution\r\n      % to the Lorenz equations.\r\n   \r\n      sigma = 10;\r\n      beta = 8\/3;\r\n      rho = 28;\r\n      eta = sqrt(beta*(rho-1));\r\n      A = [ -beta    0     eta\r\n               0  -sigma   sigma \r\n            -eta   rho    -1  ];\r\n         \r\n      v0 = [rho-1 eta eta]';\r\n      y0 = v0 + [3 2 -4]';\r\n      tspan = [0 30];\r\n      \r\n      [t,y] = ode23(@lorenzeqn, tspan, y0);\r\n   \r\n      plot(t,[y(:,1)+15 y(:,2) y(:,3)-40]);\r\n      axis([0 30 -80 80])\r\n      set(gca,'ytick',[-40 0 40],'yticklabel','y3|y2|y1')\r\n      xlabel('t')\r\n      title('Lorenz Attractor') \r\n   \r\n      % ------------------------------------\r\n   \r\n      function ydot = lorenzeqn(t,y)\r\n      \r\n         A(1,3) = y(2);\r\n         A(3,1) = -y(2);\r\n         ydot = A*y;\r\n    \r\n      end\r\n   \r\n   end\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/images\/cleve\/odes_intro_01.png\" alt=\"\"> <script language=\"JavaScript\"> <!-- \r\n    function grabCode_449d17d609cf42568601bb2250098ef0() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='449d17d609cf42568601bb2250098ef0 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 449d17d609cf42568601bb2250098ef0';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        copyright = 'Copyright 2014 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n\r\n        d.title = title + ' (MATLAB code)';\r\n        d.close();\r\n    }   \r\n     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_449d17d609cf42568601bb2250098ef0()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2014a<br><\/p><\/div><!--\r\n449d17d609cf42568601bb2250098ef0 ##### SOURCE BEGIN #####\r\n%% Ordinary Differential Equation Suite\r\n% MATLAB and Simulink have a power suite of routines for the numerical\r\n% solution of ordinary differential equations.  Today's post offers\r\n% an introduction.  Subsequent posts will examine several of the routines\r\n% in more detail.\r\n\r\n%% Simulation\r\n% MATLAB started its life as a \"Matrix Laboratory.\"  The capability for\r\n% the numerical solution of ordinary differential equations was soon added.\r\n% This, together with the block diagram programming environment, provides\r\n% the multidomain simulation companion product Simulink.  The linear\r\n% equation solutions from the matrix library underlie the stiff solvers\r\n% in the ode suite.\r\n\r\n%% Larry Shampine\r\n% Larry Shampine is a highly regarded mathematician and computational\r\n% scientist.  He is a Professor, now Emeritus, at Southern Methodist University\r\n% in Dallas.  Before SMU, Larry was with Sandia National Laboratory in\r\n% Albuquerque.  He has been a consultant to the MathWorks for many years.\r\n% He has written several books and many research and expository papers.\r\n% His software, originally in Fortran and more recently in MATLAB, has been\r\n% the basis for our ODE codes, as well as others in the industry.  Two of\r\n% Larry's PhD students, Jacek Kierzenka and Michael Hosea, are on the staff of\r\n% the MathWorks. \r\n\r\n%% The Suite\r\n% There are seven routines in the MATLAB suite.  Their names all begin with\r\n% \" |ode| \".  This is followed by two or three digits, and then perhaps one or\r\n% two letters.  The digits indicate the _order_.  Roughly, higher order\r\n% routines work harder and deliver higher accuracy per step.  A suffix \"s\",\r\n% \"t\", or \"tb\" designates a method for _stiff_ equations.\r\n% Here is the list of the functions in the suite.\r\n%\r\n% * |ode45| REPLACE_WITH_DASH_DASH- The first choice for most nonstiff problems.\r\n% * |ode23| REPLACE_WITH_DASH_DASH- Less stringent accuracy requirements than |ode45|.\r\n% * |ode113| REPLACE_WITH_DASH_DASH- More stringent accuracy requirements than |ode45|.\r\n% * |ode15s| REPLACE_WITH_DASH_DASH- The first choice for most stiff problems.\r\n% * |ode23s| REPLACE_WITH_DASH_DASH- Less stringent accuracy requirements than |ode15s|.\r\n% * |ode23t| REPLACE_WITH_DASH_DASH- Moderately stiff problems without numerical damping.\r\n% * |ode23tb| REPLACE_WITH_DASH_DASH- Less stringent accuracy requirements than |ode15s|. \r\n\r\n%% ode2\r\n% Here is a simple code, |ode2|, which I will use to discuss _order_\r\n% and the digits in the suite naming convention.\r\n% It uses a fixed step size and evaluates the function defining the\r\n% differential equation twice per step.  The first function evaluation\r\n% at the start of the step provides the slope for a half-step to the\r\n% midpoint of the interval.  The second function evaluation at the midpoint\r\n% provides the slope for the step all the way across the interval.\r\n\r\n   type ode2\r\n\r\n%%\r\n% At first glance you might think that the \"2\" in the name |ode2| just comes\r\n% from the fact that the function |F(t,y)| is evaluated twice each step.\r\n% But the reason for the 2 is deeper than that.  It is actually because this\r\n% is a _second order_ solver.  Let's see what _second order_ means.\r\n% Try solving one of the world's easiest differential equations,\r\n%\r\n% $$ dy\/dt = 1 $$\r\n%\r\n% With initial condition $y(0) = 0$, the solution is\r\n%\r\n% $$ y(t) = t $$\r\n%\r\n% I'm going to solve this on the interval $0 \\le t \\le 10$ with a \r\n% step size $h = 1$, so the result displays as integers.\r\n\r\n   format short\r\n   F = @(t,y) 1;\r\n   ode2(F,0,1,10,0)\r\n\r\n%%\r\n% Well, we got that right.  Now try\r\n%\r\n% $$ dy\/dt = 2t $$\r\n%\r\n% With initial condition $y(0) = 0$, the solution is\r\n%\r\n% $$ y(t) = t^2 $$\r\n\r\n   F = @(t,y) 2*t;\r\n   ode2(F,0,1,10,0)\r\n\r\n%%\r\n% Again, we got that right.  So try\r\n%\r\n% $$ dy\/dt = 3t^2 $$\r\n%\r\n% Do we generate\r\n%\r\n% $$ y(t) = t^3 $$\r\n\r\n   F = @(t,y) 3*t.^2;\r\n   ode2(F,0,1,10,0)\r\n\r\n%%\r\n% No, we do not get $t^3$ exactly.\r\n\r\n%%\r\n% So, our simple function |ode2| computes the exact answer for an ODE\r\n% whose solution is a polynomial in $t$ of degree 2, but not 3.\r\n% This is what we mean by a solver of _second_ order.\r\n\r\n%%\r\n% Here's a homework exercise.  Write the other simple |ode2|, the one\r\n% based on the trapezoid rule.  Evaluate |F(t,y)| at the start of the\r\n% interval.  Then take a step all the way across.  Evaluate |F(t,y)| a second\r\n% time at the other end of the interval.  Then use the average of the two\r\n% slopes to take the actual step.  You should find that the trapezoid version\r\n% of |ode2| has the save behavior as the midpoint version.  It solves\r\n% polynomials of degree 1 and 2 exactly, but not polynomials of degree 3.\r\n\r\n%%\r\n% In both of these cases, it turns out that \"2\" is both the number of function\r\n% evaluations per step and the order.  This is not always the case.\r\n% In later posts, we will see that as we strive for higher accuracy\r\n% and more efficient methods, the number of function evaluations required\r\n% increases faster than the order.\r\n\r\n%% ode4, Classical Runge-Kutta\r\n% The classical Runge-Kutta method was developed independently by a famous\r\n% German applied mathematician, Carl Runge, in 1895, and another German\r\n% applied mathematician, who was not quite as famous, Wilhelm Kutta, in 1901.\r\n% It was used extensively for hand computations and is still probably in\r\n% widespread use on digital computers today.  You can see from this MATLAB \r\n% version, a function called |ode4|, that it evaluates |F(t,y)| four times\r\n% per step.\r\n\r\n   type ode4\r\n\r\n%%\r\n% You will find that this function integrates $1$, $t$, $t^2$ and $t^3$ exactly.\r\n% But how about $t^4$?\r\n\r\n   format long e\r\n   F = @(t,y) 5*t^4;\r\n   ode4(F,0,1,10,0)\r\n\r\n%%\r\n% The exact solution would be the integers, $t^5$, but we didn't quite get them.\r\n% So, classical Runge-Kutta computes the exact answer for an ODE\r\n% whose solution is a polynomial in $t$ of degree 4, but not 5.\r\n% This is what we mean by a solver of _fourth_ order, and is the\r\n% reason why this function is called |ode4|.\r\n\r\n%%\r\n% The name of |ode4| has only one digit, not two, and classical Runge-Kutta\r\n% does not qualify for a spot in the MATLAB suite because the method has a\r\n% fixed step size.  There is no error estimate.  Modern numerical methods,\r\n% and modern mathematical software, include error estimates and automatic\r\n% step size control.  This is the subject of my next blogs.\r\n\r\n%% Lorenz graphic\r\n% I want to include some graphics in today's blog, so here let's use |ode23|\r\n% to plot the three components of the Lorenz chaotic differential equation\r\n% described in\r\n% <https:\/\/blogs.mathworks.com\/cleve\/2014\/04\/28\/periodic-solutions-to-the-lorenz-equations\/\r\n% my previous blog post>.\r\n\r\n   type lorenzplot\r\n\r\n   lorenzplot\r\n\r\n##### SOURCE END ##### 449d17d609cf42568601bb2250098ef0\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img decoding=\"async\"  class=\"img-responsive\" src=\"https:\/\/blogs.mathworks.com\/images\/cleve\/odes_intro_01.png\" onError=\"this.style.display ='none';\" \/><\/div><!--introduction--><p>MATLAB and Simulink have a powerful suite of routines for the numerical solution of ordinary differential equations.  Today's post offers an introduction.  Subsequent posts will examine several of the routines in more detail.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/cleve\/2014\/05\/12\/ordinary-differential-equation-suite\/\">read more >><\/a><\/p>","protected":false},"author":78,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[24,16,8],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/980"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/comments?post=980"}],"version-history":[{"count":4,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/980\/revisions"}],"predecessor-version":[{"id":997,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/980\/revisions\/997"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media?parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/categories?post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/tags?post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}