# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > ارزیابی نرم افزار >  ارزش نرم افزاری که معادلات را حل کند ... !؟

## Mahmood_M

سلام دوستان
من برنامه ای نوشتم ( در حال نوشتن هستم ) که میتونه معادلات ( فعلا معدلات درجه یک ) رو حل کنه ...
نکته جالب برنامه اینه که فقط کافیه که معادله مورد نظر رو به صورت یک *رشته* به برنامه بدید و سایر کارها و محاسبه مقدار X به عهده برنامه هست ...
میخواستم بدونم که چنین برنامه ای میتونه ارزشمند باشه ؟
آیا امیدی هست که چنین برنامه ای رو در مثلا در جشنواره خوارزمی شرکت بدم ؟

اگر کسی نظرش رو بگه ، خیلی کمکم کرده ...
آیا ارزش داره که من برنامه رو ادامه بدم ...
درضمن : در برنامه امکانات دیگه ای هم هست ، مثلا محاسبه جمع ، ضرب ، تفریق ، دترمینان و معکوس ماتریسهای 2*2 _ تبدیل اعداد اعشاری به کسر و بلعکس _ انجام محاسبات آنالیز ، احتمالات و فاکتوریل _ انجام محاسبات مربوط به تصاعد و حل چند مسئله و چند محاسبه دیگه ...
درواقع این یک نرم افزار برای محاسبات بزرگ هست ...
آیا میشه روی همچین برنامه ای حساب کرد ؟

با تشکر از همگی ...
موفق و پیروز باشید ...

----------


## HAIdle

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

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

ولی یه چیز باید بگم : خود مواردی که مطرح کردید خیلی جالب نیست. مثلا محاسبات روی ماتریس های 2*2 که این حرفها را نداره و ارزش زیادی نداره ولی اگه امکان بدید که بعد ماتریس آزاد باشه و البته الگوریتم های سریعی مثل الگوریتم های matlab را بکار ببرید ارزشمند تر میشه.

کلا به نظرم اگر کارهای جالب تر و مهم تر به همراه interface زیبا و *خلاقیت* را چاشنی کار کنید و البته مسائل حل نشده را (مثل مشتق که گفتم) در اون بیارید کار جالبی می تونه باشه.
موفق باشید

----------


## Mahmood_M

سلام دوست عزیز ...
ممنون از این که نظر دادید ...



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


من در همون سطحی هستم که گفتید ...



> ولی یه چیز باید بگم : خود مواردی که مطرح کردید خیلی جالب نیست. مثلا محاسبات روی ماتریس های 2*2 که این حرفها را نداره و ارزش زیادی نداره ولی اگه امکان بدید که بعد ماتریس آزاد باشه و البته الگوریتم های سریعی مثل الگوریتم های matlab را بکار ببرید ارزشمند تر میشه.


درسته ...
من برای این برنامه چند قسمت گذاشتم :
1. کار با ماتریسها ( شامل محاسباتی مثل ضرب ، جمع ، تفریق و معکوس و دترمینان و حل معادلات ماتریسی ( پیدا کردن ماتریس مجهول ) و ... )
2. تبدیل اعداد اعشاری به کسر ( شاید این قسمت رو برداشتم ، چون زیاد سخت نیست )
3. آنالیز و احتمالات و فاکتوریل
4. تصاعد ( حسابی / هندسی ) ، شامل پیدا کردن جملات مجهول ، درج واسطه ها و پیدا کردن مجموع جملات و ...
5. معادلات درجه یک و دو

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

در قسمت معادلات هم دارم روی معادلات درجه 2 کار میکنم ، در این قسمت هم مثل قسمت بالا ، ورودی فقط یک مقدار به صورت رشته است ...

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

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

به هر حال کمک زیادی بهم کردید ...
ممنون و موفق باشید ...

----------


## Microsoft.net

البته یه چیز دیگه ای که ارزش داره اینه که از چه الگوریتم هایی استفاده میکنی مثلا می دونی که الگوریتمهای محاسباتی روی ماتریسهای آزاد در ابعداد بزرگ خیلی زمانبره و اگه برنامت از مثلا الگوریتم استراسن که سریعترین روش شناخته شده فعلی است استفاده کنه خوب خیلی کاره ارزش داره در موارد دیگه هم به همین صورت ...

----------


## someCoder

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


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

----------


## Mahmood_M

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


به نظرتون اگعه خودم بنویسم نمیتونم بیشتر روش مانور بدم ، مثلا دستکاریش راحتتره ، اگه یه کد آماده بردارم ، ممکنه جاییش رو نفهمم یا تقریبا اون چیزی که میخوام نباشه ، اون موقع توی بررسی کد ممکنه به مشکل بر بخورم ...
یه چیز دیگه : اگه این برنامه رو در جشنواره شرکت بدم ، بعد از دیدن برنامه ، سورس اون رو ازم نمیخوان ؟ یا مثلا نمی پرسن که روش چیه یا ...
اگه این طور باشه بهتر می تونم توضیح بدم ... ، این طور نیست ؟ ( ولی سعی می کنم از کدهای آماده هم در برخی مواقع استفاده کنم ) ...
ولی فکر نکم سورس چنین توابع یا برنامه هایی توی اینترنت یا ... باشه ...
من الان تابعی که برای حل معادله درجه یک نوشتم حدود 400 خط هست ... ( هنوز کامل کامل نیست ! )
فکر نکنم چنین برنامه ای رو ( اگه باشه ) به همین سادگی در جایی با سورس بزارن ولی در مورد سایر کدها ، مثل کار با ماتریسها درسته ، میشه از کدهای آماده استفاده کرد که البته این قسمتها رو دیگه تموم کردم و خیلی هم تست شده ...

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

موفق باشید ...

----------


## sgb110

سلام
من درست متوجه نشدم شما برای حل معادله (درجه ی 1) 400 خط برنامه نوشتید؟؟؟
میشه بگید الگوریتمتون چی بوده؟
فکر کنم اگه از روش نیوتن استفاده کنید بیشتر از 50-60 خط لازم نباشه
تازه فکر کنم با یکم بازی کردن با بازه ها تون می تونید از روش نیوتن برای هر تابعی استفاده کنید

----------


## someCoder

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

----------


## Mahmood_M

> سلام
> من درست متوجه نشدم شما برای حل معادله (درجه ی 1) 400 خط برنامه نوشتید؟؟؟
> میشه بگید الگوریتمتون چی بوده؟


خوب دوست عزیز ، در این زمینه باید کل حالتها رو بررسی کرد ، البته در برخی موارد باید ساده نویسی هم شده باشه ، مثلا این معادله رو نگاه کنید : X + 2 + 4 = 0 ، یک همچین چیزی رو باید به برنامه به صورت X + 6 = 0 بدید و حل کنه ، ولی برای بررسی همین حالتها هم چند خطی کد لازمه ...
ولی کلا شاید یک خط فقط برای کدی مثل این مصرف بشه :
if I = 0 then
...
البته من بیشتر سعی کردم که خوانایی کد بیشتر بشه که این موضوع هم توی زیاد شدن تعداد خطوط موثر بوده ...

با تشکر از همگی ...
موفق باشید ...

----------


## Mahmood_M

سلام دوستان ...
من تونستم یک معادله درجه 2 رو هم حل کنم ...  :تشویق:  
واقعا که نتیجه یک کار سخت خیلی لذت بخشه !  :لبخند:   :لبخند:  
ولی معادله درجه 1 هنوز کار داره ، واقعا داره سخت میشه ، چون فرمول یا قاعده خاصی برا حلش نیست ...

از نظراتی که دادید ممنونم ...
موفق باشید ...

----------


## Mahmood_M

یک سئوال :
آیا لازمه که برنامه بتونه هر معادله ای ( درجه یک ) رو حل کنه ؟
مثلا ، یک معادله ممکنه به این صورت باشه : X+2 = 0 یا X-3 = 3 
و یک معادله هم میتونه به این صورت باشه : X+3-2+4-5 = 0 یا 3X = -2+4+2+4

من تا یه جاهایی ( تا دو جمله به غیر از X ، یعنی یک منفی و یک مثبت ) رو با برنامه حل میکنم و بقیه جملات رو کاربر باید خلاصه نویسی کنه ، آیا کارم درسته ؟ یا نوعی محدودیت به حساب میاد ...
مثلا یه همچین معادله ای رو : X+3+2 = 0 ، کاربر بنویسه : X+5 = 0 ...
به نظر شما این کار محدودیت برای کاربره ؟ فکر نکنم این طور باشه ، چون خلاصه نویسی یکی  از کارهای اولیه هر معادله هست و معمولا بعد از خلاصه نویسی و ساده کردن هست که جای سخت معادله میاد و میشه این سختی رو با نرم افزار آسون کرد و حلش کرد ...

اگه نظرتون رو بگید ممنون میشم ...
با تشکر از همگی ...
موفق باشید ...

----------


## sinpin

