رفتن به نوشته‌ها

برچسب: پایتون

در مورد این که همه دارن برنامه‌‌نویس میشن!

زمانی که من بچه‌سال بودم، همه جا صحبت از مهندسی مکانیک بود. رایج بود که نون تو مهندسی مکانیکه. تبی که بعدش تبدیل شد به مهندسی برق. اون زمان هر بچه محصلی که درسش خوب بود بی‌ چک و چونه باید می‌رفت برق. جوری که تقریبا انتخاب اول همه رتبه‌های برتر کنکور برق خصوصا برق شریف بود. گاهی جامعه حتی بهت اجازه نمی‌داد که به چیزی جز مهندسی برق فکر کنی. برق فلان‌جا رو می‌زدی نشد یه جای دیگه، اگه باز نشد اون موقع یه رشته دیگه. حتی سال ۹۱ که من کنکور دادم هم از همه می‌شنیدم که چی؟! یعنی برقو نمی‌زنی؟! نکن! خلاصه که دوران عجیبی بود؛ هم از این جهت که دیوانگی من برای انتخاب فیزیک و بعدش ریاضی برای هیچکس پذیرفتنی نبود هم از این جهت که اصلا برق توی لیست انتخاب رشته‌م نبود و این یعنی عباس واقعا عقلشو از دست داده! البته عباس از اول عقلی نداشت که از دست بده. مردم به این توجه نمی‌کردند!

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

به هر تقدیر، اون دوران گذشت و تب برق هم خوابید. کم‌کم مردم شروع کردن درباره این صحبت کردن که ببینید اون‌قدرا هم درست نبود که همه رو تشویق کنیم برق بخونن! از این حرفا که درسته که باید رویه جامعه رو درک کنیم ولی خوب نیست که کورکورانه دنباله‌رو بازار باشیم. شبکه‌های اجتماعی هم پر شد از این حرفا. تا این‌که خیلی سوسکی همون جوانک‌هایی که در مذمت دنباله‌روی از رویه‌ها و این که نون کجا هست و این حرفا توییت‌ها می‌زدن و رساله‌ها در لینکدین منتشر می‌کردن، یک‌هو شروع کردن به این که آی ایهاالناس برنامه نویسی یادبگیرین و نون توی دیتا است و … . مثلا یکی از همین تجددگراهای همیشه جوگیر که هنوز کارشناسیش رو هم تموم نکرده بود توییت کرده بود که به بچه‌م قبل از هر چیزی پایتون یاد می‌دم. یعنی حتی چند ثانیه فکر نکرده با خودش که شاید پایتون در زمان بچه‌ش وضعیت الانو ممکنه نداشته باشه. بازار داده برای این آدم‌ها دقیقا آشتی‌زدایی کرد از ماجرای قدیمی «بچه‌م باید دکتر/مهندس بشه.» خلاصه کماکان سگ می‌زنه و گربه می‌رقصه!

این روزها که خبر میاد که شرکت‌های بزرگ فناوری مشغول به تعدیل/اخراج تعداد زیادی از کارمندهای خودشون هستن، باز در شبکه‌های اجتماعی همه با فخرفروشی خاصی مشغول به اشتراک گذاشتن گواهی‌نامه‌های تموم کردن دوره حلقه‌های تکرار و تابع در پایتون و هم‌رسان کردن دفترچه‌های ژوپیتر خوشگلشون هستن. این بد نیست لزوما! بله بنده هم درک می‌کنم که مهارت برنامه‌نویسی چقدر مهمه. اگر اجازه بدین باید بگم که کارم اینه! بد اینه که با همون ولع قبلی که برای عمران، مکانیک و برق تبلیغ میشد حالا داره تبلیغ میشه که همه دانشمند داده بشن. چه خبره واقعا؟!

یادمه وقتی تو شهر ما اولین آب‌اناری باز شد، به یک سال نکشید که چندین مغازه دیگه تغییر کاربری دادن به این شغل. اولش تنوع بود و رقابت. بعدش شد تکرار و بدبختی عمده‌شون. واقعا این همه برنامه‌نویس ده سال دیگه اگه بیکار بشن چیکار می‌کنند؟! این که فقط کد بزنیم که نشد کار! چه مهارت‌ها و توانایی‌های دیگه‌ای دارن که خودشون رو تو بازار کار از بقیه متمایز کنند؟! توی جامعه ما هنوز کسی که با کامیپوتر کار می‌کنه حس اینو داره که کار متشخصانه‌ای داره انجام می‌ده. احساسی که انگار مشغول انجام دادن یک کار رده بالا است. کاری که افراد کمی در جامعه قادر به انجامش هستند. در جامعه طبقاتی ما که احترام آدم‌ها عمدتا به رده شغلی و لباس تنشونه، به نظرم خیلی زود مردم همگرا میشن به این ایده که برنامه‌نویسی هم شبیه به کار ساختمونه. اون موقع جوان‌های برنامه‌نویس دیگه اونقدرا که فکر می‌کنند «کول» حساب نمی‌شن.

