ode45不传递参数(MATLAB)
我正在matlab中实现一个滤波算法,在参数传递方面有一些困难 my dynamics由以下功能控制: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
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的残余,并且只存在向后兼容性。几乎可以肯定,它的效率较低。