import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
# Constants
a = 1.0
v = 1.0
E = 0.5 * v**2
def V( r, a= 1.0 ) :
if r < a:
return 1 /r + r**2 / ( 2 *a**2 ) - 3 /( 2 *a)
else :
return 0.0
def integrand( r, b, E) :
U = V( r)
inside = 1 - b**2 / r**2 - 2 * U / E
if inside < 0 :
return 0
return b / ( r**2 * np.sqrt ( inside) )
def scattering_angle( b) :
r_min = find_r_min( b)
if r_min is None :
return 0
integral, _ = quad( integrand, r_min, 10 *a, args= ( b, E) )
return np.pi - 2 * integral
def find_r_min( b) :
from scipy.optimize import brentq
def equation( r) :
return 0.5 * b**2 / r**2 + V( r) - E
try :
return brentq( equation, 1e-5 , a)
except ValueError :
return None
# Generate data
b_vals = np.linspace ( 0.01 , a, 100 )
theta_vals = [ scattering_angle( b) for b in b_vals]
# Plot θ vs b
plt.plot ( np.degrees ( theta_vals) , b_vals)
plt.xlabel ( "Scattering angle θ (degrees)" )
plt.ylabel ( "Impact parameter b" )
plt.title ( "Scattering angle vs impact parameter" )
plt.grid ( True )
plt.show ( )
aW1wb3J0IG51bXB5IGFzIG5wCmZyb20gc2NpcHkuaW50ZWdyYXRlIGltcG9ydCBxdWFkCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiMgQ29uc3RhbnRzCmEgPSAxLjAKdiA9IDEuMApFID0gMC41ICogdioqMgoKZGVmIFYociwgYT0xLjApOgogICAgaWYgciA8IGE6CiAgICAgICAgcmV0dXJuIDEvciArIHIqKjIgLyAoMiphKioyKSAtIDMvKDIqYSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIDAuMAoKZGVmIGludGVncmFuZChyLCBiLCBFKToKICAgIFUgPSBWKHIpCiAgICBpbnNpZGUgPSAxIC0gYioqMiAvIHIqKjIgLSAyICogVSAvIEUKICAgIGlmIGluc2lkZSA8IDA6CiAgICAgICAgcmV0dXJuIDAKICAgIHJldHVybiBiIC8gKHIqKjIgKiBucC5zcXJ0KGluc2lkZSkpCgpkZWYgc2NhdHRlcmluZ19hbmdsZShiKToKICAgIHJfbWluID0gZmluZF9yX21pbihiKQogICAgaWYgcl9taW4gaXMgTm9uZToKICAgICAgICByZXR1cm4gMAogICAgaW50ZWdyYWwsIF8gPSBxdWFkKGludGVncmFuZCwgcl9taW4sIDEwKmEsIGFyZ3M9KGIsIEUpKQogICAgcmV0dXJuIG5wLnBpIC0gMiAqIGludGVncmFsCgpkZWYgZmluZF9yX21pbihiKToKICAgIGZyb20gc2NpcHkub3B0aW1pemUgaW1wb3J0IGJyZW50cQogICAgZGVmIGVxdWF0aW9uKHIpOgogICAgICAgIHJldHVybiAwLjUgKiBiKioyIC8gcioqMiArIFYocikgLSBFCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGJyZW50cShlcXVhdGlvbiwgMWUtNSwgYSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHJldHVybiBOb25lCgojIEdlbmVyYXRlIGRhdGEKYl92YWxzID0gbnAubGluc3BhY2UoMC4wMSwgYSwgMTAwKQp0aGV0YV92YWxzID0gW3NjYXR0ZXJpbmdfYW5nbGUoYikgZm9yIGIgaW4gYl92YWxzXQoKIyBQbG90IM64IHZzIGIKcGx0LnBsb3QobnAuZGVncmVlcyh0aGV0YV92YWxzKSwgYl92YWxzKQpwbHQueGxhYmVsKCJTY2F0dGVyaW5nIGFuZ2xlIM64IChkZWdyZWVzKSIpCnBsdC55bGFiZWwoIkltcGFjdCBwYXJhbWV0ZXIgYiIpCnBsdC50aXRsZSgiU2NhdHRlcmluZyBhbmdsZSB2cyBpbXBhY3QgcGFyYW1ldGVyIikKcGx0LmdyaWQoVHJ1ZSkKcGx0LnNob3coKQo=