【问题标题】:ode45 not passing arguments (MATLAB)ode45 不传递参数(MATLAB)
【发布时间】:2014-08-04 06:05:58
【问题描述】:

我在matlab中实现一个过滤算法,参数传递有一些困难。

我的动态由函数控制:

function zdot = VortexDynamics(t, z, vorticity)
for ii=1:length(vorticity),
    zdot(ii,1) = 1i/(2*pi) * sum(  vorticity([1:ii-1,ii+1:end])  .* ( z(ii) - z([1:ii-1,ii+1:end])  ) ./ (abs(z(ii) - z([1:ii-1,ii+1:end])  ).^2 ) ) ;  
end
end

我最初使用 ode45 计算轨迹,没有问题

 [t_true,z_true]=ode45(@VortexDynamics, tspan ,z0_true, OPTIONS, vorticity) ;

为了实现过滤器,我为每个时间步调用一个函数:

 [z_a , Gam, z_ens] = EnKF_nonlinear(num_tracers, Func_Observation, Observations(:,ii),vorticity,  [prev_t t], z_ens, Gam, W,R, VortexDynamics, H, N) ;

EnKF_nonlinear 定义为:

 function [z_a, Gam_a, z_ens] = EnKF_nonlinear(num_tracers, Func_Observation, Observations,vorticity,  tspan, z0_est, Gam0_est, W,R, dynFunc, H,N )

在 EnKF_nonlinear 中,我需要再次将动力学与 ode45 集成:

 for ii = 1:N

  [t_out, z_out] = ode45(dynFunc, tspan, z0_est(:,ii), vorticity);
  z_ens(:,ii) = z_out(end,:) ; 
 end

但我得到了错误:

 Error using VortexEnKF>VortexDynamics (line 85)
 Not enough input arguments.

 Error in VortexEnKF (line 63)
     [z_a , Gam, z_ens] = EnKF_nonlinear(num_tracers, Func_Observation,
     Observations(:,ii),vorticity,  [prev_t t], z_ens, Gam, W,R, VortexDynamics, H,
     N) ;

但是 VortexDynamics 只需要 t,z,vorticity 作为参数。我在两个函数中都以相同的方式调用 ode45,但只有在通过 EnKFnonlinear 调用它时才会出现错误。 我看不出它是如何使用正确数量的参数调用的。有什么想法吗?

【问题讨论】:

  • 嗯,我注意到的一件事是您在 EnKF_Nonlinear 中调用 dynFunc 时没有 @ 句柄。 dynFunc 实际上也是您在这里使用的意思吗?从您在 EnKF_nonlinear 的定义中使用它的方式来看,它看起来像是一个变量。如果 dynFunc 实际上是一个函数,则不要将其作为输入包含在 EnKF_nonlinear 的定义中。如果不是函数,则 ode45 不能将其用作输入
  • 我尝试在 EnKF_Nonlinear 的定义中包含 @DynFunc,但它引发了“意外的 matlab 运算符”错误。我还尝试在 ode45 调用中使用@DynFunc,但得到了Error: File: EnKF_nonlinear.m Line: 44 Column: 26 "dynFunc" was previously used as a variable, conflicting with its use here as the name of a function or command. 我认为您正在做某事。你知道我应该如何将函数句柄作为输入变量传递吗?
  • 我认为您可以通过将function [z_a, Gam_a, z_ens] = EnKF_nonlinear(num_tracers, Func_Observation, Observations,vorticity, tspan, z0_est, Gam0_est, W,R, dynFunc, H,N ) 行替换为function [z_a, Gam_a, z_ens] = EnKF_nonlinear(num_tracers, Func_Observation, Observations,vorticity, tspan, z0_est, Gam0_est, W,R, H,N ) 来解决上述错误。然后用[t_out, z_out] = ode45(@dynFunc, tspan, z0_est(:,ii), [], vorticity);替换[t_out, z_out] = ode45(dynFunc, tspan, z0_est(:,ii), vorticity);
  • 以上假设 dynFunc 的唯一输入是 vorticity。

标签: matlab


【解决方案1】:

愚蠢的我, 我忘记在 ode45 调用中包含 [] 作为精度选项的占位符。

ode45(dynFunc, tspan, z0_est(:,ii), [], vorticity);

将 vorticity 参数传递给 dynFunc,它工作正常。

【讨论】:

  • 不,你也不应该那样做。传递参数的正确方法是通过anonymous function:ode45(@(t,z)dynFunc(t,z,vorticity), tspan, z0_est(:,ii));。请参阅ode45 文档中的this example。您使用旧版本 Matlab 的痕迹的方法仅用于向后兼容。它几乎肯定效率较低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多