بله من متوجه هستم که در شرایط کنونی، یادگیری این چیزها به لطف اینترنت خیلی آسون‌شده و دست کم فرصت‌های شغلی مختلفی برای آدم‌ها ایجاد کرده. خودم هم هزارتا پسرخاله و دخترعمو می‌شناسم که به لطف یادگیری پایتون الان سر کار هستند. همین‌طور متوجه این هم هستم که در کنار دانشگاه راه آسون مهاجرت دست به کیبورد شدنه. بله بله بله! همه این‌ها رو می‌دونم. اینو هم می‌دونم که الآن یه سطحی از برنامه‌نویسی شبیه حسابان و جبر خطی شده، ولی نه فقط برای علوم پایه. عملا برای همه. اگه تو مدرسه یا اوایل دانشگاه یه چیزی که به کار ملت بیاد رو خوب درس بدن، همه‌ی این نیازها مرتفع می‌شه.

همه حرفم اینه که به نظر می‌رسه ولع زیادی هم در دنیا و هم در ایران هست برای این‌که کل جامعه به این سمت حرکت کنه. این به خودی خود آفت‌های زیادی میاره. در آینده بخش زیادی از این نسل که قاطی این گله به چراگاه‌های خوبی رفتن متوجه میشن که دیگه زمین سبزی وجود نداره! و این هم برای جامعه بده هم برای آدم‌ها. این وسط فقط غول‌های فناوری پول‌دارتر میشن و نیروهای بهتری رو با قیمت کمتری جذب می‌کنند. باز بگم که من با این حرف موافقم که هر کسی برنامه‌نویسی یاد می‌گیره قرار نیست Software Engineer یا Data Scientist بشه. خودتون لب مطلب رو بگیرین دیگه!

لطفا دست بردارین از سر بچه‌های ما!

🎞گفت‌وگو در مورد گرانش و کیهان‌شناسی

این برنامه به منظور آشنایی بیشتر با گرانش و کیهان‌شناسی در قالب یک گفت‌وگوی زنده اینستاگرامی برگزار شد. در این برنامه به این کتاب‌ها اشاره شد:

  • سه دقیقه نخستین: نمایی امروزی از سرآغاز هستی اثر استیون واینبرگ.
  • پس از نخستین سه دقیقه اثر ت. پادمانابان

میهمانان

🎤 دکتر علیرضا وفایی‌صدر 🇨🇭
دکتری کیهان‌شناسی، تحلیل داده و نجوم رادیویی، پژوهشگر پسادکتری در دانشگاه ژنو

🎤 دکتر فریدا فارسیان 🇮🇹
دکتری کیهان‌شناسی و اخترفیزیک، ساختارهای بزرگ مقیاس، پژوهشگر پسادکتری در دانشگاه بولونیا

🎤 امیر سالار نیک‌اندیش 🇮🇷
دانشجوی دکتری کیهان‌شناسی، جهان اولیه و کیهان‌شناسی ذرات، دانشگاه شهید بهشتی

پرسش‌های اصلی که در این برنامه دنبال شد به شرح زیر است:

  • اسم دقیق این گرایش چیست؟
  • هدف و پرسش‌های معروف در این گرایش چیست؟ متخصصان به چه نوع از مسائل علاقه دارن؟
  • به نظر شما چه تصویر رایج غلطی در ذهن عوام در مورد این گرایش وجود دارد؟
  • چگونه با این رشته آشنا شدین؟ 
  • چه‌طور متوجه شدید که این گرایش مناسب شماست؟
  • محیط کار شما چه شکلی است؟ (آزمایشگاه، رصدخانه، پشت میز، کار با کامپیوتر و …)
  • یک روز عادی در زندگی حرفه‌ای شما چگونه سپری می‌شود؟
  • آیا از انتخابتان راضی هستید؟
  • سختی‌های زندگی شما شامل چه چیزهایی می‌شود؟
  • آیا به سایر علاقه‌مندان به این گرایش توصیه می‌کنید که به‌طور حرفه‌ای به این گرایش بپردازند؟
  • مقدمات علمی و فنی لازم برای ورود به این گرایش
  • درس‌های اصلی (ارائه شده و نشده در مقطع کارشناسی)
  • مهارت‌های جانبی (توانایی محاسباتی و کار کردن با نرم‌افزارهای خاص)
  • کدام دانشگاه و یا مراکز تحقیقاتی در ایران به این گرایش می‌پردازند؟
  • بازار کار در ایران و خارج چگونه است؟
  • امکان تحصیل در خارج از کشور و پذیرش گرفتن در این گرایش چگونه است؟
  • آینده کاری و وضعیت رفاهی خود را چگونه می‌بینید؟ در ایران/خارج
  • رفتن از گرایش شما به سمت گرایش‌های دیگر سخت است؟

در اینستاگرام ببینید:

در یوتیوب بینید:

یادگیری متلب و گنو اُکتاو

من معمولا از پایتون برای برنامه‌نویسی استفاده می‌کنم، چون پایتون آزاده، رایگانه و یه حالت آچار فرانسه‌طوری داره که کارهای مختلف میشه باهاش کرد. همین‌طور پایتون کتاب‌خونه‌های زیادی داره که برای کارهای مختلف علمی (محاسباتی) میشه ازشون استفاده کرد. خوبی این کتاب‌خونه‌ها اینه که به زبان‌های سطح پایین‌تری نوشته شدن به همین خاطر به قدر کافی سریع هستند! اگر هم کسی قصد کارهای تحلیل داده و یادگیری ماشین داشته باشه هم پایتون گزینه اوله، دست کم برای شروع! خلاصه همیشه به همه پیشنهاد می‌کنم که با پایتون شروع کنید و اگه کار دانشگاهی می‌کنید با پایتون ادامه بدین! از همه مهم‌تر وقتی شما با پایتون کد می‌زنید معمولا آدم‌هایی رو پیدا می‌کنید که مثل شما روی پروژه یا مسئله مشابهی کار کردن یا کار میکنند و از تجربیاتشون می‌تونید استفاده کنید یا ازشون سوال بپرسین.

