Full text
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 I n [] : = (* =========================================================================== = (* FBD Galaxy Rotation Curve Theory -Mathematica Code (Version 1 -English) *) (* A Statistical-Mechanical Interpretation of Galaxy Rotation Curves *) (* Based on Fermion-Boson Duality *) (* Author: Hirokazu Maruyama *) (* Date: 2025 *) (* =========================================================================== = (* Part 1: Physical Constants and Parameter Definitions *) (* =========================================================================== = ClearAll["Global`*"]; (* Physical constants (SI units) *) G0 =6.674 *10^(-11);(* Newton's gravitational constant [m^3 kg^-1 s^-2] *) c=2.998 *10^8; (* Speed of light [m/s] *) Msun =1.989 *10^30; (* Solar mass [kg] *) kpc =3.086 *10^19; (* 1 kpc [m] *) a0MOND =1.2 *10^(-10);(* MOND acceleration scale [m/s^2] *) (* Galaxy parameters (Milky Way reference) *) Mgalaxy =1.0 *10^11 *Msun; (* Galaxy mass [kg] *) rFB =10.0 *kpc; (* Transition radius [m] *) lambdaGal =2.0 *kpc; (* Transition smoothness [m] *) (* Scales for dimensionless quantities *) rScale =kpc; (* Distance scale *) vScale =1000; (* Velocity scale [m/s]=1 km/s*) Print["=== Physical Constants and Parameters ==="]; Print["G0 =", G0, " m^3 kg^-1 s^-2"]; Print["Msun =", Msun, " kg"]; Print["Mgalaxy =", Mgalaxy/Msun, " Msun"]; Print["rFB =", rFB/kpc, " kpc"]; Print["a0 (MOND) = ", a0MOND, " m/s^2"]; (* =========================================================================== = (* Part 2: Transition Function Definition *) (* =========================================================================== = (* Galaxy transition function T_gal(r) *) (* r<< rFB: T 1(Newtonian regime) *) (* r>> rFB: T 0(Enhanced gravity regime) *) Tgal[r_, rFB_, lambda_] :=1/(1+Exp[(r-rFB)/lambda]); (* QCD transition function (for comparison) *) (* Note: In Mathematica, E is reserved for Euler's number, so we use 'en' *) Tqcd[en_, Efb_, nu_] :=1/(1+Exp[(en -Efb)/nu]);
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Print["\n=== Transition Function Plots ==="]; (* Galaxy transition function plot *) plotTgal =Plot[ {Tgal[r*kpc, rFB, lambdaGal], 1 -Tgal[r*kpc, rFB, lambdaGal]}, {r, 0, 30}, PlotStyle {Blue, Red}, PlotLegends {"T_gal(r) [Newton]", "1-T_gal(r) [Enhanced]"}, AxesLabel {"r [kpc]", "Weight"}, PlotLabel "FBD Galaxy Transition Function", GridLines Automatic, Frame True, ImageSize 500 ]; Print[plotTgal]; (* Transition function for different lambda values *) plotTgalLambda =Plot[ Table[Tgal[r*kpc, rFB, lam*kpc],{lam, {1, 2, 3, 5}}], {r, 0, 30}, PlotStyle {Blue, Orange, Green, Red}, PlotLegends {"λ=1 kpc", "λ=2 kpc", "λ=3 kpc", "λ=5 kpc"}, AxesLabel {"r [kpc]", "T_gal(r)"}, PlotLabel "Transition Function: Effect of λ_gal", GridLines Automatic, Frame True, ImageSize 500 ]; Print[plotTgalLambda]; (* =========================================================================== = (* Part 3: Effective Gravitational Potential *) (* =========================================================================== = (* Newtonian potential *) VNewton [r_, M_] := -G0*M/r; (* Enhanced potential (corrected: logarithmic form) *) (* Flat rotation curve v =v_infty is given by this potential *) (* V_enhanced = -v_infty^2 *ln(r/r0)-GM/r*) (* where v_infty = (G*M*a0)^(1/4) *) vInfty[M_] := (G0 *M*a0MOND)^(1/4); VEnhanced [r_, M_] := -vInfty[M]^2 *Log[r/kpc]-G0*M/r; (* Effective potential (FBD convex combination) *) 2 FBD_Galaxy_Rotation_v1_EN.wl
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 VeffGal [r_, M_, rFBval_, lambda_] := Tgal[r, rFBval, lambda]*VNewton[r, M] + (1-Tgal[r, rFBval, lambda])*VEnhanced[r, M]; Print["\n=== Effective Potential Plots ==="]; (* Potential plot (normalized) *) plotPotential =Plot[ { VNewton[r*kpc, Mgalaxy]/(G0*Mgalaxy/kpc), VEnhanced[r*kpc, Mgalaxy]/(G0*Mgalaxy/kpc), VeffGal[r*kpc, Mgalaxy, rFB, lambdaGal]/(G0*Mgalaxy/kpc) }, {r, 1, 50}, PlotStyle {Blue, Red, {Thick, Purple}}, PlotLegends {"V_Newton", "V_Enhanced", "V_eff (FBD)"}, AxesLabel {"r [kpc]", "V / (GM/kpc)"}, PlotLabel "FBD Galaxy Effective Potential", PlotRange {Automatic, {-5, 0}}, GridLines Automatic, Frame True, ImageSize 500 ]; Print[plotPotential]; (* =========================================================================== = (* Part 4: Rotation Curve Calculation (Corrected Version) *) (* =========================================================================== = (* [IMPORTANT CORRECTION] Effective acceleration for flat rotation curves: -Newtonian regime: a =GM/r^2 v=sqrt(GM/r) (Keplerian decline) -Enhanced regime: a =v_infty^2/rv=v_infty (flat) where v_infty = (G*M*a0)^(1/4)is determined by the Tully-Fisher relation *) (* Effective gravitational acceleration (corrected version) *) aeff[r_, M_, rFBval_, lambda_] :=Module[{Tval, aNewton, aEnhanced}, Tval =Tgal[r, rFBval, lambda]; aNewton =G0*M/r^2; (* Correction: aEnhanced gives v=const form *) aEnhanced =vInfty[M]^2/r; Tval*aNewton + (1-Tval)*aEnhanced ]; (* Rotation velocity (from circular orbit condition) *) vRotation[r_, M_, rFBval_, lambda_] :=Sqrt[r*aeff[r, M, rFBval, lambda]]; FBD_Galaxy_Rotation_v1_EN.wl 3
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 (* Newtonian rotation velocity *) vNewton[r_, M_] :=Sqrt[G0*M/r]; (* MOND rotation velocity (corrected version) *) (* MOND basic equation: μ(a/a0)*a=a_N Simple interpolating function: μ(x)=x/(1+x) Analytical solution: a = [a_N+sqrt(a_N^2 +4*a_N*a0)] / 2 Deep MOND limit (a_N<< a0):asqrt(a_N*a0) Therefore v =sqrt(r*a)(G*M*a0)^(1/4)=const *) vMOND[r_, M_, a0_] :=Module[{aN, aEff}, aN =G0*M/r^2; (* Analytical solution for simple interpolating function *) aEff = (aN +Sqrt[aN^2 +4*aN*a0]) / 2; Sqrt[r*aEff] ]; Print["\n=== Rotation Curve Plots ==="]; (* Display theoretical asymptotic velocity *) Print["Theoretical asymptotic velocity v_infty = (G*M*a0)^(1/4)=", vInfty[Mgalaxy] / Print["(Note: FBD and MOND converge to the same asymptotic velocity)"]; (* Rotation curve comparison plot *) plotRotation =Plot[ { vNewton[r*kpc, Mgalaxy]/1000, vRotation[r*kpc, Mgalaxy, rFB, lambdaGal]/1000, vMOND[r*kpc, Mgalaxy, a0MOND]/1000, vInfty[Mgalaxy]/1000 (* Theoretical asymptotic value *) }, {r, 1, 50}, PlotStyle {{Blue, Dashed},{Thick, Purple},{Red, DotDashed},{Gray, Dotted}}, PlotLegends {"Newton (Kepler)", "FBD", "MOND", "v_∞(theory)"}, AxesLabel {"r [kpc]", "v [km/s]"}, PlotLabel "Galaxy Rotation Curves Comparison", PlotRange {{0, 50},{0, 300}}, GridLines Automatic, Frame True, ImageSize 500, Epilog { Gray, Dashed, Line[{{10, 0},{10, 300}}], Text["r_FB", {11, 280}] } ]; 4 FBD_Galaxy_Rotation_v1_EN.wl
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Print[plotRotation]; (* Confirmation of flat rotation curve *) Print["\n=== Rotation Velocity Values ==="]; Print["Theoretical asymptotic velocity: v_infty =", vInfty[Mgalaxy]/1000, " km/s"]; Print[""]; Print["Newton:"]; Print["r =5 kpc: v_Newton =", vNewton[5*kpc, Mgalaxy]/1000, " km/s"]; Print["r =10 kpc: v_Newton =", vNewton[10*kpc, Mgalaxy]/1000, " km/s"]; Print["r =20 kpc: v_Newton =", vNewton[20*kpc, Mgalaxy]/1000, " km/s"]; Print["r =30 kpc: v_Newton =", vNewton[30*kpc, Mgalaxy]/1000, " km/s"]; Print["r =50 kpc: v_Newton =", vNewton[50*kpc, Mgalaxy]/1000, " km/s"]; Print[""]; Print["FBD (corrected version):"]; Print["r =5 kpc: v_FBD =", vRotation[5*kpc, Mgalaxy, rFB, lambdaGal]/1000, " km/s" Print["r =10 kpc: v_FBD =", vRotation[10*kpc, Mgalaxy, rFB, lambdaGal]/1000, " km/ s Print["r =20 kpc: v_FBD =", vRotation[20*kpc, Mgalaxy, rFB, lambdaGal]/1000, " km/ s Print["r =30 kpc: v_FBD =", vRotation[30*kpc, Mgalaxy, rFB, lambdaGal]/1000, " km/ s Print["r =50 kpc: v_FBD =", vRotation[50*kpc, Mgalaxy, rFB, lambdaGal]/1000, " km/ s Print[""]; Print["MOND:"]; Print["r =5 kpc: v_MOND =", vMOND[5*kpc, Mgalaxy, a0MOND]/1000, " km/s"]; Print["r =10 kpc: v_MOND =", vMOND[10*kpc, Mgalaxy, a0MOND]/1000, " km/s"]; Print["r =20 kpc: v_MOND =", vMOND[20*kpc, Mgalaxy, a0MOND]/1000, " km/s"]; Print["r =30 kpc: v_MOND =", vMOND[30*kpc, Mgalaxy, a0MOND]/1000, " km/s"]; Print["r =50 kpc: v_MOND =", vMOND[50*kpc, Mgalaxy, a0MOND]/1000, " km/s"]; (* =========================================================================== = (* Part 5: Effective Gravitational Constant Plot *) (* =========================================================================== = (* Effective gravitational constant ratio G_eff/G_N*) GeffRatio[r_, M_, rFBval_, lambda_] := aeff[r, M, rFBval, lambda]/(G0*M/r^2); Print["\n=== Effective Gravitational Constant ==="]; plotGeff =Plot[ GeffRatio[r*kpc, Mgalaxy, rFB, lambdaGal], {r, 1, 50}, PlotStyle {Thick, Purple}, AxesLabel {"r [kpc]", "G_eff /G_N"}, PlotLabel "Effective Gravitational Constant", PlotRange {{0, 50},{0, 6}}, GridLines Automatic, Frame True, ImageSize 500, Epilog { Gray, Dashed, Line[{{0, 1},{50, 1}}], FBD_Galaxy_Rotation_v1_EN.wl 5
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Line[{{10, 0},{10, 6}}], Text["r_FB", {11, 5.5}] } ]; Print[plotGeff]; (* Effective gravitational constant values *) Print["G_eff/G_N values:"]; Print["r =5 kpc: G_eff/G_N=", GeffRatio[5*kpc, Mgalaxy, rFB, lambdaGal]]; Print["r =10 kpc: G_eff/G_N=", GeffRatio[10*kpc, Mgalaxy, rFB, lambdaGal]]; Print["r =20 kpc: G_eff/G_N=", GeffRatio[20*kpc, Mgalaxy, rFB, lambdaGal]]; Print["r =30 kpc: G_eff/G_N=", GeffRatio[30*kpc, Mgalaxy, rFB, lambdaGal]]; Print["r =50 kpc: G_eff/G_N=", GeffRatio[50*kpc, Mgalaxy, rFB, lambdaGal]]; (* =========================================================================== = (* Part 6: Tully-Fisher Relation Verification (Corrected Version) *) (* =========================================================================== = Print["\n=== Tully-Fisher Relation ==="]; (* Theoretical prediction: v_infty = (G*M*a0)^(1/4) Therefore v^4 ∝M Slope of log(v)vs log(M)is 0.25 *) (* Mass-dependent transition radius *) rFBfromMass[M_] :=Sqrt[G0*M/a0MOND]; (* Asymptotic rotation velocity for different galaxy masses *) (* Theoretical value: directly use v_infty = (G*M*a0)^(1/4) *) vAsymptoticTheory[M_] :=vInfty[M]; (* Numerical value: value at r =5*rFB *) vAsymptoticNumerical[M_] :=Module[{rFBlocal, lambdaLocal}, rFBlocal =rFBfromMass[M]; lambdaLocal =0.2 *rFBlocal; (* λ=0.2 *rFB *) vRotation[5*rFBlocal, M, rFBlocal, lambdaLocal] ]; (* Tully-Fisher plot data (theoretical values) *) massValues = {10^9, 3*10^9, 10^10, 3*10^10, 10^11, 3*10^11, 10^12}*Msun; TFdataTheory =Table[ {Log10[M/Msun], Log10[vAsymptoticTheory[M]/1000]}, {M, massValues} ]; 6 FBD_Galaxy_Rotation_v1_EN.wl
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 TFdataNumerical =Table[ {Log10[M/Msun], Log10[vAsymptoticNumerical[M]/1000]}, {M, massValues} ]; (* Linear fit *) fitTheory =Fit[TFdataTheory, {1, x}, x]; slopeTheory =Coefficient[fitTheory, x]; fitNumerical =Fit[TFdataNumerical, {1, x}, x]; slopeNumerical =Coefficient[fitNumerical, x]; Print["Tully-Fisher slope (theoretical): ", slopeTheory]; Print["Tully-Fisher slope (numerical): ", slopeNumerical]; Print["Expected value (v^4 ∝M): 0.25"]; plotTF =Show[ ListPlot[ {TFdataTheory, TFdataNumerical}, PlotStyle {{PointSize[0.02], Blue},{PointSize[0.015], Red}}, PlotLegends {"Theory: (GMa\[SubScript]0)^(1/4)", "Numerical: v(5r_FB)"} ], Plot[fitTheory, {x, 9, 12}, PlotStyle {Blue, Dashed}], Plot[fitNumerical, {x, 9, 12}, PlotStyle {Red, Dotted}], AxesLabel {"log\[SubScript]10(M/M⊙)", "log\[SubScript]10(v/km s\[SuperScript]-1) PlotLabel "Tully-Fisher Relation (FBD Theory)", PlotRange {{8.5, 12.5},{1.4, 2.8}}, GridLines Automatic, Frame True, ImageSize 500, Epilog { Text[Style["slope =0.25 (v\[SuperScript]4∝M)", 12],{10.5, 1.6}] } ]; Print[plotTF]; (* =========================================================================== = (* Part 7: Structural Comparison with QCD *) (* =========================================================================== = Print["\n=== Structural Comparison with QCD ==="]; (* QCD parameters *) EfbQCD =0.5; (* GeV *) nuQCD =0.1; (* GeV *) sigmaQCD =0.18; (* GeV^2 *) alphaF =0.3; alphaB =0.1; CF =4/3; FBD_Galaxy_Rotation_v1_EN.wl 7
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 (* QCD effective potential (GeV units, r in GeV^-1) *) VF [r_] := -CF*alphaF/r+sigmaQCD*r; VB [r_] := +CF*alphaB/r; VeffQCD [en_, r_] :=Tqcd[en, EfbQCD, nuQCD]*VF[r]+(1-Tqcd[en, EfbQCD, nuQCD])*VB (* QCD potential plot *) plotQCDpotential =Plot[ {VF[r], VB[r], VeffQCD[0.3, r], VeffQCD[0.5, r], VeffQCD[0.7, r]}, {r, 0.1, 3}, PlotStyle {Blue, Red, {Purple, Thin},{Purple, Thick},{Purple, Dashed}}, PlotLegends {"V_F(Confinement)", "V_B(Asympt. freedom)", "V_eff(E=0.3)", "V_ eff AxesLabel {"r [GeV\[SuperScript]-1]", "V [GeV]"}, PlotLabel "QCD Effective Potential (for comparison)", PlotRange {{0, 3},{-2, 3}}, GridLines Automatic, Frame True, ImageSize 500 ]; Print[plotQCDpotential]; (* Transition function comparison *) plotTransitionComparison =GraphicsRow[{ Plot[ {Tqcd[en, EfbQCD, nuQCD], 1 -Tqcd[en, EfbQCD, nuQCD]}, {en, 0, 1.5}, PlotStyle {Blue, Red}, PlotLegends {"T (F-type)", "1-T(B-type)"}, AxesLabel {"E [GeV]", "Weight"}, PlotLabel "QCD Transition", Frame True, ImageSize 300 ], Plot[ {Tgal[r*kpc, rFB, lambdaGal], 1 -Tgal[r*kpc, rFB, lambdaGal]}, {r, 0, 20}, PlotStyle {Blue, Red}, PlotLegends {"T (Newton)", "1-T(Enhanced)"}, AxesLabel {"r [kpc]", "Weight"}, PlotLabel "Galaxy Transition", Frame True, ImageSize 300 ] }, ImageSize 650]; Print[plotTransitionComparison]; (* =========================================================================== = (* Part 8: Relationship with MOND Acceleration Scale *) 8 FBD_Galaxy_Rotation_v1_EN.wl
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 (* =========================================================================== = Print["\n=== Relationship with MOND Acceleration Scale ==="]; (* Transition radius and mass relationship *) Print["Theoretical prediction: r_FB =sqrt(GM/a0)"]; Print["M =10^10 Msun: r_FB =", rFBfromMass[10^10*Msun]/kpc, " kpc"]; Print["M =10^11 Msun: r_FB =", rFBfromMass[10^11*Msun]/kpc, " kpc"]; Print["M =10^12 Msun: r_FB =", rFBfromMass[10^12*Msun]/kpc, " kpc"]; (* Acceleration comparison plot *) plotAcceleration =LogPlot[ { (G0*Mgalaxy/(r*kpc)^2)/a0MOND, aeff[r*kpc, Mgalaxy, rFB, lambdaGal]/a0MOND, 1(* a=a0 line *) }, {r, 1, 50}, PlotStyle {{Blue, Dashed},{Purple, Thick},{Gray, Dashed}}, PlotLegends {"a_Newton/a\[SubScript]0", "a_eff/a\[SubScript]0", "a =a\[ SubScript AxesLabel {"r [kpc]", "a /a\[SubScript]0"}, PlotLabel "Acceleration Comparison", PlotRange {{0, 50},{0.01, 20}}, GridLines Automatic, Frame True, ImageSize 500 ]; Print[plotAcceleration]; (* =========================================================================== = (* Part 9: 3D Visualization *) (* =========================================================================== = Print["\n=== 3D Visualization ==="]; (* 3D plot of v(r, M) *) plot3D =Plot3D[ vRotation[r*kpc, 10^logM*Msun, rFBfromMass[10^logM*Msun], 0.2*rFBfromMass[10^logM* Msun {r, 1, 40},{logM, 9, 12}, PlotRange All, AxesLabel {"r [kpc]", "log\[SubScript]10(M/Msun)", "v [km/s]"}, PlotLabel "Rotation Velocity v(r, M)", ColorFunction "TemperatureMap", MeshFunctions {#3 &}, ImageSize 500 ]; Print[plot3D]; FBD_Galaxy_Rotation_v1_EN.wl 9
Theoretical prediction: r_FB =sqrt(GM/a0) M=10^10 Msun: r_FB =3.40819 kpc M=10^11 Msun: r_FB =10.7776 kpc M=10^12 Msun: r_FB =34.0819 kpc 0 10 20 30 40 50 0.01 0.05 0.10 0.50 1 5 10 Acceleration Comparison a_Newton/ a a_eff/a\[ SubScript a=a\ [ SubScript === 3D Visualization === === Comparison with Observational Data === 16 FBD_Galaxy_Rotation_v1_EN.wl
0 10 20 30 40 0 50 100 150 200 250 300 r[kpc] Model Fit to Observed Rotation Curve Observed FBD Model Newton === Theoretical Parameter Summary === Parameter QCD Galaxy Relation Transition scale E_fb ~0.5 GeV r_FB ~10 kpc sqrt(GM/a\[SubScript ]0) Transition width ν~0.1 GeV λ~2 kpc Free parameter Asymptotic velocity -v_∞= (GMa\[SubScript]0) ^(1/4) Tully-Fisher Low energy/Short r Confinement Newton gravity T 1 High energy/Long r Asympt. freedom Enhanced gravity T 0 Key relation Cornell potential Flat rotation v\[SuperScript]4∝M === Figure Export === FBD_Galaxy_Rotation_v1_EN.wl 17
0 5 10 15 20 25 30 0.0 0.2 0.4 0.6 0.8 1.0 FBD Galaxy Transition Function T_gal(r) [ Newton ] 1-T_gal(r) [ Enhanced 0 10 20 30 40 50 0 50 100 150 200 250 300 Galaxy Rotation Curves Comparison r_FB Newton ( Kepler FBD MOND v_∞( theory === Calculation Complete === v_infty = (G*M*a0)^(1/4) = 199.779 km/s Tully-Fisher slope =0.25 (theoretical value 0.25) 18 FBD_Galaxy_Rotation_v1_EN.wl