> سلام دوستان
> من برنامه ای نوشتم ( در حال نوشتن هستم ) که میتونه معادلات ( فعلا معدلات درجه یک ) رو حل کنه ...
> نکته جالب برنامه اینه که فقط کافیه که معادله مورد نظر رو به صورت یک *رشته* به برنامه بدید و سایر کارها و محاسبه مقدار X به عهده برنامه هست ...
> میخواستم بدونم که چنین برنامه ای میتونه ارزشمند باشه ؟
> آیا امیدی هست که چنین برنامه ای رو در مثلا در جشنواره خوارزمی شرکت بدم ؟
> 
> اگر کسی نظرش رو بگه ، خیلی کمکم کرده ...
> آیا ارزش داره که من برنامه رو ادامه بدم ...
> درضمن : در برنامه امکانات دیگه ای هم هست ، مثلا محاسبه جمع ، ضرب ، تفریق ، دترمینان و معکوس ماتریسهای 2*2 _ تبدیل اعداد اعشاری به کسر و بلعکس _ انجام محاسبات آنالیز ، احتمالات و فاکتوریل _ انجام محاسبات مربوط به تصاعد و حل چند مسئله و چند محاسبه دیگه ...
> ...


بعید میدونم بیشتر از 500 تومن ارزش داشته باشه !
چون من چند وقته پیش برنامه Matlab رو خریدم 500 تومن! بعید میدونم برنامه شما کاملتر از اون باشه.  :بامزه: 
البته شوخی بود میتونه یه self study خوب باشه واسه خودتون. موفق باشید.

----------


## reza.palang

> یک سئوال :
> آیا لازمه که برنامه بتونه هر معادله ای ( درجه یک ) رو حل کنه ؟
> مثلا ، یک معادله ممکنه به این صورت باشه : X+2 = 0 یا X-3 = 3 
> و یک معادله هم میتونه به این صورت باشه : X+3-2+4-5 = 0 یا 3X = -2+4+2+4
> 
> من تا یه جاهایی ( تا دو جمله به غیر از X ، یعنی یک منفی و یک مثبت ) رو با برنامه حل میکنم و بقیه جملات رو کاربر باید خلاصه نویسی کنه ، آیا کارم درسته ؟ یا نوعی محدودیت به حساب میاد ...
> مثلا یه همچین معادله ای رو : X+3+2 = 0 ، کاربر بنویسه : X+5 = 0 ...
> به نظر شما این کار محدودیت برای کاربره ؟ فکر نکنم این طور باشه ، چون خلاصه نویسی یکی  از کارهای اولیه هر معادله هست و معمولا بعد از خلاصه نویسی و ساده کردن هست که جای سخت معادله میاد و میشه این سختی رو با نرم افزار آسون کرد و حلش کرد ...
> 
> ...


این محدودیت بزگی هست. برنامه ای که میتونه معادله درجه 2 رو حل کنه نتونه مجموع چند عدد ثابت رو حساب کنه زیاد جالب نیست. ضمن اینکه جدا کردن متغیر ها و اعداد ثابت کار سختی نیست.
مباحث طراحی کامپایلر به خصوص تحلیل لغوی می تونه کمکت کنه. مبحث سختی هم نیست

----------


## Mahmood_M

با سلام
از نظراتتون ممنونم ...



> این محدودیت بزگی هست. برنامه ای که میتونه معادله درجه 2 رو حل کنه نتونه مجموع چند عدد ثابت رو حساب کنه زیاد جالب نیست. ضمن اینکه جدا کردن متغیر ها و اعداد ثابت کار سختی نیست.
> مباحث طراحی کامپایلر به خصوص تحلیل لغوی می تونه کمکت کنه. مبحث سختی هم نیست


ولی به نظر خودم این که این محدودیت نباشه زیاد منطقی نیست ...
اصلا کلا به نظر شما یک همچین معادله ای : X+3+4-5-6-5-2 ، غیر منطقی نیست ؟



> ضمن اینکه جدا کردن متغیر ها و اعداد ثابت کار سختی نیست.


ولی من معادله رو به صورت رشته میگیرم ، و اگه برنامه آماده برخورد با چنین معادله ای باشه ، شاید کاراییش توی معادله های کوچکتر پایین بیاد ، یه جورایی شاید درصد اشتباهش بالا بره ...
اگر اعداد جدا از هم وارد می شدند ، خیلی راحت بود ولی چون به صورت رشته دریافت میشن ، یه خورده کار *زیادتر* میشه و این *زیاد* شدن شاید کیفیت کار رو بیاره پایین ... ( البته این نظر منه )
ولی حتما از تجربیات و نظرات شما استفاده خواهم کرد ...
با تشکر از همه دوستان که نظراتشون رو گفتند ، خیلی کمکم کردید ...

با تمام این اوصاف ، آیا به نظر شما امیدی به این برنامه هست ؟ من خودم امید دارم ، چون چند تا نرم افزار رو که در دوره های قبل اول شده بودن یا رتبه آورده بودن رو دیدم ... !

موفق و پیروز باشید ...

----------


## HAIdle

یه نکته که می تونه به دردتون بخوره:
برای خوارزمی کار کردن گرچه انگیزه خوبیه ولی پشتوانه خوبی نیست مثلا ممکنه برای اینکه خوارزمی رتبه بیارید مجبور بشید خیلی چیزهای به دردبخوری که خیلی چیز توش یاد می گیرید را بیخیال شوید. بعنوان مثال چون در خوارزمی (تا اونجایی که من می دونم ) خلاقیت و تولید چیزهای جدید اهمیت داره بنابر این کار با مثلا ماتریس ها که در نرم افزار matlab وجود داره برای آنها خیلی خوب نیست ولی برای خودت وق العاده عالیه

----------


## Mahmood_M

> یه نکته که می تونه به دردتون بخوره:
> برای خوارزمی کار کردن گرچه انگیزه خوبیه ولی پشتوانه خوبی نیست مثلا ممکنه برای اینکه خوارزمی رتبه بیارید مجبور بشید خیلی چیزهای به دردبخوری که خیلی چیز توش یاد می گیرید را بیخیال شوید. بعنوان مثال چون در خوارزمی (تا اونجایی که من می دونم ) خلاقیت و تولید چیزهای جدید اهمیت داره بنابر این کار با مثلا ماتریس ها که در نرم افزار matlab وجود داره برای آنها خیلی خوب نیست ولی برای خودت وق العاده عالیه


سلام
درسته ...
من بیشتر سعی ام روی حل معادلات هست و حل مسائل ( و درواقع امتیاز مهم برنامه هم همینه )
تا اینجای کار برنامه میتونه معادلات درجه 2 رو حل کنه و دیگه کم کم حل معادلات درجه یک هم داره تموم میشه ...
درضمن ، قابلیت مشتق گیری هم دارم میزارم ( از حل معادله درجه یک به مراتب آسونتره ) و همچنین ، حل اتحادها رو هم گذاشتم ...
ولی اگه بتونم کاری کنم که برنامه مسائل ( مثلا تصاعد یا ... ) رو تشخیص بده و حل کنه ، خیلی عالی میشه ...

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

با تشکر از همگی ...
موفق باشید ...

----------


## DAMAVAND

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

موفق باشید

----------


## HAIdle

> سلام
> درسته ...
> من بیشتر سعی ام روی حل معادلات هست و حل مسائل ( و درواقع امتیاز مهم برنامه هم همینه )
> تا اینجای کار برنامه میتونه معادلات درجه 2 رو حل کنه و دیگه کم کم حل معادلات درجه یک هم داره تموم میشه ...
> درضمن ، قابلیت مشتق گیری هم دارم میزارم ( از حل معادله درجه یک به مراتب آسونتره ) و همچنین ، حل اتحادها رو هم گذاشتم ...
> ولی اگه بتونم کاری کنم که برنامه مسائل ( مثلا تصاعد یا ... ) رو تشخیص بده و حل کنه ، خیلی عالی میشه ...


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

----------


## Mahmood_M

سلام
بابت نظرها ممنونم ...



> تشخیص معادله که امکانش در حد محاسبه یک عبارت ریاضی است که در همه زبانها وجود داره و بنابراین کار جدیدی نیست


ولی این کار در حد محاسبه یک عبارت ریاضی نیست ، و فکر نکنم در هیچ زبانی وجود داشته باشه ، چون قاعده و فرمول خاصی نداره ، البته اون روش نیوتن رو که گفتید من نمیدونم چطوریه ...
سختی کار در اینه که حالتهای خیلی زیادی برای یک معادله هست ! ...
مثلا :
X+3-4
X(4-3)-3
3X+4X-3+X
5+3-2X-4
و خیلی حالتهای دیگه ؟
چیزی که مهمه اینه که برنامه این حالتها رو تشخیص بده و اعداد و Xها رو از یک رشته جدا کنه ، ضرایب X رو پیدا کنه ، معادله رو ساده کنه و حل کنه ...
اگه ورودی های برنامه رو به صورت عدد دریافت میکردیم شاید خیلی ساده بود ولی استخراج اونها از یک رشته یه جورایی سخت هست ( البته برای من )
البته شاید چون من آشناییم کم هست برام سخته ولی به هر حال تا اینجا که زیاد آسون نبود ...

موفق و پیروز باشید ...

----------


## reza.palang

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


