我必须解决以下形式的常微分方程组:
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返回的向量和初始值 条件向量必须具有相同数量的元素。
有什么想法吗? 感谢
答案 0 :(得分:2)
当然,你应该看一下你的函数yprime
。使用一些与您的问题共享差异状态变量数量的简单模型,请看一下这个例子。
function dyds = yprime(s, y)
dyds = zeros(2, 1);
dyds(1) = y(1) + y(2);
dyds(2) = 0.5 * y(1);
end
yprime
必须返回一个包含两个右侧值的列向量。输入参数s
可以忽略,因为您的模型与时间无关。您展示的示例有点困难,因为它不是dy / dt = f(t,y)形式。作为第一步,您必须重新排列方程式。将x
重命名为y(1)
和y
重命名为y(2)
会有所帮助。
另外,您确定global g a v0 d
不是空的吗?如果这些变量中的任何一个仍然未初始化,您将使用空矩阵乘以状态变量,最终导致返回空向量dyds
。这可以用
assert(~isempty(v0), 'v0 not initialized');
<{1>}中的,或者您可以使用调试断点。
答案 1 :(得分:0)
ODE求解器的语法是[s y]=ode45(@yprime, [1 10], [2 2])
并且你不需要在你的情况下进行元素操作,即代替.*
只使用*