PDA

View Full Version : گفتگو: روند نوشتن برنامه ای برای محاسبه ی مشتق یک تابع



soheril.server
یک شنبه 05 اردیبهشت 1389, 23:12 عصر
با سلام به همه ی دوستان
بنده می خواستم پروژه ای رو شروع کنم گفتم شاید بهتر باشه از اول مسیر درست رو برای نوشتن کدش انتخاب کنم، چون وقت زیادی ندارم و با آزمون و خطا جلو رفتن امکان پذیر نیست...
برنامه به این صورت هست که مثلا" یک فیلد داره که هر عبارت جبری رو کاربر میتونه درش بنویسه، از عبارات مثلثاتی گرفته تا چند جمله ای ها و توابع معکوس مثلثاتی و ...
بعد برنامه مشتق اون رو محاسبه می کنه و بر میگردونه....
اما میخوام با شما مشورت کنم و ببینم به چه طریقی این کار رو انجام بدم تا راحت تر باشه....
اگه براتون مقدور هست روند کار رو توضیح بفرمایید...یعنی مثلا" :

1.یه فیلد داریم که کاربر عبارتش رو وارد میکنه و ما Valid بودن اون رو چک میکنیم

2. [ از اینجا به بعدش رو اگه براتون مقدور هست کمک کنید و راهی که به ذهنتون میاد رو بفرمایید } :چشمک:

با تشکر فراوان:لبخندساده::تشویق:

mortezamsp
دوشنبه 06 اردیبهشت 1389, 01:28 صبح
باید بتونه متغیرهارو بشناسه و با هم ترکیب کنه . مثلا باید برنامه بتونه یک کسر رو ساده کنه . دراینصورت میشه عبارت جبری رو در فرمول مشتق قرار داد و محاسبه کرد .