ببین شما جز اینکه یه قانونی برای رشته ای که کاربر به برنامه ات میده بذاری چاره ای نداری. ریاضیات خودش قانون داره و هر کسی غیر از اون چیزی که قوانین ریاضیات میگه چیزی بنویسه، نه یک برنامه، یک ریاضی دان خبره هم نمیفهمه. و یا در بهترین حالت نتیجه اشتباهی میگیره.
اولین زبانی که توش این چیزها باید رعایت بشه خود ریاضیات هست. و قواعد سفت و سختی باید رعایت بشه.
x*20+1 هیچوقت مثل x*(20+1)
پردازش نمیشه.




> سختی کار در اینه که حالتهای خیلی زیادی برای یک معادله هست ! ...
> مثلا :
> X+3-4
> X(4-3)-3
> 3X+4X-3+X
> 5+3-2X-4
> و خیلی حالتهای دیگه ؟


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




> چیزی که مهمه اینه که برنامه این حالتها رو تشخیص بده و اعداد و Xها رو از یک رشته جدا کنه ، ضرایب X رو پیدا کنه ، معادله رو ساده کنه و حل کنه اگه ورودی های برنامه رو به صورت عدد دریافت میکردیم شاید خیلی ساده بود ولی استخراج اونها از یک رشته یه جورایی سخت هست ( البته برای من )


نمیدونم با چه زبانی داری مینویسی. اما هرچی هست حد اقل امکاناتش برای کار با رشته ها مثل C++‎ تحت Dos هست. باید رشته ورودی رو به صورت استاندارد و قابل فهم برای برنامه در بیاری. این کار ساده ای هست. مخصوصا با Net. (اگه امروز فردا وقت شد یه نمونه کوچیک آماده میکنم)
منظورت از اینکه ورودی به صورت عدد باشه چیه؟ (یه مثال لطفا)




> البته شاید چون من آشناییم کم هست برام سخته ولی به هر حال تا اینجا که زیاد آسون نبود ...


از مباحث طراحی کامپایلر غافل نشو. بخصوص تحلیل لغوی یادم میاد 30، 40 صفحه بیشتر نبود.

----------


## Mahmood_M

سلام



> منظورت از اینکه ورودی به صورت عدد باشه چیه؟ (یه مثال لطفا)


ببخشید ، اشتباه از من بود ، فکر نکنم ورودی عددی داشته باشیم ، البته از طرف کاربر !
منظورم این بود که اعداد به صورت جدا به برنامه داده بشن ( مثلا فرض کنیم میخوایم یک معادله درجه 2 رو حل کنیم ، اگه برنامه A رو به صورت جدا ، B  رو به صورت جدا و C رو هم به صورت جدا دریافت کنه ، دیگه اصلا کاری لازم نیست انجام بده ، بقیش دیگه فرموله ... )



> نمیدونم با چه زبانی داری مینویسی. اما هرچی هست حد اقل امکاناتش برای کار با رشته ها مثل C++‎ تحت Dos هست.


من با *دلفی* دارم مینویسم ... ( دلفی 7 و دات نت نیست )



> منظورت این نیست که اینا حالت های یه معادله هستن؟؟ میدونم اینو نمیخواستی بگی.
> تمام معادلاتی که اینجا نوشتی فقط به یک صورت میشه فهمیدشون و هیچ ابهامی ندارن. اگه یه مثال از یک معادله بتونی بزنی که دو جور بشه پردازش (حل) بشه بهتر منظورت رو میفهمم


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



> ببین شما جز اینکه یه قانونی برای رشته ای که کاربر به برنامه ات میده بذاری چاره ای نداری. ریاضیات خودش قانون داره و هر کسی غیر از اون چیزی که قوانین ریاضیات میگه چیزی بنویسه، نه یک برنامه، یک ریاضی دان خبره هم نمیفهمه. و یا در بهترین حالت نتیجه اشتباهی میگیره.


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



> باید رشته ورودی رو به صورت استاندارد و قابل فهم برای برنامه در بیاری


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

از کمکهاتون ممنونم ...
موفق باشید ..

----------


## azmoodeh

دوست عزیز
آقا محمود گل

خیلی تاپیکت رو دنبال کردم و مشتاق بودم ببینم به کجا میرسی و دوستان هم برات چیکار می کنند
در مورد نرم افزارت باید بهت بگم که متاسفانه برنامه ات برای جشنواره خوارزمی مناسب نیست(چون قبلا بارها و بارها کار شده ، به عنوان مثال بچه های سال اول کامپیوتر دانشگاه شیراز تقریبا هر سال این برنامه رو به عنوان HomeWork یا پروژه می نویسن ) و سورسش هم توی اینترنت خیلی زیاده . اما این به هیچ عنوان به این معنی نیست که کارت و ایده ات فوق العاده جذاب نیست و من هم بهت پیشنهاد می کنم که تا می تونی بهش فکر کن.چون تا حد فوق لیسانس و شاید دکترای کامپیوتر میشه در موردش بحث کرد و مطلب نوشت و یا حتی چیز جدید ارایه داد.
اما تجربه خودم رو بهت میگم امیدوارم کمکت کنه  :چشمک:  
اول اینکه در طراحی چنین نرم افزاری یا هر چیزی که قراره یک دستور زبان رو پردازش کنه ( در اینجا  ریاضی ) سعی کن تا می تونی به برنامه کلی نگاه کنی.یعنی مثلا می خوای حالتهای مختلف2+x+8+y+7+43+z=6  یا چیزهایی شبیه این رو برای حل مساله در نظز بگیری که سر به آسمون میکشه . پس بهتره نرم افزارت طوری باشه که برای پردازش به این موضوعات حساس نباشه و نخواد که قبلا یه بار مرتب بشه و ...

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

اما در مورد ایده شما باید عرض کنم که از اوایل مطرح شدن علم کامپیوتر این موضوع مطرح بوده و در مباحثی مثل ریاضیات گسسته ( ادامه جبر و احتمال دبیرستان میشه و توی دانش کامپیوتر بسیار پایه ای و مهم هست) در موردش خیلی بحث شده که رشته های ریاضی رو چجور پردازش کنن ، چون نه تنها برای برنامه های محاسب ریاضی لازم هست ( مثل Matlab و مثلا همین برنامه شما) بلکه برای طراحی کامپایلر ها هم خیلی لازمه ، شما در نظر بگیرید همین رشته هایی رو که شما الان داری واسه پردازششون تلاش می کنی اگر توی کدت هم بود باید کار می کرد دیگه؟؟مگه نه؟
نهایتا بهترین روشی که معرفی شده مدل لهستانی هست ، یعنی هر رشته موجود در زبان ریاضی رو میشه تقریبا به این فرم در آورد ، به چه معنی ؟؟
یعنی معادل قابل پردازش توسط کامپیوتر برای چیزی که واسه ما قابل فهمه .لهستانی واسه ماشین معمولی واسه آدم .خوب این چجوری هست ؟؟

a b op1 c d op2 op3 op4 e f  op5 

حالا اینو هم ببین 

