【问题标题】:The length of the vector returned by COPY_OF_ODEFUN is 1, but the length of the initial condition vector is 2COPY_OF_ODEFUN返回的向量长度为​​1,但初始条件向量的长度为2
【发布时间】:2020-02-12 16:16:27
【问题描述】:

我尝试通过 ode45 解决 Copy_of_odefun。我得到了错误:COPY_OF_odefun返回的向量长度为​​1,但初始条件向量的长度为2。我的代码如下。

主要功能:

clear all; clc;
%% Inpput parameters
lambda = 0.0625;
H = 2.3;
zw_H = 2;
ztop_H = 8;
Cdh = 1.2;
a = 9.6 * lambda;
Cd = Cdh * (1 - exp(-2 * a));
d_H = 0.066;  %% Macdonald, 2000(lambda = 0.05)
%% Running
t = linspace(8,0.01,100);
y0 = [1.75; 0.05];
[t,y] = ode45(@Copy_of_odefun,t,y0);

copy_of_odefun 函数:

function dy = Copy_of_odefun(t,y)
global H lambda Cd
%% mixing length closure parameter
% within canopy
z_H1 = [0.01 1];
lc_H = [0.2463 0.2463];
lc_dz = [0 0];
% shear layer
z_H2 = [1.01 2];
lm_H = [0.2516 0.7736];
lm_dz = [0.5273 0.5273];
% inertial layer
z_H3 = [2.01 8];
lz_H = [0.7776 3.1736];
lz_dz = [0.4 0.4];
% for whole computation domain
zm_H = [z_H1 z_H2 z_H3];
l3_H = [lc_H lm_H lz_H];
l3_dz = [lc_dz lm_dz lz_dz];
% interpolate to obtain value at each point of t
lx_H = interp1(zm_H,l3_H,t);
lx_dz = interp1(zm_H,l3_dz,t);

% second order translated into one order
dy = [y(2); (-lx_H * H * lx_dz * y(2)^2 / (H^2 * lx_H^2 * y(2)) + 0.25 * y(1)^2 * lambda / H * Cd / (H^2 * lx_H^2 * y(2)))];

【问题讨论】:

    标签: matlab


    【解决方案1】:

    问题出在全局变量中。您需要在函数和主脚本中标记它们。只需添加

    global H lambda Cd

    到主脚本,它将运行。

    ode45 的第二个参数也有问题 - 它应该只是 [8, 100],而不是所有需要的值 t 的向量。在documentation 中可以找到一些很好的例子。代码中可能还有其他一些问题 - 它为大多数 y 值提供了 NaN

    【讨论】:

    • 是的,问题可能出在t。就我而言,t 实际上是 [0.01 8]。但是初始条件适用于 8,在我的情况下是 tf。所以我必须写 t = linspace(8,0.01,100) 或 [8,0.01],这样行不通。你对这种情况有什么想法吗?
    • @PanCheng [8,0.01] 应该没问题,这里有一个这样的例子的链接。 mathworks.com/matlabcentral/answers/…
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2012-08-26
    • 2023-03-12
    • 2011-05-15
    • 2021-11-02
    相关资源
    最近更新 更多