Solving an ODE when the function is given as discrete values -matlab-
I have the following ODE:
x_dot = 3*x.^0.5-2*x.^1.5 % (Equation 1)
I am using ode45
to solve it. My solution is given as a vector of dim(k x 1) (usually k = 41, which is given by the tspan
).
On the other hand, I have made a model that approximates the model from (1), but in order to compare how accurate this second model is, I want to solve it (solve the second ODE) by means of ode45
. My problem is that this second ode is given discrete:
x_dot = f(x) % (Equation 2)
f
is discrete and not a continuous function like in (1). The values I have for f
are:
0.5644
0.6473
0.7258
0.7999
0.8697
0.9353
0.9967
1.0540
1.1072
1.1564
1.2016
1.2429
1.2803
1.3138
1.3435
1.3695
1.3917
1.4102
1.4250
1.4362
1.4438
1.4477
1.4482
1.4450
1.4384
1.4283
1.4147
1.3977
1.3773
1.3535
1.3263
1.2957
1.2618
1.2246
1.1841
1.1403
1.0932
1.0429
0.9893
0.9325
0.8725
What I want now is to solve this second ode using ode45
. Hopefully I will get a solution very similar that the one from (1). How can I solve a discrete ode applying ode45
? Is it possible to use ode45
? Otherwise I can use Runge-Kutta
but I want to be fair comparing the two methods, which means that I have to solve them by the same way.
Solution 1:
You can use interp1
to create an interpolated lookup table function:
fx = [0.5644 0.6473 0.7258 0.7999 0.8697 0.9353 0.9967 1.0540 1.1072 1.1564 ...
1.2016 1.2429 1.2803 1.3138 1.3435 1.3695 1.3917 1.4102 1.4250 1.4362 ...
1.4438 1.4477 1.4482 1.4450 1.4384 1.4283 1.4147 1.3977 1.3773 1.3535 ...
1.3263 1.2957 1.2618 1.2246 1.1841 1.1403 1.0932 1.0429 0.9893 0.9325 0.8725];
x = 0:0.25:10
f = @(xq)interp1(x,fx,xq);
Then you should be able to use ode45
as normal:
tspan = [0 1];
x0 = 2;
xout = ode45(@(t,x)f(x),tspan,x0);
Note that you did not specify what values of of x
your function (fx
here) is evaluated over so I chose zero to ten. You'll also not want to use the copy-and-pasted values from the command window of course because they only have four decimal places of accuracy. Also, note that because ode45
required the inputs t
and then x
, I created a separate anonymous function using f
, but f
can created with an unused t
input if desired.