ode45不传递参数(MATLAB)

ode45不传递参数(MATLAB),matlab,Matlab,我正在matlab中实现一个滤波算法,在参数传递方面有一些困难 my dynamics由以下功能控制: 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

我正在matlab中实现一个滤波算法,在参数传递方面有一些困难

my dynamics由以下功能控制:

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_非线性定义如下:

 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_非线性中,我需要再次将动力学与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) ;
但涡动力学只需要t,z,涡度作为参数。我在两个函数中调用ode45的方式相同,但只有在通过ENKfNonal调用ode45时才会得到错误。 我看不出它调用的参数数量是否正确。有什么想法吗?

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

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

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

我注意到的一件事是,在EnKF_非线性中,您在没有@handle的情况下调用dynFunc。另外,dynFunc实际上是您在这里使用的吗?它看起来像一个变量,从你在EnKF_非线性定义中使用它的方式来看。如果dynFunc实际上是一个函数,那么不要将其作为输入包含在EnKF_非线性的定义中。如果它不是一个函数,则ode45不能将其用作输入。在EnKF_非线性的定义中包含@DynFunc,但它抛出了一个意外的matlab运算符错误。我还尝试在ode45调用中使用@DynFunc,但出现了错误:File:EnKF_noneral.m Line:44 Column:26 DynFunc以前用作变量,这与它在此处用作函数或命令名称的用法相冲突。我想你知道了什么。你知道我应该如何将函数句柄作为输入变量传递吗?我想你可以简单地通过用函数[z_a,Gam_a,z_ens]替换线函数[z_a,Gam_a,z_ens]=EnKF_非线性num_示踪剂,Func_观测,观测,涡度,tspan,z0_est,W,R,dynFunc,H,N来修复上述错误=EnKF_非线性示踪物,函数观测,观测,涡度,tspan,z0_est,Gam0_est,W,R,H,N。然后替换[t_out,z_out]=ode45dynFunc,tspan,z0_est:,ii,涡度;[t_out,z_out]=ode45@dynFunc,tspan,z0_est:,ii,[],涡度;以上假设dynFunc的唯一输入是涡度。不,你也不应该这样做。传递参数的正确方法是通过:ode45@t,zdynFunct,z,涡度,tspan,z0_est:,ii;。请参见ode45文档中的右侧。您正在使用的方法是旧版本Matlab的残余,并且只存在向后兼容性。几乎可以肯定,它的效率较低。