رفتن به مطلب

استفاده از Function Handle در متلب


helen66

ارسال های توصیه شده

با سلام

میخوام فرمول زیر رو بصورت فانکشن بنویسم ..

cost=soschg+costbat-Earnre

کد زیرو براش نوشتم ولی اروررمیده میشه لطف کنید ایرادشو بگید؟

با تشکر

 

CostFunction=@(kd,Id,Dt) codd17(kd,Id,Dt); % Cost Function

که codd17 بصورت زیره:

function [ cost ] = codd17( coschg,costbat,Earnreg )

%UNTITLED7 Summary of this function goes here

% Detailed explanation goes here

 

cost=codd15+codd4-codd16;

disp(cost)

end

لینک به دیدگاه
  • پاسخ 87
  • ایجاد شد
  • آخرین پاسخ

بهترین ارسال کنندگان این موضوع

بهترین ارسال کنندگان این موضوع

با سلام

میخوام فرمول زیر رو بصورت فانکشن بنویسم ..

cost=soschg+costbat-Earnre

کد زیرو براش نوشتم ولی اروررمیده میشه لطف کنید ایرادشو بگید؟

با تشکر

 

CostFunction=@(kd,Id,Dt) codd17(kd,Id,Dt); % Cost Function

که codd17 بصورت زیره:

function [ cost ] = codd17( coschg,costbat,Earnreg )

%UNTITLED7 Summary of this function goes here

% Detailed explanation goes here

 

cost=codd15+codd4-codd16;

disp(cost)

end

 

سلام

چه اروری میده؟ چجوری ازش استفاده می کنین؟ فانکشنتون رو داخل یه ام فایل نوشتین و سیو کردین؟

لینک به دیدگاه
سلام

چه اروری میده؟ چجوری ازش استفاده می کنین؟ فانکشنتون رو داخل یه ام فایل نوشتین و سیو کردین؟

سلام،این اررورشه:

Error using +

Matrix dimensions must agree.

 

Error in codd17 (line 5)

cost=codd15+codd4-codd16;

مثلا ی سری عدد بعنوان ورودی بهش میدیم تا خروجی بگیریم..

coschg,costbat,Earnre هر کدومشو تو ی ام فایل نوشتم...

لینک به دیدگاه
سلام،این اررورشه:

Error using +

Matrix dimensions must agree.

 

Error in codd17 (line 5)

cost=codd15+codd4-codd16;

مثلا ی سری عدد بعنوان ورودی بهش میدیم تا خروجی بگیریم..

coschg,costbat,Earnre هر کدومشو تو ی ام فایل نوشتم...

 

سلام

خب اینجا میگه جمع نمی تونین استفاده کنین، ابعاد ماتریس ها به هم نمی خوره.

یعنی چی اینا رو هر کدوم توی یه ام فایل نوشتین؟

 

مثلا من بخوام از تابع times متلب برای اینکار استفاده کنم:

 

clear;
F = @(x,y) times(x,y);

F(5,6)

لینک به دیدگاه
سلام

خب اینجا میگه جمع نمی تونین استفاده کنین، ابعاد ماتریس ها به هم نمی خوره.

یعنی چی اینا رو هر کدوم توی یه ام فایل نوشتین؟

 

مثلا من بخوام از تابع times متلب برای اینکار استفاده کنم:

 

clear;
F = @(x,y) times(x,y);

F(5,6)

 

اخه ابعادشو چک کردم هر سه تا 1*100هستند.

یعنی اشتباه نوشتم و باید تو ی ام فایل بنویسم؟؟؟(چون خیلی زیاد میشد جدا گانه نوشتمشون.)

لینک به دیدگاه
اخه ابعادشو چک کردم هر سه تا 1*100هستند.

یعنی اشتباه نوشتم و باید تو ی ام فایل بنویسم؟؟؟(چون خیلی زیاد میشد جدا گانه نوشتمشون.)

 

