نکاتی پیرامون توابع و تابع کاربر_ متلب (قسمت دوم)

ام- فایل تابعی با چند آرگومان خروجی

یکی از ویژگیهای متلب این است که در آن میتوان توابعی با چندین خروجی که هر خروجی هم میتواند بردار باشد تعریف کرد. مابین نام آرگومانهای خروجی تابع باید کاما قرار گیرد مثل:
function [p1, p2]
مثال ها:
تابع درجه دو در یک ام- فایل تابعی
function [p1, p2] = y2(x,a,b,c)
p1 = a*x^2 + b*x + c;
p2 = 2*a*x + b;
>> [a b] = y2(-2,3,4.6,-5.8)

 جواب:

a = -3.0000
b = -7.4000

 حل معادله با راه برد نیوتن

راهبرد نیوتن یکی از روشهای ساده محاسبات عددی برای حل معادله چند جمله ای  f(x) = 0 است. با روش تکرار برای نزدیک شدن به ریشه از راهبرد نیوتن به این شکل میتوان استفاده کرد:
x -> x - f(x)/f'(x)
 یعنی در هر بار تکرار به جای  x عبارت
x - f(x)/f'(x)
 جایگزین میشود. مقدار دهی به x در اولین دور حلقه اختیاری است و حدس اولیه نام دارد. راهبرد نیوتن برای حدسهای اولیه مختلف ریشههای مختلف میدهد.
برای حصول ریشه های معادله درجه دو
f(x) = 3x^2 + 4.6x - 5.8
 با راهبرد نیوتن برای ریشه های حقیقی با دو حدس اولیه حقیقی، و برای ریشه های موهومی با دو حدس اولیه موهومی شروع میکنیم. از تابع y2  در این برنامه استفاده میکنیم.
function [p1, p2] = y2(x,a,b,c)
p1 = a*x^2 + b*x + c;
p2 = 2*a*x + b;
% M-File script secndegree.m
% solves equation f(x) = a*x^2 + b*x -c
x = input('Enter initial guess: '); % initial guess
n = input('Enter 3 coefficients: ');
ero = 1;
iero = 1e-8; % permissible error
while ero > iero
x1 = x;
[y yp] = y2(x, n(1), n(2), n(3));
x = x - y/yp;
ero = abs((x-x1)/x);
end
format
disp(['root = ' num2str(x)])
>> secndegree
>> secndegree
>> secndegree
>> secndegree
>> secndegree

 جواب:

Enter initial guess: -1
Enter 3 coefficients: [3 4.6 -5.8]
root = -2.3545

Enter initial guess: 1
Enter 3 coefficients: [3 4.6 -5.8]
root = 0.82113

Enter initial guess: i
Enter 3 coefficients: [3 4.6 5.8]
root = -0.76667+1.16i

Enter initial guess: -i
Enter 3 coefficients: [3 4.6 5.8]
root = -0.76667-1.16i

 تابع بدون مقدار، متغیر Persistent

یک ام-فایل تابعی (که به اختصار تابع خوانده میشود) میتواند بدون مقدار برگشتی (آرگومان خروجی) باشد. اینگونه توابع معمولاٌ برای نمایش نتایج به کار میروند.
معرفی یک متغیر با پیشوند persistent باعث میشود که مقدار متغیر در مراجعات بعدی به تابع حفظ شود.
آوردن نام تابع بعد از clear اعث میشود که مقدار متغیرهای عددی persistent آن صفر شود.

مثال:

نام یک دانشجو را به عنوان ورودی دریافت و همراه با شماره ردیف نمایش میدهیم.
ابتدا یک تابع با ورودی نام دانشجو مینویسیم. این تابع نام دانشجو را از صفحه کلید دریافت میکند و هر بار که اجرا شود نام دریافتی را با شماره ردیف در کنار نام دانشجو (متغیر رشتهای wr) چاپ میکند. رشتهی wr که به تابع sst(ns) ارسال میشود یک بردار است که هر عنصر آن یک حرف الفبا است.
عبارت persistent nn باعث میشود که مقدار n  که شمار ردیف را نشان میدهد برای اجرای بعدی تابع  حفظ شود.
% Function M-File stt.m
function stt(ns)
persistent nn
if isempty(nn)
nn=1;   دراجرای اول شماره ردیف را یک میدهیم %
else
nn = nn + 1;     در هر بار تکرارِ اجرا شماره ردیف یک واحد افزایش مییابد %
end
mm = num2str(nn);
disp(['Student number ' mm ' is ' ns])
 حال برنامهای به نام  stdno.m مینویسیم که تابع فوق را در درون یک حلقه چند بار اجرا میکند.
% Script M-File stdno.m
clear stt
%این دستور در اجرای اولِ تابع stt() مقدار شمارنده را صفرمیکند. 
wr = 'h';
%یک مقدار اولیه دلخواه برای نام دانشجو در نظر میگیریم که حلقه برای بار اول اجرا شود. 
while isempty(wr) == 0
% حلقه تا زمانیکه نامی را وارد کنیم (wr خالی نباشد)، ادامه مییابد. با زدن  <Enter> حلقه تمام میشود.
wr = input('Enter the student name: ','s');
قرار دادی 's' به عنوان آرگومان input() باعث میشود که بتوانیم یک رشته را به wr نسبت دهیم %
if isempty(wr)
اگر بدون وارد کردن نام (wr خالی)، کلید <Enter> را بزنیم برنامه تمام میشود %
break
end
stt(wr)%
end
>> stdno

 جواب:

Enter the student name: Ali
Student number 1 is Ali
Enter the student name: Maryam
Student number 2 is Maryam
Enter the student name: Masud
Student number 3 is Masud
Enter the student name:

 زیر نابع subfunction

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

مثال:

برای حل معادله درجه سه b^3 – 2*b^2 + 3*b -4 یک ام-فایل تابعی به نام newss() بنویسید، که در آن تابع و مشتق آن به صورت دو زیر تابع با نامهای ny() و nyp() تعریف شوند
% newss.m
function p1 = newss(a)
p1 = ny(a)/nyp(a); %
function p2 = ny(b)
p2 = b^3 - 2*b^2 + 3*b - 4 ;
function p3 = nyp(d)
p3 = 3*d^2 - 2*2*d + 3;
 سپس از درون یک ام- فایل با نام eus.m، تابع newss() را فرامیخوانیم:
% eus.m
x = input('Enter initial guess: ');
ero = 1;
while ero > 1e-6
x1 = x ;
x = x- newss(x);
ero=abs((x-x1)/x);
end
disp(['root = ' num2str(x)])
>> eus
>> eus
>> eus

 جواب:

Enter initial guess: 1
root = 1.6506

Enter initial guess: i
root = 0.17469+1.5469i

Enter initial guess: -i
root = 0.17469-1.5469i

 

لینک کوتاه شده مطلب: http://www.esfandune.ir/Duqmc

پسور فایل ها: esfandune.ir یا www.esfandune.ir می باشد

درباره مهندس ذرقانی

ما را دنبال کنید:


آموزش های پیشنهادی سایت (نمایش همه):


نظر خود را بیان کنید

بسته آموزشی زمستانه فارسی اندروید
تخفیف نورورزی
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
بسته آموزشی زمستانه فارسی اندروید
آموزش برنامه نویسی اندروید با کاتلین