23
ﺧﺪا ﻧﺎم ﺑﻪ در ﻏﻴﺮﺧﻄﻲ و ﺧﻄﻲ رﻳﺰي ﺑﺮﻧﺎﻣﻪ ﻣﺘﻤﺘﻴﻜﺎ6.0 ﻋﺒﺪل ﻣﺴﻌﻮد اﻣﻴﺮ ﺗﺎﺑﺴﺘﺎن1387

Linear and NonLinear Programming with Mathematica 6

Embed Size (px)

DESCRIPTION

This Document that written in Farsi language describe some Expression in Mathematica 6 about Solving Linear and NonLinear problem, and in the end of that i solved some problem with Expression that introduce in document.If you don't understand Farsi and want to know about this Expression and problem Solving in Mathematica JUST LOOK AT SAMPLE CODE IN DOCUMENT.

Citation preview

Page 1: Linear and NonLinear Programming with Mathematica 6

 به نام خدا

برنامه ريزي خطي و غيرخطي در  6.0 متمتيكا  

 امير مسعود عبدل

 1387تابستان

 

 

 

   

 

Page 2: Linear and NonLinear Programming with Mathematica 6

مقدمهامروزه نرم افزارهاي بسياري براي انجام عمليات رياضي توليد شده اند كه از برجسته ترين و سريع ترين و انعطاف

.اشاره كرد 1متمتيكاپذيرترين آنها ميتوان به

امروزه حل مسائل خطي و غيرخطي از اهميت خاصي برخوردار است، كه البته حل مسائل خطي مدتي است كه تا رفته است و روش هاي متعددي براي آن ابداع شده است و در اكثر نرم افزارهاي رياضي و مهندسي انتهاي راه

.الگوريتمها و توابعي نيز براي حل آنها قرار داده شده است

.نيز دستوراتي براي حل اين دو دسته معادله در نظر گرفته شده است كه به توضيح آنها ميپردازيم متمتيكادر

                                                             1  Mathematica 

Page 3: Linear and NonLinear Programming with Mathematica 6

LinearProgrammingدستور :شود كه به توضح آنها ميپردازيمروش فراخواني مي 7به دستور

ضرايب تابع هدف است، cورودي فراخواني ميشود كه 3اين دستور با :  .1m ماتريسي كه نشان دهنده ضرائب محدوديت ها وb نشان دهنده طرف راست محدوديتها است.

. و را با استفاده از محدوديتها و خروجي دستور برداري است كه مقدار مينيمم شده مسئله :براي مثال

:و متغيرهاي نامنفي با محدوديتهاي براي مينميمم كردن مسئله

اين دستور حالت تكميل شده اي براي : .2دستور باال است كه امكان انتخاب نوع نامساوي را براي محدويتها به ما ميدهد، به اين معنا كه ميتوانيم براي هريك

2همانطور كه ميبينيد . از محدوديتها معين كنيم كه نامساوي كوچكتر مساوي است يا بزرگتر مساوي و يا مساويمانند باال وجود دارند و همان معنا را نيز دارند ولي براي وارد كردن طرف راست محدوديتها كه در و ورودي

. باال همگي به صورت بزرگتر و مساوي بودند و فقط يك بردار آنها را مشخص ميكرد روش ديگري بيان شده استاست سطر آن به صورت وارد ميكنيم كه هر 2در nبه اين صورت كه بردار را به صورت يك ماتريس

ام و مولفه دوم نشان دهنده نوع محدوديت است، براي jكه مولفه اول نشان دهنده مقدار طرف راست محدوديت :مثالً. را وارد ميكنيم -1؛ و براي كوچكتر و مساوي 0؛ براي مساوي 1بزرگتر و نامساوي عدد

:يمدستوري به صورت زير را دار با محدوديت براي حل مسئله

:باشد دستور به صورت زير ميشود و يا اگر محدويت به صورت

باهت بسياري با دستور اول دارد و تنها تفاوت اين دستور نيز ش : .3به جمع ورودي ها است كه همانطور كه در روند پيشرفت دستورها مشاهده كرديد، هر اضافه شدن ورودي

براي وارد كردن مقدار قابل قبول براي متغييرهاي مدل به ما ميدهد، دستور امكان بيشتري را براي پياده كردن بزرگتر از آن مقدار را همه متغييرها مقدار موجود است، به اين صورت كه با وارد كردن عددي حقيقي به جاي