نمی دونم چیکار کردین که، فانکشن رو باید توی یه ام فایل بنویسین و سیو کنین، بعد داخل کد دیگه مثل چیزی که بالا نوشتم، استفاده کنین.:a030:

لینک به دیدگاه
نمی دونم چیکار کردین که، فانکشن رو باید توی یه ام فایل بنویسین و سیو کنین، بعد داخل کد دیگه مثل چیزی که بالا نوشتم، استفاده کنین.:a030:

خب منم این کارو کردم واسه تاشون....:ws52:

لینک به دیدگاه
خب منم این کارو کردم واسه تاشون....:ws52:

 

هلن خانوم، شما باید یه فانکشن تعریف کنین، بعد از اون توی این کدتون مثل کد من استفاده کنین، من از فانکشن متلب استفاده کردم، به جای اینکه یه فانکشن تعریف کنم.

لینک به دیدگاه
هلن خانوم، شما باید یه فانکشن تعریف کنین، بعد از اون توی این کدتون مثل کد من استفاده کنین، من از فانکشن متلب استفاده کردم، به جای اینکه یه فانکشن تعریف کنم.

سلام مهندس

من اگه الان بخوام همه برنامه رو تو ی فانکشن بنویسم ،سه تا از متغیر ها که بصورت تصادفی تغییر میکنه رو بعنوان ورودی بگیرم؟؟؟(kd,Id,Dt)

لینک به دیدگاه

ی سوال دیگه هم دارم :من اگه بخوام cost=soschg+costbat-Earnre بصورت فانکشن بنویسم که سمت چپ هر کدوم ی سری ورودی دارن ،برای ورودی های فانکشن cost باید همون soschgوcostbatو

Earnreبنویسم یا کل ورودی های این سه تا رو؟؟؟؟؟

لینک به دیدگاه
سلام مهندس

من اگه الان بخوام همه برنامه رو تو ی فانکشن بنویسم ،سه تا از متغیر ها که بصورت تصادفی تغییر میکنه رو بعنوان ورودی بگیرم؟؟؟(kd,Id,Dt)

 

ی سوال دیگه هم دارم :من اگه بخوام cost=soschg+costbat-Earnre بصورت فانکشن بنویسم که سمت چپ هر کدوم ی سری ورودی دارن ،برای ورودی های فانکشن cost باید همون soschgوcostbatو

Earnreبنویسم یا کل ورودی های این سه تا رو؟؟؟؟؟

 

سلام

ببخشید، خیلی متوجه نشدم. با کد توضیح میدین؟

لینک به دیدگاه
سلام

ببخشید، خیلی متوجه نشدم. با کد توضیح میدین؟

 

مثلا این درسته؟؟؟؟؟؟

[left]function cost1 =  cost2( coschg,costbat,Earnreg )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));
end
m=0;
for t=1:24
   coschg=m+PEV(t).*rt;
end
% disp(coschg)

end
ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
  for t=1:24
   Edis=Edis+Dd(t).*Prate(d);
  end
end
costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);
end
Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg

end

[/left]

لینک به دیدگاه
مثلا این درسته؟؟؟؟؟؟
[left]function cost1 =  cost2( coschg,costbat,Earnreg )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));
end
m=0;
for t=1:24
   coschg=m+PEV(t).*rt;
end
% disp(coschg)

end
ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
  for t=1:24
   Edis=Edis+Dd(t).*Prate(d);
  end
end
costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);
end
Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg

end

[/left]

 

این کلش یه فانکشن هست؟

وسطش فانکشن رو بستین که، end گذاشتین.

لینک به دیدگاه
این کلش یه فانکشن هست؟

وسطش فانکشن رو بستین که، end گذاشتین.

 

بله کلش ی فانکشنه...یعنی باید همه endواسه for هستو اخر بنویسم ؟؟مثل کد زیر:

[left]function cost1 =  cost2( coschg,costbat,Earnreg )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;

