{"id":2035,"date":"2016-11-14T12:00:30","date_gmt":"2016-11-14T17:00:30","guid":{"rendered":"https:\/\/blogs.mathworks.com\/cleve\/?p=2035"},"modified":"2016-10-21T16:58:37","modified_gmt":"2016-10-21T21:58:37","slug":"my-favorite-ode","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/cleve\/2016\/11\/14\/my-favorite-ode\/","title":{"rendered":"My Favorite ODE"},"content":{"rendered":"\r\n\r\n<div class=\"content\"><!--introduction--><p>My favorite ordinary differential equation provides a good test of ODE solvers, both numeric and symbolic.  It also provides a nice illustration of the underlying existence theory and error analysis.<\/p><!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#e9cfe23b-6372-49f7-ab23-b01b6ee9d3a9\">Implicit equation<\/a><\/li><li><a href=\"#7caab8c4-56bf-46bd-a91d-8005cc63b086\">Explicit equation<\/a><\/li><li><a href=\"#51737a7c-d976-4453-b164-17332e2e9cd3\">First attempt<\/a><\/li><li><a href=\"#c0151fdf-530d-43c7-a8bb-e535425f3dc5\">Keep in bounds<\/a><\/li><li><a href=\"#c041c52e-3fe0-4872-a834-7b6dd47871e6\">Switch sign<\/a><\/li><li><a href=\"#85a57c66-fd24-49c3-bafe-f2a8de0c9abf\">Jacobian<\/a><\/li><li><a href=\"#50e7007d-5670-4ed3-8694-2f4db9cf1134\">Nonuniqueness<\/a><\/li><li><a href=\"#f7bd4afa-3a96-462d-8dce-595ef60b3201\">Symbolic solutions<\/a><\/li><li><a href=\"#b643dd70-6efc-4b2a-8c32-50e833b81e6f\">Simplify<\/a><\/li><li><a href=\"#00b65aca-4779-4887-944f-9ad5d54befd7\">Second order equation<\/a><\/li><li><a href=\"#8e3762dc-ed7a-4f4d-8c56-410caa347e47\">First order system.<\/a><\/li><li><a href=\"#9f88d041-aae1-4bf9-b3d8-cc9f5b565293\">pi_axis<\/a><\/li><\/ul><\/div><h4>Implicit equation<a name=\"e9cfe23b-6372-49f7-ab23-b01b6ee9d3a9\"><\/a><\/h4><p>Here is one of my favorite ordinary differential equations. The dot means differentiation with respect to $t$. The equation does not express $\\dot{y}$ directly, so it is implicit.<\/p><p>$$ \\dot{y}^2 + y^2 = 1 $$<\/p><p>We don't need a computer to verify that the analytic solution is a combination of $\\sin{t}$ and $\\cos{t}$.   But the constants $y=1$ and $y=-1$ are also solutions.<\/p><h4>Explicit equation<a name=\"7caab8c4-56bf-46bd-a91d-8005cc63b086\"><\/a><\/h4><p>Our ODE solvers require an explicit equation, but when we solve this equation for $\\dot{y}$ we get two solutions, differing in sign.<\/p><p>$$ \\dot{y} = \\pm \\sqrt{1-y^2} $$<\/p><p>That $\\pm$ sign makes this interesting.<\/p><h4>First attempt<a name=\"51737a7c-d976-4453-b164-17332e2e9cd3\"><\/a><\/h4><p>Let's plunge ahead with the $+$ sign.  Specify the equation, an interval for $t$ and an initial condition.<\/p><pre class=\"codeinput\">   f = @(t,y) sqrt(1-y^2)\r\n   format <span class=\"string\">short<\/span>\r\n   tspan = [0 pi]\r\n   y0 = 0\r\n<\/pre><pre class=\"codeoutput\">f = \r\n    @(t,y)sqrt(1-y^2)\r\ntspan =\r\n         0    3.1416\r\ny0 =\r\n     0\r\n<\/pre><p>An attempt to compute a numeric solution with <tt>ode45<\/tt> runs into trouble when $y$ gets slightly larger than $1$ and the square root of a negative number generates an imaginary result.  So temporarily use a shorter $t$ interval.<\/p><pre class=\"codeinput\">   <span class=\"keyword\">try<\/span>\r\n      ode45(f,tspan,y0);\r\n   <span class=\"keyword\">catch<\/span>\r\n      ode45(f,[0 1.47],y0)\r\n   <span class=\"keyword\">end<\/span>\r\n   pi_axis([-0.1 1.1])\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_01.png\" alt=\"\"> <pre class=\"language-matlab\">Error <span class=\"string\">using<\/span> <span class=\"string\">odeplot<\/span> <span class=\"string\">(line 63)<\/span>\r\nError <span class=\"string\">updating<\/span> <span class=\"string\">the<\/span> <span class=\"string\">ODEPLOT<\/span> <span class=\"string\">window.<\/span>\r\nSolution <span class=\"string\">data<\/span> <span class=\"string\">may<\/span> <span class=\"string\">have<\/span> <span class=\"string\">been<\/span> <span class=\"string\">corrupted.<\/span> <span class=\"string\">Argument<\/span> <span class=\"string\">Y<\/span> <span class=\"string\">cannot<\/span> <span class=\"string\">be<\/span> <span class=\"string\">complex.<\/span>\r\nError <span class=\"string\">in<\/span> <span class=\"string\">ode45<\/span> <span class=\"string\">(line 435)<\/span>\r\n<\/pre><h4>Keep in bounds<a name=\"c0151fdf-530d-43c7-a8bb-e535425f3dc5\"><\/a><\/h4><p>Change the equation so that it provides a guard against the square root of negative numbers.<\/p><pre class=\"codeinput\">   f = @(t,y) sqrt(1-min(y,1)^2)\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-0.1 1.1])\r\n<\/pre><pre class=\"codeoutput\">f = \r\n    @(t,y)sqrt(1-min(y,1)^2)\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_02.png\" alt=\"\"> <p>This is the correct solution, $\\sin{t}$.  For a while.  But when $y$ reaches $1$ it has to stay there because its derivative is always nonnegative.<\/p><h4>Switch sign<a name=\"c041c52e-3fe0-4872-a834-7b6dd47871e6\"><\/a><\/h4><p>If we want to continue with $\\sin{t}$ beyond $\\pi\/2$ we have to switch to the minus sign.<\/p><pre class=\"codeinput\">   f = @(t,y) (1-2*double(t&gt;pi\/2))*real(sqrt(1-y.^2))\r\n   ode45(f,tspan,y0)\r\n   pi_axis([-0.1 1.1])\r\n<\/pre><pre class=\"codeoutput\">f = \r\n    @(t,y)(1-2*double(t&gt;pi\/2))*real(sqrt(1-y.^2))\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_03.png\" alt=\"\"> <h4>Jacobian<a name=\"85a57c66-fd24-49c3-bafe-f2a8de0c9abf\"><\/a><\/h4><p>We're solving the autonomous differential equation,<\/p><p>$$ \\dot{y} = f(y) $$<\/p><p>where<\/p><p>$$ f(y) = \\sqrt{1-y^2} $$<\/p><p>An important quantity in both the existence theory for ODEs and the error analysis for numeric methods is the <i>Jacobian<\/i>.<\/p><p>$$ J = \\frac{\\partial{f}}{\\partial{y}} $$<\/p><p>In this case $J$ is 1-by-1.<\/p><p>$$ J = -\\frac{y}{\\sqrt{1 - y^2}} $$<\/p><p>When $y$ approaches $\\pm 1$ the Jacobian approaches infinity.<\/p><p>Existence and uniqueness theorems for ODEs rely on a bounded Jacobian (or a bounded Lipschitz constant).  The derivations of numerical methods rely on a bounded Jacobian.  Error control in modern ODE software relies on a bounded Jacobian.  All of these are up in the air with this example.<\/p><h4>Nonuniqueness<a name=\"50e7007d-5670-4ed3-8694-2f4db9cf1134\"><\/a><\/h4><p>We can see the lack of uniqueness happening when we change the initial condition to $y(0) = -1$.  The Jacobian is infinite at the start and both the constant $y(t) = -1$ and the trig function $y(t) = -\\cos{t}$ are solutions. A small perturbation in the initial condition switches the numerical solution from one to the other.<\/p><pre class=\"codeinput\">   f = @(t,y) sqrt(1-max(min(y,1),-1)^2)\r\n\r\n   y0 = -1\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-1.2 0])\r\n   hold <span class=\"string\">on<\/span>\r\n\r\n   format <span class=\"string\">long<\/span>\r\n   y0 = -.99999999\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-1.1 1.1])\r\n   hold <span class=\"string\">off<\/span>\r\n<\/pre><pre class=\"codeoutput\">f = \r\n    @(t,y)sqrt(1-max(min(y,1),-1)^2)\r\ny0 =\r\n    -1\r\ny0 =\r\n  -0.999999990000000\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_04.png\" alt=\"\"> <h4>Symbolic solutions<a name=\"f7bd4afa-3a96-462d-8dce-595ef60b3201\"><\/a><\/h4><p>I was curious to see how the Symbolic Toolbox handles this equation with this initial condition.  There is good news and surprising news.<\/p><pre class=\"codeinput\">   syms <span class=\"string\">y(t)<\/span>\r\n   ode = diff(y)^2+y^2==1\r\n   init = y(0)==-1\r\n   ysym = dsolve(ode,init)\r\n<\/pre><pre class=\"codeoutput\">ode(t) =\r\ndiff(y(t), t)^2 + y(t)^2 == 1\r\ninit =\r\ny(0) == -1\r\nysym =\r\n          -1\r\n -cosh(t*1i)\r\n<\/pre><p>I am pleased to see the two solutions confirmed, but I am surprised to see the second one expressed as a hyperbolic trig function of an imaginary argument.<\/p><h4>Simplify<a name=\"b643dd70-6efc-4b2a-8c32-50e833b81e6f\"><\/a><\/h4><p>Simplification generates a more familiar form.<\/p><pre class=\"codeinput\">   simplify(ysym)\r\n<\/pre><pre class=\"codeoutput\">ans =\r\n      -1\r\n -cos(t)\r\n<\/pre><h4>Second order equation<a name=\"00b65aca-4779-4887-944f-9ad5d54befd7\"><\/a><\/h4><p>Let's return to the original implicit equation and differentiate the entire equation with respect to $t$.<\/p><p>$$ \\frac{d}{dt} \\left( \\dot{y}^2 + y^2 = 1 \\right) $$<\/p><p>$$ 2 \\dot{y} \\ddot{y} + 2 y \\dot{y} = 0 $$<\/p><p>We can divide through this equation by $2 \\dot{y}$, provided that ${\\dot{y}}$ is nonzero.  This eliminates the constant solutions and produces an old friend, the harmonic oscillator.<\/p><p>$$ \\ddot{y} + y = 0 $$<\/p><h4>First order system.<a name=\"8e3762dc-ed7a-4f4d-8c56-410caa347e47\"><\/a><\/h4><p>Our ODE solvers need the second order equation to be expressed as a first order system.<\/p><p>$$ \\dot{y_1} = y_2, \\ \\ \\dot{y_2} = -y_1 $$<\/p><p>Now there is no trouble computing $\\sin{t}$ and $-\\cos{t}$.<\/p><pre class=\"codeinput\">   f = @(t,y)[y(2); -y(1)]\r\n   y0 = [0; -1]\r\n   ode23(f,tspan,y0)\r\n   pi_axis([-1 1])\r\n<\/pre><pre class=\"codeoutput\">f = \r\n    @(t,y)[y(2);-y(1)]\r\ny0 =\r\n     0\r\n    -1\r\n<\/pre><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_05.png\" alt=\"\"> <h4>pi_axis<a name=\"9f88d041-aae1-4bf9-b3d8-cc9f5b565293\"><\/a><\/h4><p>I have been using this little function to label the x-axis with multiples of $\\pi$ and scale the y-axis.<\/p><pre class=\"codeinput\">   type <span class=\"string\">pi_axis<\/span>\r\n<\/pre><pre class=\"codeoutput\">\r\nfunction pi_axis(yaxis)\r\n   axis([0 pi yaxis])\r\n   set(gca,'xtick',0:pi\/4:pi, ...\r\n       'xticklabels',{0 '\\pi\/4' '\\pi\/2' '3\\pi\/4' '\\pi'})\r\nend\r\n<\/pre><script language=\"JavaScript\"> <!-- \r\n    function grabCode_90479354b1dc4b9895c5cd27eb939ae5() {\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='90479354b1dc4b9895c5cd27eb939ae5 ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' 90479354b1dc4b9895c5cd27eb939ae5';\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 2016 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_90479354b1dc4b9895c5cd27eb939ae5()\"><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; R2016a<br><\/p><\/div><!--\r\n90479354b1dc4b9895c5cd27eb939ae5 ##### SOURCE BEGIN #####\r\n%% My Favorite ODE\r\n% My favorite ordinary differential equation provides a good test of\r\n% ODE solvers, both numeric and symbolic.  It also provides a nice\r\n% illustration of the underlying existence theory and error analysis.\r\n\r\n%% Implicit equation\r\n% Here is one of my favorite ordinary differential equations.\r\n% The dot means differentiation with respect to $t$.\r\n% The equation does not express $\\dot{y}$ directly, so it is implicit.\r\n%\r\n% $$ \\dot{y}^2 + y^2 = 1 $$\r\n\r\n%%\r\n% We don't need a computer to verify that the analytic solution is a\r\n% combination of $\\sin{t}$ and $\\cos{t}$.   But the constants $y=1$ and \r\n% $y=-1$ are also solutions.\r\n\r\n%% Explicit equation\r\n% Our ODE solvers require an explicit equation, but when we solve this\r\n% equation for $\\dot{y}$ we get two solutions, differing in sign.\r\n%\r\n% $$ \\dot{y} = \\pm \\sqrt{1-y^2} $$\r\n%\r\n% That $\\pm$ sign makes this interesting.\r\n\r\n%% First attempt\r\n% Let's plunge ahead with the $+$ sign.  Specify the equation,\r\n% an interval for $t$ and an initial condition.\r\n\r\n   f = @(t,y) sqrt(1-y^2)\r\n   format short\r\n   tspan = [0 pi]\r\n   y0 = 0\r\n   \r\n%%\r\n% An attempt to compute a numeric solution with |ode45| runs into trouble\r\n% when $y$ gets slightly larger than $1$ and the square root of a negative \r\n% number generates an imaginary result.  So temporarily use a shorter\r\n% $t$ interval.\r\n\r\n   try\r\n      ode45(f,tspan,y0);\r\n   catch\r\n      ode45(f,[0 1.47],y0)\r\n   end\r\n   pi_axis([-0.1 1.1])\r\n   \r\n%%\r\n%   Error using odeplot (line 63)\r\n%   Error updating the ODEPLOT window. \r\n%   Solution data may have been corrupted. Argument Y cannot be complex.\r\n%   Error in ode45 (line 435)  \r\n   \r\n%% Keep in bounds\r\n% Change the equation so that it provides a guard against the square root\r\n% of negative numbers.\r\n  \r\n   f = @(t,y) sqrt(1-min(y,1)^2)\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-0.1 1.1])\r\n   \r\n\r\n%%\r\n% This is the correct solution, $\\sin{t}$.  For a while.  But when $y$\r\n% reaches $1$ it has to stay there because its derivative is always\r\n% nonnegative.\r\n   \r\n%% Switch sign\r\n% If we want to continue with $\\sin{t}$ beyond $\\pi\/2$ we have to switch\r\n% to the minus sign.\r\n\r\n   f = @(t,y) (1-2*double(t>pi\/2))*real(sqrt(1-y.^2))\r\n   ode45(f,tspan,y0)\r\n   pi_axis([-0.1 1.1])\r\n   \r\n%% Jacobian\r\n% We're solving the autonomous differential equation,\r\n%\r\n% $$ \\dot{y} = f(y) $$\r\n%\r\n% where\r\n%\r\n% $$ f(y) = \\sqrt{1-y^2} $$\r\n\r\n%%\r\n% An important quantity in both the existence theory for ODEs and the\r\n% error analysis for numeric methods is the _Jacobian_.\r\n%\r\n% $$ J = \\frac{\\partial{f}}{\\partial{y}} $$\r\n%\r\n% In this case $J$ is 1-by-1.\r\n%\r\n% $$ J = -\\frac{y}{\\sqrt{1 - y^2}} $$\r\n%\r\n% When $y$ approaches $\\pm 1$ the Jacobian approaches infinity.\r\n\r\n%%\r\n% Existence and uniqueness theorems for ODEs rely on a bounded Jacobian\r\n% (or a bounded Lipschitz constant).  The derivations of numerical methods\r\n% rely on a bounded Jacobian.  Error control in modern ODE software\r\n% relies on a bounded Jacobian.  All of these are up in the air with this\r\n% example.\r\n   \r\n%% Nonuniqueness\r\n% We can see the lack of uniqueness happening when we change the initial\r\n% condition to $y(0) = -1$.  The Jacobian is infinite at the start \r\n% and both the constant $y(t) = -1$ and the trig function\r\n% $y(t) = -\\cos{t}$ are solutions.\r\n% A small perturbation in the initial condition switches the numerical\r\n% solution from one to the other.\r\n\r\n   f = @(t,y) sqrt(1-max(min(y,1),-1)^2)\r\n   \r\n   y0 = -1\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-1.2 0])\r\n   hold on\r\n\r\n   format long\r\n   y0 = -.99999999\r\n   ode45(f,tspan,y0);\r\n   pi_axis([-1.1 1.1])\r\n   hold off\r\n   \r\n   \r\n%% Symbolic solutions\r\n% I was curious to see how the Symbolic Toolbox handles this equation\r\n% with this initial condition.  There is good news and surprising news.\r\n\r\n   syms y(t)\r\n   ode = diff(y)^2+y^2==1\r\n   init = y(0)==-1\r\n   ysym = dsolve(ode,init)\r\n \r\n%%\r\n% I am pleased to see the two solutions confirmed, but I am surprised\r\n% to see the second one expressed as a hyperbolic trig function of an\r\n% imaginary argument.\r\n   \r\n      \r\n%% Simplify\r\n% Simplification generates a more familiar form.\r\n\r\n   simplify(ysym)\r\n   \r\n%% Second order equation\r\n% Let's return to the original implicit equation and differentiate\r\n% the entire equation with respect to $t$.\r\n%\r\n% $$ \\frac{d}{dt} \\left( \\dot{y}^2 + y^2 = 1 \\right) $$\r\n%\r\n% $$ 2 \\dot{y} \\ddot{y} + 2 y \\dot{y} = 0 $$\r\n%\r\n% We can divide through this equation by $2 \\dot{y}$, provided that\r\n% ${\\dot{y}}$ is nonzero.  This eliminates the constant solutions and\r\n% produces an old friend, the harmonic oscillator.\r\n%\r\n% $$ \\ddot{y} + y = 0 $$\r\n\r\n%% First order system.\r\n% Our ODE solvers need the second order equation to be expressed as a \r\n% first order system.\r\n%\r\n% $$ \\dot{y_1} = y_2, \\ \\ \\dot{y_2} = -y_1 $$\r\n\r\n%%\r\n% Now there is no trouble computing $\\sin{t}$ and $-\\cos{t}$.\r\n\r\n   f = @(t,y)[y(2); -y(1)]\r\n   y0 = [0; -1]\r\n   ode23(f,tspan,y0)\r\n   pi_axis([-1 1])\r\n   \r\n%% pi_axis\r\n% I have been using this little function to label the x-axis with\r\n% multiples of $\\pi$ and scale the y-axis.\r\n\r\n   type pi_axis\r\n   \r\n   \r\n##### SOURCE END ##### 90479354b1dc4b9895c5cd27eb939ae5\r\n-->","protected":false},"excerpt":{"rendered":"<div class=\"overview-image\"><img decoding=\"async\"  class=\"img-responsive\" src=\"https:\/\/blogs.mathworks.com\/cleve\/files\/favorite_blog_01.png\" onError=\"this.style.display ='none';\" \/><\/div><!--introduction--><p>My favorite ordinary differential equation provides a good test of ODE solvers, both numeric and symbolic.  It also provides a nice illustration of the underlying existence theory and error analysis.... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/cleve\/2016\/11\/14\/my-favorite-ode\/\">read more >><\/a><\/p>","protected":false},"author":78,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,24,16],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/2035"}],"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=2035"}],"version-history":[{"count":1,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/2035\/revisions"}],"predecessor-version":[{"id":2036,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/posts\/2035\/revisions\/2036"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/media?parent=2035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/categories?post=2035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/cleve\/wp-json\/wp\/v2\/tags?post=2035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}