حل دستگاه معادلات در متلب
به نام خدا و سلام.
به جلسه سی ام از سری جلسات آموزش متلب خوش آمدید. آموزش متلب از وبسایت متلبپلاس به صورت کاملا رایگان و تخصصی ارائه میشود. در این جلسه به آموزش حل دستگاه معادلات در متلب میپردازیم. بدلیل کاربرد زیاد حل دستگاه معادلات جبری با متلب این مباحث را در یک جلسه مجزا ارائه کردهایم. نحوه حل دستگاه معادله جبری خطی و غیرخطی با solve، linsolve، fsolve و … از مباحث این جلسه هستند.
با متلب پلاس همراه باشید.
این مقاله درباره حل دستگاه معادلات جبری در متلب است. آموزش حل معادله جبری ساده (یک معادله، یک مجهول) نیز در وبسایت متلبپلاس ارائه شده است. برای مشاهده این مقاله روی 👈 حل معادله جبری در متلب 👉 کلیک نمائید.
حل دستگاه معادلات خطی با دستور solve در متلب
در این آموزش matlab به حل دستگاه معادلات خطی و غیرخطی میپردازیم. ابتدا دستگاه معادلات خطی را درنظر میگیریم. معروفترین دستور برای حل چند معادله و چند مجهول در متلب، دستور solve است. دستور solve(eqns,vars) معادلات eqns را برحسب متغیرهای vars حل میکند. دقت کنید که معادلات eqns بایستی حتما به صورت نمادین (symbolic) باشند. برای حل دو معادله-دو مجهول برحسب x و y، ابتدای کار syms x y در متلب وارد میشود. با استفاده از دستور solve هم میتوان معادله را به صورت پارامتری حل کرد و هم عددی. اما قدرت اصلی solve در حل معادلات پارامتری است. برای شروع، یک دستگاه معادله 2 مجهولی را درنظر میگیریم.
برای حل این دستگاه معادلات در متلب، کد زیر را مینویسیم.
syms x y
eq1 = 8*x + 4*y == 2;
eq2 = x + 3*y == 4;
[X, Y] = solve([eq1,eq2],[x,y])
پس از اجرای این کد، پاسخ به صورت زیر است.
X =
-1/2
Y =
3/2
دقت کنید که X پاسخ x و Y پاسخ y است.
برای مثال دوم از حل دستگاه معادله جبری با متلب، 3 معادله و 3 مجهول درنظر میگیریم. این دستگاه معادلات خطی به صورت زیر است.
برای حل این دستگاه معادله در متلب، بصورت زیر عمل میکنیم.
syms x1 x2 x3
eq1 = 2*x1 + 3*x2 + 5*x3 == 5;
eq2 = 3*x1 + 4*x2 + 7*x3 == 6;
eq3 = 1*x1 + 3*x2 + 2*x3 == 5;
[X1, X2, X3] = solve([eq1, eq2, eq3],[x1, x2, x3])
X1 =
-3
X2 =
2
X3 =
1
به همین راحتی انواع دستگاه معادلات خطی در متلب با دستور solve حل میشود. اما یک روش بسیار سریع و ساده برای حل دستگاه معادلات خطی در متلب، استفاده از ماتریس است. این روش در زیر تشریح شدهاست.
حل دستگاه معادلات خطی با تقسیم ماتریس A/B
با استفاده از ماتریسها میتوان دستگاه معادلات خطی در متلب را به راحتی حل کرد. این روش هیچ نیازی به دستور یا کدنویسی ندارد. تنها کافیست ماتریس ضرایب (A) و ماتریس ثابتها (B) را ایجاد کنیم. برای اینکه بهتر متوجه ماتریس ضرایب و ماتریس ثوابت شوید به شکل زیر دقت کنید. این شکل برای دستگاه 3 معادله و 3 مجهول ایجاد شده. بدیهی است که برای هر تعداد معادله قابل انجام است.
در این روش کافیست ماتریسهای A و B را تشخیص داده و سپس معادلات را حل کنیم. مثال 2 که با دستور solve حل شد را درنظر بگیرید. ماتریس ضرایب را برای این دستگاه تعیین کرده و سپس پاسخ را محاسبه میکنیم.
A = [2 3 5; 3 4 7; 1 3 2];
B = [5;6;5];
A\B
ans =
-3.0000
2.0000
1.0000
A = [2 3 5; 3 4 7; 1 3 2];
B = [5;6;5];
inv(A)*B
ans =
-3.0000
2.0000
1.0000
مشاهده میکنید که بسیار ساده، پاسخ دستگاه چند معادله و چند مجهول محاسبه میشود. برای محاسبه پاسخ نهایی 2 روش داریم. یا استفاده از معکوس ماتریس inv(A) یا تقسیم از راست. با معکوس ماتریس و تقسیم از راست در آموزش عملیات ریاضی روی ماتریسها در متلب آشنا شدیم. تقسیم از راست، به این صورت است که A\B در واقع B تقسیم بر A میشود. (تقسیم معمولی در متلب با / انجام میشود)
برای درک بهتر این روش، یک دستگاه 4 معادله و 4 مجهول را در متلب حل میکنیم.
برای حل این دستگاه، کد زیر را در متلب مینویسیم.
A = [1 2 4 3; 6 2 3 8; -1 4 4 3; 1 -1 6 2];
B = [1; 5; -2; 7];
A\B
ans =
-0.8370
-2.3370
0.3478
1.7065
به همین راحتی پاسخ دستگاه چند معادله چند مجهول با متلب محاسبه شد.
تنها نکتهای که در این روش باید مدنظر داشته باشیم این است که ماتریس ضرایب (A) معکوس پذیر باشد. هنگامی که دترمینان یک ماتریس صفر باشد، ماتریس معکوس پذیر نخواهد بود. مفهوم این قضیه این است که دستگاه معادلات ناسازگار است. مثلا اگر یکی از معادلات ضریبی از معادله دیگر باشد، این حالت رخ میدهد.
حل دستگاه معادلات خطی با دستور linsolve در متلب
این روش دقیقا روش ماتریسی قبل است با این تفاوت که از دستورات متلب برای محاسبه ضرایب استفاده میشود. ابتدا معادلات را به فرم نمادین (سیمبولیک) مینویسیم. سپس با دستور equationsToMatrix ماتریسهای A و B محاسبه میشود. در نهایت برای حل از linsolve استفاده میکنیم. دستگاه معادلات زیر را درنظر بگیرید.
برای حل این دستگاه با دستور linsolve به صورت زیر عمل میکنیم.
syms x y z
eqn1 = 2*x + y + z == 2;
eqn2 = -x + y - z == 3;
eqn3 = x + 2*y + z == 1;
[A,B] = equationsToMatrix([eqn1, eqn2, eqn3], [x, y, z]);
X = linsolve(A,B)
X =
7/3
4/3
-4
به طور کلی این روش توصیه نمیشود. چرا که روش ماتریسی (که اساسا یکی هستند) بسیار سریعتر و کوتاهتر پاسخ دستگاه را میدهد.
تا اینجا معادلاتی را حل کردیم که خطی بودند. حال به سراغ حل دستگاه معادلات غیرخطی در متلب میرویم.
حل دستگاه معادلات غیرخطی با دستور vpasolve در متلب
در آموزش حل معادله در متلب دیدیم که دستور solve توانایی حل معادله غیرخطی را ندارد. این موضوع در دستگاه معادلات نیز برقرار است. برای حل عددی دستگاه معادلات غیرخطی در متلب از دستور vpasolve استفاده میکنیم. نوشتار این دستور برای دستگاه معادلات مشابه با حل یک معادله است. برای درک بهتر، یک دستگاه معادله غیرخطی به صورت زیر درنظر میگیریم.
این دستگاه معادلات با solve قابل حل نیست. برای حل از vpasolve استفاده میکنیم.
syms x y
eq1 = y^3 + y*sin(2*x) - 1 == 0;
eq2 = y^2 + 1 - exp(-x/3) == 0;
[sol_x, sol_y] = vpasolve([eq1, eq2], [x, y])
sol_x =
-1.7434047003890221807289415755004
sol_y =
0.8877311285739711891668586789055
بدین ترتیب دستگاه معادلات غیرخطی با استفاده از دستور vpasolve حل میشود. در حل معادله با دستور vpasolve میتوان حدس اولیه را نیز وارد کرد. برای وارد کردن حدس اولیه، باید در انتهای دستور vpasolve قرار دهیم. نوشتار این دستور با حدس اولیه به صورت vpasolve(eqns,vars,init_guess) است.
حل دستگاه معادلات غیرخطی با دستور fsolve
روش دیگری که برای حل دستگاه معادلات غیرخطی در متلب داریم، دستور fsolve است. برای حل دستگاه معادلات غیرخطی با دستور fsolve باید معادلات را به صورت تابع تعریف کنیم. آموزش کامل تابع و مباحث آن در جلسه آموزش تعریف تابع در متلب ارائه شدهاست. نوشتار این دستور برای حل دستگاه معادلات غیرخطی به صورت fsolve(fun,x0) است. که در آن fun معادلات و x0 حدسی است که برای پاسخ داریم. دستگاه معادله غیرخطی زیر را درنظر بگیرید.
برای حل این دستگاه با دستور fsolve، ابتدا یک تابع به صورت زیر ایجاد میکنیم.
function eq = nonlin_sys1(x)
eq(1) = exp(x(1) - x(2)) - x(2)*(1 + x(1)^2);
eq(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
این تابع را با نام nonlin_sys1 در دایرکتوری فعلی متلب ذخیره میکنیم. پس از آن در پنجره فرمان (Command Window) کد زیر را مینویسیم. توجه کنید که ابتدا تابع تعریف و ذخیره شده، سپس درون دستور fsolve فراخوانی میشود. تعریف تابع در متلب در جلسه 19 ام ارائه شد. برای مشاهده روی لینک قرمز👉 کلیک کنید.
fsolve(@nonlin_sys1,[0,0])
Equation solved.
fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.
ans =
0.3484 0.6558
دستور fsolve قابلیتهای بیشتری را نیز در اختیار ما قرار میدهد. یکی از این قابلیتها، نمایش مراحل حل است. برای مشاهده مراحل حل دستگاه معادلات غیرخطی بایستی تنظیمات fsolve را تغییر دهیم. مثلا دستگاه معادلات غیرخطی زیر را درنظر بگیرید.
برای این دستگاه نیز یک تابع در متلب تعریف میکنیم.
function eq = nonlin_sys2(x)
eq(1) = 2*x(1) - x(2) - exp(-x(1));
eq(2) = -x(1) + 2*x(2) - exp(-x(2));
این تابع را با نام nonlin_sys2 در دایرکتوری متلب ذخیره میکنیم. حال با دستور fsolve آن را فراخوانی کرده و مسئله را حل میکنیم. قبل از اینکه دستگاه را حل کنیم، با دستور optimoptions تنظیمات حل را تغییر داده و نمایش مراحل حل را فعال میکنیم.
x0 = [0,0];
options = optimoptions('fsolve','Display','iter');
fsolve(@nonlin_sys2,x0,options)
run:
Norm of First-order Trust-region
Iteration Func-count f(x) step optimality radius
0 3 2 2 1
1 6 0.0226976 0.707107 0.171 1
2 9 3.40349e-06 0.0937779 0.00204 1.77
3 12 7.72066e-14 0.00117685 3.08e-07 1.77
Equation solved.
fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.
ans =
0.5671 0.5671
همانطور که مشاهده میکنید علاوه بر پاسخ، مراحل حل و همگرایی نیز نمایش داده شدهاست.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) دستگاه معادلات خطی زیر را با دستور solve حل کنید.
Eq1: 8x + 4y = 5
Eq2: 14x – 3y = 2
تمرین دوم) دستگاه معادلات خطی زیر را با solve و روش ماتریسی حل کنید.
Eq1: 3x + 2y – z = 1
Eq2: 3x – 2y + 14z = 2
Eq3: x + y -5z = 2
تمرین سوم) دستگاه معادلات غیرخطی زیر را با دستور fsolve در متلب حل کنید.
Eq1: 2x2 + 2y – sin(z) = 1
Eq2: 3x – 2y3 – 4z = 12
Eq3: 8x + y2 + 4z = 2
جمعبندی
خب جلسه سی ام از سری جلسات آموزش متلب به پایان رسید. این جلسه به طور کامل درباره حل دستگاه معادلات در متلب صحبت کردیم. حل دستگاه معادلات جبری خطی، غیرخطی و معادلات پیچیده اهمیت زیادی در محاسبات مهندسی دارد. روش حل دستگاه معادله با دستور solve، vpasolve، fsolve و روش ماتریسی ارائه شد. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
6 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام من این معادله رو نوشتم ولی ارور میدهد ممنون میشم راهنمایی کنیدsyms A B C D E F G K H
eq1 = 2*A + 6*B – 6*C + D – 2*E + 9*F – 8*G – 9K == 0;
eq2 = -A + 4*B – C + 6*D + 9*E – 2*E + G + 11*K == 0;
eq3 = 3*A – 6*B – 6*C – 7*D + E + F + G – H + K == 0;
eq4 = A – B + C – D + E – F + G – H + K == 0;
eq5 = -2*A + B – C + 2*D – E + 2*F – G + 2*H – K == 0;
eq6 = -A – B – C – D – E – F – G – H – K == 0;
eq7 = 2*A – B – C + D + E – 6*F – 4*G + 2*H – K == 0;
eq8 = A – B – C – D – E – F – G – H – K == 0;
[a, b, c, d, e, f, g, h, k, h] = slove([eq1,eq2,eq3,eq4,eq5,eq6,eq7,eq8],[A,B,C,D,E,F,G,K,H])
سلام و عرض ادب
اولا اینکه کلی اشتباه نگارشی دارید (دستور solve رو نوشتید slove یا در معادله اول 9K نوشتید که اشتباهه و باید * بین شون نوشته بشه و…)
ثانیا شما 10 تا مجهول دارید و 9 معادله که با این روشی که دارید میرید قابل حل نیست. باید از روشهای فرض یک مجهول و حل مابقی و یا سایر روشها استفاده کنید.
موفق باشید.
سلام وقت بخیر
کد متلبی میخواستم که 3 معادله، 4 مجهول برام حل کنه
سلام. وقت شمام بخیر
اینجور کدی وجود نداره. شما با استفاده از روشهایی مثل حدس یک پاسخ یا فرض یک پاسخ و محاسبه سایر پاسخها، میتونید مسئله رو حل کنید.
تشکر بابت آموزش های رایگان
سلام و عرض ادب
خیلی ممنون از شما که نظرتون رو با ما به اشتراک گذاشتید!