.: قبول ميكنند، يعني

Page 4: Linear and NonLinear Programming with Mathematica 6

را اختيار كنند دستور را به -2مثالً براي مثال مطرح شده در حالت اول اگر بخواهيم متغييرها اعدادي بزرگتر از :صورت زير تغيير ميدهيم

اين دستور بهينه شده دستور باال است كه امكان ميدهد :  .4ها نشان تشكيل دهنده نامعادله كه مقدار اوليه هر متغيير را براي آن به طور خاص مشخص كنيم، يعني هر كدام از

:آنگاه داريم و براي مثال فوق اگر بخوايم . هستند

اين دستور توانايي بسيار مفيدي را براي:  .5سازي مدلهاي پيچيده تر تواناتر ميكند، به اين صورت كه بعد از وارد كردن ما به ارمغان مي آورد كه ما را در پياده

وارد ميكنيم، البته اينبار به جاي 2ستون همانند حالت 2ما ماتريسي را با c,m,bمتغييرهاي اصلي يعني كه امكان وارد كردن يك بازه را به ما براي هريك از متغييرها به ما ميدهد، به اين صورت كه

.و اين كار را ميتوانيم براي هريك از متغييرها انجام دهيم. خواهد بود نشان دهنده معادله

:حل كنيم، آنگاه داريم و براي مثال فرض كنيد مسئله دستور اول را با دو شرط

 

استفاده ميشود، به اين صورت كه براي اينكه Infinityبراي نشان دادن مقدار بينهايت در متمتيكا از عبارت : ذكرترا جايگزين عبارت 5در دستور و نشان دهيم كه

.ميكنيم

:داريم و با شروط مثالً براي حل مسئله

اين دستور ورودي هاي اصلي را به طور كامل دارد و در :  .6مقدار متغييرها است، به اين معني كه را نيز اضافه كرده است كه نشان دهنده دامنه انتخاب domانتها مقدار ورودي

ما برنامه Integersكه در صورت انتخاب . Integersباشد و يا Realsجواب دستگاه از چه نوع داده اي باشد، .ريزي خطي صحيح را خواهيم داشت

هستند كه در اينجا دو مقدار Reals, Integers, Rationals, Complexانواع داده اي در متمتيكا به صورت : تذكرReal وInteger مورد قبول هستند.

Page 5: Linear and NonLinear Programming with Mathematica 6

به طوري كه جواب صحيح با محدوديت براي حل مسئله به صورت مينيمم سازي : براي مثال :باشد داريم

اين دستور همانند نمونه هاي گذشته مكمل :  .7هر كدام از . داده اي را براي تك تك متغييرها به ما ميدهد دستور بااليي خود است كه امكان تعيين كردن نوع

domها نشان دهنده نوع داده مورد قبول براي متغيير مورد اشاره انديس هستند.

:مقدار صحيح را بپذيرد داريم yمقدار حقيقي و xثال باال را بخواهيم طوري حل كنيم كه مثالً اگر م: المث

 

نكاتتوضيح داده شده، همانطور كه مشاهده كرديد اين دستور امكان پياده حالت دستور 7

و حالت كلي از . دستور فوق ميتوانند با هم تركيب شوند 7هر . كردن مدلهاي بسياري را براي ما فراهم خواهد كرد .ردازيمتركيب همه آنها به دست مي آيد در زير به چند تذكر در مورد اين دستور و همينطور نكات بيشتر ميپ

تمام اعداد وارد شده در متغييرهاي ورودي بايد از نوعReals البته نوع داده اي . باشندReals نوعIntegers را نيز در بر ميگيرد. 

را اختيار كنند و ميتوانند مقادير و حدود.  بدون محدوديت از عبارت براي حل مسئلهNone بعد از وارد كردنc استفاده ميكنيم.  مقدار كسري و يا صحيح را بر ميگرداند اگر تمام وروديها به طور دقيق  دستور

 .به صورت كسري و يا صحيح وارد شوند در صورتي كه نتواند جوابي براي مسئله وارد شده پيدا كند به صورت دستور

 .كامل و همانطور كه وارد شده برگشت داده ميشود مدل وارد شده پيدا ميكند، خصوصيتي در مقدار تقريبي را براي جواب دستور

