An error of unable to perform assignment because the size of the left side is 1-by-1-by-3 and the size of the right side is 1-by-3-by-3 when I am using the following:
    3 views (last 30 days)
  
       Show older comments
    
% Vectors and Matrices Initialization:
v1_2=zeros(360,76,3); % each element of the 360x76 matrix is a velocity vector
v2_prime_2=zeros(360,76,3);
r1=zeros(360,3);
r2_prime=zeros(360,76,3);
delta_t=zeros(360,76);
string='pro';
% Main Code:
for i=1:1:360
    for j=1:1:76
        % The inputs in the following function are non-zero(
        % r1, r2_prime, delta_t and string). Previous calculations have been
        % made inside the double for loop with these matrices and vectors, but they do not affect the error
        % of this code and thus they are not mentioned.
        [v1_2(i,j,:), v2_prime_2(i,j,:)] = lambert_equation(r1(i,:), r2_prime(i,j,:), delta_t(i,j), string);
    end
end
%The error is probably in the calculations made for V1 and V2 of the following function:
function [V1, V2] = Lambert(R1, R2, t, str)
%   This function solves Lambert's problem.
%   INPUTS: 
%       R1 = position vector at position 1 (km)
%       R2 = position vector at position 2 (km)
%       t  = time of flight  (s) 
%   OUTPUTS: 
%       V1 = velocity vector at position 1 (km/s)
%       V2 = velocity vector at position 2 (km/s)
%
%   VARIABLES DESCRIPTION:
%       r1, r2     - magnitudes of R1 and R2 
%       c12        - cross-product of R1 and R2 
%       theta      - change in true anomaly between position 1 and 2 
%       z          - alpha*x^2, where alpha is the reciprocal of the
%                    semimajor axis and x is the universal anomaly
%       y(z)       - a function of z
%       F(z,t)     - a function of the variable z and constant t
%       dFdz(z)    - the derivative of F(z,t)
%       ratio      - F/dFdz
%       eps        - tolerence on precision of convergence
%       C(z), S(z) - Stumpff functions
%% Gravitational parameter:    
global mu
%% Magnitudes of R1 and R2:
r1 = norm(R1);
r2 = norm(R2,'fro');
%% Theta:
c12 = cross(R1, squeeze(R2));
theta = acos(dot(R1,squeeze(R2))/r1/r2);
%Assume prograde or retrograde orbit:
if strcmp(str,'pro')
    if c12(3) <= 0
        theta = 2*pi - theta;
    end
elseif strcmp(str,'retro')
    if c12(3) >= 0
        theta = 2*pi - theta;
    end
end
%% Solve equation for z:
A = sin(theta)*sqrt(r1*r2/(1 - cos(theta)));
%Check where F(z,t) changes sign, and use that 
%value of z as a starting point:
z = -100;
while F(z,t) < 0
    z = z + 0.1;
end
%Tolerence and number of iterations:
eps= 1.e-8;
nmax = 5000;
%Iterate until z is found under the imposed tolerance:
ratio = 1;
n = 0;
while (abs(ratio) > eps) && (n <= nmax)
    n = n + 1;
    ratio = F(z,t)/dFdz(z);
    z = z - ratio;
end
%Maximum number of iterations exceeded
if n >= nmax
    fprintf('\n\n **Number of iterations exceeds %g \n\n ',nmax)
end
%% Lagrange coefficents:
f = 1 - y(z)/r1;
g = A*sqrt(y(z)/mu);
g_dot = 1 - y(z)/r2;
%% V1 and V2:
V1 =1/g*(R2 - f*R1);
V2 =1/g*(g_dot*R2 - R1);
return
%% Subfunctions used: 
function dum = y(z)
    dum = r1 + r2 + A*(z*S(z) - 1)/sqrt(C(z));
end
function dum = F(z,t)
    dum = (y(z)/C(z))^1.5*S(z) + A*sqrt(y(z)) - sqrt(mu)*t;
end
function dum = dFdz(z)
    if z == 0
        dum = sqrt(2)/40*y(0)^1.5 + A/8*(sqrt(y(0)) + A*sqrt(1/2/y(0)));
    else
        dum = (y(z)/C(z))^1.5*(1/2/z*(C(z) - 3*S(z)/2/C(z)) ...
        + 3*S(z)^2/4/C(z)) + A/8*(3*S(z)/C(z)*sqrt(y(z)) ...
        + A*sqrt(C(z)/y(z)));
    end
end
%Stumpff functions:
function c = C(z)
    if z > 0
        c = (1 - cos(sqrt(z)))/z;
    elseif z < 0
        c = (cosh(sqrt(-z)) - 1)/(-z);
    else
        c = 1/2;
    end
end
function s = S(z)
    if z > 0
        s = (sqrt(z) - sin(sqrt(z)))/(sqrt(z))^3;
    elseif z < 0
        s = (sinh(sqrt(-z)) - sqrt(-z))/(sqrt(-z))^3;
    else
        s = 1/6;
    end
end
end
1 Comment
  Walter Roberson
      
      
 on 5 Mar 2024
				We are missing lambert_equation 
It is not the same as your Lambert -- your Lambert function is not designed to handle vectors.
Answers (1)
  Drishti
 on 3 Sep 2024
        Hi Loannis,
I reproduced the error on my end by considering ‘Lambert’ as ‘lambert_equation’. The error you're encountering is due to a discrepancy in the dimensions of the variables being assigned from the 'lambert_equation' function. 
I managed to fix the error by adjusting the shape of the variables. You can refer to the implemented code:
% Main Code:
for i=1:1:360
    for j=1:1:76
        % The inputs in the following function are non-zero(r1, r2_prime, delta_t and string). 
        % Ensure r2_prime(i,j,:) is correctly reshaped to a 1-by-3 vector
        r2_prime_vector = squeeze(r2_prime(i, j, :))';
        [v1_2(i,j,:), v2_prime_2(i,j,:)] = lambert_equation(r1(i,:), r2_prime_vector, delta_t(i,j), string);
    end
end
I hope this resolves the error.
See Also
Categories
				Find more on Creating and Concatenating Matrices in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!