如何在symfun类型的函数上在matlab中使用interp1函数?

时间:2019-03-03 00:21:35

标签: matlab interpolation ode differential-equations dsolve

我在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。 在matlab中的symfun函数类型上使用interp1的正确方法是什么? 附言自变量't'尚未被定义为任何事先说过的向量(我理解matlab喜欢向量)。

1 个答案:

答案 0 :(得分:2)

我不确定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的初始值都可以使用。否则,任何其他问题都会收敛到不同/错误的答案。

您可以在此处详细了解fsolvehttps://www.mathworks.com/help/optim/ug/fsolve.html