وجود دارد كه مقدار تقريب براي جواب را معين ميكند، واژه اين دستور به نام به معناي دامنه تغييرات و يا خطا است كه مقدار ورودي براي آن تعداد اعداد با معني را در

كه يا با . است قسمت اعشار براي خروجي معلوم ميكند، مقدار پيش فرض براي اين خصوصيت در وارد نكردن اين خصوصيت اعمال ميشود و يا با وارد كردن عبارت

 .انتهاي وروديهاي اصلي

Page 6: Linear and NonLinear Programming with Mathematica 6

امكان تعيين روش محاسبه نيز وجود دارد، مثالً استفاده از روش توردر دس.Simplex كه اين اعمال توسط خاصيتMethod اعمال ميشود. 

.نكات بيان شده مثالي آورده ميشودبراي هريك از

:Method استفاده ازو و روش 3امكان حل مسئله با دستور

را دارد، كه به ترتيب روش نقاط دروني، روش سيمپلكس و روش سيمپلكس اصالح شده براي نشان دادن سرعت روشها و نحوه .. روش نقاط دروني سريعتر ازدو روش سيمپلكس عمل ميكند. هستند

.شها حل ميكنيم.استفاده از دستور مدل بزرگي را توليد و با هريك از رو

قطري كه قطر باالي قطر 3متغيير كه مينيمم ميشود و ماتريس محدويتي 200هدف با مدل عبارت است از يك تابعاين دستگاه را با دستورات متمتيكا توليد ميكنيم و در . است 2و قطر زير قطر اصلي 1اصلي آن صفر، قطر اصلي

:آخر زمان اجراي دستور را اندازه ميگيريم

.ي ثانيه بوده استميل 0.291كه زمان اجراي دستور برابربا

:حال دستور زير را وارد ميكنيم

.اندازه گيري شده است 0.02مقدار زمان اجراي الگوريتم

.همانطور كه گفته شد سرعت اجراي الگوريتم با روش نقاط مياني بسيار سريعتر از روش سيمپلكس است

:استفاده از نيز دستگاهي بزرگتر را توليد ميكنيم و باز زمان اجراي دستور را با براي نشان دادن روش استفاده از

و محدوديتها را نيز . متغير در نظر ميگيريم 20000دقت متفاوت اندازه ميگيريم، اينبار دستگاهي با تابع هدفي با 2 :در اين صورت داريم. مانند باال ولي به تعداد متغييرهاي تابع هدف توليد ميكنيم

:ميلي ثانيه بوده است و عده اي از جوابها عبارتند از 1.311زم براي اجراي دستور زمان ال

Page 7: Linear and NonLinear Programming with Mathematica 6

را مشخص نكرديم و به طور پيش دقت كنيد كه مقدار . است همانطور كه ميبينيد دقت اعداد .در نظر گرفته شد فرض

رقم اعشار باشد، انتظار سرعت بيشتري 1اجرا ميكنيم، يعني دقت اعداد حال همين دستور را با .را در اجراي دستور داريم

.است 0.521زمان اجراي دستور

و و ارتباط نزديكي با دستورات دستور : نكته 3به طور مثال اين . به كار ميروند... دارد، كه البته اين دستورات براي حل مسائل غير خطي به روشهاي عددي و

:دستور را با هم مقايسه ميكنيم

     

قدرت بيشتري در حل و و ولي دستورات . مقدار با هم برابرند 3هر

.مسائل غيرخطي دارند

Page 8: Linear and NonLinear Programming with Mathematica 6

:Klee Mintyحل مسئله : را حل كرد كه عبارت است از Klee Mintyميتوان مسئله معروف LinearProgrammingبا استفاده از دستور

:به صورت زير است n=3موسوم است كه براي حالت nاز مرتبه Klee Mintyاين مسئله به مسئله

ما براي .. همانطور كه از صورت مسئله بر مي آيد ميتوان آن را با سيمپلكس و روشهاي برنامه ريزي خطي حل كرد

LinearProgrammingريف ميكنيم كه خروجي آن وروديهاي دستور اين مسئله يك تابع در متمتيكا تعساختن :است تعريف ميكنيم n  با يك ورودي كه مقدار KleeMintyباشد و تابع را به نام

