Как использовать функцию interp1 в matlab для функции типа symfun?

У меня есть решения для системы дифференциальных уравнений в моем сценарии 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 ответ

Решение

Я не уверен, что 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

Другие вопросы по тегам