mahdi hassani
mahdi hassani
خواندن ۳ دقیقه·۸ ماه پیش

فیزیک در بیلیارد با یک توپ!

همه ما بازی بیلیارد رو انجام دادیم یا حداقل دیدیم. اما یه بخش جذاب ماجرا فیزیک پشت این بازی هست که ظاهرا خیلی ساده به نظر میرسه اما وقتی وارد میدان میشی تا ببینی این پشت داره چه اتفاقی میوفته تازه متوجه عمق فاجعه و پیچیدگی میشی.

من و دوستام تخصصمون فیزیک نیست اما برامون جالب بود با دانش کمی که توی فیزیک داریم به صورت خیلی ساده حرکت یک توپ رو توی زمین بیلیارد شبیه سازی کنیم.

تصویری از شبیه سازی ساده مون :)
تصویری از شبیه سازی ساده مون :)

اگر دوست داشتید میتونید کدهای این شبیه سازی رو از گیتهاب من بردارید.

خب بریم سروقت فیزیک ماجرا(از خیلی از پیچیدگی ها صرف نظر شده)

اول از همه باید واحد اصلیمون رو معرفی کنم. کمیت اصلی ما زمان و واحدش توی این محیط 80 میلی ثانیه هست. علتش هم اینکه که صفحه بازی هر 80 میلی ثانیه یک بار آپدیت میشه. بنابراین واحد سرعت توپ رو هم cm/80ms در نظر گرفتم.

1-ضربه زدن به توپ و حرکتش در یک مسیر مستقیم بدون برخورد با دیواره

توی این سناریو درست بعد از ضربه زدن به توپ ما یک سرعتی رو در توپ ایجاد میکنیم و توپ شروع به حرکت میکنه. فرض میکنیم تنها نیرویی که داره به توپ وارد میشه اصطکاک سطح هست.

تنها نیروی موثر
تنها نیروی موثر


بنابراین با تعریف ضریب اصطکاک جنبشی برای سطحمون(μ) این رابطه معروف رو براش مینویسیم : f=μN
همچنین میتونیم بجای N از mg استفاده کنیم و بنویسیم : f=μ(mg) (I)
از طرفی چون تنها نیروی خالص وارد بر توپ همین اصطکاک هست میتونیم رابطه اصلی نیوتون رو هم براش بنویسیم : f = ma (II)
حالا با ترکیب روابط (I) و (II) به این نتیجه میرسیم: ma = μmg => a = μg
حالا با توجه به اینکه شتاب یه مقدار ثابتی داره میتونیم از روابط سینماتیک برای محاسبه سرعت استفاده کنیم:
a = (v2-v1)/(t2–t1) که در اینجا t2-t1=80ms ، چون همونطور که گفتم داریم تغییرات رو توی بازه زمانی 80 میلی ثانیه بررسی میکنیم و همچنین فرض میکنیم که سرعت اولیه ای که در توپ ایجاد میشه رو داریم.
پس با ترکیب این روابطی و پارامتر هایی که میدونیم به یه همچین چیزی میرسیم :
v2-v1 = -[(0.08μg) * 8] (III)

دلیل اینکه عبارت (0.08μg) در یک 8 هم ضرب شده اینه که گفتم ما واحد سرعتمون رو سانتی متر برا 80 میلی ثانیه درنظر گرفتیم و باتوجه به اینکه سمت راست تساوی یک مقداری رو بر حسب متر بر ثانیه به ما بر میگردونه در با یکم ساده سازی صرفا با ضربش در 8 میتونیم به واحد خودمون برسیم.

بنابراین با این معادله و با داشتن سرعت اولیه ای که در توپ ایجاد میشه میتونیم سرعت ثانویه رو در 80 میلی ثانیه بعد داشته باشیم و باز از این سرعت ثانویه استفاده کنیم تا سرعت بعد از اونو پیدا کنیم و الی آخر...

2-برخورد توپ به دیواره

این سناریو یک اتلاف انرژی بین توپ و دیواره رو داره که به صورت گرما تلف میشه.اما اینکه واقعا سرعت بعد از برخورد به چه حالتی میرسه هیچ ایده ای براش نداشتم.بنابراین از چت جی پی تی کمک گرفتم و رسیدم به مفهومی به نام ضریب برخورد یا به اختصار COR که با علامت e داده میشه. این ضریب یه مقدار بین صفر و یک داره که بسته به جنس و توپ و میز متغیر هست و توی این مثال به همچین فرمولی میرسیم :

e = Vf/Vi (IIII)

که در اینجا Vf سرعت بعد از برخورد و Vi سرعت قبل از برخورد را نشان میدهد. من از 0.9 با توجه به اینکه چت جی پی تی هم برای همچین کیسی متغیر بین 0.7 تا 0.9 گرفته بود، استفاده کردم.

بخش اصلی کد که مربوط به آپدیت کردن سرعت هست رو اینجا میتونید ببینید :

# constants
mass = 0.1
COR = 0.9 # Coefficient of restitution
COF = 0.3 # Coefficient of friction
g = 10
t = 0.08 # time in secendsp
# Calculates and updates velocity
def updateVelocity(v0, gotHit):
if gotHit:
# hit the edge
return COR * v0
else:
# moving on table
return v0 - t * g * COF * 8

اگر پیشنهادی برای بهبود این مدل دارید خوشحال میشم توی بخش کامنت ها اضافه کنید.

ممنون از نگاهتون

شبیه سازیفیزیکمکانیکپایتونبرنامه نویسی
شاید از این پست‌ها خوشتان بیاید