Subscript indices must either be real positive integers or logicals while k starts from 1 .

1 次查看(过去 30 天)
% I've fun_dquat called by another function RK4 as shown below. Error says, Subscript indices must either be real positive integers or
%logicals.
function dquat=fun_dquat(k,q)
global wwx
global wwy
global wwz
wx=wwx;
wy=wwy;
wz=wwz;
ww=[wx;wy;wz]'; %64 by 3 matrix obtained in each iteration
Wskew= [ 0,-ww(k,1),-ww(k,2),-ww(k,3);
ww(k,1), 0, ww(k,3),-ww(k,2);
ww(k,2),-ww(k,3), 0, ww(k,1);
ww(k,3), ww(k,2),-ww(k,1), 0]
coef=0.1;
c=coef*(1-q*q');
dquat=0.5*(Wskew*q')'+c*q;
end
% Function RKF utilize fun_dquat to compute dquat
function yout = RK4(F,t0,h,tfinal,y0)
% ODE4 Classical Runge-Kutta ODE solver.
% yout = ODE4(F,t0,h,tfinal,y0) uses the classical
% Runge-Kutta method with fixed step size h on the interval
% t0 <= t <= tfinal
% to solve
% dy/dt = F(t,y)
% with y(t0) = y0.
% Copyright 2014 - 2015 The MathWorks, Inc.
y = y0;
yout = y;
for tt = t0 : h : tfinal-h
s1 = F(tt,y);
s2 = F(tt+h/2, y+h*s1/2);
s3 = F(tt+h/2, y+h*s2/2);
s4 = F(tt+h, y+h*s3);
y = y + h*(s1 + 2*s2 + 2*s3 + s4)/6;
yout = [yout; y]; %#ok<AGROW>
end
%error message
RK4 nonunit quaternion integration:
Subscript indices must either be real positive integers or logicals.
Error in fun_dquat (line 9)
Wskew= [ 0,-ww(k,1),-ww(k,2),-ww(k,3);
Error in RK4 (line 14)
s1 = F(tt,y);
Error in PRS20200428 (line 187)
q_rk4 = RK4(@fun_dquat,0,delt,t_max,q_init); % Integration to get the next quaternion
%Can anyone help to figureout where the problem of the code is ? Thanks
  4 个评论
Geoff Hayes
Geoff Hayes 2020-4-28
So the k input to your fun_dquat is neither a positive integer nor logical...and so is invalid as an index into the array. Are these the correct values that you want to pass into this function?
HN
HN 2020-4-28
Yes, ww are the variables I wanted to pass from main file to function fun_dquat. The global declaration seem to confused as well.

请先登录,再进行评论。

回答(1 个)

James Tursa
James Tursa 2020-4-28
The RK4( ) function expects to call the derivative function with the signature F(tt,y), i.e. time is the 1st argument.
But your fun_dquat( ) signature has k as the 1st argument, which you are using as an index in your code.
So you have a mismatch, hence the error. Your derivative function needs to have the signature that the RK4 expects when making that F(tt,y) and similar calls.
  2 个评论
HN
HN 2020-4-28
编辑:HN 2020-4-28
,
ww is passing from the main file. q is predicted from initial point. I used rung-kutta integrator to next q. So I've only ww and q as a variable to to deal with RK4. Thats what I tried to do.
Thanks
James Tursa
James Tursa 2020-4-28
编辑:James Tursa 2020-4-28
So why do you have a k in your input argument and why are you using k as an index in your code? I don't see any k in the above formula. What are the global wwx, wwy, wwz in your code? Arrays of sampled rates? And you are trying to pick off the correct sample with k?
The RK4 scheme is going to try and generate a derivative at "fractional" times. If all you have is sampled rate arrays at specific times, you will need to interpolate them within the derivative function to get rates at the desired times for the RK4 scheme to use.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by