max(e,f,sin((a+b)/(c*d))



خب حالا واست جالبه که چجور میشه این عبارت که شامل چند تا پرانتز و تابع چند متغیره و ... رو میشه به این فرم در آورد و حالا وقتی به این فرم در اومد کامپیوتر چیکارش میکنه ؟
فرم لهستانی که اگر بهش دقت کنی قابل فهمه . یعنی میاد آخرین عملگر (op) رو پیدا می کنه و پشتش دنبال عملوندهاش می گرده ( که من تعمیم دادم به طوریکه یک عملگر چند تا عملوند داشته باشه و صرفا دو دویی نباشه مثل عملگر Max که سه تایی هست یا سینوس که تکی هست و تو باید با توجه به عمگرت به تعداد دنبال عملوند بگردی)
با توجه به عملگر و عملوند ها مقدار رو محاسبه می کنه و قرار می ده توی عبارت به عنوان عملوند  و .... 
توضیحش خیلی مفصله اما اگر الگوریتمش رو ببینی و یکم روش وقت بذاری می بینی جالب و ساده هست . این تبدیلات رو توی اینترنت با اسم Postfix و Infix می تونی پیدا کنی و الگوریتمش رو مخصوص کار خودت پیاده سازی کنی .

میبنی که راحت می تونی بالا مقادیر a,b,.. رو عدد بدی و کارت رو انجام بدی یا حتی جالبتر اینکه یکیش رو متغیر قرار بدی و هر دفعه یه مقدار جایگزینش کنی  و رشته رو بتونی برای مقادیر مختلف محاسبه کنی  :چشمک:  

بحثش مفصله ولی با انگیزه ای که ازت برای این برنامه دیدم حالا که  روش اصولیش رو خیلی می تونی بسط و تعمیمش بدی
امیدوارم تونسته باشم کمکت کنمو اگر سوالی داشتی و من بلد بودم کمکت کنم
موفق باشی

----------


## Mahmood_M

سلام
ممنون دوست عزیز ...



> در مورد نرم افزارت باید بهت بگم که متاسفانه برنامه ات برای جشنواره خوارزمی مناسب نیست(چون قبلا بارها و بارها کار شده ، به عنوان مثال بچه های سال اول کامپیوتر دانشگاه شیراز تقریبا هر سال این برنامه رو به عنوان HomeWork یا پروژه می نویسن ) و سورسش هم توی اینترنت خیلی زیاده .


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

بابت توضیحاتتون ممنونم ، خیلی کمکم کرد ...
موفق باشید ...

----------


## azmoodeh

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

برات آرزوی موفقیت می کنم و امیدوارم بزودی توی همین تاپیک نرم افزارت رو بذاری تا ببینیم

----------


## Mahmood_M

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


ممنون ... ، روحیم دو چندان شد ...



> برات آرزوی موفقیت می کنم و امیدوارم بزودی توی همین تاپیک نرم افزارت رو بذاری تا ببینیم


ممنون ، وقتی تمام شد حتما میزارم ...

موفق و پیروز باشید ...

----------


## HAIdle

دوست من همانطور که بارها گفتم و دوستمون هم فرمودند این کار بارها و به اشکال مختلف انجام شده است. به نظر من اگر 

این کار (حل معادله) را ادامه بدی برای خودت فوق العاده است ولی برای خوارزمی فکر نکنم.ولی اگر به فکر 

خوارزمی هستی بیشتر تلاشت را متمرکز کن روی قسمت حل مساله یعنی یه مساله ورودی باسه و برنامه بتونه سوال را در 

بیاره و آنرا حل کنه.
تاکید می کنم: برای خوارزمی ها این که چقدر در برنامه شما چیز هست نباید زیاد مهم باشه  قطعا اینکه در برنامه شما چقدر 

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

را تشخیص بدید چقدر می توانید خلاقیت به خرج بدید...




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


اتفاقا در همه زبانها وجود داره: مثلا در همین دلفی که شما کار می کنید یک متغیر از نوع صحیح تعریف کنید و به آن یه 

مقدار بدید. بعد یه عبارت ریاضی *دلخواه* بنویسید که توش همین متغیر باشه و بگید مقدار اون را چاپ 

کنه. براحتی صرفنظر از اینکه عبارت چقدر پیچیده است دلفی عبارت را محاسبه می کنه(البته باید عبارت از نحو زبان 

دلفی تبعیت کنه)
حالا حل معادله به همین سادگی است:(صرفنظر از اینکه عبارت درجه 1 است یا درجه هزار)
علامت تساوی را پیدا کرده و عبارت چپ و راست آنرا بیرون می کشید.تا اینجا دو تا عبارت ریاضی دارید. یه مقدار 

حدس می زنید و با آن مقدار دو عبارت بدست آمده را محاسبه می کنید. تفاضل این دو مقدار تخمینی از میزان دقت حدس 

شما است. به کمک این تفاضل و روشی مثل روش وتر(روش نیوتن بدون نیاز به مشتق) حدس جدیدی می زنید و آنقدر 

جلو می روید تا خطای شما قابل چشمپوشی باشد. برای آگاهی از روش وتر به آدرس زیر رجوع کن:
http://en.wikipedia.org/wiki/Secant_method
موفق باشید

----------


## reza.palang

> ..... حل مساله یعنی یه مساله ورودی باسه و برنامه بتونه سوال را در 
> بیاره و آنرا حل کنه......


 :متعجب: من فکر میکنم محمد آقا میخواد به همین برسه.




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


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

----------


## Mahmood_M

قضیه معادله از قضیه ی مسائل جداست ، من میخوام در قسمتی از برنامه ، معادلات رو حل کنم و قسمت دیگه ای هم توی برنامه بزارم ...
توی این قسمت دوم ، قسمتی برای نوشتن مسئله وجود داره ، که در برنامه من بیشتر روی مسائل مربوط به تصاعد و آنالیز دارم کار میکنم ، وقتی شما مسئاله رو مینویسید ، برنامه داده های مسئله و مجهولات رو تشخیص میده و بعد با تشخیصی که داده اقدام به حل مسئله میکنه ...

امیدوارم بتونم این کار رو انجام بدم ...

درضمن :
من *محمود* هستم !   :چشمک: 

از این که این تاپیک رو پیگیری می کنید ممنونم ...
موفق باشید ...

----------


## Mahmood_M

> اتفاقا در همه زبانها وجود داره: مثلا در همین دلفی که شما کار می کنید یک متغیر از نوع صحیح تعریف کنید و به آن یه 
> 
> مقدار بدید. بعد یه عبارت ریاضی دلخواه بنویسید که توش همین متغیر باشه و بگید مقدار اون را چاپ 
> 
> کنه. براحتی صرفنظر از اینکه عبارت چقدر پیچیده است دلفی عبارت را محاسبه می کنه(البته باید عبارت از نحو زبان 
> 
> دلفی تبعیت کنه)


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

از کمکهاتون ممنونم ...
موفق باشید ...

----------


## reza.palang

> قضیه معادله از قضیه ی مسائل جداست ، من میخوام در قسمتی از برنامه ، معادلات رو حل کنم و قسمت دیگه ای هم توی برنامه بزارم ...
> توی این قسمت دوم ، قسمتی برای نوشتن مسئله وجود داره ، که در برنامه من بیشتر روی مسائل مربوط به تصاعد و آنالیز دارم کار میکنم ، وقتی شما مسئاله رو مینویسید ، برنامه داده های مسئله و مجهولات رو تشخیص میده و بعد با تشخیصی که داده اقدام به حل مسئله میکنه ...


پس در حقیقت برای بدست اوردن ریشه معادله هست. حل این:
f(x) = 0نه این:

a = 5;
f(a) = ?کدوم؟؟ من بعضی وقتا یکمی دوزاریم خم میشه




> من *محمود* هستم !


 :لبخند:  فرقش یه واو هست. :لبخند گشاده!: 
آقا محمود
so sorry

----------


## Mahmood_M

> پس در حقیقت برای بدست اوردن ریشه معادله هست. حل این:
> 
> کد:
> f(x) = 0نه این:
> 
> 
> کد:
> a = 5;
> f(a) = ?کدوم؟؟ من بعضی وقتا یکمی دوزاریم خم میشه


X^+X-3 = 4
X = ?
( X^ = ایکس دو )
یا X + 4-3 = 6-2
X = ?

موفق باشید ...

----------


## reza.palang

> ولی در یک معادله به صورت رشته ، چیزی مشخص نیست ، شما از ضرایب متغیر ، تعدا تکرار متغیر ، تعداد اعداد غیر از متغیر ، مقدار اونها و ... خبر ندارید و باید اونها رو از رشته استخراج کنید ...


توی Net. یه متد هست به اسم split که کارش جدا کردن رشته ها هست . ولی.... ولی شما میتونی seoratorهایی از نوع char یا string تعریف کنی که رشته رو از جاهایی که این seprator ها هستن بشکنه و به چند رشته دیگه تقسیم کنه. (نمیدونم ولی توی دلفی هم باید یه همچین چیزی باشه)
به عنوان مثال میشه رشته ورودی رو از جاهایی که + یا - هست شکست و به مجموع مینترم ها تبدیل کرد. همین کار رو روی رشته های جدید ولی با sepratorهای دیگه انجام باید داد تا اونها رو هم تجزیه کرد. و الی آخر

----------


## azmoodeh

محمود جان 
سلام 
اینطور که می بینم چندان دنبال Infix  Postfix نرفتی !!

----------


## Mahmood_M

سلام



> ولی شما میتونی seoratorهایی از نوع char یا string تعریف کنی که رشته رو از جاهایی که این seprator ها هستن بشکنه و به چند رشته دیگه تقسیم کنه. (نمیدونم ولی توی دلفی هم باید یه همچین چیزی باشه)
> به عنوان مثال میشه رشته ورودی رو از جاهایی که + یا - هست شکست و به مجموع مینترم ها تبدیل کرد. همین کار رو روی رشته های جدید ولی با sepratorهای دیگه انجام باید داد تا اونها رو هم تجزیه کرد. و الی آخر


من تقریبا همین کار رو میکنم ...



> محمود جان 
> سلام 
> اینطور که می بینم چندان دنبال Infix Postfix نرفتی !!


من چند تا چیز پیدا کردم :
http://packages.debian.org/unstable/...2-infix-source
------------------
http://postfix-release.cs-network.de/
------------------
http://en.wikipedia.org/wiki/Infix
و ...
ولی از روی اینها نمی تونم دقیقا به موضوع پی ببرم ...  :افسرده:  

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

ممنون و موفق باشید ...

----------


## linux

منم پستهای اینجا را می خواندم دیدم واقعا دنبال این هستی که مطلب یاد بگیری آفرین خیلی کار خوبی هست.
قسمت بزرگی از کار شما صرف بررسی ورودی اطلاعات خواهد شد.
ببنید برای معادله درجه یک ax+b=0 که جواب آن x=-b/a هست شما 400 خط کد نوشتید یکم زیاد هست. 
اصلی ترین کار شما نوشتن برنامه برای تجزیه و تحلیل ورودی است اگر دنبال math parser بگردید کلی مطلب پیدا می کنید.

----------


## Mahmood_M

سلام ...
ممنون از جواب و راهنماییتون ...



> ببنید برای معادله درجه یک ax+b=0 که جواب آن x=-b/a هست شما 400 خط کد نوشتید یکم زیاد هست.


راستش من یک شیوه کدنویسی به خصوصی دارم ( یه خورده مسخره هست ! ) بیشتر سعی میکنم که خوانایی کد بالا بره ، در خیلی از جاها یک خط فقط شاید جای یک begin یا end یا تنها یک کلمه یا یک اختصاص دهی کوچک باشه ...
ولی دارم روش کار رو عوض میکنم ، فکر کنم هم برنامه ساده تر بشه و هم سرعت بیشتر بشه ( البته حل معادله ( در صورت کوچک بودن اعداد ) زمان بر نیست ) ...

واقعا از نظراتی که می دید ممنونم ، خیلی بهم کمک کردید ...

با تشکر از همگی ...
موفق و پیروز باشید ...

----------


## azmoodeh

محمود جان
من این سورس رو که به پایتون هست برات پیدا کردم.
( پایتون یکی از بهترین زبانهای برنامه نویسی برای کارهای آکادمیک و ایجاد الگوریتم هاست و کدش هم به شبه کد های توضیحی برنامه نویسی شباهت داره و من به همه توصیه می کنم که باهاش آشنایی داشته باشند )
http://aspn.activestate.com/ASPN/Coo...8915/index_txt

سایت رسمی اون هم www.python.org هست و جزو زبانهای متن آزاد محسوب میشه.امیدوارم بزودی بحث جدی اون هم توی این سایت آغاز بشه.
فکر می کنم برای شروع کار سورس خوبی باشه و اگر بهش مسلط بشی می تونی چیزهای جدیدی هم بهش اضافه کنی
موفق باشی

----------


## Alireza_Salehi

> سلام ...
> ممنون از جواب و راهنماییتون ...
> 
> راستش من یک شیوه کدنویسی به خصوصی دارم ( یه خورده مسخره هست ! ) بیشتر سعی میکنم که خوانایی کد بالا بره ، در خیلی از جاها یک خط فقط شاید جای یک begin یا end یا تنها یک کلمه یا یک اختصاص دهی کوچک باشه ...
> ولی دارم روش کار رو عوض میکنم ، فکر کنم هم برنامه ساده تر بشه و هم سرعت بیشتر بشه ( البته حل معادله ( در صورت کوچک بودن اعداد ) زمان بر نیست ) ...
> 
> واقعا از نظراتی که می دید ممنونم ، خیلی بهم کمک کردید ...
> 
> با تشکر از همگی ...
> موفق و پیروز باشید ...


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

تا جایی که من از بحث دستگیرم شد گیر اصلی روی تجزیه و تحلیل رشته ایی هست که کاربر وارد کرده و بدست آوردن اعداد و متغییر هاست و در واقع بدست آوردن ساختار معادله.

بدون شک راحت ترین راه برای همچین کاری طراحی یک Parser کوچیک برای عبارات ریاضی هست ، در واقع این راهی که شما داری میری قبلا رفته شده و نتایج بدون نقصی هم گرفته شده.(طراحی کامپایلر برای عبارات ریاضی و حل معادله)

به طور خلاصه برای این کار شما باید اول متن مورد نظر رو تجزیه کنید(Lexical Analyzer) یعنی اعداد ، متغییر ها و عملوند ها (*,+,-,^,....) را جدا کنید بعد با استفاده از (Parser) یک درخت (Parsing Tree) برای عبارت مورد نظر بسازید در این مرحله حل کردن معادله دیگه کاری نداره.
اگر می خواهید از تجربیات کسانی که قبلا به موضوع مد نظر شما فکر کرده اند و نتیجه گرفته اند استفاده کنید کتاب طراحی کامپایلر بخونید که تو بازار هم به وفور پیدا میشه.
(مثلا کتاب اصول طراحی کامپایلر تالیف آلفرد- ای- هو Alfred Aho و ترجمه های مختلفی براش هست- در همین کتاب مثال برای تجزیه عبارات ریاضی وجود داره)

در ضمن یه چند تا برنامه در این زمینه دیده بودم اگر پیداشون کردم برات میذارم تا عملکردشون رو ببینی.
موفق باشید و هیچ وقت نا امید نشید.

----------


## Alireza_Salehi

این هم چند تا برنامه نمونه:

1. QuickMath-Automatic Math Solutions

2. Equation Wizard

3. Math Solver 

4. http://www.mathsolver.vze.com/

5. Algebra Solver


Maths Editor

در ضمن نرم افزار MatLab روفراموش نکنید واقعا نرم افزار بی نظیری هست.
توابع 
1. roots بدست آوردن ریشه های معادله
2. fsolve حل معادلات غیرخطی(به روشهای محاسبات عددی)
3. fzero حل معادلات خطی
رو حتما تو مطلب تست کنید و نتیجه حل معادلات را ببینید.

ابزار Symbolic Math Toolbox موجود در مطلب را هم تست کنید.

----------


## Mahmood_M

با سلام خدمت همگی ، و عرض تشکر فراوان به خاطر نظراتی که دادید و کمکهایی که کردید ...
من به مشکلی برخوردم ، اگه راهنماییم کنید کمک بزرگی بهم کردید ...
اول روشی که دارم استفاده میکنم رو می گم ، بعد مشکلم رو می گم و بعد روش PostFix رو ( تا جایی که من فهمیدم ) مقایسه می کنیم ، امیدوارم راه حل خوبی پیدا بشه ...
روش کار من :
من برای این که یک معادله رو ساده کنم ، از چند تابع جدا استفاده کردم ، یک تابع برای محاسبه ضریب X ( در صورت وجود بیش از 1 X ، مثلا X-2X+3 ) ، یک تابع برای محاسبه اعداد درون یک رشته ( مثلا  3+3-2+4 ) ، یک تابع برای آوردن مقادیر سمت راست تساوی به سمت چپ و برعکس کردن اونها و یک تابع هم برای حل معادله ساده شده ...
مشکلاتی که وجود داره :
من روی محاسبه عملگرهایی مثل  * و / و یا پرانتزها ( مثلا X+3)2) ) به مشکل برخوردم ، البته مشکل که نمی شه گفت ، یه جورایی توی روش محاسبشون تردید دارم ، مثلا به نظر شما عبارت زیر رو باید به چه ترتیب ساده کنم ؟
(X/3 + 4(3 - X)) + 3 
میشه اول چک کرد که اگر ، در عبارتی مثل " X/3 " ، حرف X وجود داشت ، اونوقت ضریب X برابر باشه با 3/1 ( یک سوم ) ، و بعد به قسمت بعدی داخل پرانتر رفت ، و بعد از محاسبه عبارت ( 4(3 - X) ) ، اون رو به صورت  X 1/3 + 12-4X نوشت ، و بعد ضریبهای X رو از این عبارت محاسبه کرد و بعد یک معادله ساده شده به صورت  X-11/3 + 12 + 3 ( منفی یازده سوم X + دوازده + 3 ) و نهایتا با محاسبه 12+3 ، معادله  X-11/3 + 15 بدست میاد که یک معادله ساده هست و در حل کردنش مشکلی ندارم ...
مشکل اصلی روی پرانتزها است ، توی محاسبه مقادیری که داخل پرانتز هستند و یا در عبارت داخل پرانتز ضرب شدند یا ... ، مشکل دارم ، البته میشه ، مقادیر داخل پرانتز رو استخراج و محاسبه کرد ولی در عباراتی که چند پرانتز دارند ، این کار یه خورده مشکل میشه ! ...

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

