VMS_SPARK_README.txt VMS + NFW + MOND analysis for SPARC rotation curves (Nov 2025 fixed version Ð units clean, fits honest, no magic constants hiding in the walls) 0. What this script is This is a single-file, no-nonsense comparison between three rotation-curve models on SPARC galaxies: * VMS: my geometric residue profile (effectively a Zhao n=0 spherical halo), with one free parameter per galaxy: ?? (a density scale in M?/kpc?). * NFW: standard cold dark matter halo, but constrained to one free parameter per galaxy: ?_s. The scale radius r_s is fixed per galaxy from a simple heuristic, on purpose, so VMS and NFW are on equal footing. * MOND: classic Milgrom MOND with fixed a? = 1.2 ? 10??? m/s?, so zero free parameters per galaxy in this implementation. All three models use the same baryonic baseline from SPARC: * Vgas, Vdisk, Vbul are combined as Vbar = sqrt(Vgas? + Vdisk? + Vbul?). * MOND modifies that baryonic curve directly. * VMS and NFW add a dark/geometric halo on top of the same Vbar: v_tot?(r) = v_bar?(r) + v_DM?(r) so nobody gets a special advantage or handicap on the baryons. The code uses standard SPARC units: * Radius r in kpc * Velocity v in km/s * Densities in M?/kpc? * G in kpc (km/s)? / M? (and we do not Òre-convertÓ it into some Frankenstein unit system) If youÕve ever looked at SPARC, this will feel familiar. 1. What the script does, in plain terms From top to bottom, the script: 1. Defines constants and unit system o G_KPC = 4.302e-6 in kpc (km/s)? / M? Ð the standard astrophysical G. o A0 = 1.2e-10 m/s? Ð the standard MOND acceleration scale. 2. Loads SPARC rotation curve files o Looks for a file matching ./sparc_data/*{GALAXY}*.dat. o Handles both SPARC formats: * 5 columns: Rad, Vobs, errV, Vgas, Vdisk ? sets Vbul = 0.0. * 6 columns: Rad, Vobs, errV, Vgas, Vdisk, Vbul. o Drops NaNs and resets the index. o Prints how many data points it found for that galaxy. 3. Implements the three models o VMS: v?(r) = 4 ¹ G ?? r / (r + r_s) vms_velocity(r, rho0, rs) returns v_DM(r) in km/s. o NFW: * Mass: M(= 5 else np.max(v_obs) rs_guess = np.max(r) / 3.0 # VMS (1 parameter: ??) rho0, rho0_err = fit_vms(r, v_obs, v_err, rs_guess, v_flat, v_bar) v_dm_vms = vms_velocity(r, rho0, rs_guess) v_vms = np.sqrt(v_dm_vms**2 + v_bar**2) vms_stats = calculate_statistics(v_obs, v_vms, v_err, n_params=1) # NFW (1 parameter: ?_s) rho_s, rho_s_err = fit_nfw(r, v_obs, v_err, rs_guess, v_flat, v_bar) v_dm_nfw = nfw_velocity(r, rho_s, rs_guess) v_nfw = np.sqrt(v_dm_nfw**2 + v_bar**2) nfw_stats = calculate_statistics(v_obs, v_nfw, v_err, n_params=1) rows.append({ 'Galaxy': galaxy, 'N_points': len(r), 'MOND_chi2_red': mond_stats['chi2_red'], 'MOND_rms': mond_stats['rms'], 'VMS_chi2_red': vms_stats['chi2_red'], 'VMS_rms': vms_stats['rms'], 'VMS_rho0': rho0, 'VMS_rho0_err': rho0_err, 'NFW_chi2_red': nfw_stats['chi2_red'], 'NFW_rms': nfw_stats['rms'], 'NFW_rho_s': rho_s, 'NFW_rho_s_err': rho_s_err, }) except Exception as e: print(f"Skipping {galaxy}: {e}") if rows: summary = pd.DataFrame(rows) summary.to_csv('sparc_vms_mond_nfw_summary.csv', index=False) print("\nSaved summary to sparc_vms_mond_nfw_summary.csv") print(summary) else: print("\nNo successful fits Ð check your galaxy names and data files.") What this gives you * One CSV: sparc_vms_mond_nfw_summary.csv * Each row: one galaxy, with: o Number of points. o MOND ??_red, RMS. o VMS ??_red, RMS, ?? ± err. o NFW ??_red, RMS, ?_s ± err. From there, you can: * Make histograms of ??_red for each model. * Look for outliers where VMS crushes NFW (or vice versa). * Check correlations between ??, ?_s, and galaxy properties. 5. Sharing and publishing If you do run this on a large SPARC sample and get interesting trends: * YouÕre absolutely free to: o Share the results anywhere. o Publish your own analysis. o Fork the script and modify it. If you want to share your summary with me for inclusion on the VMS Institute site (or for people to compare their own runs against), feel free to send: * Your sparc_vms_mond_nfw_summary.csv. * A short note on: o Which SPARC galaxies you used. o Any changes you made to the script (error floors, r_s strategy, MOND variant, etc.). The whole point of this is to make it easy and transparent for anyone to test VMS against the usual suspects, on public data, with code they can read in one sitting.