Как использовать функцию interp1 в matlab для функции типа symfun? - PullRequest
0 голосов
/ 03 марта 2019

У меня есть решения для системы дифференциальных уравнений в моем сценарии matlab.Я определяю свои функции следующим образом:

syms V_x(t) V_y(t) X(t) Y(t);
ode_V_x = diff(V_x,t) == -(B/m)*V_x;
ode_V_y = diff(V_y,t) == -g - (B/m)*V_y;
ode_X = diff(X,t) == V_x;
ode_Y = diff(Y,t) == V_y;

Затем я решаю их с надлежащими начальными условиями следующим образом:

[V_xSol(t), V_ySol(t), XSol(t), YSol(t)] = dsolve(odes,conds);

Например, решение для Y (t) получается следующим образом:

YSol(t) = exp(-t/5)*((981*exp(t/5))/4 - 12891678040772023/35184372088832) - (981*t)/20 + 4262710785985975/35184372088832

Теперь мне нужно найти значение времени, за которое Y(t) = 0.Я думал об использовании функции interp1 в Matlab, выполнив: t_f = interp1([0,5],YSol,0);, но она не работает.Ошибка гласит: Values V must be of type double or single.Как правильно использовать interp1 для функции типа symfun в matlab?PS независимая переменная 't' не была определена как вектор чего-либо ранее (я понимаю, что Matlab любит векторы).

1 Ответ

0 голосов
/ 03 марта 2019

Я не уверен, что функция interpl является правильным инструментом для работы.Вы можете использовать fsolve для достижения желаемого результата.

Использование fsolve:

fsolve(function handle, initial guess)

Это реализовано для вашей проблемы в Matlab ниже:

t = fsolve(@(t)exp(-t/5)*((981*exp(t/5))/4 - 12891678040772023/35184372088832) - (981*t)/20 + 4262710785985975/35184372088832, 5)

Ответ, в данном случае, является 4.3243.Обратите внимание, что ответ зависит от первоначального предположения, которое вы даете решателю.В вашем случае я заметил, что любое начальное значение выше 2 должно работать.Все остальное приведет к другому / неправильному ответу.

Подробнее о fsolve можно прочитать здесь: https://www.mathworks.com/help/optim/ug/fsolve.html

...