qwerty11
دوشنبه 06 اردیبهشت 1389, 05:45 صبح
این سوال فوق العاده سختیه :(

اما فکر کنم به صورت بازگشتی بشه حلش کرد. فرض کن عبارت مقابل رو داری :



h(x) * f( (g(x) * p(x) ) / q(x)

تو باید اول مشتق g*p رو به دست بیاری، بعدش مشتق h*f رو و بعد هم مشتق h*f/q که جواب مساله هستش رو به دست بیاری. امیدوارم یه چیزایی دستگیرت شده باشه ...

FastCode
دوشنبه 06 اردیبهشت 1389, 06:37 صبح
http://stackoverflow.com/questions/114586/smart-design-of-a-math-parser
http://www.bestcode.com/html/jbcparser.html

مصطفی ساتکی
دوشنبه 06 اردیبهشت 1389, 12:24 عصر
جواب شما پهلوی جناب golbafan (http://barnamenevis.org/forum/member.php?u=101169)
http://barnamenevis.org/forum/showthread.php?t=161333

soheril.server
دوشنبه 06 اردیبهشت 1389, 15:32 عصر
باید بتونه متغیرهارو بشناسه و با هم ترکیب کنه . مثلا باید برنامه بتونه یک کسر رو ساده کنه . دراینصورت میشه عبارت جبری رو در فرمول مشتق قرار داد و محاسبه کرد .
با سلام
البته در این برنامه لازم به ساده کردن عبارات نیست، چون اصلا" برنامه قرار نیست یک عدد رو به عنوان جواب برگردونه، بلکه عبارتی رو که در حقیقت مشتق هست بر می گردونه:تشویق:

soheril.server
دوشنبه 06 اردیبهشت 1389, 15:36 عصر
این سوال فوق العاده سختیه :(

اما فکر کنم به صورت بازگشتی بشه حلش کرد. فرض کن عبارت مقابل رو داری :



h(x) * f( (g(x) * p(x) ) / q(x)




تو باید اول مشتق g*p رو به دست بیاری، بعدش مشتق h*f رو و بعد هم مشتق h*f/q که جواب مساله هستش رو به دست بیاری. امیدوارم یه چیزایی دستگیرت شده باشه ...





بله دوست عزیز...یکم سخته
ولی فکر کنم سختیش تو کد نوشتنش نیست..تو اینه که برنامت همه جا جواب بده . هیچ exceptionی نداشته باشه..در حقیقت سختیش روی کاغذه..باید بتونی اول از همه تو ذهنت حلش کنی!!!
حالا سوال من هم از حضار محترم همینه که آیا باید تمام این ها رو با if به برنامه حالی کنیم یا راه ساده تری هم هست؟ چون وقت زیادی ندارم می خوام راه درست رو از اول انتخاب کنم...

qwerty11
دوشنبه 06 اردیبهشت 1389, 16:04 عصر
نه من فکر نمیکنم سختیش روی کاغذ باشه. یه تابع مثال بزن خودت میفهمی مراحل کار چطوریه اما اینکه چجوری اینو به کامپیوتر بفهمونی سخته ! خوب مطمئناً راهی جز if وجود نداره به نظر من. اما راهی که من تو ذهنم دارم if کمی میخواد ! ببین فرض کن یه تابع نوشتی که مشتق یه تابع رو برمیگردونه (isolate). حالا فرض کن میخوای عبارت f/g رو به دست بیاری. کافیه که بنویسی :

return isolate(f).multiply(g) - isolate(g).multiply(f) / (g.miltiply(g)) نمیدونم منظورمو میفهمی یا نه !

یه چیز دیگه، اگه جداً هاروارد زندگی میکنی اونجا حتماً آدمای خیلی زیادی هستن که میتونن کمکت کنن... راستش من که ترم اول بودم یکی از بجه های سال بالاییمون که تی ای بود گفت من این برنامه رو با جاوا نوشتم 9000 خط کد شد :-/ البته خالی نمیبست، خیلی قدر بود ...

#Elahe#
دوشنبه 06 اردیبهشت 1389, 16:30 عصر
بهتره شما اول هر چی عبارت جبی تو ریاضی هست رو لیست کنید ، به همراه طریقه مشتق گیریشون . مثل اعدا کسری و مثلثاتی و چند جمله ای و رادیکلی و . . . . .
البته واسه هر کدوم از اینها هم کلی باید شرط گذاشت . مثلا واسه یه عبارت کسری فرض کنید مخرجش یه عبارت رادیکالی باشه که زیر رادیکال هم یه عبارت مثلثاتی چند جمله ای . . .باشه !!!!
یا واسه یه عبارت رادیکالی باید شرط تعیین شه که فرجه ش زوجه یا فرد !!!
همه اینها رو جمع و جور کنید رو کاغذ کدنویسیش راحته . حتی با ابتدائیترین سواد کد نویسی هم میشه برنامه رو نوشت .
البته همه اینها تو گفتار راحته :دی
نوبت نوشتن که برسه سخت میشه

javanerd
دوشنبه 06 اردیبهشت 1389, 16:35 عصر
با سلام به همه ی دوستان
بنده می خواستم پروژه ای رو شروع کنم گفتم شاید بهتر باشه از اول مسیر درست رو برای نوشتن کدش انتخاب کنم، چون وقت زیادی ندارم و با آزمون و خطا جلو رفتن امکان پذیر نیست...
برنامه به این صورت هست که مثلا" یک فیلد داره که هر عبارت جبری رو کاربر میتونه درش بنویسه، از عبارات مثلثاتی گرفته تا چند جمله ای ها و توابع معکوس مثلثاتی و ...
بعد برنامه مشتق اون رو محاسبه می کنه و بر میگردونه....
اما میخوام با شما مشورت کنم و ببینم به چه طریقی این کار رو انجام بدم تا راحت تر باشه....
اگه براتون مقدور هست روند کار رو توضیح بفرمایید...یعنی مثلا" :

1.یه فیلد داریم که کاربر عبارتش رو وارد میکنه و ما Valid بودن اون رو چک میکنیم

2. [ از اینجا به بعدش رو اگه براتون مقدور هست کمک کنید و راهی که به ذهنتون میاد رو بفرمایید } :چشمک:

با تشکر فراوان:لبخندساده::تشویق:

راهی که من پیشنهاد می‌دهم اینه:


یک گرامر بنویسید که با استفاده از اون بشه تمام عبارت‌های ریاضی معتبر رو تولید کرد (توی کتاب‌های کلاسیک کامپایلر از این دست گرامرها زیاد هست). ترجیحا گرامر LL(1) یا LR باشه.
با استفاده از یکی از ابزاهایی که گرامر رو می‌گیرند و parse‌ رو تولید می‌کنند این گرامر رو به یک صورت خودکار به برنامه‌ای تبدیل کنید که بتونه تمام عبارت‌های درست ریاضی رو تجزیه کند و یک AST به شما برگردونه. برای این کار می‌تونید از JavaCC‌ یا SableCC استفاده کنید.
درخت AST که این برنامه‌ها تولید می‌کنند رو پیمایش کنید و هرجا که لازم بود با نوشتن passهای لازم گره‌های موجود در درخت رو تغییر بدهید طوری که بعد از پیمایش کامل درخت (در یک یا چند pass) مشتق عبارت تولید بشه.