کلیدستان

نسخه‌ی کامل: نوشتن سینتکس قانون فازی در این حالت خاص با کدنویسی، چه طور???
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام--فرض کنیم که ورودی فازی من 5 تا تابع عضویت (خیلی باارزش-باارزش-ارزش متوسط،ارزش کم-خیلی ارزش کم) دارم حالا می خواهم برای سیستم با کدنویسی در ام-فایل قانونی بنویسم که بدین مفهوم باشد:
اگر ورودی یک،" کم ارزش" و ورودی دوم "کم ارزش نباشد" ان گاه خروجی متوسط شود

if x=low-value and y= not low-value then output=middle
منظور این است که ورودی دوم حالاتی همچون (خیلی باارزش-باارزش-ارزش متوسط) را میتواند اتخاد کند--به عبارتی ساده سازی قانون انجام می دهم...به جای نوشتن چند قانون مجزا که در ان ورودی دوم جداگانه مقادیر خیلی باارزش-باارزش-ارزش متوسط، را اتخاد کند می خواهم ، در قالب یک قانون بنویسم و ادغام کردم
دستور سینتکس آن چیست؟؟ چه طور باید کد نویسی این قانون خاص را انجام بدهم؟
منظورم در فرم ماتریسی قانون هست که باید در "کد های ام فایل " بنویسیم
لطفا راهنماییم کنید نیاز فوری دارم
سلام .
امیدوارم درست منظورتون رو متوجه شده باشم .
برای سادگی هر مقدار را در برنامه با یک عدد نمایش می دهیم . مقدار خیلی کم ارزش با 1 ، کم ارزش با 2 ، متوسط با 3 ، با ارزش با 4 و خیلی با ارزش را با 5 نمایش می دهیم .
کدها به صورت زیر می باشند :

کد:
clear all
close all
clc

% 1--> very low value  2--> low value  3--> middle  4--> high value  5--> very high value

output_values=cellstr(['very low ';'low      ';'middle   ';'high     ';'very high']);

output=0;
input_1=1;
input_2=3;
if (input_1<=2 && input_2>=3)
    output=3;
end
output=output_values(output)

دو ورودی را با input_1 و input_2 نمایش می دهیم . با تبدیل 5 حالت تعیین شده به عدد ، به راحتی می توان شرط کم ارزش بودن را با 2=> و شرط کم ارزش نبودن را با 3=< اعمال نمود .
در آخر برنامه هم حالت مربوط به خروجی چاپ می شود .
قبل از شرط if ، من مقدار output رو برابر صفر گذاشتم . حالت های مختلف رو برای ورودی ها امتحان کنید و نتیجه رو ببینید .
سلام جناب ادمین
واقعیت اینکه منم این مشکل و دارم اما متوجه نمیشم منظورتون رو

من دو ورودی دارم همون طور که بالا گفته شد
ورودی اول من شامل 4حالته (کوچک-متوسط-بزرگ-خیلی بزرگ)
ورودی دوم من هم همینطر 4 حالت داره

یکی از قوانین من این و میگه:
if input1=means and input2=small then output=means

حالا من دو تا سول دارم
چجوری میتونم ورودی اول و که 4 تا وروودی توی input1 تعریف کنیم

کد:
%%INPUT 1
x1=0:10:800; small=trimf(x1,[1 1 800]);
x2=0:10:1000; means=trimf(x2,[0 800 1000]);
x3=700:10:1200; large=trimf(x3,[800 1000 1200]);
x4=900:10:1300; verylarge=trimf(x4,[1000 1300 1300]);

%% input2
a1=0:0.1:36; b1=trimf(a1,[10 10 35.85]);
a2=0:0.1:44; b2=trimf(a2,[10 35.85 43.92]);
a3=10:0.1:53; b3=trimf(a3,[35.85 43.92 52]);
a4=10:0.1:53; b4=trimf(a4,[43.92 52 52]);




%% output
z1=0:0.01:0.7; k1=trimf(z1,[0.3 0.3 0.5045]);
z2=0:0.01:0.7; k2=trimf(z2,[0.3 0.5045 0.5273]);
z3=0:0.01:0.7; k3=trimf(z3,[0.45 0.55 0.65]);
z4=0:0.01:0.7; k4=trimf(z4,[0.5273 0.55 0.55]);

قانون رو چجوری میتونم تعریف کنم توی mfile?

Huh
سلام .
اون نوشته من برای زمانی هست که نخواهیم از توابع متلب استفاده کنیم . اما روش اصلی در متلب برای منطق فازی به این صورت هست که ابتدا یک فایل fis می سازید و سپس قوانین رو برای اون تعریف می کنید .
تعدادی از دستورات مرتبط با این موضوع عبارتند از :

getfis
newfis
addrule
addvar
addmf
evalfis

با دستور addrule قوانین رو تعریف می کنید و با دستور evalfis هم ورودی های دلخواه رو می دهید تا ببینید خروجی چی هست . coffee
تقریبا متوجه شدم

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

من نیاز به کد نویسی دارم
یه mfile باید بنویسم

اینجوری میتونید کمکم کنید؟

Undecided
یکی از مثالای خود نرم افزار متلب رو براتون اینجا می نویسم و توضیح میدم (البته چند خط کد بهش اضافه کردم) :

کد:
clear all
close all
clc

a=newfis('tipper');

a=addvar(a,'input','service',[0 10]);
a=addmf(a,'input',1,'poor','gaussmf',[1.5 0]);
a=addmf(a,'input',1,'good','gaussmf',[1.5 5]);
a=addmf(a,'input',1,'excellent','gaussmf',[1.5 10]);
plotmf(a,'input',1)

a=addvar(a,'input','food',[0 10]);
a=addmf(a,'input',2,'rancid','trapmf',[-2 0 1 3]);
a=addmf(a,'input',2,'delicious','trapmf',[7 9 10 12]);
figure
plotmf(a,'input',2)

a=addvar(a,'output','tip',[0 30]);
a=addmf(a,'output',1,'cheap','trimf',[0 5 10]);
a=addmf(a,'output',1,'average','trimf',[10 15 20]);
a=addmf(a,'output',1,'generous','trimf',[20 25 30]);
figure
plotmf(a,'output',1)

ruleList=[ ...
1 1 1 1 2
2 0 2 1 1
3 2 3 1 2 ];
a=addrule(a,ruleList);

out=evalfis([1 1],a)

ابتدا با دستور newfis ، یک fis با نام tipper ساخته ایم . سپس با دستور addvar ، اولین ورودی را با نام service و با محدوده 0 تا 10 تعریف کرده ایم . در سه خط بعد ، با دستور addmf ، سه تابع عضویت برای ورودی شماره اول تعریف کرده ایم . با دستور plotmf می توانیم توابع عضویت را مشاهده کنیم که برای ورودی اول به صورت عکس زیر می باشد (روی عکس کلیک کنید تا آن را در اندازه اصلی ببینید) :

[attachment=16]

این بار با دستور addvar ، ورودی دوم را با نام food و با محدوده 0 تا 10 تعریف کرده ایم . سپس دو بار از دستور addmf استفاده کرده ایم تا دو تابع عضویت برای ورودی دوم تعریف کنیم . سپس با دستور plotmf ، توابع عضویت را برای ورودی دوم رسم کرده ایم که نتیجه به صورت عکس زیر می باشد :

[attachment=17]

در مرحله بعد ، با دستور addvar ، خروجی (تنها یک خروجی) را تعریف کرده ایم . این خروجی با نام tip و دارای محدوده 0 تا 30 می باشد . با دستور addmf ، سه تابع عضویت برای خروجی تعریف کرده ایم . این بار از دستور plotmf برای رسم توابع عضویت خروجی استفاده کرده ایم که نتیجه به صورت زیر می باشد :

[attachment=18]

ruleList شامل قوانینی است که تعریف می کنیم . با دستور addrule ، این قوانین را به قوانین fis اضافه می کنیم . قوانین هم به صورت اعداد 5 تایی هست که 2 عدد اول مربوط به مقدار 2 ورودی ، عدد سوم مربوط به مقدار خروجی ، عدد چهارم مربوط به وزن (weight) در نظر گرفته شده برای قانون و عدد چهارم هم مشخص می کند که قانون به صورت AND می باشد یا OR (عدد 1 برای AND و عدد 2 برای OR) .
در انتها نیز با دستور evalfis ، مقدار دو ورودی را تعیین می کنیم تا ببینیم خروجی دارای چه مقداری می باشد . نتیجه خروجی به صورت زیر است :

