format long c = 299792.458; d_1 = 0.0001; delta_t = 10^-8; init_vec = [0; 0; 6370; 0]; true_sol = [0; 0; 6370; 0.0001]; n_vals = [4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]; n_value = zeros(length(n_vals),1); cond_value = zeros(length(n_vals),1); pos_err = zeros(length(n_vals),1); emf = zeros(length(n_vals),1); for n_idx = 1:length(n_vals) n = n_vals(n_idx); h1 = (pi / 2) / n; h2 = (2*pi) / n; rho = 26570; phi = [0:n-1]*h1; theta = [0:n-1]*h2; sat_A = zeros(1,n); sat_B = zeros(1,n); sat_C = zeros(1,n); R = zeros(1,n); t = zeros(1,n); for i=1:n sat_A(i) = rho*cos(phi(1,i))*cos(theta(1,i)); sat_B(i) = rho*cos(phi(1,i))*sin(theta(1,i)); sat_C(i) = rho*sin(phi(1,i)); R(i) = sqrt(sat_A(i)^2 + sat_B(i)^2 + (sat_C(i) - 6370)^2); t(i) = d_1 + R(i)/c; end maxerr = 0; maxposerr = 0; for randiter = 1:100 k = 100; f = zeros(1,n); init_vec = [0; 0; 6370; 0]; time_error = delta_t * ((rand(1, n) > 0.5) * 2 - 1); for iter=1:k x = init_vec(1,1); y = init_vec(2,1); z = init_vec(3,1); d = init_vec(4,1); for i=1:n f(i) = (x - sat_A(i))^2 + (y - sat_B(i))^2 + (z - sat_C(i))^2 - (c*(t(i) + time_error(i) - d))^2; end f_sol = transpose(f); Jacobian = zeros(n,4); for i=1:n Jacobian(i,1) = 2*(x - sat_A(i)); Jacobian(i,2) = 2*(x - sat_B(i)); Jacobian(i,3) = 2*(x - sat_C(i)); Jacobian(i,4) = 2*c^2*(t(i) + time_error(i) - d); end A = transpose(Jacobian)*Jacobian; b = -(transpose(Jacobian)*f_sol); v = A \ b; init_vec = init_vec + v; end comp_vec = init_vec; maxerr = max(maxerr, max(abs(comp_vec - true_sol))); maxposerr = max(maxposerr, norm(comp_vec - true_sol)); end %cond_value pos_err(n_idx,1) = maxposerr; n_value(n_idx,1) = n; emf(n_idx,1) = maxerr / (c * delta_t); end n_value pos_err emf scatter(n_value, emf); title('Accuracy Gains from Increased Satellites'); xlabel('Number of Satellites'); ylabel('Error Magnification Factor');