2014-10-29 2 views
0

У меня есть вектор с дискретными значениями, которые мне нужно передать в мою систему ODE, и я хочу использовать команду ode45. Этот вектор должен быть интерполирован в решателе, когда я его использую. Есть ли способ сделать это?Интерполяция внутри ode45

У меня есть система линейных ОДУ.

dxdt = f(t)*x + g(t)*y 
dydt = g(t)*x + h(t)*y 

У меня есть три вектора f (t), g (t) и h (t) как функция от t. Мне нужно передать их в решатель.

Я могу скопировать решателя Runge-Kutta на C или C++. Мне предложили, чтобы сделать это в Матлабе быстрее. Может кто-нибудь предложить способ сделать это?

+0

http://www.mathworks.com/help/matlab/ref/interp1.html – Cheery

ответ

2

Несомненно, вы можете использовать interp1. Предположим, у вас есть векторы fvec, gvec и tvec, содержащие соответственно значения F, G, и моменты времени, в которые принимаются эти значения, вы можете определить производную функции как:

dxydt = @(t,x) [interp1(tvec, fvec, t) * x(1) + interp1(tvec, gvec, t) * x(2) 
       interp1(tvec, gvec, t) * x(1) + interp1(tvec, hvec, t) * x(2)]; 

и использовать его в ode45:

[T,Y] = ode45(dxydt, tspan, [x0; y0]); 
+0

большое спасибо! Это сработало. Очень признателен! –

+0

Привет @Simon, зачем нам интерполяцию, если мы знаем точную форму зависимых от времени параметров? – kyle

+0

Привет @Simon может 'tvec = tspan'? – kyle

Смежные вопросы