:و براي اعمال دستور.هستند  LinearProgrammingاست كه وروديهاي دستور c,m,bماتريس 3با خروجي

مقدار براي متغييرها را به ما ميدهد و همينطور زمان صرف 16را توليد كرده ايم و خروجي n=16ما يك مسئله با

:شده براي محاسبه

Page 9: Linear and NonLinear Programming with Mathematica 6

 NMinimizeغير خطي با استفاده از مسائلحل

را به غيرخطياين تابع يكي از قدرتمندترين توابع در متمتيكا است كه امكان مينيمم كردن يك عبارت خطي و .سادگي براي كابر فراهم ميكند و همچنين امكان محاسبه مقدار مينيمم را با اعمال محدويتها نيز دارا ميباشد

است كه همه خصوصيات اين تابع را دارا ميباشد و براي ماكزيمم كردن توابه به كار NMaximizeمشابه اين تابع .يپردازيمرد زير به توضيحي دقيق در مورد اين تابع م. ميرود

تابع به دو صورت

متغييرهايي را مشخص ميكند كه دستور براي مينيمم دستورفراخواني ميشود، ليست قرار گرفته در انتهاي فراخواني ن اعمال است امكا كه به صورت NMinimizeفراخواني دوم دستور . به آنها توجه ميكند كردن

.ي زير به اين دستور توجه بيشتري ميكنيمدر مثالها. محدوديتها را به كاربر ميدهد

نكات خروجي تابع از دو قسمت تشكيل شده است كه قسمت اول مقدار مينيمم تابع است و قسمت دوم

 .خروجي نشان دهنده مقداري از متغييرهاست كه تابع با آنها مينيمم ميشود ميتواند مساوي، نامساوي تركيب منطقي از آنها باشند.  تابعNMinimize همواره تالش ميكند كه مقدار مينيمم تابع را با توجه به محدوديتها بدست آورد.  به طور پيش فرض همه متغييرها به صورتReals در نظر گرفته ميشوند.  در ليست انتهاي دستور براي مشخص كردن اينكه مقدار ميتوان از عبارتx بايد صحيح

 .اختيار شود استفاده شود توابع خطي باشند تابع و تابع اگر همNMinimize مقدار مينيمم را هم به صورت اعداد حقيقي

 .و هم صحيح بدست ميĤورد NMinimize وردĤدر بيشتر اوقات مينيمم نسبي را بدست مي.  اگر تابعNMinimize ته باشد خروجي به صورت نتواند مقدار مينيمم را پيدا كند و يا تابع مينيمم نداش

 .زير است خصوصيات زير براي دستور در دسترس هستند: 

Page 10: Linear and NonLinear Programming with Mathematica 6

است به طور پيش فرض برابر و مقدار.  مقادير مجاز برايMethod عبارتند از :"NelderMead",    "DifferentialEvolution",   

"SimulatedAnnealing"  و  "RandomSearch".

.محدوديت مينيمم ميكندمتغييره را بدون در نظر گرفتن 1مثال زير تابع

.بدست ميĤيد x=1.1309است و اين مقدار به ازاء -1.07023مقدار مينيمم تابع برابر با

مينيمم ميكند كه مسئله بدست آموردن را با اعمال محدوديت مثال زير تابع .مينيمم شكل زير است كه با اعمال محدوديت بدست آمده است

.بسيار پيچيده استو يا مسئله زير كه

Page 11: Linear and NonLinear Programming with Mathematica 6

.حل مسائلي به اين پيچيدگي نشان دهنده قدرت اين دستور در حل مسائل غير خطي است

دورنمابراي در نظر گرفتن محدوديتها از عملگرهاي منطقي استفاده ميكند، يعني اگر بخواهيم چندين NMinimizeتابع

&&و ||به صورت "و"و "يا"محدوديت را براي مينيمم كردن اعمال كنيم با استفاده از عملگرهاي منطقي :مثالً .عملگرها را وارد ميكنيم

ر نظر د يا به طوري كه محدوديت براي مينيمم كردن .1 .گرفته شود به صورت زير نوشته ميشود

  :اگر تابع هدف و محدوديتها خطي باشند، داريم .2

  :براي حل مسائل غير خطي به صورت صحيح .3

 .هم به صورت يك محدوديت ياد شده است همانطور كه ديده ميشود از عبارت

 :و يا .4

