Last Chemist
Last Chemist
خواندن ۱۱ دقیقه·۵ ماه پیش

موازنه واکنش های شیمیایی با پایتون - پروژه CREB - قسمت صفرم - مقدمات و نقشه پروژه

لوگوی موقت با حفظ واترمارک سایت سازنده لوگو (ابزار بر پایه AI بود (مثلا!))
لوگوی موقت با حفظ واترمارک سایت سازنده لوگو (ابزار بر پایه AI بود (مثلا!))


آقا من و فرهان (Amber eye) یه کانال راه اندازی کردیم مفتخر میشیم اونجا ببینیمتون : https://t.me/stembc

مقدماتجات!!!

پیش نوشت ۱ : اکثر مواردی که من در این پست نوشتم توی سورس کد موجوده به جز چند مورد که با علامت (v0.x) مشخص شده که به این معنی هست که در ادامه مسیر توسعه ایجاد خواهند شد.
پیش نوشت ۲ : این پست آپدیت میشه و تاریخ های آپدیت هم کنار مواردی که با v0.x مشخص شدن هم نوشته میشه.
پیش نوشت ۳ : x در v0.x به معنی ورژن هسته برنامه هست. x={1,2,3,..,n} <- 😂
و در نهایت! پیش نوشت ۴: برای اینکه وقت خودم رو برای چیزای بیهوده تلف نکنم از ابزار نیمه شگرفی به اسم Copilot برای ریفکتور و این داستانا استفاده میکنم (توی Microsoft Edge و نه به صورت Embedded)

خب آقا سلام یه مدتی بود که (تقریبا ۲ سال) میخواستم یه برنامه ای بنویسم که بتونه موازنه معادلات شیمیایی رو انجام بده ولی خب نشد که بشه بخاطر نداشتن الگوریتم درست و حسابی و صد البته پیچیدگی هایی که ممکنه پیش بیاد و البته میاد و تا عید امسال کاملا عقب افتاده بود یکی از دلایل دیگری که معلقش کرده بودم این بود که کنکور داشتم (مثلا البته) (شایدم کنکور من رو داشت؟؟). حالا من اینجا هستم که بالاخره به شما این امید رو بدم که پروژه داره به قسمت های پایانیش میرسه (تا به این تاریخ ورژن ۰.۲ آپلود شده) و به مرور که قسمت های آینده این پست نوشته میشن پروژه هم احتمال قوی تموم شده و نسخه پایدار ۱.۰ رو در گیتهابم به این آدرس (https://github.com/LastChemist/CREB-Chemical_Reaction_Equation_Balancer) آپلود میکنم. البته که خیلی توی گیت و قوانینش حرفه ای نیستم و شاید از این بابت یکم حرفه ای پسند نباشه ولی خب مهم اینه که کد ما درست و بهینه کار بکنه :)

توصیه ای پیشنهادی کتکی! چیزی داشتین راحت باشین :

https://github.com/LastChemist/CREB-Chemical_Reaction_Equation_Balancer

این پروژه به طور خلاصه چی کار میکنه؟

پروژه CREB که دلیل نامگذاریش رو کمی پایین تر ذکر کردم یه برنامه هست که کارش موازنه کردن معادلات شیمیایی ساده تا خیلی پیچیده هست. همین :)

تا ورژن ۰.۴ (چند ورژن جلوتر) فقط امکان موازنه کردن واکنش های کامل وجود داره و در ادامه توسعه نیم واکنش هایی که نیازمند موازنه بار هستن هم اضافه میشه.

یه توصیه کوچیک

اگر با روش حل معادلات شیمیایی به روش جبری (به عبارت دقیق تر : حل دستگاه معادلات خطی) آشنا نیستین بهتره (میگم بهتره نه حتما) یاد بگیرینش ساده هست خیلی ساده هست فقط شاید حل دستگاه اذیت بکنه که دیگه اینجا از کامپیوتر بهره میگیریم (البته اگر کنکوری نیستین 😂😂🩸🩸)

اگر regex هم بلد نیستین بنظرم یه آشنایی داشته باشین خیلی کمک کننده هست.

دلیل توسعه