بیشتر مشکلات من روی همین قسمتها هست ...
امیدوارم بتونم تا چند روز دیگه تمومش کنم و روی حل مسائل بیشتر کار کنم ... ( زیاد وقت ندارم )

اما روش Infix ، PostFix ...
راستش من هنوز این روش رو خوب درک نکردم ...



> محمود جان
> من این سورس رو که به پایتون هست برات پیدا کردم.
> ( پایتون یکی از بهترین زبانهای برنامه نویسی برای کارهای آکادمیک و ایجاد الگوریتم هاست و کدش هم به شبه کد های توضیحی برنامه نویسی شباهت داره و من به همه توصیه می کنم که باهاش آشنایی داشته باشند )
> http://aspn.activestate.com/ASPN/Coo...8915/index_txt
> 
> سایت رسمی اون هم www.python.org هست و جزو زبانهای متن آزاد محسوب میشه.امیدوارم بزودی بحث جدی اون هم توی این سایت آغاز بشه.
> فکر می کنم برای شروع کار سورس خوبی باشه و اگر بهش مسلط بشی می تونی چیزهای جدیدی هم بهش اضافه کنی
> موفق باشی


خیلی خیلی ممنونم  :قلب:   ، راستش اوایل کد رو یه جورایی فهمیدم ولی اواسط کد که شلوغ شد چیزی متوجه نشدم ... !  :کف کرده!:  