با این وجود گاهی پیش میاد که آدم مجبور به استفاده از زبان‌های دیگه بشه. تجربه شخصی من اینه که عمده دانشگاهی‌ها به این دلیل مجبور میشن از یک زبان خاص استفاده کنند که به قدر کافی آدم‌های حرفه‌ای در تیمشون نیست! گاهی استاد و تیمی که پروژه‌ای رو پیش برده سال‌ها با یک زبان خاص کد زدند و ترجیحشون اینه که آدم‌های جدید هم با همون زبون ادامه بدن. راه کم‌دردسرتری هست معمولا، هر چند که گاهی می‌تونه به شدت احمقانه باشه! خلاصه ممکنه که هر کسی مجبور بشه سراغ زبان‌ها یا محیط‌های دیگه برنامه‌نویسی بره. یکی از این محیط‌ها متلب هست. توی لینوکس می‌تونید از Octave به جای متلب استفاده کنید و لذتش رو ببرید!

متلب یک محیط نرم‌افزاری برای انجام محاسبات عددی و یک زبان برنامه‌نویسی نسل چهارم است. واژهٔ متلب هم به معنی محیط محاسبات رقمی و هم به معنی خود زبان برنامه‌نویسی مورد نظر است که از ترکیب دو واژهٔ MATrix (ماتریس) و LABoratory (آزمایشگاه) ایجاد شده‌است. این نام حاکی از رویکرد ماتریس محور برنامه است، که در آن حتی اعداد منفرد هم به عنوان ماتریس در نظر گرفته می‌شوند.

گنو اُکتاو ( GNU Octave) زبان برنامه‌نویسی سطح بالایی است که بیشتر برای محاسبات عددی به کار می‌رود. این برنامه امکانات زیادی را از طریق رابط خط فرمان برای حل عددی مسائل خطی و غیر خطی می‌دهد. این برنامه را می‌توان جایگزین مناسبی برای همتای غیر آزاد خود متلب به حساب آورد.

ویکی‌پدیا

در ادامه یک سری منبع برای یادگیری متلب و اکتاو رو معرفی می‌کنم.

برای شروع

از بین این دوره‌ها، ببینید کدوم یکی به مذاقتون بیشتر خوش میاد:

برای محسابات عددی

به طور کلی

پیشنهاد من اینه که کلیات متلب رو یاد بگیرین و از منابع مختلف مربوط به کارتون استفاده کنید. مخصوصا از مثال‌های خود Mathworks استفاده کنید. مثلا اینجا ۵۰۰ تا مثال خیلی خوب برای ریاضیات، آمار و یادگیری ماشین هست. خوبه به این‌ها حتما نگاه کنید. حواستون باشه که به روی ایران بسته‌س و شما نیاز به چیزی برای دور زدن تحریم دارین که حتما راه‌های مختلفی بلدین براش!

این کتاب پر از مثال‌های خیلی قشنگه و اساسا آموزشش بر پایه مثال زدن. فصل اولش هم برای کسایی که آشنایی با متلب ندارن یک سری مثال آموزشی خوب داره.

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

به عنوان پیشنهاد به دوستانی که معلم این درس یا درس‌های دیگه میشن : میتونید به جای حل‌تمرین سنتی پایه کلاس‌هاتون رو بر همچین چیزی بذارید. همین کار کوچیک میتونه تغییر محسوسی توی آموزش فیزیک به‌وجود بیاره. این کتاب نسخه‌ پایتونی هم داره!

تجربه شخصی در کارهای مربوط به تحلیل داده در بازار و نه دانشگاه!

من برای مدتی (۶ ماه) به‌خاطر امرار معاش و کسب تجربه وارد یه پروژه تحلیل داده به صورت پاره‌وقت شدم. درآمدش بد نبود و خوش هم می‌گذشت از یه جهت‌هایی! اگه شما تجربه‌ای در برنامه‌نویسی دارین یا ممکنه نیاز به کار پاره وقت داشته باشین یا اینکه کلا دوست داشته باشین که به صورت تفریحی از این کارا کنید، یه سری پیشنهاد دارم که بهتون کمک کنه وارد این شغل بشین.

فقط توجه کنید که این‌ها تجربه یه آدم حرفه‌ای نیست! تجربه کسی هست که فیزیک خونده و حالا می‌خواد یه کار پاره وقت رو تجربه کنه! کاری خارج از صنعت تست و کنکور و المپیاد. امیدوارم حرفه‌ای‌ها ببخشن و با نظرات خودشون این نوشته رو بهتر کنن.

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

۱) پایتون یاد بگیرید

پایتون بر هر درد بی‌درمان دواست. اینم سه تا دوره خوب فارسی:

💡 اگر پایتون رو شروع کردین، ادامه این نوشته رو بخونید!

دیگه وقتش رسیده که حرفه‌ای تر بشین! اولین قدم – به عنوان پیشنهاد – اینه که برین توی ژوپیتر نوت‌بوک کد بزنید، خیلی محیطش خوبه، همون‌جا کدو ران می‌کنید و خیلی راحته همه چیز. در هر مرحله هم خیلی راحت میشه کنترل کرد که دارین چیکار می‌کنید. برای آشنایی بیشتر مثلا این نوشته رو ببینید.

در ضمن گوگل یه چیزی درست کرده به اسم Google Colab که یه ژوپتر نوت بوک آنلاینه که میشه بری اونجا و آنلاین کد بزنی روی کامپیوترای گوگل! ۱۲ گیگ رم میده بهتون با یه پردازنده نسبتا معقول. gpu هم میده برای پردازش‌های موازی! خوبی این‌کار اینه که حتی با یه کامپیوتر ضعیف هم میشه راحت کد پایتون زد و مهم‌تر این‌که میشه کد رو به اشتراک بذاری و همزمان چند نفر توی یه پروژه مشارکت داشته باشند. در ضمن، هر چیزی که بشه روی کامپیوتر شخصی نصب کرد، به راحتی روی گوگل کولب هم نصب میشه. خودتون ببنید چیه دیگه! داخل خود پروژه هم کلی کد نمونه هست. فیلم آموزشی هم هست. اینجا هم یکمی توضیح هست برای گوگل کولب.

بین محیط‌هایی که میشه کد زد ژوپیتر رو بیشتر به این خاطر پیشنهاد می‌کنم چون که می‌تونید برین روی گوگل کولب و راحت زندگی کنید! به خصوص توی کار گروهی به جای این‌که هی به مردم توضیح بدین که دارین چیکار می‌کنید یا مثلا نمودارهاتونو مدام بخواین ذخیره کنید و جدا براشون بفرستین، راحت لینک گوگل کلب رو میدین و میگین خب همه چیز اینجا هست. از طرف دیگه شفاف هم هست دیگه همه چیز. بقیه هم کدتون رو می‌تونن دنبال کنند و این‌که خودتونم یه جوری مجبور میشین تمیز کد بزنید و مرتب کامنت گذاری کنید، توضیح بنویسید که بعدترش دچار مشکل نشین در ادامه پروژه. امکانات خیلی زیادی خلاصه هست.

۲) تحلیل داده به کمک پایتون

الان وقتشه که یه سری کورس تحلیل داده هم ببینید و یاد بگیرین (مهم‌ترین کتابخونه پایتون برای تحلیل داده Pandas هست). با دوره‌ آنلاین آشنا هستید؟!

دوره‌های پیشنهادی:

یک دوره جامع از دانشگاه میشیگان:

۳) آمار یاد بگیرید

اگه واقعا می‌خواین کار درست حسابی کنید باید درست آمار بدونید. این دوره رو پیشنهاد می‌کنم:

نکته مهم اینه که لزومی نداره که خیلی کورس ببینید یا کتاب بخونید! خیلی چیزا رو حین کار میشه یاد گرفت. ولی دونستن یه حداقل‌هایی کمک می‌کنه که شما سریع‌تر بتونید کار پیدا کنید یا موقع کار اصلا بدونید برای رفع مشکلتون چی باید سرچ کنید! فراموش نکنید که گوگل بهترین کمک‌دهنده شما در این مسیره. گوگل معلم خوبیه، ازش سوال بپرسید! راستی، این نوشته از جادی – به عنوان یک آدم حرفه‌ای و با سابقه – رو بخونید.

پیشنهادهایی برای دانشجویان تحصیلات تکمیلی (خصوصا برای سیستم‌های پیچیده)

تجربه من از دوران کارشناسی ارشد سیستم‌های پیچیده در دانشگاه شهید بهشتی چیزهای مختلفی بهم یاد داد. شاید بعضی از این تجربه‌ها به کار شما هم بیاد اگر که به تازگی دوران کارشناسی ارشد یا دکتری خودتون رو در زمینه سیستم‌های پیچیده در یکی از مراکز آموزش عالی شروع کرده باشید.

تا جایی که می‌تونید با سواد بشید.

در هر دانشگاهی، یک سری درس ارائه میشه که شما موظف هستید که بخشی از اون‌ها رو بگذرونید. به نظرم چندان در برابر عناوین اون درس‌ها مقاومت نکنید. این‌که من قراره سیستم‌پیچیده بخونم پس نباید کوانتوم پیشرفته بگذرونیم یا درس ماده چگال پاس کنم یا نظریه میدان به من چه اصلا، حرف‌هایی هست که زیاد شنیده میشه و به نظر من همه‌شون نگاه‌های اشتباهی رو معرفی می‌کنند. تا جایی که میشه سعی کنید از این فرصت‌ها برای یادگیری چیزهای مختلف استفاده کنید. خوبه که آدم یک‌بار برای همیشه خیلی عمیق مکانیک کوانتومی رو یادبگیره و بدونه فیزیک ماده چگال سراغ چه چیزه‌هایی میره. اصلا اشکالی نداره که یک بار با نظریه میدان روبه‌رو بشید؛ اگه الان روبه‌رو نشید شاید دیگه هیچ موقع این فرصت رو پیدا نکنید که این مطالب رو با حوصله یادبگیرید. حواستون باشه سواد آدم‌ها با کتاب‌خوندن و سر کلاس رفتن و تمرین حل کردن به دست می‌آد. وقت زیادی بذارید در ترم‌های اول دوره‌تون برای این‌که باسواد بشید. اگر فکر می‌کنید که استادتون خوب درس نمیده یا به هر دلیلی از کلاسی راضی نیستید سعی کنید از اینترنت استفاده کنید.