اول اینکه کرم دارم 😂 دوم اینکه بعد از اینکه با سایت webqc.org آشنا شدم برای تایید موازنه های شیمیاییم به این فکر افتادم که واقعا چطوری این معادلات رو از ساده تا پیچیده رو به کامپیوتر میفهمونن و در نهایت حلش میکنن؟ (همین سوال قبلا درمورد نحوه ساخت یه IDE برای زبان های برنامه نویسی برام پیش اومده بود)

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

یه نامگرازی برای پروژمون نشه؟

بله نام گرازی! یه اسم خفنطور برای پروژه بعد از ساعت ها فسفر سوزوندن (۲ دقیقه بیشتر نشد) انتخاب کردم
CREB که مخفف Chemical Reaction Equation Balancer به معنی موازنهگر معادله واکنش شیمیایی هست. تادا!! اینم از این (*لبخند)

زبان برنامه نویسی مورد استفاده برای هسته برنامه

زبان برنامه نویسی که من استفاده کردم و البته تسلط (نسبی) دارم بهش پایتون هست. من از پایتون ۳ (دقیق تر بگم ۳.۱۲.۱) استفاده کردم.

رابط کاربری

فعلا برنامه توی کنسول (CMD, terminal و پورتقال دان زات دان) اجرا میشه و به احتمال ۵۰/۵۰ قراره GUI برنامه رو با C-sharp (هنوز ویژوال استودیو رو نصب ننمودم! و این GUI قراره برنامه رو اجرا بکنه و نتیجه رو فقط نشون بده محاسبات هنوز گردن پایتونه!) یا حتی تحت وب (که با PyScript مینویسم) بنویسم.
GUI > v0.x (یعنی ورژن دقیق براش در نظر نگرفتم در آپدیت های آینده پست مینویسم)

روش حل معادله و کتابخانه؟

آها! رسیدیم به قسمت شیمیایی مسئله!!

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

کتابخانه ای که ما استفاده میکنیم کتابخانه SymPy صرفا جهت حل دستگاه معادلات خطی هست یه کتابخونه دیگه هم هست به اسم regex که برای بهینه سازی پارسرمون استفاده میکنیم.

اجزای پروژه

توی ورژن ۰.۲، به تعداد ۸ تا فایل موجوده که با احتساب فایل main.py و فایل linear_equations_system_solver.automatic.py تعدادشون میشه ۱۰ تا که اگر کلاس بندی بخوایم بکنیم و بگیم که هرکدوم به کدوم کلاس تعلق دارن به چند کلاس مختلف بر میخوریم که ترتیب پیاده سازیشون به این شکله البته اونایی که نوشته شده [single file] فقط یه فایل تنها هستن:

میان نوشت : یکسری از مواردی که اینجا گفته شدن ماهیت ابزاری دارن و قراره توی یه کلاس جدا به اسم util طبقه بندی بشن (v0.3)

  • Equation Verifier (البته این مورد بیشتر از یه بار به کارمون میادش) - v0.3
  • JsonHandler [single file]
  • assets [single file]
  • Parser
  • Linear Equations System (builder and solver)
  • linear_equations_system_solver.automatic.py [single file]
  • Chemical Equation Rewriter [single file]
  • Stoichiometric calculations - v0.4
  • Tests - v0.3
  • main.py [single file]

Equation Verifier - upcoming in v0.3

این داشمون کلا کارش ۲ تا چیز بیشتر نیست!

۱ - تشخیص غلط های املایی (مثلا به جای Ar بنویسید ar) و علائم نگارشی غیر مجاز (به جز +، -، =، ()، [] و {})

۲ - تشخیص معادلات غیرممکن (شیمیایی) : منظور این هست که شاید واکنشی که به برنامه دادیم قابل موازنه نباشه که این میتونه به این معنی باشه که :

یکی از ضرایب مواد منفی شده
همه ضرایب صفر بشن
یا اصن اتم جدیدی در یه طرف معادله ظاهر بشه که ممکن نیست (دقت کنین واکنش هسته ای موازنه نمیکنیم)

مورد اول رو در ابتدای برنامه قبل از ورودی دادن به برنامه شاهدش هستیم و یه چک اولیه میشه تا منابع الکی مصرف نشه :)