e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));

m=0;
for t=1:24
   coschg=m+PEV(t).*rt;

% disp(coschg)


ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
  for t=1:24
   Edis=Edis+Dd(t).*Prate(d);
  

costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);

Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg
end
  end 
end
end
end
end
end
end



[/left]

لینک به دیدگاه
بله کلش ی فانکشنه...یعنی باید همه endواسه for هستو اخر بنویسم ؟؟مثل کد زیر:

 

نه هلن خانوم، اینجوری که حلقه هاتون به دچار مشکل میشه. ببینین توی کد اولتون یه end خط 50 دارین که مربوط به هیچ forی نمیشه، اون فانکشنتون رو می بنده، متلب فکر می کنه تعریف فانکشنتون تموم شده. در انتحای فانکشن هم میشه از end استفاده کرد، ولی الزامی نیست، مگر اینکه بخواین فانکشن جدیدی توی همون کد تعریف کنین، که توی این حالت end فانکشن هم نیازه که نوشته بشه.:a030:

لینک به دیدگاه

سلام.این چیزی که میگم ربطی به برنامه نویسی نداره ولی فقط واسه این که کدتون خوانا تر بشه و دیباگ کردنش راحت تر باشه ،هر وقت نوشتن کدتون تموم شد همه ی کد رو انتخاب کنید و Ctrl +I بزنید تا هر حلقه یا تابعی با end خودش هم تراز بشه.الان با این کار شما متوجه میشی که آخرین end به هیچ حلقه یا تابعی تعلق نداره.این کار تو متلب به همین راحتی انجام میشه ولی مثلا اگه همین کد شما تو پایتون بود مرتب کردنش یه کار عذاب آور میشد.

لینک به دیدگاه
نه هلن خانوم، اینجوری که حلقه هاتون به دچار مشکل میشه. ببینین توی کد اولتون یه end خط 50 دارین که مربوط به هیچ forی نمیشه، اون فانکشنتون رو می بنده، متلب فکر می کنه تعریف فانکشنتون تموم شده. در انتحای فانکشن هم میشه از end استفاده کرد، ولی الزامی نیست، مگر اینکه بخواین فانکشن جدیدی توی همون کد تعریف کنین، که توی این حالت end فانکشن هم نیازه که نوشته بشه.:a030:

 

مرسی اقا ایمان ،اصلاحش کردم...میشه لطف کنید ایراد برنامه رو بگید چیه امشب باید برای استادم بفرستمش ...برنامه کلی pso هست نمیدونم تادرسته یا نه؟ عدداش نمیدونم چرا شبیه هم هستن؟!!!

function cost1 =  cost2( coschg,costbat,Earnreg )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));
end
m=0;
for t=1:24
   coschg=m+PEV(t).*rt;
end
% disp(coschg)


ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
   for t=1:24
       Edis=Edis+Dd(t).*Prate(d);
   end
end
costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);
end
Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg

end

لینک به دیدگاه
مرسی اقا ایمان ،اصلاحش کردم...میشه لطف کنید ایراد برنامه رو بگید چیه امشب باید برای استادم بفرستمش ...برنامه کلی pso هست نمیدونم تادرسته یا نه؟ عدداش نمیدونم چرا شبیه هم هستن؟!!!
function cost1 =  cost2( coschg,costbat,Earnreg )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));
end
m=0;
for t=1:24
   coschg=m+PEV(t).*rt;
end
% disp(coschg)


ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
   for t=1:24
       Edis=Edis+Dd(t).*Prate(d);
   end
end
costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);
end
Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg

end

 

دو تا از ورودی ها تون (costbat و Earnreg) رو استفاه نمی کنین، دوباره هر دو رو توی فانکشن تعریف می کنین. یا متغیرهایی توی فانکشن دارین که استفاده نمیشن، فقط محاسبه شون می کنین. متلب یه خط نارنی برای اینا میذاره، که موس رو روش نگه دارین، توضیحش رو هم میاره. این اسم فانکشن و متغیر خروجی هم خیلی شبیه به هم هستن، ممکنه با هم اشتباه بشن.

 

