【发布时间】:2013-02-08 13:07:51
【问题描述】:
我必须求解以下形式的常微分方程组:
dx/ds = 1/x * [y* (g + s/y) - a*x*f(x^2,y^2)]
dy/ds = 1/x * [-y * (b + y) * f()] - y/s - c
其中x,y是我需要找出的变量,s是自变量;其余的都是常数。到目前为止,我尝试使用 ode45 解决此问题,但没有成功:
y = ode45(@yprime, s, [1 1]);
function dyds = yprime(s,y)
global g a v0 d
dyds_1 = 1./y(1) .*(y(2) .* (g + s ./ y(2)) - a .* y(1) .* sqrt(y(1).^2 + (v0 + y(2)).^2));
dyds_2 = - (y(2) .* (v0 + y(2)) .* sqrt(y(1).^2 + (v0 + y(2)).^2))./y(1) - y(2)./s - d;
dyds = [dyds_1; dyds_2];
return
其中@yprime 具有方程组。我收到以下错误消息:
YPRIME 返回一个长度为 0 的向量,但初始的长度 条件向量为 2。 YPRIME 返回的向量和初始 条件向量必须具有相同数量的元素。
有什么想法吗? 谢谢
【问题讨论】:
-
我敢打赌,
g、a、v0或d中的至少一个保持未初始化,因此[]。使用这些“系数”将为dyds生成一个空向量。您可以在yprime中使用assert(~isempty(v0), 'v0 not initialized')进行测试。 -
你的方程是奇异的。你除以x,但你的初始条件是x = 0。不知道这是否是你错误的根源,但会是个问题。
-
顺便说一句:这里使用全局变量不是最佳实践。使用 ode45 传输参数请参阅:stackoverflow.com/questions/29215121/…
-
谢谢朋友,这当然很有帮助!
标签: matlab differential-equations ode