JsonHandler [single file]

از اونجایی که فایل های برنامه از هم مجزا هستن، پاسخ دستگاه معادلات خطی رو باید یه جایی ذخیره کرد و با دانش فعلی من بجای ایجاد متغیر های Global که دیباگ کردن برنامه رو سخت تر میکنه از یه فایل مجزا از نوع جیسون (JSON) برای ذخیره پاسخ دستگاه استفاده میکنم. این فایل جیسون فقط یه پارامتر داره! اصن بیایم ببینیم چی توشه! اینا:

{
"equation_solution" : " "
}

assets [single file]

۳ تا مورد توی این بزرگوار ذخیره شدن:

۱ - لیست کل عنصر های جدول تناوبی (از هیدروژن تا اوگانسون)
۲ - حروف انگلیسی به ترتیب الفبا (اول حروف کوچیک و بعد بزرگ) که به عنوان متغیر های دستگاه معادلات خطی استفاده میشن (البته بعید میدونم واکنش داشته باشیم که همه اینا رو استفاده بکنه!)
۳ - لیست اعداد ۰ تا ۹
۴ - لیست کاراکتر های مرسوم غیرمجاز در معادله (v0.3) (اگر همه رو بنویسیم لیستش خیلی طولانی میشه ولی خب بخاطر یه نفر که احتمالا میخواد کاراکتر غیر مجاز بنویسه من که نمیتونم بیام کامپیوتر رو علاف چک کردن احتمال وجود چند صد نوع تا کاراکتر غیر مجاز بکنم!)

Parser

اصولا وقتی که در نقش یک انسان فهیم! یه معادله شیمیایی میبینیم اول سمت های معادله ینی فراورده ها و واکنش دهنده ها رو مشخص میکنیم و بعدش میشینیم دونه دونه فرمول های شیمیایی مواد شرکت کننده در واکنش رو بررسی میکنیم و تعداد اتم ها رو رو میشمریم (n تا کربن m تا اکسیژن و ...) بعدش کار ما اینجا تموم میشه.

حالا این وسط غلط های املایی و برخی موارد رو هم بررسی میکنیم، در نهایت میتونیم نوع واکنش مون رو مشخص بکنیم (که واکنش مربوط به یه نیم واکنش هست یا واکنش کامله).

برای این گفتم نیم واکنش برای اینکه توی نیمواکنش ها (بخصوص توی الکتروشیمی) الکترون آزاد در معادله ظاهر میشه که باید موازنه بار رو همزمان با موازنه جرم (با موازنه جرم توی مهندسی شیمی اشتباه نشه) انجام بدیم.
درنهایت ضرایب مورد نیاز رو به هر فرمول اختصاص میدیم و اطلاعات کاملی در مورد فراورده ها و واکنش دهنده ها از بابت تعداد اتم ها به دست میاریم که برای قسمت بعدی قراره استفاده بشه

توی پارسر ما کل معادله رو یه دید میزنیم و تک به تک جزئیات رو بررسی میکنیم.

Linear Equations System (builder and solver)

قسمت builder ماجرا!

این داوشمون کارش مشخصه! با توجه به دیتایی که از پارسر به دست اومده (جزئیات معادله، یعنی تعداد اتم ها در طرف واکنش دهنده ها و فراورده ها) شروع میکنه برای تک تک اتم ها باتوجه به روش جبری که بهتون گفتیم یه سری متغیر به عنوان ضریب استوکیومتری فرمول های شیمیایی دخیل در واکنش ارجاع میده و بعدش مثل کاری که در روش جبری انجام میدیم، معادلات خطی (شاید بهتره بگیم درجه ۱) برای هر اتم منحصر به فرد در واکنش ایجاد میکنه (توضیحش خفنه ولی روش رو بلد باشین میدونین که چیزی نیست (*لبخند + یاح یاح!!)).

قسمت میانی ماجرا!