Page 12: Linear and NonLinear Programming with Mathematica 6

FindMinimumدستور با اين تفاوت كه اين دستور امكانات انجام ميدهد NMinimizeدستور كاري بسيار شبيه به كار دستور اين

انتخاب روشهاي مختلف دارد و در ضمن ميتواند اطالعات اوليه ما را نسبت به مسئله درمدل و بيشتري براي .محاسبات داخلي خود دخيل كند

:عبارتند از روش كلي فراخواني ميشود كه 3اين دستور به

به سمت مينيمم شدن با شروع از نقطه در اين نوع فراخواني تابع : .1نقطه اي است كه تابع در آن NMinimizeحركت داده ميشود و در صورت وجود مينيمم خروجي تابع مانند تابع

.مينيمم شده و همينطور مقدار مينيمم تابع در آن نقطه

كه تنها تفاوت ارت است از حالت تكميل شده اين دستور عبرا مينيمم براي مثال فرض كنيد ميخواهيم تابع . آن با دستور باال در تعداد متغييرهاي تابع هدف ميباشد

:به بعد به دست آوريم، در اين صورت داريم x=2كنيم و مينيمم آن را از نقطه

عالوه بر مقادير ابتدايي در اين نوع فراخواني :  .2

به طور مثال فرض كنيد ميخواهيم تابع . براي تعداد دلخواه متغييرها ميتوان محدوديتهايي را نيز اعمال كرد :در اين صورت داريم. مينيمم كنيم xبراي را همراه با محدوديت

دارد NMinimizeفراخواني از تابع شباهت زيادي به اين :  .3

فقط با اين تفاوت كه باز نقاط ابتدايي براي شروع حركت را نياز دارد ولي اين نقاط را با توجه به نقاط ابتدايي مرز با محدويتهاي خطي و بدون تعيين نقاط مثالً براي مينيمم كردن تابع . محدوديتها خود تابع انتخاب ميكند

:شروع داريم

نكات قسمت است كه قسمت اول مقدار مينيمم تابع و قسمت 2يك ليست از خروجي دستور

 .تابع هدف هستند كه مقدار مينيمم را توليد كرده اند دوم مقدار متغييرهاي ميتواند مساوي، نامساوي تركيب منطقي از آنها باشند. 

Page 13: Linear and NonLinear Programming with Mathematica 6

محاسبه ميكند و محاسبه مقدار مينيمم ابتدا مقدار تابع را به ازاء نقاط ابتدايي براي دستوردر ادامه مقدار را با استفاده از مقداير بدست آمده مقايسه ميكند و اين كار را به صورت عددي ادامه ميدهد

 .تا به مينيمم برسد ميتواند دو مقدار ابتدايي را براي محاسبات خود در نظر بگيرد به اين صورت كه دستور

  .محاسبه ميكند و دو مقدار اول را با

معيين كننده اين است كه تابع اولين مقدار را فراخواني  .برود عمليات را متوقف ميكند خارج از xدر نظر بگيرد و در صورتي كه مقدار

فقط مينيممهاي اگر تابع هدف و محدديتها همگي خطي باسند آنگاه ممكن است دستور .نسبي را پيدا كند و مينيممهاي مطلق را در نظر نگيرد

به طور پيش فرض همه مقادير حقيقي در نظر گرفته ميشوند.  اگر تابع هدف و محدوديتها هردو خطي باشند و در محدوديتها محدوديتي به صورت

 .اتخاذ شود دستگاه به صورت صحيح حل خواهد شد خصوصيات زير ميتوانند اعمال شوند: 

  به طور پيش فرض برابر و مقدار

 .است عبارتند از د استفاده در دستور روشهاي مور:    ,"ConjugateGradient"  "Gradient", 

"LevenbergMarquardt",    "Newton",    "QuasiNewton",    "InteriorPoint" و     "LinearProgramming" كهو "برنامه ريزي خطي"و "شبه نيوتن"و "و نيوتن "نقاط مياني"و "گراديان"و "گراديان توام"روشهاي

."لونبرگ"

:چند مثال

Page 14: Linear and NonLinear Programming with Mathematica 6

:براي تابع دو متغييره داريم

اگر با استفاده از محدوديت

و در ادامه

:ئله برنامه ريزي خطي تبديل ميشودو در صورت خطي بودن به مس