مستقل از حرف‌های بالا، یه سری چیزها رو باید خوب بدونید:

برنامه‌نویسی و شبیه‌سازی رو جدی بگیرید.

احتمال زیاد در دوره لیسانس هیچ موقع شما درست حسابی کد نزدید. اما از الان به بعد نه تنها باید زیاد کد بزنید بلکه باید «درست» هم کد بزنید؛ کد شما باید بهینه و خوانا باشه! لطفا به جای غر زدن و بازگو کردن این حقیقت که ای بابا ما قبلا کلاس برنامه‌نویسی نداشتیم و این جور حرفا بچسبید به زندگی علمی‌تون و تلاش کنید که از فرصت‌های پیش اومده برای بهتر شدن استفاده کنید تا بد و بیراه گفتن به زمانه! پیشنهاد می‌کنم با پایتون شروع کنید و بعدا سراغ زبان‌های دیگه برید. گویا زبان‌ علمی آینده،‌ ژولیا است! کورس پایتون برای همه و کورس پایتون برای پژوهش برای شروع خوبه. سعی کنید این مدت جوری کد بزنید که بعد از فارغ‌التحصیلی اگه خواستید از دانشگاه فاصله بگیرید، توی صنعت (بازار) کار گیرتون بیاد!

عمیق بشید.

بالاخره شما موضوعی خواهید داشت و مسئله‌ای برای پژوهش. تا جایی که می‌تونید در مورد اون حوزه اطلاعات کسب کنید. مطالب پیرامونش رو یادبگیرید، چهره‌های شاخص اون حوزه رو بشناسید،‌کنفرانس‌های مربوط در سراسر دنیا رو دنبال کنید و مراقب مسیر تحول موضوع پژوهشتون باشید. لزومی نداره شما وفادار باشید به جریان‌های اصلی، ولی همیشه جریان‌های اصلی ارزش خودشون رو دارن. مقاله‌های مروری کلیدی رو پیدا کنید. زمانی که مقاله‌ای می‌خونید، سعی کنید گزاره‌ها رو دونه به دونه بفهمید. روابط رو اثبات کنید و شبیه‌سازی‌ها رو انجام بدین خودتون. هیچ موقع خودتون رو گول نزنید!

دانشجوی خوب کارشناسی ارشد بعد از تموم شدن دوره‌ش می‌دونه که کجا باید دنبال موقعیت دکتری باشه. اگه به جای این‌که حرفه‌ای عمل کرده باشین، سر خودتون رو شیره مالیده باشید اون موقع سرتون حسابی بی‌کلاه می‌مونه. اگه هم دانشجوی دکتری در این وضعیت باشه که دیگه وای به حالش!

تماشاچی نباشید!

مثل عمده دانشجوها بی‌تفاوت نباشید! فعال باشید، سوال بپرسید، خودتون و بقیه رو به چالش بکشید. جو گیر نباشید ولی در کنفرانس‌های مختلف شرکت کنید. سعی کنید توی جلسات هفتگی فعالانه شرکت کنید. ژورنال کلاب راه بندازین. با بچه‌هایی که سرشون به تنشون می‌ارزه جمع بشین و هفتگی مقالات مهم رو بخونید. در موردشون بحث کنید، حرف بزنید و تلاش جدی داشته باشید که خودتون رو جزوی از جامعه جهانی بدونید!

این جزئیات هم مهمه:

یادگیری «سیستم‌های پیچیده» رو از کجا و چه‌طور آغاز کنیم؟!

خیلی وقته که از من پرسیده میشه که اگر بخوایم یادگیری سیستم‌های پیچیده رو شروع کنیم باید چیکار کنیم؟! آیا میشه بیرون از دانشگاه این کار رو انجام داد؟ یا اگر من رشته‌م مثلا کیهان‌شناسی، آمار یا ریاضی هست برام مقدوره که یادبگیرم؟ خب جواب اینه: چرا که نه! اما اینکه یک راه خیلی خاص وجود داشته باشه، راستش وجود نداره. در حقیقت آدم‌های مختلفی به این سوال طی سال‌های گذشته جواب‌های متنوعی دادن؛ مثلا  مارک نیومن یک‌بار در مورد موضوعات مطرح و منابع موجود در Complex Systems: A Survey نوشته. با این حال سعی می‌کنم طرحی برای شروع یادگیری سیستم‌های پیچیده در ادامه ترسیم کنم. از هرگونه نظر، انتقاد یا پیشنهاد از صمیم قلب استقبال می‌کنم، به‌ویژه از طرف متخصصان. راستی  قبل‌تر نوشته‌ای با عنوان «چگونه یک‌ فیزیک‌دان نظری خوب شویم؟» از خِراردوس توفت، نوبلیست، ترجمه کرده بودم.

