آموزش متلب

خطایابی برنامه ها در متلب

خطایابی برنامه ها در متلب

 

خطايابي برنامه ها
شما مي توانيد از راههاي زير، برنامه هايتان را خطايابي (debugging) نمائيد:
– برنامه را به چند بخش كوتاهتر تقسيم كنيد و هر بخش را جداگانه امتحان كنيد.
– نتايج محاسبات را در مراحل مياني جريان برنامه بنويسيد. اين كار را مي توانيــد بـه آسـاني بـا
برداشتن (;) semicolon از انتهاي دستور محاسباتي ويا نوشتن نام متغير مورد نظر انجام دهيد.

همچنين مي توانيد با قرار دادن disp در مكانهاي مشخصي از برنامه دريابيد كه برنامه تــا كجـا
به پيش رفته است.
– تا حد امكان سعي كنيد كه از عمليات ماتريسي استفاده كنيد و در برنامه از تعداد حلقــه هـايي
كه همان كار را انجام مي دهند بكاهيد.
– خطوط مورد شك برنامه را بطور جداگانه در محيط كار MATLAB اجــرا كنيـد (ترجيحـا” بـه
كمك copy-paste) تا درستي و يا نادرستي محاسبه را دريابيد.
– دقت كنيد كه پيغام خطا روي چه سطري از برنامه داده شده است و بويژه دقت كنيد كه پيغــام
خطا چه مي باشد و چه معنايي دارد.
– امكانات خطايابي موجود در نرم افزار را به كمك بگيريد.
پيغامهاي خطا
بيشترين حجم پيغامهاي خطايي كه شما در ابتداي كار با MATLAB دريافت مي كنيد مربوط بــه
عمليات و جايگزيني هاي برداري/ماتريسي است. در اين بخش نحوه تصحيح برنامه را با اســتفاده از
پيغامهاي خطاي دريافتي با ذكر يك مثال نشان داده مي شود.
در نظر بگيريد كه مي خواهيد سطح PVT را بر اســاس قـانون گـاز كـامل رسـم كنـيد. داده هـاي
ورودي به برنامه محدوده هاي فشار و دما به صورت برداري هستند و برنامه بايد حجـم ويـژه گـاز را
محاسبه نمايد و سپس سطح را رسم كند. بهتر است كه محاسبه حجم در يك تابع جداگانـه انجـام
گيرد تا اگر بخواهيد محاسبه را با معادله حالت ديگري نيز تكــرار كنيـد، نيـازي بـه نوشـتن مجـدد
برنامه اصلي نداشته باشيد و فقط تابع محاسبه حجم را تغيير دهيد. فرض كنيد كه برنامـه اصلـي و
تابع مورد نياز را در وهله اول به صورت زير ايجاد كرده ايد:

برنامه اصلي (main.m)
% Input
p = input(‘ Pressure (bar) = ‘);
t = input(‘ Temperature (K) = ‘);
% Calculation
v = ideal(t,p*1e5);
% Plotting results
surf(p,vol,t)
٣٠
(ideal.m) تابع
function v = ideal(t,p)
R = 8314; % Gas constant (J/kmol.K)
v = R*t/p; % Ideal gas law

حال در صورتي كه اين برنامه را اجرا كنيد، پيغام خطاي زير را دريافت مي كنيد:

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400
??? Error using ==> /
Matrix dimensions must agree.
Error in ==> C:\MATLABR11\work\ideal.m
On line 4 ==> v = R*t/p; % Ideal gas law
Error in ==> C:\MATLABR11\work\main.m
On line 6 ==> v = ideal(t,p*1e5);

همانطور كه ملاحظه مي كنيد اشكال از سطر ٦ برنامه اصلي كه مربوط بــه مراجعـه بـه تـابع اسـت
گرفته شده و در حقيقت خطا در سطر ٤ تابع و مشخصا” در نحوه تقسيم دو بردار t و p وجــود دارد.
به ياد بياوريد كه در عمليات ماتريسي، ابعاد ماتريسها بايد اجازه انجــام چنيـن عملـي را بدهـد. در
اينجا با دو بردار t و p نمي توان عمل تقسيم را انجام داد و اصولا” در اين مسـئله مقصـود از عبـارت
بكار برده شده براي محاسبه حجم گاز كامل انجام محاسبه ماتريسي نمي باشــد. بنـابراين سـطر ٤
تابع ideal.m به شكل زير تغيير داده مي شود (بكار بردن تقسيم عضو به عضو بجـاي ماتريسـي) تـا
محاسبه حجم به صورت ماتريسي صورت نگيرد:

function v = ideal(t,p)
R = 8314; % Gas constant (J/kmol.K)
v = R*t./p; % Ideal gas law

اما با اجراي مجدد برنامه مي بينيد كه مشكل حل نشده است:

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400
??? Error using ==> ./
Matrix dimensions must agree.
Error in ==> C:\MATLABR11\work\ideal.m
On line 4 ==> v = R*t./p; % Ideal gas law
Error in ==> C:\MATLABR11\work\main.m
On line 6 ==> v = ideal(t,p*1e5);

اگر تعداد مولفه هاي بردارهاي t و p را در محيط كار MATLAB بخواهيم:

» length(p)
ans =
10
» length(t)
ans =
21

ديده مي شود كه اين دو بردار هم اندازه نيستند و بنابراين عمليات عضو به عضو نيز نمــي تـوان بـر
روي آن دو انجام داد. در اينجا چاره اي نيست جز آنكه از يك حلقه در محاسبات استفاده نمـائيد و
مقادير حجم ويژه را بر حسب دما، هر بار در يك فشار معين، محاسبه نمائيد:

function v = ideal(t,p)
R = 8314; % Gas constant (J/kmol.K)
for k = 1:length(p)
v(:,k) = R*t/p(k); % Ideal gas law
end

اما اين بار نيز با پيغام خطا مواجه مي شويد:

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400
??? In an assignment A(:,matrix) = B, the number of elements in the subscript of A
and the number of columns in B must be the same.
Error in ==> C:\MATLABR11\work\ideal.m
On line 5 ==> v(:,k) = R*t/p(k); % Ideal gas law
Error in ==> C:\MATLABR11\work\main.m
On line 6 ==> v = ideal(t,p*1e5);

توجه كنيد كه بردار دما يك بردار سطري است و در نتيجه سمت راست عبارت محاسبه حجم يــك
بردار سطري خواهد بود. اين در حالي است كه در سمت چپ همان عبارت يك بردار ســتوني قـرار
دارد و پيغام خطا نيز از همينجا ناشي مي شود. بنابراين تابع ideal.m بايد بـه شـكل زيـر تصحيـح
گردد:

function v = ideal(t,p)
R = 8314; % Gas constant (J/kmol.K)
for k = 1:length(p)
v(k,:) = R*t/p(k); % Ideal gas law
end

اين بار با اجرا كردن برنامه اصلي پيغام زير را مشاهده مي كنيد:

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400
??? Undefined function or variable ‘vol’.
Error in ==> C:\MATLABR11\work\main.m
On line 9 ==> surf(p,vol,t)

باز هم پيغام خطا! اما اگر دقت كنيد مي بينيد كه اين بار پيغام خطا مربوط به تابع ideal.m نيست
بلكه خطا از دستور مربوط به رسم داده ها گرفته شده است. در حقيقت تابع كار خود را بــه خوبـي
انجام داده و رفع اشكال شده است. خطاي اين دفعه مربوط به اشتباه در نام متغير اسـت. متغـير v
كه قبلا” تعريف شده است اشتباها” در دستور surf با نام vol بكار برده شده اســت. ولـي vol قبـلا”
تعريف نشده است و در نتيجه MATLAB آن را نمي شناسد. پـس از تصحيـح ايـن سـطر، برنامـه
اصلي به صورت زير خواهد بود:

% Input
p = input(‘ Pressure (bar) = ‘);
t = input(‘ Temperature (K) = ‘);
% Calculation
v = ideal(t,p*1e5);
% Plotting results
surf(p,v,t)

اجراي اين برنامه پيغام زير را به دنبال خواهد داشت:

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400
??? Error using ==> surface
Matrix dimensions must agree.
Error in ==> C:\MATLABR11\toolbox\matlab\graph3d\surf.m
On line 59 ==> hh = surface(varargin{:});
Error in ==> C:\MATLABR11\work\main.m
On line 9 ==> surf(p,v,t)

خطاي اين دفعه باز هم مربوط به دستور surf و اين بار در باره نحوه معرفي آرايه ها به آن است. بـا
مراجعه به توضيحات (help) اين دستـور مشخص مي گردد كه آرگومانـهاي اول و دوم ايـن دسـتور
مي توانند بردار باشند ولي آرگومان سـوم بايد ماتريس باشد. در اين حالت طول آرگومانــهاي اول و

دوم بايد به ترتيب برابر با تعداد ستونها و سطرهاي آرگومان سوم باشد. لــذا طبـق ايـن توضيحـات
متغير v بايد آرگومان سوم دستور surf باشد و ضمنا” با مشاهده ابعاد اين متغير:

» size(v)
ans =
10 21

مي توانيد بگوئيد كه آرگومان اول بايد بردار t و آرگومان دوم بــايد بـردار p باشـد. بنـابراين برنامـه
اصلي بايد به شكل زير اصلاح گردد:

% Input
p = input(‘ Pressure (bar) = ‘);
t = input(‘ Temperature (K) = ‘);
% Calculation
v = ideal(t,p*1e5);
% Plotting results
surf(t,p,v)
xlabel(‘T (K)’)
ylabel(‘P (bar)’)
zlabel(‘V (m^3/kmol)’)
view(135,30)

در صورت اجراي برنامه نتيجه نهايي را خواهيد ديد.

» main
Pressure (bar) = [1:10]
Temperature (K) = 300:5:400

 

سعید عربعامری
من سعید عربعامری نویسنده کتاب 28 گام موثر در فتح متلب مدرس کشوری متلب و سیمولینک و کارشناس ارشد مهندسی برق قدرتم . بعد از اینکه دیدم سایتهای متعدد یک مجموعه کامل آموزش متلب و سیمولینک ندارند به فکر راه اندازی این مجموعه شدم
http://sim-power.ir

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *