0

我必须求解以下形式的常微分方程组:

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 返回的向量和初始条件向量必须具有相同数量的元素。

有任何想法吗?谢谢

4

2 回答 2

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) 的形式。作为第一步,您必须重新排列方程式。这将有助于重命名xy(1)和。yy(2)

另外,你确定你global g a v0 d的不是空的吗?如果其中任何一个变量仍未初始化,则您将状态变量与空矩阵相乘,最终导致dyds返回一个空向量。这可以用

assert(~isempty(v0), 'v0 not initialized');

in yprime,或者您可以使用调试断点。

于 2013-02-05T23:46:43.230 回答
0

ODE 求解器的语法是[s y]=ode45(@yprime, [1 10], [2 2])

而且你不需要在你的情况下进行元素操作,而不是.*仅仅使用*y(:,1) 针对 s 绘制初始条件 [2 2] 和参数值:g=1;a=2;v0=1;d=1.5;

y(:,2) 与 s

于 2013-02-07T10:53:09.137 回答