اندکس ها را اینجورا میشه استخراج کرد
k1=pp<0.5
k2=pp>=0.5
k11=find(pp<0.5)
k22=find(pp>=0.5)
اندکس ها را اینجورا میشه استخراج کرد
k1=pp<0.5
k2=pp>=0.5
k11=find(pp<0.5)
k22=find(pp>=0.5)
حالا اینا اگه نمرات 15 تا دانش آموز باشند و یه بردار 1 در 15 دیگه داشته باشیم که سن این دانش آموزان باشه.
وقتی که اینا بر اساس نمره گروه بندی میشن چطوری میشه اون بردار سن رو هم به ترتیب به گروه مربوطه منتقل کرد؟
منظورم این نیست که دوباره همین برنامه رو برای سن هم اجرا کنیم.
مثلن نمره ی دوازدهمین دانش آموز 51 هست و سنش 27 سال هست. وقتی که این دانش آموز توی گروه 2 قرار میگیره، به ترتیب سنش هم توی یه گروه 2 ولی از جنس سن قرار بگیره!
منظورم رو فهمیدین؟
مثلن سن دانش آموزان :
age=[20 25 30 27 28 30 40 20 23 24 25 27 31 32 38];
میشه یک متغیر جدید با چند تابع عضویت درست کرد
a = addvar (a, 'input', 'age', [0 100]);
a = addmf (a, 'input', 2, 'nobaveh', 'trapmf', [-1 0 5 7]);
a = addmf (a, 'input', 2, 'nonahal', 'trapmf', [5 7 9 11]);
a = addmf (a, 'input', 2, 'nojavan', 'trapmf', [9 11 15 17]);
a = addmf (a, 'input', 2, 'javan', 'trapmf', [15 17 35 40]);
البته قواعد هم باید طور دیگه ای بنویسیم
همه اینها توی مثالها و آموزشها هست
نه منظورم رو متوجه نشدین!
نمیخوام سن رو هم بر اساس اعداد گروه بندی کنم. میخوام هر دانش آموزی که بر اساس نمره گروهبندی که شد ، مشخصاتش هم از جمله سن به همون گروه منتقل بشه و همچنینی به ترتیب.
به این صورت :
n=[10 20 30 40 44 45 46 60 70 80 49 51 48 50 90];
age=[20 25 30 27 28 30 40 20 23 24 25 27 31 32 38];
Group1 :
N1=[10 20 30 40 44 45 46 49 48 50]
Age1=[20 25 30 27 28 30 40 25 31]
Group2 :
N2=[60 70 80 51 90]
Age2=[20 23 24 27 38]
اگه دقت بکنید سن ها گروهبندی نشدن. فقط مثلن دانش آموز دوازدهم که نمره آن 51 بود رفت گروه 2 ، باید مشخصاتش هم بره گروه 2
و ضمن اینکه الآن توی گروه دوم پنجمین درایه هست باید در Age2 هم پنجمین درایه باشه.
گفتم که با همون find اندکس ها را در میارید و به عناون هم اندکس gae و هم اندکس نمره قابل استفاده هست
دوتا ماتریس را به هم بچسبون تا کنار همدیگه قرار بگیره
شرمنده. متوجه نمیشم.
منظورم اینه که مثلن اندکس های K22 که بصورت
k22 =
8
9
10
12
15
هستن بجاش خود سن قرار بگیره یا خود نمره ها قرار بگیره. نمیخوام سن و نمره رو به هم بچسبونم تا توی یه ماتریس قرار بگیرن!
منظورم اینه
n=[10 20 30 40 44 45 46 60 70 80 49 51 48 50 90];
pp=evalfis(n,a) ;
iGroup1=find(pp<0.5);
iGroup2=find(pp>=0.5);
N1=n(iGroup1)
N2=n(iGroup2)
Age1=age(iGroup1)
Age2=age(iGroup2)
چند تا دستور هست که زیاد در متلب کاربرد داره برای پیدا کردن اندکس ها یا مثلا کار با ماتریسها که توی اغلب جزوه های مختصر هم دیده میشه چیز خاصی نیست
لیست اینها هم میشه مثلا در گوگل در matlab refcard پیدا کرد
مهندس من دارم توی کدهام از یه دستور شرطی استفاده میکنم. داخل این شرط میخوام بگم مثلن اگه n=10 بود فلان برنامه ای که توی یه m-file دیگه هست رو اجرا کن ولی اون برنامه بصورت تابع نیست. باید چیکار کنم؟
واسه ی قوانین چطوری 1 یا 2 مشخص میکنی؟ بر چه اساسیه؟
aa = addrule (aa, [1 1 1 1;2 2 1 1]);
اگه بخوام n جمله ی اول رو بصورت یک بردار نشون بدم چطوریه؟
مثلن وقتی n=5 هست بصورت زیر بشه
P=[ 1 2 3 4 5]
این یه مثال ساده هست.
همونطوری هم که گفتین جواب رو بر میگردونه دیگه!
چطوری باید جدا جدا توی workspace ذخیره کنم و هر مقادیر محیط و مساحت رو در هر دو مرحله داشته باشم؟
function [P,S]= math(r)
P=(pi)*r;
S=(pi)*r^2;
end
------------------------
clc
r = input('\n input r=');
[P,S]= math(r);
fprintf('\n mohit=%f\n',P);
fprintf('\n masahat=%f \n',S);
% --------------------------------
r = input('\n input r=');
[P,S]= math(r);
fprintf('\n mohit=%f\n',P);
fprintf('\n masahat=%f \n',S);
این جوری
function [P,S]= math(r)
P=(pi)*r;
S=(pi)*r^2;
end
------------------------
clc
r = input('\n input r=');
[P1,S1]= math(r);
fprintf('\n mohit=%f\n',P1);
fprintf('\n masahat=%f \n',S1);
% --------------------------------
r = input('\n input r=');
[P2,S2]= math(r);
fprintf('\n mohit=%f\n',P2);
fprintf('\n masahat=%f \n',S2);
ممنونم.
ولی من همینو قبلن نوشته بودم. اینطوری نمیخواستم.
بیخیال. مرسی :)
همونطوری که توی مقاله گفت این دو تا تابع باید maximize بشن. ولی این دستور که مینیمم سازی میکنه ویک نقطه مینیمم رو بدست میاره که!
مگه اینطور نیست؟
من یه فایل آموزشی از متلب سایت گرفتم که دقیقن همین منفی رو گفته ولی اونجا اول یه تابع هدف معرفی کرده و سپس توابع خودش رو نوشته. من که اینجا تابع هدف ندارم!
در ضمن توی هلپ متلب گفته این دستور برای تک متغیره هست ولی من اینجا دوتا متغیر دارم. p و q
فکر کنم از دستور fmincon باید استفاده بشه.
اینطوری نیست؟
آخرین ویرایش به وسیله coronaa : سه شنبه 11 شهریور 1393 در 23:34 عصر
درسته واسه رابطه 5 فکر کنم fminbnd کافی باشه اما برای رابطه 6 همونطور که اشاره کردیدfmincon باید به کار بره. فکر کنم فقط لازم باشه تابع خودتون را داخل این دستور بذارید اون چیزهایی که لازم نیست را [ ] بذارید
از چه جهت میگین رابطه (5) با fminbnd و معادله (6) با fmincon حل میشه؟اگه از نظر تعداد متغیر بگیم یا هردو ، دو متغیر p و q دارند و یا هر دو ، فقط یک متغیر q دارند.شما از این الگوریتمی که تو صفحه سوم داده سر در میارید؟فکر کنم این دوتا تابع رو باید با الگوریتمی که داده بهینه کنیم. با همون روش تکرار و آپدیت کردن.دقیقاً متوجه نشدم که باید چیکارش کنم!
زیر کلمه max را نگاه کنید. در رابطه 5 فقط یک متغیر می بینیم اما در رابطه 6 چند تا می بینیم. دلیلش اینه.
آها. مرسی.
من هر کاری کردم نتونستم با اون کدها جواب بگیرم. یک تابع هدف و چندتا قید معرفی میکنه ولی اینجا اصلن اینطوری نیست!
یه مثال نمونه که داد اینطوری بود :
function [c, ceq]=NLC(x)
c=x(1)^2+x(2)^2-100;
ceq=[];
end
clc;
clear;
close all;
f=@(x) -x(1)*x(2);
lb=[0 0]';
x0=[1 1]';
[x, fx]=fmincon(f,x0,[],[],[],[],lb,[],@NLC);
این کدوم رو میخواد ماکزیمم کنه؟
من اینطوری نوشت. ولی خطا میده!
function [c, ceq]=NLC(x)
c=-p*q ;
ceq=[];
end
clc;
clear;
close all;
% ----------------------------
% Parameters : [MG1 MG2 MG3 MG4]
p=[12.5 12 13 15]; % Trading Price
q=[25 30 40 50]; % Amount of Energy
alpha = [.3 .32 .34 .36];
beta = [.2 .25 .27 .3];
lambda = [1 1 1 1];
D = [3.3 1.6 2.3 2];
m = [3 2 3 2];
k = [.38 .38 .38 .38];
% ----------------------------
% Satisfacton Function
for i=1:4
pq_bar = k.*(D-sum(q));
end
fprintf('Satisfacton Function = ');
disp(pq_bar)
% ----------------------------
% Production Cost
for i=1:4
Cq=alpha.*q.^2+beta.*q;
end
fprintf('Production Cost = ');
disp(Cq)
% --------------------------------
f=@(x) (((p+pq_bar).*q)-Cq);
lb=[0 0]';
x0=[1 1]';
[x, fx]=fminbnd(f,x0,[],[],[],[],lb,[],@NLC);
اشتباهه؟
فرمول 6 اینجور میشه
D = [3.3 1.6 2.3 2];
lb=[0 0 0 0];
q=[25 30 40 50]; % Amount of Energy
alpha = [.3 .32 .34 .36];
lambda = [1 1 1 1];
k = 0.38;
f=@(q)sum(alpha.*q.^2+k*(D-sum(q)).*q);
[x, fx]=fmincon(f,q,[],[],[],[],lb,lambda);
1- چرا فرمول 6 رو اینطوری نوشتین؟ به این صورت نیست؟
sum(diff(Cq)+k.*(D-sum(q)).*q)-Cq ;
2- چرا k رو بصورت برداری ننوشتین؟ (بخاطر اینکه مقادیر یکسانی داره؟)
3- پارامت آخر آرگومان fmincon چرا لاندا گذاشتین؟ لاندا ماکزیمم عدد q نیست؟
مرسی. کاملاً منطقیه.
اون کد آماده NLC رو بخاطر چی قرار میداد؟
و سوال دیگه اینکه الآن وقتی این اجرا میشه یک عدد منفی میده. یعنی اون نقطه، نقطه ی بهینه هست؟
باید معادله ی اولی هم به همین صورت حل بشه ولی با fminbnd و سپس این دوتا رو بذارم توی الگوریتمی که وجود داره؟
فکر کنم رابطه 5 را لازم نداریم چون محاسبه برای موقعیه که فقط یک تولید کننده را در نظر می گیریم
NLC را لازم نداریم فکر کنم برای موقعی هست که بخواهیم شروط دیگه برقرار کنیم
یه چیزی برام مشخص نیست. لاندا که باید برابر باشه با بیشترین ظرفیت تولید هر تولید کننده را اینجا گذاشته 1 که برام مبهمه
در مورد جواب منفی هم دقت کنید که آیا x منفی شده؟ چون اگه اینجور باشه یه جای کار اشکال وجود داره که احتمالا مقدار لاندا باشه
منم دقیقاً متوجه نشدم واسه چی 1 گرفته. بر حسب پریونیت هم نمیتونه باشه!
جوابی که میگیرم اینطوریه :
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
1
2
3
4
x =
1 1 1 1
fx =
-1.2640
فکر کنم q ها اشتباه هست باید حداکثر 1 باشه