یکی از دوستان در بخش دلفی یک برنامه برام گذاشت که این کار رو میکرد ولی عبارت رو درست حساب نمیکرد ! ، مثلا  4-6+5-6 ، رو -1 حساب کرد ! 
احتمالا چون عجله ای درست کردن ، یه جورایی اشتباه شده ... ( البته با دلفی ننوشته بود و با C بود )
ولی کلا چیزهایی که من از این روش فهمیدم :
فکر کنم روش به این صورت باشه که ابتدا اعداد رو از عملوندها جدا میکنیم ، مثلا در عبارتی مثل عبارت 4-3+4-5 ، ابتدا رشته به این صورت میشه :
-+-5434 , و بعد هر دو حرف رو با یک عملوند محاسبه میکنیم ، به این صورت :

یعنی اول 5 و 4 با عملوند اول محاسبه میشند ، بعد حاصلشون با عدد بعدی و با عملوند بعدی محاسبه میشه و همینطور الی آخر ...

فکر نکنم درست فهمیده باشم ! ...

خیلی خوب میشه اگه یکی از دوستان بگه که مثلا معادله ای که در بالا مثال زدم رو چطور با این روش باید حل کرد ؟



> سلام 
> دیدم خیلی پیگیر و مشتاق این مطلب هستید گفتم شاید بتونم کمکی بکنم:
> 
> تا جایی که من از بحث دستگیرم شد گیر اصلی روی تجزیه و تحلیل رشته ایی هست که کاربر وارد کرده و بدست آوردن اعداد و متغییر هاست و در واقع بدست آوردن ساختار معادله.
> 
> بدون شک راحت ترین راه برای همچین کاری طراحی یک Parser کوچیک برای عبارات ریاضی هست ، در واقع این راهی که شما داری میری قبلا رفته شده و نتایج بدون نقصی هم گرفته شده.(طراحی کامپایلر برای عبارات ریاضی و حل معادله)
> 
> به طور خلاصه برای این کار شما باید اول متن مورد نظر رو تجزیه کنید(Lexical Analyzer) یعنی اعداد ، متغییر ها و عملوند ها (*,+,-,^,....) را جدا کنید بعد با استفاده از (Parser) یک درخت (Parsing Tree) برای عبارت مورد نظر بسازید در این مرحله حل کردن معادله دیگه کاری نداره.
> اگر می خواهید از تجربیات کسانی که قبلا به موضوع مد نظر شما فکر کرده اند و نتیجه گرفته اند استفاده کنید کتاب طراحی کامپایلر بخونید که تو بازار هم به وفور پیدا میشه.
> ...


با تشکر فراوان از شما ، من هم تقریبا میخوام به همین برسم ...
درضمن : بایت برنامه ها هم ممنون ، مخصوصا EquationWizard چیز جالبی بود ولی جالب اینجاس که من هنوز با Matlab کار نکردم ...
امروز اگه خدا بخواد میرم کتابی که گفتید ( اصول طراحی کامپایلر ) و این نرم افزار رو تهیه کنم ...

با تمام این توضیحات ، بی صبرانه منتظر راهنماییهاتون هستم ، من دیگه برنامه رو ادامه نمی دم تا توی همین بحث و با راهنمایی شما به نتیجه مطلوب برسم و یه جورایی وقتم رو هدر ندم ...
بازم تاکید میکنم که وقت زیادی ندارم ، کوچکترین راهنمایی شما میتونه خیلی کمک کنه  :قلب:  

جا داره در آخر این پست از همه دوستان مخصوصا جناب Azmoodeh و arsp_2004 و HAIdle و Reza.Palang و همه دوستانی که نظر دادن و راهنماییم کردن تشکر ویژه ای بکنم ...  :قلب:  
کاش میتونستم جبران کنم ...

موفق و پیروز باشید ( و منتظرم ) ...  :قلب:

----------


## azmoodeh

محمود جان عزیز
سلام

عبارتی که گذاشته بودی یه صورت زیر تبدیل میشه : 

5-4+3-4 ---->5 4 - 3 + 4 - 


و حتی اگه دارای پرانتز باشه اینجور میشه 

(5-4)+(3-4) ---> 5 4 - 3 4 - +

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


ممنون از تلاشی که می کنی  :تشویق:  
موفق باشید

----------


## Mahmood_M

سلام
ممنونم ...



> همیشه هم اولین عملگر از سمت راست پیدا میشه و بعد عملوندهاش رو محاسبه می کنه و بعدش حاصل رو به جای اونها قرار می ده .


اگه یک توضیح جزئیتر بدید ممنون میشم ...
روش محاسبه در قسمت اول ( بدون پرانتز ) رو نتونستم خوب بفهمم !
برای پیاده سازی این روش ، خودم باید رشته ها رو به این صورت دربیارم و بعد حساب کنم یا این روش در زبانهای برنامه نویسی به صورت تابع یا ... وجود داره ؟

...
درضمن : در مورد مشکل اولم ( پرانتزها در معادله )  نظری ندارید ؟

درضمن :



> ما گلچین تقدیر و تصادفیم !!


جمله جالب و زیبایی بود ... !

با تشکر فراروان

----------


## Alireza_Salehi

به طور کلی عبارات ریاضی را به سه صورت می توان نوشت :
میانوند Infix
پیشوند Prefix
پسوند Postfix
عبارات میانوند همان عبارات معمول بین انسان ها هستند مثلا:
A+B*Cعبارات پسوند و پیشوند تبدیل شده همان عبارت میانوند به صورت اول عملگر یا آخر عملگر می باشند.
مثلا همان عبارت بالا به صورت پیشوند +A*BC یا به صورت پسوند ABC*+ 
حالا برای ارزیابی یک عبارت به یک سری پیشنیاز ها لازم است :
1. جهت محاسبه - معمولا چپ به راست
2. تقدم عملگرها (Operators) - یعنی اگر از پرانتز گذاری استفاده نشده بود کدام عملگر ابتدا عمل می کند.
3. جهت تقدم - مثلا اگر در یک عبارت چند تا عمل ضرب بود اول سمت چپی عمل می کند یا سمت راستی.
4. فرمت عملوندها (operands) - یعنی متغییر ها با چه فرمتی تعریف می شوند یا چه کاراکترهایی برای تعریف متغییر ها مجاز است (در اکثر زبان های برنامه نویسی : کاراکتر اول از حروف انگلیسی یا _ و بقیه کاراکترها عددی یا حرفی هستند) 
خوب حالا چرا از عبارت های پسوندی یا پیشوندی استفاده می کنیم؟
دلیل آن سادگی محاسبات این عبارات توسط کامپیوتر است. مثلا عبارت پسوند به راحتی با استفاده از پشته قابل محاسبه است. تنها با چند خط کد نویسی. 
نکته مهمی که در این جا باید ذکر شود این است که عبارت پسوندی یا پیشوندی به هیچ وجه شامل پرانتز نمی باشد و این عبارت میانوند است که می تواند پرانتز داشته باشد.
در واقع شما با تبدیل عبارت میانوند به پسوند یا پیشوند عملا بحث پردازش پرانتز را منتفی می کنید.
برای مثال با فرض این که *ثابت های عددی*،* متغییرها* ،* عملگرها*،* پرانتزباز* و* پرانتز بسته* را یک *نشانه* (Token) بنامیم الگوریتم تبدیل یک عبارت میانوند به پسوند به صورت زیر است(به نقل از کتاب ساختمان داده ها در C انتشارات علوم رایانه):--------------------------------------------------------------------------------------------------
1. یک پشته خالی ایجاد کنید. 

2. تازمانی که خطای رخ نداده یا به انتهای عبارت نرسیده ایم کارهای زیر را انجام بده2-1. نشانه بعدی را از عبارت استخراج کن (این کار توسط تحلیلگر لغوی انجام می شود)
2-2. اگر نشانه2-2-1. *پرانتز باز است* : آن را در پشته قرار بده.
2-2-2. *پرانتز بسته است* : عناصر پشته را آنقدر حذف کنید و در عبارت پسوندی قرار دهید تا به پرانتز باز برسید (اگر پرانتز باز پیدا نشد خطا وجود دارد)2-2-3. *عملگر است* :اگر پشته خالی است *یا* تقدم این عملگر از تقدم عملگر بالای پشته بیشتر استآن را در پشته قرار دهید وگرنه عنصر بالای پشته را حذف کنید و در عبارت پسوندی قرار دهید.این کار را برای عملگر جدید موجود در بالای پشته تکرار کنید.2-2-4.*عملوند است* : آن را در عبارت پسوندی قرار دهید.3. وقتی به انتهای عبارت میانوند رسیدید عناصر پشته را حذف کنید و در عبارت پسوندی قرار دهید تا پشته خالی شود.
--------------------------------------------------------------------------------------------------