البته مشکلی توی اجراش نداری، کد درسته.:a030:

لینک به دیدگاه
دو تا از ورودی ها تون (costbat و Earnreg) رو استفاه نمی کنین، دوباره هر دو رو توی فانکشن تعریف می کنین. یا متغیرهایی توی فانکشن دارین که استفاده نمیشن، فقط محاسبه شون می کنین. متلب یه خط نارنی برای اینا میذاره، که موس رو روش نگه دارین، توضیحش رو هم میاره. این اسم فانکشن و متغیر خروجی هم خیلی شبیه به هم هستن، ممکنه با هم اشتباه بشن.

 

البته مشکلی توی اجراش نداری، کد درسته.:a030:

ورودی ها رو تغییر دادم بصورت زیر شد: بعدشم از costbat و Earnreg اینا که واسه بدست اوردن خروجی استفاده شده!

[left]function hel =  cost2( kd,Id,Dt )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
beta1=0.1;
beta2=0.2;
alfa=10;
t=linspace(0,24);
a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1)
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);
h1=[7.8,9,11.4,13.8];
p1=h1(randi([1,4],1,1));
h2=[10.4,12,15.2,18.4];
p2=h2(randi([1,4],1,1));
h3=[15.6,18,22.8,27.6];
p3=h3(randi([1,4],1,1));
p=[p1 p2 p3];
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;
psys=ereq/t;
pavg=ereq/24;
rt=beta1+(beta2*(alfa.^((psys-pavg)./pavg)));
% disp(rt);
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
s=0;
for d=1:24
   PEV=s+(kd.*Prate(d));
end
m=0;
for t=1:24
   coschg=m+PEV(t).*rt;
end
% disp(coschg)


ee=eye(1,100);
cl=240.*ee;
lc=5000;
etadis=0.8;
cb=300;
% Edis=300;
DOD=0.8;
h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
Eb=h1(randi([1,12],1,100));

kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=1.8+(3.6-1.8)*rand(1,100);
Dd=zeros(1,100);
Dd(kd==-1)=1;
Edis=0;
for d=1:100
   for t=1:24
       Edis=Edis+Dd(t).*Prate(d);
   end
end
costbat=(((cb.*Eb)+cl)./((lc*DOD).*Eb))*Edis;
disp(costbat);
reg=4928;
kd1=eye(1,100);
k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Prate=0.85+(0.9-0.85)*rand(1,100);
Id=zeros(1,100);
Id(kd==0)=1;
pr=Id.*Prate;
PReg=sum(pr);
Earnreg=0;
for t=1:24
   Earnreg=Earnreg+(PReg.*reg);
end
Earnreg1=Earnreg.*eye(1,100);
cost1=coschg+costbat-Earnreg

end

[/left]

لینک به دیدگاه

اینم کد نهایی pso هست که اصلا اجرا نمیشه!!! میشه ایرادششو بگید؟؟؟؟؟

[left]clc;
clear;
close all;

%% Problem Definition

global NFE;

CostFunction=@(kd,Id,Dt) cost2(kd,Id,Dt);        % Cost Function

nVar=100;             % Number of Decision Variables

VarSize=[1 nVar];   % Size of Decision Variables Matrix

VarMin=-1;         % Lower Bound of Variables
VarMax= 1;         % Upper Bound of Variables


%% PSO Parameters

MaxIt=4000;      % Maximum Number of Iterations

nPop=2400;        % Population Size (Swarm Size)

w=1;            % Inertia Weight
wdamp=0.99;     % Inertia Weight Damping Ratio
c1=2;           % Personal Learning Coefficient
c2=2;           % Global Learning Coefficient

