我在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,涡度作为参数。我在两个函数中都以相同的方式调用ode45,但是当我通过EnKFnonlinear调用它时,我只得到错误。 我没有看到它没有调用正确数量的参数。有什么想法吗?
答案 0 :(得分:0)
ode45(dynFunc, tspan, z0_est(:,ii), [], vorticity);
将vorticity参数传递给dynFunc,它工作正常。