کد:
out =

    5.5375

امیدوارم این مطالب مفید بوده باشه . coffee
کد (ام فایل) مربوط به این مثال fuzzy tipper رو چه جوری میشه تو متلب آورد و دید؟
برای یک fis ، اگر آن را ذخیره کنیم، فایلی با پسوند fis ساخته می شود، بنابراین m-file نیست که بتوانید کدها را به صورت معمولی ببینید.
برای ساخت فایل fis ، از دستور writefis و برای خواندن آن، از دستور readfis در متلب استفاده می شود. دستور readfis اطلاعات کلی مروبط به fis را به شما می دهد.
در ضمن، اگر می خواهید پنجره FIS Editor در نرم افزار متلب باز شود، دستور زیر را اجرا کنید :

کد:
fuzzy

اگر دوست دارید ببینید که ساختار کدنویسی فایل های fis چگونه است، باید پسوند یک فایل fis را از fis به txt تغییر بدهید و سپس آن را با یک نرم افزار ویرایشگر متن باز کنید (ساختار آن، یک ساختار قراردادی است و شما به آن نیازی نخواهید داشت).
یعنی کدی که بالا نوشتید ماله خود تولباکس نیست و خودتون نوشتید؟
(۱۳۹۲/۱۲/۲۷, ۱۰:۵۴ ق.ظ)'mobinesmaeili' نوشته: [ -> ]یعنی کدی که بالا نوشتید ماله خود تولباکس نیست و خودتون نوشتید؟

 


در نرم افزار متلب، Toolbox ها تنها واسط گرافیکی هستند تا کاربران با آنها، عملیات های مورد نظرشان را  راحتتر انجام بدهند. این واسط های گرافیکی، از توابع موجود در نرم افزار متلب استفاده می کنند. آن کدها را با کمی تغییر یکی از مثال های خود متلب نوشته ام، ولی این تصور را نداشته باشید که کدهای مورد استفاده Toolbox ها خیلی متفاوت است (پس زمینه آنها، همان توابع متلب می باشد).
سلام اگه میشه یکی به سوالم خیلی سریع پاسخ بده ..ممنون میشم
تو همین نوشتن قوانین فازی با این دستورات من میخوام تو توابع عضویت بجای عدد متغیر بذارم
مثل این
'trapmf',[0 0 mid-d mid+d]


ولی نمیدونم چیکاکنم؟ موضوع پروژم تشخیص لبه با منطق فازی
clear all
close all
clc

a=newfis('CFED');

a=addvar(a,'input','input1',[0 255]);
a=addmf(a,'input',1,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',1,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',1)

a=addvar(a,'input','input2',[0 255]);
a=addmf(a,'input',2,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',2,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',2)

a=addvar(a,'input','input3',[0 255]);
a=addmf(a,'input',3,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',3,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',3)

a=addvar(a,'input','input4',[0 255]);
a=addmf(a,'input',4,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',4,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',4)

a=addvar(a,'input','input5',[0 255]);
a=addmf(a,'input',5,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',5,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',5)

a=addvar(a,'input','input6',[0 255]);
a=addmf(a,'input',6,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',6,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',6)

a=addvar(a,'input','input7',[0 255]);
a=addmf(a,'input',7,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',7,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',7)

a=addvar(a,'input','input8',[0 255]);
a=addmf(a,'input',8,'white','trapmf',[0 0 mid+d mid-d]);
a=addmf(a,'input',8,'black','trapmf',[0 0 mid+d mid-d]);
figure
plotmf(a,'input',8)


a=addvar(a,'output','Output',[0 255]);
a=addmf(a,'output',1,'Edge','trimf',[247 251 255]);
a=addmf(a,'output',1,'notEdge','trimf',[247 251 255]);
figure
plotmf(a,'output',1)

%gesmate ghavanine fuzzy ke 8taye aval vorudi badi khuruji badi weight badi
%ghanun be surate and ya or (AND=1 va OR=2)
ruleList=[ ...
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
];
a=addrule(a,ruleList);

out=evalfis([1 1 1 1 1 1 1 1],a)