این هم چند تا مثال :
A+B  :لبخند:  AB+
A+B-C  :لبخند:  AB+C-
(A+B)*(C-D)  :لبخند:  AB+CD-*
A^B*C-D+E/F/(G+H)  :لبخند:  AB^C*D-EF/GH+/+
((A+B)*C-(D_E))^(F+G)  :لبخند:  AB+C*DE--FG+^
A-B/(C*D^E)  :لبخند:  ABCDE^*/-
عبارات پیشوندی یا پسوندی به خودی خود تنها برای محاسبه نتیجه یک عبارت به کار می روند و نه حل یک معادله. در واقع این روشها برای بدست آوردن یک فرمت استاندارد از معادله ورودی بیشتر کاربرد دارند تا حل آن. معمولا برای حل معادلات مخصوصا از نوع غیر خطی توسط کامپیوتر از روش های محاسبات عددی استفاده میشود. 
حالا برای ارزیابی یک عبارت دو مرحله اصلی و اولیه وجود دارد :
1 . ابتدا عبارت تحلیل شده ، اعداد و متغییرها جداسازی شوند- این کار توسط فاز تحلیل لغوی (lexical Analyzer) در یک کامپایلر انجام می شود. در این مرحله خطاهای لغوی مشخص می شود - مثلا عددی به صورت زیر در رشته ورودی وجود داشته باشد 15a23 
2. در مرحله دوم شما باید با پیشنیازهایی که در بالا ذکر کردم اعداد و متغییر های جدا شده به عنوان یک عبارت در نظر گرفته و حل نمایید (Syntax Analyzer) - در این مرحله اگر خطای نحوی موجود باشد مشخص می شود - مثلا یک پرانتز جا افتاده باشد یا دو عملگر پشت سر هم باشند x^2+5-*X 

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

----------


## HAIdle

دوست من محمود جان
من این بحث مهم را در چند پست بیان کردم ولی فکر کنم خوب بیان نکردم چون شما هنوز دارید راه مشکلی را می روید.
یک بار دیگه می گم. لطفا خوب دقت کنید:
بطور کلی تنها معادلاتی که برای حل آنها فرمول وجود داره مغادلات درجه 1 و درجه دو هستند(البته معادلات درجه 3 هم یه فرمول پیچیده ای دارند ولی آنقدر پیچیده است که عملا استفاده زیادی ندارد)
پس برای حل معادلات چند جمله ای یا نه پیچیده تر مثلا معادلات مثلثاتی یا لگاریتمی و غیره باید چکار کرد؟ جواب خیلی ساده است: سراغ روشهای حل معادلات غیر خطی می رویم(مثل روش تنصیف یا نابجایی یا نیوتن یا وتر یا ...)
گرچه اصول آنرا یک بار گتم ولی یک بار دیگر هم می گویم خوب دقت کنید: روش به این ترتیب است که شما هیچ نیازی ندارید عملیاتی مثل آوردن طرف راست به چپ یا محاسبه اتحادها را انجام دهید.فقط کافی است در رشته ورودی علامت "=" را پیدا کنید و بعد طرف چپ علامت را بصورت یک عبارت و طرف راست را هم بصورت یک عبارت ریاضی در نظر بگیرید. سپس یا یک مقدار حدسی کار را آغاز می کنید. با آن مقدار طرف چپ و راست را محاسبه می کنید(به همان سادگی محاسبه عبارت ریاضی درزبانهای برنامه نویسی نه چیز بیشتر.و آن هم بینهایت کد و راه حل آماده دارد).تا این نقطه شما دو مقدار دارید. هر چه این دو مقدار تفاوت بیشتری داشته باشند حدس اولیه شما بدتر بوده. حالا این دو مقدار ورودی الگوریتم مورد نظر شما (مثلا روش وتر) شده و با محاسبات انجام شده روی آن یک مقدار جدید به دست می آید. و این عمل به دلخواه شما و تا دقتی که شما بخواهید تکرار می شود تا تقریب مناسبی از حل معادله  بدست آید.
اینکه شما درک کنید این روش برای معادلات غیر چند جمله ای و معادلات جند جمله ای با درجه بالاتر از 2 تنها روش و برای چندجمله ایهای با درچه دو و یک ساده ترین روش است بسیار مهم است. شما در پست های بالا حرف از اتحاد زده اید. رفتن سراغ اتحاد ها به نظر من کار اشتباهی است. سعی کنید به این سمت که الان توضیح دادم بیایید.

بار یگر می گویم روی حل معادله کار زیادی شده است. به نظر من اگر برای خوارزمی کار می کنید به سمت حل مسائل حرکت کنید(البته در حل معادله چیزهای بسیار خوبی یاد می گیرید ولی فکر نکنم برای خوارزمی خوب باشه مگر اینکه کار حدید و ایده ی جدیدی مطرح کنید)

موفق باشید

----------


## Mahmood_M

با سلام



> دوست من محمود جان
> من این بحث مهم را در چند پست بیان کردم ولی فکر کنم خوب بیان نکردم چون شما هنوز دارید راه مشکلی را می روید.
> یک بار دیگه می گم. لطفا خوب دقت کنید:
> بطور کلی تنها معادلاتی که برای حل آنها فرمول وجود داره مغادلات درجه 1 و درجه دو هستند(البته معادلات درجه 3 هم یه فرمول پیچیده ای دارند ولی آنقدر پیچیده است که عملا استفاده زیادی ندارد)
> پس برای حل معادلات چند جمله ای یا نه پیچیده تر مثلا معادلات مثلثاتی یا لگاریتمی و غیره باید چکار کرد؟ جواب خیلی ساده است: سراغ روشهای حل معادلات غیر خطی می رویم(مثل روش تنصیف یا نابجایی یا نیوتن یا وتر یا ...)
> گرچه اصول آنرا یک بار گتم ولی یک بار دیگر هم می گویم خوب دقت کنید: روش به این ترتیب است که شما هیچ نیازی ندارید عملیاتی مثل آوردن طرف راست به چپ یا محاسبه اتحادها را انجام دهید.فقط کافی است در رشته ورودی علامت "=" را پیدا کنید و بعد طرف چپ علامت را بصورت یک عبارت و طرف راست را هم بصورت یک عبارت ریاضی در نظر بگیرید. سپس یا یک مقدار حدسی کار را آغاز می کنید. با آن مقدار طرف چپ و راست را محاسبه می کنید(به همان سادگی محاسبه عبارت ریاضی درزبانهای برنامه نویسی نه چیز بیشتر.و آن هم بینهایت کد و راه حل آماده دارد).تا این نقطه شما دو مقدار دارید. هر چه این دو مقدار تفاوت بیشتری داشته باشند حدس اولیه شما بدتر بوده. حالا این دو مقدار ورودی الگوریتم مورد نظر شما (مثلا روش وتر) شده و با محاسبات انجام شده روی آن یک مقدار جدید به دست می آید. و این عمل به دلخواه شما و تا دقتی که شما بخواهید تکرار می شود تا تقریب مناسبی از حل معادله بدست آید.
> اینکه شما درک کنید این روش برای معادلات غیر چند جمله ای و معادلات جند جمله ای با درجه بالاتر از 2 تنها روش و برای چندجمله ایهای با درچه دو و یک ساده ترین روش است بسیار مهم است. شما در پست های بالا حرف از اتحاد زده اید. رفتن سراغ اتحاد ها به نظر من کار اشتباهی است. سعی کنید به این سمت که الان توضیح دادم بیایید.
> 
> بار یگر می گویم روی حل معادله کار زیادی شده است. به نظر من اگر برای خوارزمی کار می کنید به سمت حل مسائل حرکت کنید(البته در حل معادله چیزهای بسیار خوبی یاد می گیرید ولی فکر نکنم برای خوارزمی خوب باشه مگر اینکه کار حدید و ایده ی جدیدی مطرح کنید)
> ...


ممنون از جواب و راهنماییتون ...
ولی اگه می شه یک مثال عملی از حل یک معادله با این روش بزنید ! ، من چون نه تجربه درسی و نه تجربه ساخت برنامه ریاضی با این روش رو نداشتم ، یه جورایی درکش برام سخته !
مثلا چنین معادله ای رو چطور میشه با این روشی که میگید حل کرد ؟
5/3X-3+6X=4-X/2=
فرض میکنیم در معادله بالا ، "/" به عنوان خط کسری باشد ...
اگر روش حل چنین معادله ای رو با روشی که گفتید توضیح بدید خیلی خیلی ممنون میشم ...
و اما در رابطه با حل مسائل هم حق با شماست و باید بیشتر روی اون قسمت کار کنم ...
..............
*با تشکر فراوان از جناب arsp_2004* ، دیگه فکر کنم کاملا متوجه شدم ...  :قلب:  
درضمن ، کتاب اصول طراحی کامپایلر رو هم تهیه کردم و دارم میخونم ...

با تشکر از همگی ...
موفق باشید ...

----------


## Alireza_Salehi

> با سلام
> 
> ممنون از جواب و راهنماییتون ...
> ولی اگه می شه یک مثال عملی از حل یک معادله با این روش بزنید ! ، من چون نه تجربه درسی و نه تجربه ساخت برنامه ریاضی با این روش رو نداشتم ، یه جورایی درکش برام سخته !
> مثلا چنین معادله ای رو چطور میشه با این روشی که میگید حل کرد ؟
> 5/3X-3+6X=4-X/2=
> فرض میکنیم در معادله بالا ، "/" به عنوان خط کسری باشد ...
> اگر روش حل چنین معادله ای رو با روشی که گفتید توضیح بدید خیلی خیلی ممنون میشم ...
> و اما در رابطه با حل مسائل هم حق با شماست و باید بیشتر روی اون قسمت کار کنم ...
> ...


با اجازه جناب HAIdle :

همون طور که قبلا گفتم شما بعد از این که با روش های مطرح شده مثل تحلیل لغوی ، تحلیل نحوی و ... عبارت مورد نظر رو ساده کردید خطاهای آن را رفع کردید و متغییرها ، اعداد و تقدم عملگرها رو مشخص کردید ( یعنی به طور خلاصه خیالتون از لحاظ ساختار معادله راحت شد - هنر شما در این مرحله میتونه ساده کردن عبارت باشه : مثلا عبارت 25X^2-5X+6X-12X^2+5-3+4X رو به 13X^2-7X+2 تبدیل کنید. (Optimization) ) نوبت به حل معادله میرسه.

برای حل معادله دو راه پیش رو دارید:
*1.* با روشهایی که برای هر درجه ای از عبارات چند جمله ای وجود داره بعد از این که تشخیص دادید این چند جمله ای درجه چنده به ازای هر نوع چند جمله ای روش حلش روانتخاب کنید و اون رو حل کنید.
کاملا واضح است که دراین روش باید به ازای هر نوع معادله (بر اساس درجه - مثلثاتی - لگاریتمی و... ) یک روش حل بنویسید که با توجه به تنوع معادلات اصلا منطقی نیست. مثلا معادله درجه 2 یک روش ، معادله درجه 3 یک روش و الی آخر.
البته نوشتن برنامه ای که نوع معادله رو تشخیص بده و یک روش کلاسیک رو برای حلش انتخاب کنه می تونه جالب باشه ولی با این همه تنوع در معادلات خیلی کار میبره!

*2.* از روش های محاسبات عددی استفاده کنید.
در این روشها با یک سری عملیات (بسته به نوع روش) و دقتی که برای روش انتخاب می کنید از یک مرحله شروع کرده و به تدریج به جواب می رسید.این روشها معمولا برای اکثر معادلات چه خطی و چه غیر خطی پاسخگو و دقیق هستند. در واقع در علوم مختلف برای محاسبات کامپیوتری معادلات از این روشها استفاده می شود.
این روشها معمولا به دو صورت است:
در *حالت اول* یک مقدار حدسی برای جواب در نظر میگیریم و به تدریج با یک سری محاسبات به جواب اصلی نزدیک می شویم. مثلا می گوییم نقطه x جواب است و با یک سری تقریب ها به همسایگی چپ یا راست x حرکت می کنیم و به جواب اصلی نزدیک می شویم.
در *حالت دوم* یک بازه برای جواب در نظر می گیریم و به تدریج این بازه را با یک سری محاسبات کوچک می کنیم تا به جواب معادله برسیم. مثلا می گوییم جواب در بازه [a,b] قرار دارد بسته به روش انتخاب شده این بازه را تقسیم می کنیم حال یا به دو قسمت مساوی یا نامساوی که بستگی به روش حل دارد بعد مثلا با تقریبی می فهمیم جواب در بازه چپ است آنقدر این عمل را روی این بازه انجام می دهیم و آن را کوچک می کنیم تا با دقت مشخص و از قبل تعیین شده ای به جواب برسیم.

*مزیت این روشها این است که سرعت بالایی دارند و با یک حلقه قابل پیاده سازی هستند. تنها کاری که در این روشها انجام می شود عدد گذاری در معادله است و بس ؛ و نوع معادله تقریبا مهم نیست.*

روشهای معروف حل معادلات عبارتند از (روش های دیگری هم در کتاب ها موجود است):
1. تصنیف Bisection
2.نابجایی False Position (روش Regula Falsi)
3.تکرار ساده Simple Fixed Point Iteration
4. تکرار Fixed Point Iteration
5. نیوتن-رافسون Newton-Raphson
6.وتری Secant
7.ایتکن Aitken
8.استفنسن Steffensen

نکته آخر اینکه در این روشها برای بالابردن دقت جواب باید اولا به *همگرایی* روش انتخاب شده دقت نمود ، ثانیا *دقت مناسبی* را انتخاب نمود و ثالثا در حین محاسبات به *خطای انباشته* توجه نمود.

اطلاعات بیشتری اگر در مورد این روشها و روشهای دیگه بخوای در کتاب های *روشهای محاسبات عددی* پیدا خواهی کرد.


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

----------


## Mahmood_M

با عرض سلام و تشکر فراروان به خاطر نظرات و کمکهایی که کردید ...
در ابتدا از جناب arsp_2004 تشکر میکنم که توضیحات کاملی دادند ... 



> محمود جان
> با توضیحات arsp-2004 اگر باز مثال خواستی من در خدمتم


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

شما یک مسئله رو به برنامه می دید ( در یک کادر تایپ میکنید ) ، بعد با کلیک بر روی یک دکمه ، برنامه کلمات داخل مسئله رو پیدا میکنه و بعد از پیدا کردن ، با کلماتی که بهش داده شده مقایسه میکنه و با یک سری محاسبات ( که اگه فعلا نگم بهتره ) ، نتایجش رو در یک رکورد میریزه ...
اطلاعات درون این رکورد به شرح زیر هست :
1. مبحث مسئله ( یعنب مسئله وارد شده مربوط به کدام مبحث ریاضی هست ؟ )
2. داده های مسئله
3. مجهولات مسئله
4. روشهای حل مسئله
5. صحیح ترین روش حل مسئله

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

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

حق با جناب Azmoodeh هست ، نباید فقط برای شرکت در جشنواره یا ... ، برنامه نوشت ، ولی یه جورایی جشنواره یه انگیزه میشه که من بتونم برنامه رو بنویسم ( حتما بنویسم ) و بین راه منصرف نشم ... !

تا اینجای کار به مشکلی بر نخوردم ، ولی اگه سئوالی پیش اومد در همین تاپیک می پرسم ...

*اینم بگم که من هنوز دارم روی حل معادلات کار میکنم ...*

با تشکر از همگی ...
موفق باشید ...

----------


## HAIdle

> با این که توضیحات جناب arsp_2004 واقعا کامل بود ، اما یک مثال عددی کوچیک می تونه خیلی کمکم کنه !! ( البته ببخشید ، شاید به نوعی پررویی باشه ) ، ممنون ...


نه! هیچ پررویی نیست. تا انسان شجاعت پرسیدن سوال را نداشته باشد باید ذلت ندانستن را بپذیرد. سعی کن همیشه آنچه را متوجه نشدی دوباره بپرسی... :تشویق:  

ببخشید من این چند وقت یه کم سرم شلوغه. به زودی برات مثال می گذارم.
موفق باشید

----------


## medashti

سلام،
من يک عضو جديد سايت هستم. از مطالب بسيار مفيدي که در مورد روشهاي حل دستگاه معادلات غير خطي در پيامتون به دوست ديگري بود ممنون هستم. من يک دستگاه معادله غير خطي 7 معادله 7 مجهولي دارم که دارم با استفاده از نرم افزار مطلب و تابع fsolve حلش مي کنم. اما مشکل همگرا شدن داره. خودم حدسم اينکه يا حدس اوليه اش درست نيست (که احتمالش خيلي کمه) و يا بعضي نکات رو مثل انتخاب تعداد تکرارها و يا دقت مسئله را که بايد در بکارگيري اين روشها استفاده کرد رعايت نمي کنم. خلاصه يک سري نکات هست که بهش توجه ندارم. شما در پيامتون گفته بوديد "نکته آخر اينکه در اين روشها براي بالابردن دقت جواب بايد اولا به*همگرايي*روش انتخاب شده دقت نمود ، ثانيا *دقت مناسبي* را انتخاب نمود و ثالثا در حين محاسبات به *خطاي انباشته* توجه نمود. "، ميشه در اين مورد بيشتر توضيح بديد يا اگر زحمتي نباشه با مثال بگين. شايد مشکل حل مسئه من در همين نکاتي باشه که شما اشاره کردين و من رعايتش نمي کنم. بسيار از شما ممنون هستم. 
از دوستان ديگر هم که در اين مورد مي تونن به منکمک کنن ممنون مي شم که جواب سؤالم رو بدن. از همگي ممنون.

----------


## Felony

دوست عزیز من اولین بار هست که این تاپیک رو خوندم .
اگه برای جشنواره ی خوارزمی میخوای این پروژه رو ارایه بدی باید بگم هر چی تعداد خطهای کدهای برنامت کمتر و واضحتر باشه بهتره ...
من تو زمینه ی جشنواره ی خوارزمی زیاد تجره دارم ، اینی که گفتم به نفع خودته چون تو مرحله ی داوری یه سری بلا نسبت شما I.K.U نشستن داوری میکنن ولی خودشون نمیدونن چیکار میکنن !!!

مثلا مثل دانشگاه که پروژه به استاد تحویل میدی میشینه اونجا اگه 5000 خط برنامه داری برنامت رو برا خودش 10 قسمت میکنه و از هرقسمت 40 ، 50 خط پاک میکنه مثلا 30 دقیق یا 45 دقیقه بهت فرصت میده برنامه رو دوباره مثل اول سرپا کنی و این تو پروژه های تکنفره و بزرگ یعنی فاجعه ...

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

----------