اخیرا کتابی منتشر شده به اسم «مقدمه‌ای بر نظریه سیستم‌های پیچیده» که کتاب بسیار خوبی برای شروع سیستم‌های پیچیده به‌طور حرفه‌ایه!

کتاب مقدمه‌ای بر نظریه سیستم‌های پیچیده

پیش‌فرض این نوشته اینه که خواننده به حساب دیفرانسیل و انتگرال، معادلات دیفرانسیل و فیزیک پایه مسلط هست و علاقه شدیدی به ورود به حوزه بین‌رشته‌ای داره! اصلی‌ترین پیش‌نیاز برای یادگیری سیستم‌های پیچیده شهامت و حوصله کافی برای ورود به دنیایی تازه و هیجان‌انگیزه! اگر به دنبال کتابی هستین که حس کلی از «سیستم‌های پیچیده» به شما بده نگاه کنید به کتاب «سیری در نظریه پیچیدگی» نوشته ملانی میچل با ترجمه رضا امیر رحیمی.  همین‌طور کورس مقدماتی در Complexity Explorer وجود داره برای این که یک آشنایی کلی از سیستم‌های پیچیده پیدا کنید.

لیستی که در ادامه اومده، بسته به هر موضوع، از ابتدایی به پیشرفته مرتب شده و تقریبا سعی کردم ترتیب معنی‌داری برقرار کنم. به این معنی که شما می‌تونید به‌ترتیب موضوعات مطرح شده یادگیری اون‌ها رو شروع کنید و بسته به زمانی که دارین توی هر کدوم عمیق و عمیق‌تر بشین!

۱) جبر خطی و ماتریس‌ها

برای شروع نیاز به مفاهیم‌ و تکنیک‌های جبرخطی دارین. باید بتونید با ماتریس‌ها خوب کار کنید.

  1. کورس جبر خطی Vector and Matrix Algebra by Anthony D. Rhodes
  2. ویدیوهای Essence of linear algebra
  3. کورس و کتاب جبرخطی Gilbert Strang

این کتاب با نگاهی جدید به مکانیک کلاسیک، به موضوعات مورد نیاز برای سیستم‌های پیچیده می‌پردازد.

۲) مکانیک کلاسیک

بخش زیادی از سیستم‌های پیچیده توسط فیزیک‌دانان توسعه داده شده، پس باید با ادبیات ابتدایی فیزیک آشنا بشید!

  1. کورس مکانیک کلاسیک لنرد ساسکیند
  2. کتاب Introduction to Modern Dynamics – Chaos, Networks, Space and Time – David D. Nolte

۳) آمار، احتمال و فرایندهای تصادفی

ایده‌های اصلی آمار و احتمال رو باید بدونید. یعنی هرکسی که در دنیای امروز زندگی می‌‌کنه باید بدونه!

  1. کتاب An Introduction to Random Vibrations, Spectral & Wavelet Analysis by D. E. Newland
  2. کتاب Probability Theory: The Logic of Science by E. T. Jaynes
  3. جزوه فرایندهای تصادفی دکتر کریمی‌پور

۴) فرکتال‌ها و مفاهیم مقیاسی

  1. مقدمه‌ای بر هندسه فرکتالی: ویدیو
  2. کتاب Scale: The Universal Laws of Growth, Innovation, Sustainability, and the Pace of Life in Organisms, Cities, Economies, and Companies by Geoffrey West
  3. کورس Fractals and Scaling by David Feldman
  4. این ویدیو رو ببینید:

۵) فیزیک آماری و پدیده‌های بحرانی

مکانیک آماری رو خیلی خوب باید بدونید! از ایده‌های ابتدایی تا مباحث پیشرفته. مدل آیزینگ رو خیلی جدی بگیرین!

  1. کورس مکانیک آماری لنرد ساسکیند
  2. کورس و کتاب فیزیک آماری ذرات، مهران کاردر
  3. کتاب Statistical Mechanics Entropy, Order Parameters, and Complexity by James P. Sethna
  4. کورس کوتاه  Introduction to Renormalization by Simon DeDeo
  5. کتاب Lectures On Phase Transitions And The Renormalization Group by Nigel Goldenfeld
  6. کتاب David Tong: Lectures on Kinetic Theory

    کتاب دینامیک غیرخطی و آشوب استیون استروگتز به همراه ویدیوهای کلاس درسش یکی از بهترین منابع یادگیری دینامیک غیرخطی است.

۶) دینامیک غیرخطی و آشوب

  1. کورس Introduction to Dynamical Systems and Chaos by David Feldman
  2. کورس و کتاب Nonlinear Dynamics and Chaos by Steven H. Strogatz
  3. کورس Nonlinear Dynamics: Mathematical and Computational Approaches by Liz Bradley

۷) شبکه‌ها (علم شبکه)

  1. ویدیو «ظهور علم شبکه»
  2. مقاله مروری The shortest path to complex networks by S. N. Dorogovtsev and J. F. F. Mendes
  3. این ۴ ویدیو رو ببینند.
  4. کتاب علم شبکه باراباشی
  5. کتاب Networks: An Introduction by Mark Newman
  6. این ویدیو رو ببینید:

۸) روش‌ها و تکنیک‌های محاسباتی و شبیه‌سازی

  1. کورس پایتون برای همه
  2. کورس پایتون برای پژوهش
  3. کتاب Monte Carlo Simulation in Statistical Physics: An Introduction by Kurt Binder, Dieter W. Heermann
  4. کتاب Complex Network Analysis in Python by Dmitry Zinoviev
  5. کورس Introduction to Agent-Based Modeling by William Rand

۹)  نظریه اطلاعات و محاسبه

Self-contained, precise. Numerous examples and exercises make it a valuable teaching book
Builds a bridge between physics of glasses and computer science problems

  1. کورس Introduction to Computation Theory by Josh Grochow
  2. مقاله مروری A Mini-Introduction To Information Theory by Edward Witten
  3. کتاب Information, Physics, and Computation by Marc Mézard and Andrea Montanari

۱۰) نظریه بازی‌‌ها

  1. کورس Game Theory I – Static Games by Justin Grana
  2. کورس Game Theory II- Dynamic Games by Justin Grana
  3. کتاب Strategy: An Introduction to Game Theory by Joel Watson

۱۱) یادگیری ماشین

  1. کورس Matrix Methods in Data Analysis, Signal Processing, and Machine Learning – Gilbert Strang
  2. کورس Fundamentals of Machine Learning by Brendan Tracey and Artemy Kolchinsky
  3. مقاله مروری A high-bias, low-variance introduction to Machine Learning for physicists
  4. ویدیو Bayesian Inference by Peter Green

به طور کلی، دوره‌های آموزشی Complexity Explorer رو دنبال کنید. موسسه سن‌تافه (سانتافه!)  یک کورس مقدماتی روی پیچیدگی داره. همین‌طور پیشنهاد می‌کنم عضو کانال Complex Systems Studies در تلگرام بشین. فراموش نکنید که اینترنت پره از منابع خوب برای یادگیری ولی چیزی که کمه، همت! در آخر دیدن این ویدیو رو با زیرنویس فارسی پیشنهاد می‌کنم:

چگونه‌ازكامپيوتردرفيزيک‌استفاده‌كنيم؟ حل عددی، قسمت دوم!

در پست قبل از روش اویلر برای حل معادله دیفرانسیل مربوط به نیمه عمر رادیواکتیو استفاده کردیم. تو این پست هم میخوایم دوباره از این روش استفاده کنیم و یک حرکت پرتابی واقعی! رو شبیه سازی کنیم که کمی پیچیده تر از مثال مربوط به رادیواکتویه .

از معادله دیفرانسیل حرکت پرتابی شروع می کنیم. گفتیم که میخوایم حرکت پرتابیمون واقعی باشه، یعنی ما اثر مقاومت هوا رو هم روی جسممون در نظر می گیریم. اما حرکت ما در صفحه انجام میشه و باید معادلاتمون رو  به دو راستا (x – y) تجزیه کنیم.

معادله دیفرانسیل های این حرکت بصورت زیر هستند (اگر با معادلات زیر مشکل دارید به کتاب‌های فیزیک پایه و یا مکانیک کلاسیک (تحلیلی) رجوع کنید) :

$$ \frac{\mathrm{d^2}{x} }{\mathrm{d} t^2}=\frac{F_{d,x}}{m} $$

$$ \frac{\mathrm{d^2}{y} }{\mathrm{d} t^2}=-g + \frac{F_{d,y}}{m} $$

که در این معادلات ${F_{d}}$ اثر مقاومت هواست و با سرعت حرکت جسم بصورت زیر رابطه داره :

$$F_{d}=-\beta v^2 \widehat{v}$$

همونطور که مشخصه معادله های دیفرانسیلمون مرتبه دو هستند. خب این کار مارو سخت نمیکنه، فقط کافیه هر کدوم از این معادلات رو به دو معادله مرتبه اول تبدیل کنیم. یعنی در پایان با چهار معادله دیفرانسیل مرتبه اول سر و کار داریم. حالا اگه  ${F_{d}}$ رو هم به دو راستا تجزیه کنیم داریم:

$$F_{d,x} = F_{d} cos{\theta} = F_{d} \frac{v_{x}}{v} = -\beta v v_{x}$$

$$F_{d,y} = F_{d} sin{\theta} = F_{d} \frac{v_{y}}{v} = -\beta v v_{y}$$

و در نهایت چهار معادله دیفرانسیل مورد نظرمون به صورت زیر درمیاد :

$$\frac{\mathrm{{d} x} }{\mathrm{d} t} = v_{x} = f_{x}(t,x,v_{x})$$

$$\frac{\mathrm{{d} v_{x}} }{\mathrm{d} t} = -\frac{\beta}{m} v_{x} \sqrt{v_{x}^2 + v_{y}^2}  = f_{vx}(t,x,v_{x})$$

$$\frac{\mathrm{{d} y} }{\mathrm{d} t} = v_{y} = f_{y}(t,x,v_{y})$$

$$\frac{\mathrm{{d} v_{y}} }{\mathrm{d} t} = – g  – \frac{\beta}{m} v_{y}\sqrt{v_{x}^2 + v_{y}^2}  = f_{vy}(t,x,v_{y})$$

حالا اگه از روش اویلر استفاده کنیم و این معادلات رو گسسته کنیم داریم :