:به محدوديتها اضافه شود مسئله برنامه ريزي صحيح خواهد بود و اگر عبارت

"يا"عبارت منطقي محدوديت با و در نهايت يك

:روش گراديان براي استفاده از روش گراديانت بايد گراديان تابع را حساب كرده و آن را به عنوان ورودي به تابع بدهيم، به صورت

:زير

Page 15: Linear and NonLinear Programming with Mathematica 6

.اين معادله با توجه به گراديان از روش نيوتن مقدارمينيمم را حساب ميكند

:را نيز به دستور به عنوان ورودي بدهيم خواهيم داشت تابع هدف "هسين"در روش نيوتن اگر ماتريس

 

Page 16: Linear and NonLinear Programming with Mathematica 6

:FindShortestTourاستفاده از دستور اپيدا كردن كوتاهترين مسير ببراي پيدا كردن كمترين فاصله در بين نقاط صفحه راههاي متفاوتي وجود دارد و اين دستور بيشتر اين الگوريتمها را

خروجي را برميگرداند كه يكي ميزان اندازه كمترين 2دريافت ليستي از نقاط اين دستور با. ر دسترس قرار ميدهدالبته اين دستور اين شرط را . مسير و دومين خروجي ترتيب طي كردن نقاط است تا اين كمترين مسير به دست آيد

.كه همه نقاط طي شوند را نيز در نظر ميگيرد

 دستور در حالت كلي به صورت ختصات يك نقطه در م هركدام از   .صفحه هستند

:مثال

:دستور باال ميزان كمترين مسافت و ترتيب نقاط را براي طي كردن مسير در بين نقاط داده شده را بر ميگرداند

به مثال ديگري كه اندكي از انعطاف پذيري متمتيكا را نيز نشان ميدهد توجه كنيد، ما كمترين فاصله را با استفاده از .لگوريتم به دست ميĤوريم و با استفاده از توابع گرافيكي متمتيكا اين مسير را رسم ميكنيماين ا

.توانايي پيدا كردن كمترين مسير در فضا را نيز دارد تابع : نكته

Page 17: Linear and NonLinear Programming with Mathematica 6

:Method خصوصيت، براي نشان دادن هركدام از از چندين روش براي پيدا كردن كمترين مسير استفاده ميكند تابع 10نسبت به هم اول كوچكتر از 2به2روشها ما مثالي را كه خواستار پيدا كردن كمترين مسير در بين نقاط اين

:كه عبارتند از هستند اجرا ميكنيم،

:روش پيش فرض براي پيدا كردن كمرين مسير در صفحه. 

  :روش پيش فرض براي نقاط در فضا. 

  :ورد روشي كه از كمترين مسير را بدون تقاطعĤبدست مي. 

  :روشي كه كمترين تداخل و زاويه را انتخاب ميكند. 

  :روشي كه از يك نقطه به نزديكترين نقطه خالي خود ميرود. 

Page 18: Linear and NonLinear Programming with Mathematica 6

  : كه طوالنيترين مسير را انتخاب ميكند نوعي از روش. 

  :  

Page 19: Linear and NonLinear Programming with Mathematica 6

:مطالب باال ميتوان مسائل زير را حل كردبا توجه به .حل كنيدمسئله زير را .1

:حل

:را اعمال كنيم، دستور جواب نميدهد اگر محدوديتهاي

Page 20: Linear and NonLinear Programming with Mathematica 6

.نشان دهيد هيچ جواب شدني ندارد .2

:جواب بهينه دستگاه

:اگر دستور را مجاب كنيم كه جواب صحيح برگرداند خواهيم داشت

:استفاده كنيم، داريم NMinimizeاگر از دستور

 .اين است كه تابع جواب صحيح نامنفي نداردكه باز نشان دهنده

Page 21: Linear and NonLinear Programming with Mathematica 6

.مرحله و نقطه آغازي 4با روش جستجوي گراديان مسئله زير را حل كنيد و تا .3

:حل

Page 22: Linear and NonLinear Programming with Mathematica 6

.تكرار حل كنيد 3مسئله زير را با .4

:حل

:با استفاده از دو دستور زير مسئله را حل ميكنيم

Page 23: Linear and NonLinear Programming with Mathematica 6

.مسئله زير را با حل كنيد .4

:حل