این قسمت یه ترفند خیلی خفن زدم (در نظر خودم) اونم سورس کد داینامیک هست، به این صورت که بعد از اینکه builder گرامی معادله رو ساخت بالاخره باید یکی این رو حل بکنه یا نه؟ برای همین فایل
linear_equations_system_solver.automatic.py به صورت سورس کدش ایجاد و به صورت یه فایل پایتون ذخیره میشه، این همون حلال (حل کننده!) دستگاه معادلات خطی هست.
برای حل معادله همونطوری که گفتم از SymPy استفاده کردم.

میان نوشت : دلیل این کار من این بود که حوصله دردسر سر و کله زدن با SymPy رو نداشتم و حقیقتا حتی به کمک Copilot نتونستم یه کد خوب براش بنویسم که معادله رو حل بکنه از اونجایی که هر بار معادله متفاوتی ممکنه به برنامه بدیم.
حالا هر بار که معادله منحصر به فردی به معادله میدیم فایل مذکور که با پسوند automatic اشاره نمودم! سورس کد عوض میشه و الان یه برنامه پایتون جدا (حلال) واسه یه معادله منحصر به فردی که ایجاد شده داریم.

قسمت solver ماجرا!

این قسمت بیکاره! میاد فایل linear_equations_system_solver.automatic.py رو اجرا میکنه همین!

Chemical Equation Rewriter [single file]

این قسمت کارش خیلی مهمه (مثلا البته😂)، کاری که میکنه این هست که با استفاده از ابزار JsonHandler میاد فایل جیسون حاوی پاسخ دستگاه معادلات ... (خسته شدم همش اینو گفتم (*خنده)) رو میخونه و باتوجه به معادله شیمیایی اولیه که به برنامه داده بودیم میاد ضریب متناظر با هر ماده شیمیایی حاضر در معادله واکنش رو پشتش مینویسه (دقیقا کاری که توی موازنه انجام میدیم اعداد که ضریب باشن! رو پشت مواد مینویسیم) و تمام!

تبریک میگم شما تونستین یه معادله معادله شیمیایی هرچند پیچیده رو موازنه کنین :)

Stoichiometric calculations - upcoming v0.4

فعلا خیلی روی این قسمت مانور نمیدم چونکه ۲ ورژن جلوتره! ولی این رو داشته باشین که اینجا میتونین مقادیر استوکیومتری جرمی مواد رو به دست بیارین مثلا برای واکنش ماده A با B چند گرم از هر کدوم نیاز دارین، بازده واکنش و درصد خلوص اگر فلان قدر باشن چقدر ماده تولید و مصرف میشه و این موارد.

Tests - upcoming in v0.3

خب هر برنامه های نیاز به یسری تست داره مگه نه؟ به قول یکی از رفقا (آقا پدرام) برای اینکه اگر فیچر جدید اضافه کردیم مطمئن بشیم که فیچر های قبلی هنوز درست کار میکنن و برنامه خراب نشده :)

توضیح خاصی برای این قسمت ندارم فقط میدونم که باید حداقل یه ۱۰۰ تایی واکنش شیمیایی کامل، چه ساده و چه پیچیده رو به عنوان تست به برنامه بنویسم.

میم تایم!

شاید برای شما نیز اتفاق بیفتد!
شاید برای شما نیز اتفاق بیفتد!


کاملا صحیح! البته توی پایتون از «;» برای چند دستور در یه خط استفاده میکنن :)
کاملا صحیح! البته توی پایتون از «;» برای چند دستور در یه خط استفاده میکنن :)


😂😂😂😂
😂😂😂😂
روایت من وقتی که خواستم از SymPy استفاده بکنم این وسط نتم قطع بود :/
روایت من وقتی که خواستم از SymPy استفاده بکنم این وسط نتم قطع بود :/




خب رفقا اینم از این، البته که این پست آپدیت میشه ولی اگر میخواین بروز تر باشین توی چنل مشترک من و فرهان (Amber eye) جوین بشین : https://t.me/stembc

پی نوشت : انصافا نوشتن داکیومنت خیلی سخت بوده ۳ روزه دارم روش کار میکنم😂😂😂

ارادتمند همتون، Last Chemist, OUT



برنامه نویسیگیتهابشیمی
It is an unpopular opinion, but I am surrounded by the idiots. کانال تلگرام : MyDifferentNameChannel
شاید از این پست‌ها خوشتان بیاید