$$x_{i+1} = x_{i} + \Delta t   v_{x,i}$$

$$v_{x,i+1} = v_{x,i} – \Delta t   \frac{F_{d,x}}{m}$$

$$y_{i+1} = y_{i} + \Delta t   v_{y,i}$$

$$v_{y,i+1} = v_{y,i} – \Delta t   (g + \frac{F_{d,y}}{m})$$

که در این معادلات t∆ گام گسسته‌سازی مساله ماست. حالا وقتشه که کد برنامه‌مون رو بنویسیم . کد این برنامه هم مثل برنامه رادیواکتیو خیلی سادست و نکته اضافی ای نسبت به اون نداره. دوباره به یک ساختار تکرار نیاز داریم که محاسبات رو تا زمانی که پرتابه مون به زمین نخورده( y >= 0 ) ادامه بده و به محض خوردن زمین عملیات رو متوقف کنه.

در ++c:

#include <iostream>
#include <fstream>
#include <math.h>
#define g 9.8
#define B 4e-5
#define m 1.0
using namespace std;
int main()
{
    double x, y, vx, vy, v, teta, t, dt = 0.1;
    /*** initial conditions***/
    t = 0;
    x = 0;
    y = 0;
    v = 100;
    teta = 30;
    vx = v * cos(teta * M_PI / 180);
    vy = v * sin(teta * M_PI / 180);
    /***-------------------***/
    ofstream o;
    o.open("Projectile motion.txt",ios::out);
    o<<"x"<<"\t"<<"y"<<"\t"<<"t"<<endl;
    while(y >= 0)
    {
        o<<x<<"\t"<<y<<"\t"<<t<<endl;
        v = sqrt(vx * vx + vy * vy);
        x = x + vx * dt;
        y = y + vy * dt;
        vx = vx - (B/m) * v * vx * dt;
        vy = vy - g * dt - (B/m) * v * vy * dt;
        t += dt;      
    }
    o.close();
}

در قسمت اول برنامه کتابخونه هایی که لازم داریم رو تعریف کردیم. کتابخونه math.h توابع مثلثاتی مثل sin و  cos  و همچنین یک سری از عملیات های ریاضی مثل جذر و یا به توان رسوندن رو شامل میشه (البته کلی توابع دیگه هم تو این کتابخونه هست!) و چون در بدنه برنامه نیاز به محاسبات ریاضی داشتیم از این کتابخونه استفاده شد. در خطوط بعد، ثوابت مورد نیاز در برنامه رو تعریف کردیم. همونطور که مشخصه در قسمت بعد و در بدنه اصلی برنامه، ابتدا شرایط اولیه رو که شامل مکان ابتدایی جسم، سرعت اولیه و زاویه پرتاب میشه تعریف و بعد سرعت رو به راستای افقی و  عمودی تجزیه کردیم. در مرحله بعد فایلی برای ذخیره خروجی درست شد و بعد از اون الگوریتم اویلر برای حرکت پرتابی رو با استفاده از ساختار تکرار while پیاده کردیم.

و در پایتون:

from math import *
g = 9.8
m = 1.0
B = 4e-5
x = 0
y = 0
v = 100
teta = 30
t = 0
dt = 0.1
vx = v * cos(teta * pi / 180)
vy = v * sin(teta * pi / 180) 

f = open("Projectile motion.txt", "w")
f.write("x" + "\t" + "y" + "\t" + "t" + "\n") 
while y >= 0 :
    f.write(str(x)+"\t"+ str(y)+ "\t" + str(t) + "\n")
    v = sqrt(vx * vx + vy * vy)
    x = x + vx * dt
    y = y + vy * dt
    vx = vx - (B/m) * v * vx * dt
    vy = vy - g * dt - (B/m) * v * vy * dt
    t += dt

f.close()

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

نمودار حرکت پرتابی در حضور و عدم حضور مقاومت هوا

همونطور که انتظار داشتیم، نمودارمون بطور کامل سهموی نیست و تقارن لازم رو نداره و این بخاطر وجود مقاومت هوا در برابر حرکت جسم ماست. مساله دیگه ای که وجود داره، برد پرتابه است. در حالت عادی و بدون مقاومت هوا میدونستیم که همیشه به ازای زاویه‌ی پرتاب  45 درجه برد پرتابه بیشینه میشه. اما با وجود مقاومت هوا دیگه اینطوری نیست.

برای تمرین بیشتر می تونین برنامه ی حرکت پرتابی رو طوری تغییر بدین که به ازای یک سرعت اولیه، برد بیشینه رو برامون پیدا کنه . همچنین میشه برای یک زاویه خاص، سرعتی که در اون زاویه برد بیشینه میشه رو  بدست آورد.

در این پست هم یک معادله دیفرانسیل رو با روش اویلر حل کردیم. بازهم این پرسش مطرحه که همه ی معادله های دیفرانسیل با این روش حل میشه یا نه؟ و آیا روش های قدرتمند تر و مطمعن تری هم برای حل معادله دیفرانسیل وجود داره؟

به امید خدا پست بعد فضای متفاوت تری خواهد داشت ، اما در پست های بعدتر، باز هم به حل معادله دیفرانسیل و روش های مختلف برای حل این معادلات بر می گردیم.