% Constriction Coefficients
% phi1=2.05;
% phi2=2.05;
% phi=phi1+phi2;
% chi=2/(phi-2+sqrt(phi^2-4*phi));
% w=chi;          % Inertia Weight
% wdamp=1;        % Inertia Weight Damping Ratio
% c1=chi*phi1;    % Personal Learning Coefficient
% c2=chi*phi2;    % Global Learning Coefficient

% Velocity Limits
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;

%% Initialization

empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];

particle=repmat(empty_particle,nPop,1);

GlobalBest.Cost=inf;

for i=1:nPop
   
   % Initialize Position
   particle(i).Position=randi([-1,1],1,100);
   
   % Initialize Velocity
   particle(i).Velocity=zeros(VarSize);
   
   % Evaluation
   particle(i).Cost=CostFunction(particle(i).Position);
   
   % Update Personal Best
   particle(i).Best.Position=particle(i).Position;
   particle(i).Best.Cost=particle(i).Cost;
   
   % Update Global Best
   if particle(i).Best.Cost<GlobalBest.Cost
       
       GlobalBest=particle(i).Best;
       
   end
   
end

BestCost=zeros(MaxIt,1);

nfe=zeros(MaxIt,1);


%% PSO Main Loop

for it=1:MaxIt
   
   for i=1:nPop
       
       % Update Velocity
       particle(i).Velocity = w*particle(i).Velocity ...
           +c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
           +c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
       
       % Apply Velocity Limits
       particle(i).Velocity = max(particle(i).Velocity,VelMin);
       particle(i).Velocity = min(particle(i).Velocity,VelMax);
       
       % Update Position
       particle(i).Position = particle(i).Position + particle(i).Velocity;
       
       % Velocity Mirror Effect
%         IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
%         particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
%         
       % Apply Position Limits
       particle(i).Position = max(particle(i).Position,VarMin);
       particle(i).Position = min(particle(i).Position,VarMax);
       a=readfis('gu1');
       x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1);
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end

a=readfis('gu1');
x=normrnd(9.97,2.2,100,1);
y=normrnd(17.01,3.2,100,1);
d=evalfis([x y],a);
aer=[30,40,60];
dr1=aer(randi([1,3],1));
landa=d./100;
if (landa.*d)>0,(landa.*d)<(0.8*dr1);
   socinitial=(1-(landa.*d)./dr1)*100;
elseif (landa*d)>=0.8*dr1;
   socinitial=0.2;
end
e=eye(100,1);

h1=[7.8,9,11.4,13.8,10.4,12,15.2,18.4,15.6,18,22.8,27.6];
p=h1(randi([1,12],1,100));
eta=0.85+(0.9-0.85)*rand(1,100);
c=p(randi(3,1,100));
c=diag(c);
ereq=(((e-socinitial))'*c)./eta;

k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Id=zeros(1,100);
Id(kd==0)=1;

k=[-1,0,1];
kd=k(randi([1,3],1,100 ));
Dd=zeros(1,100);
Dd(kd==-1)=1;
       % Evaluation
       particle(i).Cost = CostFunction(particle(i).Position);
       
       % Update Personal Best
       if particle(i).Cost<particle(i).Best.Cost
           
           particle(i).Best.Position=particle(i).Position;
           particle(i).Best.Cost=particle(i).Cost;
           
           % Update Global Best
           if particle(i).Best.Cost<GlobalBest.Cost
               
               GlobalBest=particle(i).Best;
               
           end
           
       end
       
   end
   
   BestCost(it)=GlobalBest.Cost;
   
   nfe(it)=NFE;
   
   disp(['Iteration ' num2str(it) ': NFE = ' num2str(nfe(it)) ', Best Cost = ' num2str(BestCost(it))]);
   
   w=w*wdamp;
   
end

%% Results

figure;
%plot(nfe,BestCost,'LineWidth',2);
semilogy(nfe,BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');

[/left]

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • اضافه کردن...