diff --git a/main__1_.py b/main__1_.py new file mode 100644 index 0000000000000000000000000000000000000000..1094c73e1a3659bb60e043b2e3bdaf037823bc5e --- /dev/null +++ b/main__1_.py @@ -0,0 +1,93 @@ +from scipy.optimize import least_squares +import numpy as np + +# Measured distances with ±10 cm errors (a, b, c, d, e, f) +measured_distances = [3905.12, 2236.07, 5000, 8000, 8994.27, 5590.17] + +# Updated initial guess for (x_B, y_B, x_C, y_C, y_D) +# Use values that are reasonably close to the expected beacon positions. +initial_guess = [2500, 3000, 4500, 5500, 8000] + +# Updated bounds for the variables +# Allowing for a wide range, given the distances are in the thousands +bounds = ([0, 0, 0, 0, 0], [10000, 10000, 10000, 10000, 10000]) + + +# Error function for least squares +def error_function(variables, measured_distances): + x_B, y_B, x_C, y_C, y_D = variables + a_measured, b_measured, c_measured, d_measured, e_measured, f_measured = measured_distances + + # Calculating residuals + residuals = [] + r_a = np.sqrt(x_B**2 + y_B**2) - a_measured + r_b = np.sqrt((x_C - x_B)**2 + (y_C - y_B)**2) - b_measured + r_c = np.sqrt(x_C**2 + (y_C - y_D)**2) - c_measured + r_d = y_D - d_measured + r_e = np.sqrt(x_C**2 + y_C**2) - e_measured + r_f = np.sqrt(x_B**2 + (y_B - y_D)**2) - f_measured + + residuals.extend([r_a, r_b, r_c, r_d, r_e, r_f]) + return residuals + + +# Run least squares optimization +result = least_squares( + error_function, + initial_guess, + args=(measured_distances, ), + bounds=bounds, + loss='soft_l1' # Using a robust loss function to deal with noise +) + +# Extract optimized coordinates +optimized_coords = result.x +x_B, y_B, x_C, y_C, y_D = optimized_coords + +# Print the optimized coordinates +print("Optimized coordinates:", optimized_coords) + +# Manually calculate distances based on optimized coordinates +a_calculated = np.sqrt(x_B**2 + y_B**2) # Distance from A to B +b_calculated = np.sqrt((x_C - x_B)**2 + (y_C - y_B)**2) +c_calculated = np.sqrt(x_C**2 + (y_C - y_D)**2) +d_calculated = y_D # Distance from A to D (since A is at (0,0) and D is at (0, y_D)) +e_calculated = np.sqrt(x_C**2 + y_C**2) +f_calculated = np.sqrt(x_B**2 + (y_B - y_D)**2) + +# Verification with a tolerance to handle the measurement error (±10 cm) +a_measured = 3905.12 # Example measured distance (in cm) +b_measured = 2236.07 +c_measured = 5000 +d_measured = 8000 # Example measured distance (in cm) +e_measured = 8994.27 +f_measured = 5590.17 + +# Check if calculated distances match measured distances within ±10 cm +assert np.isclose( + a_calculated, a_measured, atol=10 +), f"a_calculated {a_calculated} differs from a_measured {a_measured}" +assert np.isclose( + b_calculated, b_measured, atol=10 +), f"b_calculated {b_calculated} differs from b_measured {b_measured}" +assert np.isclose( + c_calculated, c_measured, atol=10 +), f"c_calculated {c_calculated} differs from c_measured {c_measured}" +assert np.isclose( + d_calculated, d_measured, atol=10 +), f"d_calculated {d_calculated} differs from d_measured {d_measured}" +assert np.isclose( + e_calculated, e_measured, atol=10 +), f"e_calculated {e_calculated} differs from e_measured {e_measured}" +assert np.isclose( + f_calculated, f_measured, atol=10 +), f"f_calculated {f_calculated} differs from f_measured {f_measured}" + +print( + "All calculated distances are within the acceptable tolerance of the measured distances." +) + +# Calculate and print the residuals after optimization +residuals_after_optimization = error_function(optimized_coords, + measured_distances) +print("Residuals after optimization:", residuals_after_optimization)