# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  حل تابع چند جمله ای

## coronaa

با سلام به دوستان گرامی،
من یه تابع درجه دوم دارم که باید ازش مشتق بگیرم و بعد برابر یک ضریبی قرار بدم و سپس ریشه ی اون تابع مشتق گرفته شده (درجه یک) رو بدست بیارم.
من مشتق میگیرم و برابر اون ضریب قرار میدم ولی نمیتونم ریشه رو بدست بیارم.
کسی هست کمک کنه؟
منظورم اینه که دستور این معادله رو چطوری بنویسم؟ (x متغیره)
2ax+b=c
باید از این معادله x بدست بیاد.
مرسی

----------


## rahnema1

سلام
اگه می خواهید به صورت سمبولیک حل کنید می تونید از تولباکس symbolic استفاده کنید

----------


## coronaa

> سلام
> اگه می خواهید به صورت سمبولیک حل کنید می تونید از تولباکس symbolic استفاده کنید


نه. فعلن میخوام کد بزنم!
دستوری نداره؟

----------


## rahnema1

> نه. فعلن میخوام کد بزنم!
> دستوری نداره؟


ببینید این لینک به کارتون میاد:
http://www2.math.umd.edu/~immortal/2...quations.shtml
حالا اگه می خواهید چرخ را دوباره اختراع کنید باید کاری شبیه کاری که مثلا یک کامپایلر انجام میده انجام بدین

----------


## coronaa

> ببینید این لینک به کارتون میاد:
> http://www2.math.umd.edu/~immortal/2...quations.shtml
> حالا اگه می خواهید چرخ را دوباره اختراع کنید باید کاری شبیه کاری که مثلا یک کامپایلر انجام میده انجام بدین


ممنونم. دقیقاً همینو میخواستم!

----------


## coronaa

مهندس مشکلم تقریباً حل شد. حالا میخوام نتیجه رو چاپ کنم یه پیغام خطا میده!
clc; clear; 
syms P 
for i=1:5
    
a(i)=5;    
b(i)=10;
c(i)=15;
ro(i)=30;
lambda=20;
% -----------------------------    
f=a*P^2+b*P+c;
d=diff(f,'P');
% -----------------------------
s=d(1,i)-lambda;
p(1,i)=solve(s) ;      % P(i)   bozorg
Pr=sum(p);
% -----------------------------
end
fprintf('Pi(Big) = %f',p);
fprintf('Pr = %f',Pr);

این خطا رو میده. ظاهراً P که بعنوان سیمبول شناخته شد دیگه دستور fprintf کار نمیکنه :
??? Error using ==> fprintf
Function is not defined for 'sym' inputs.

Error in ==> ProftCode at 
fprintf('Pi(Big) = %f',p);

----------


## rahnema1

من تولباک سمبولیک ندارم حالا شما اگه بتونید اول p  را تبدیل به عدد اعشاری بکنید چون f% که در fprintf استفاده میشه برای چاپ عدد اعشاری هست. مثلا با استفاده از دستور double یا امثال اینها

----------


## coronaa

> من تولباک سمبولیک ندارم حالا شما اگه بتونید اول p  را تبدیل به عدد اعشاری بکنید چون f% که در fprintf استفاده میشه برای چاپ عدد اعشاری هست. مثلا با استفاده از دستور double یا امثال اینها


p هم عدد اعشاریه هم یک ماتریس یک در 5 هست. نکنه بخاطر ماتریس بودنش قبول نمیکنه؟

----------


## coronaa

ممنونم دوست عزیز.
حل شد تا اینجا.  :لبخند:

----------


## coronaa

اگه یه مجموعه داشته باشیم بصورت {1,2,3} و بخوایم حالت های ممکنی که می تونن با هم یه زیر مجموعه تشکیل بدن چطوریه؟
مثلاً به این صورت :
{1},{1,2},{1,3},{2,3},{1,2,3}
ضمن اینکه {1,2} و {2,1} فرقی نمیکنن با هم!

----------


## rahnema1

a=[1 2 3];
for i=1:numel(a)
	s{i}=nchoosek(a,i);
end
disp(s)

----------


## coronaa

> a=[1 2 3];
> for i=1:numel(a)
>     s{i}=nchoosek(a,i);
> end
> disp(s)


nchoosek، جایگشته؟
 ولی من تمام حالتهای زیر مجموعه رو میخوام. تعدادشون نه! خود حالت ها رو نشون بده.
خروجی متلب :
[3x1 double]    [3x2 double]    [1x3 double]

----------


## rahnema1

s سک سلوله که داخلش تمام حالتها قرار داره.
خروجی octave:

octave-3.6.2.exe:3> disp(s)

{
  [1,1] =

     1
     2
     3

  [1,2] =

     1   2
     1   3
     2   3

  [1,3] =

     1   2   3

}

----------


## coronaa

دستتون درد نکنه ولی من هنوز اون جوابی که میخواستم رو نگرفتم.
یکمی باز مقالاتم رو مطالعه میکنم تا برام روشنتر بشه که چی میخوام. بعد دوباره سوالم رو از شما میپرسم.
ممنونم از راهنمائیت.
مرسی

----------


## coronaa

آقای مهندس،
برنامه ای که دادی رو یکمی دستکاری کردم و به یه جوابی رسیدم. بصورت زیر :
 ;
a=[1 2 3];
for i=1:numel(a);
    v=nchoosek(a,i)
 
end
خروجی متلب :

v =

     1
     2
     3


v =

     1     2
     1     3
     2     3


v =

     1     2     3
ولی میخوام خروجی رو به این صورت نمایش بده :
http://www.uplooder.net/img/image/1/...89cc88/aaa.jpg

راه حلی وجود داره به نظر شما؟

----------


## rahnema1

> راه حلی وجود داره به نظر شما؟


این را امتحان کنید

a=[1 2 3];
k=1;
for i=1:numel(a)
    s=nchoosek(a,i);
    for j=1:size(s,1)
		v(k)=sum(x(s(j,:)).*y(s(j,:)));
		k=k+1;
	end
end
disp(v)

----------


## coronaa

خطا :

 
??? Undefined function or method 'x' for input arguments of type
'double'.

Error in ==> sett1 at 6
        v(k)=sum(x(s(j,:)).*y(s(j,:)));

----------


## rahnema1

توی فایل ورد که x و y داشتین. من فکر کردم x و y عبارتند از دو تا بردار مثلا با طول 3 (چون a هم از 1 تا 3 بود)یه چیزی شبیه این

x=rand(1,3);
y=rand(1,3);

----------


## coronaa

> توی فایل ورد که x و y داشتین. من فکر کردم x و y عبارتند از دو تا بردار مثلا با طول 3 (چون a هم از 1 تا 3 بود)یه چیزی شبیه این
> 
> x=rand(1,3);
> y=rand(1,3);


بله. میشه گفت برداره.
در اصل توی رابطه ام x,y وجود نداره. رابطه های دیگه هست ولی گفتم پیچیده نشه فقط بعنوان مثال یه جمله ی اون رو گذاشتم. 
خب حالا جوابی که گرفتم بصورت زیره :
Columns 1 through 6

    0.7441    0.5728    0.0124    1.3169    0.7565    0.5852

  Column 7

    1.3293

----------


## rahnema1

حالا v برای حالتهای مختلف به دست اومده

----------


## coronaa

> حالا v برای حالتهای مختلف به دست اومده


چطوری باید بفهمم کدوم v هست؟

----------


## rahnema1

به همون ترتیبی که s را چاپ می کردیم

----------


## coronaa

ادامه ش اینطوریه :

----------


## rahnema1

{i} یعنی یکی از اعضای s که در اینجا یکی از اعداد 1 و 2 یا 3 میتونه باشه

----------


## coronaa

> {i} یعنی یکی از اعضای s که در اینجا یکی از اعداد 1 و 2 یا 3 میتونه باشه


به. یعنی باید عضو i از اونا کم بشه.
اگه i برابر 1 هست میشه :
v(1,2)-v(2)
v(1,2,3)-v(2,3)

----------


## rahnema1

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

----------


## coronaa

> فکر می کنم این فی باید جزء یک فرمول بزرگتر باشه درسته؟


نه.
مستقله. فقط همون Vs هایی که بدست آوردیم باید درش قرار بدیم تا فی i بدست بیاد.

----------


## rahnema1

آخه یه مشکل وجود داره. توی فرمول v که در فایل ورد اولی بود اون اندکس i منظورش چیه؟ منظورش اعضای مجموعه s هست یا نه صرفا اندیس هست؟

----------


## coronaa

> آخه یه مشکل وجود داره. توی فرمول v که در فایل ورد اولی بود اون اندکس i منظورش چیه؟ منظورش اعضای مجموعه s هست یا نه صرفا اندیس هست؟


تعداد اعضای مجموعه A هست. یعنی 3 تا
حل مسئله بدین صورته :

----------


## rahnema1

این یکی


a=[1 2 3];
x=rand(1,3);
y=rand(1,3);

function ret= indexV(Smini,S,v)
	ret=0;
	if (numel(Smini)==0)
		return;
	end
	for i=1:numel(S)
		if(size(S{i},2)<numel(Smini))
			ret=ret+size(S{i},1);
		else
			[val,dx]=ismember(Smini, S{i},'rows');
			ret=ret+dx;
		break;
		end
	
	end
	ret=v(ret);
end
k=1;
S={};
v=[];
for i=1:numel(a)
    s=nchoosek(a,i);
    S{i}=s;
    for j=1:size(s,1)
		v(k)=sum(x(s(j,:)).*y(s(j,:)));
		k=k+1;
	end
end
k=1;
phi=zeros(1,numel(a));
	for i=1:numel(S)
		for j=size(S{i},1)
			for z=1:numel(a)
				if (ismember(a(z),S{i}(j,:)))
					phi(z)=phi(z)+factorial(numel(S{i}(j,:))-1)* factorial(numel(a) -numel(S{i} (j,:)))* (v(k)-indexV(setdiff( S{i}(j,:) ,a(z)),S,v))/ factorial(numel(a));
					k=k+1;
				end
			end
		end
	end
disp(phi)

----------


## coronaa

دستت درد نکنه. این خطا رو میده فعلاً :
??? Undefined function or variable 's'.
 
Error in ==> rphii at 9
S{i}=s;

----------


## coronaa

آقا فعلاً  خطا نداد. دارم بررسی میکنم ببینم جواب درست میده یا نه!
مرسی مهندس  :تشویق:  :تشویق:

----------


## coronaa

مهندس، من رابطه های خودمو توی برنامه جایگذاری کردم.
لینکی که براتون فرستادم ، رابطه ی دوم باید توی متلب نوشته بشه. من بصورت زیر نوشتم. چند تا جمله ی دیگه هم هست. این جمله رو گیر میده میگه ماتریس باید مربعی باشه. یعنی سایز این ماتریس با ماتریسهای دیگه که با هم جمع و کم میشن یکی نیست.
مشکلش کجاست ؟
http://www.uplooder.net/img/image/47...a6999/zzzz.jpg

 v(k)=sum(a(s(j,:)).*(pi(s(j,:)))^2+b(s(j,:)).*pi(s  (j,:))+c(s(j,:)));
طرز نوشتنش درسته؟(این a با a که قبلن تعریف کردیم فرق میکنه.
a,b,c,pi هر کدام، یک بردار یک در سه هستن.

----------


## coronaa

> مهندس، من رابطه های خودمو توی برنامه جایگذاری کردم.
> لینکی که براتون فرستادم ، رابطه ی دوم باید توی متلب نوشته بشه. من بصورت زیر نوشتم. چند تا جمله ی دیگه هم هست. این جمله رو گیر میده میگه ماتریس باید مربعی باشه. یعنی سایز این ماتریس با ماتریسهای دیگه که با هم جمع و کم میشن یکی نیست.
> مشکلش کجاست ؟
> http://www.uplooder.net/img/image/47...a6999/zzzz.jpg
> 
>  v(k)=sum(a(s(j,:)).*(pi(s(j,:)))^2+b(s(j,:)).*pi(s  (j,:))+c(s(j,:)));
> طرز نوشتنش درسته؟(این a با a که قبلن تعریف کردیم فرق میکنه.
> a,b,c,pi هر کدام، یک بردار یک در سه هستن.


آقا حل شد. ظاهرن!
بردار pi که به توان 2 بود رو ضرب نقطه ای کردم. درسته؟
v(k)=sum(a(s(j,:)).*(pi(s(j,:)).*pi(s(j,:)))+b(s(j  ,:)).*pi(s(j,:))+c(s(j,:)));
حالا فعلن مشکلش اینه که v و فی رو منفی میده (البته با داده های خودم!)
دارم بررسیش میکنم.
تا اینجا خیلی چیزها رو از شما یاد گرفتم. واقعن سپاسگزارم.
مرسی

----------


## rahnema1

ببخشید اون قسمت آخر کد یه اشتباه کوچولو شده لطفا تغییر بدید

k=1;
phi=zeros(1,numel(a));
	for i=1:numel(S)
		for j=size(S{i},1)
			for z=1:numel(a)
				if (ismember(a(z),S{i}(j,:)))
					phi(z)=phi(z)+factorial(numel(S{i}(j,:))-1)* factorial(numel(a) -numel(S{i} (j,:)))* (v(k)-indexV(setdiff( S{i}(j,:) ,a(z)),S,v))/ factorial(numel(a));
					
				end
			end
			k=k+1;
		end
	end
disp(phi)

----------


## coronaa

مهندس میشه به طور مختصر از تابعی که تعریف کردی رو توضیح بدی؟ احتمالن واسه محاسبه ی s-{i} هست!
 همچنین خط 38 برنامه.
ممنونم

----------


## rahnema1

> مهندس میشه به طور مختصر از تابعی که تعریف کردی رو توضیح بدی؟ احتمالن واسه محاسبه ی s-{i} هست!
>  همچنین خط 38 برنامه.
> ممنونم


بله تابع واسه s-{i هست. ا.ن سلول خودش شامل 3 تا زیر مجموعه هست ما تعداد اعضای این زیر مجموعه ها را می شماریم تا برسیم به عنصر مورد نظر و شماره اندکس اون را در میاریم تا بتونیم v با اون اندکس را پیدا کنیم
توی اون حلقه های تودرتوی آخر هم تقریبا همین روند را دنبال می کنیم با این تفاوت که الان ما v ها را داریم

----------


## rahnema1

یه اشتباه دیگه کشف کردم فکر کنم دیگه مشکلی نباشه:)

k=1;
phi=zeros(1,numel(a));
	for i=1:numel(S)
		for j=1:size(S{i},1)
			for z=1:numel(a)
				if (ismember(a(z),S{i}(j,:)))
					phi(z)=phi(z)+factorial(numel(S{i}(j,:))-1)* factorial(numel(a) -numel(S{i} (j,:)))* (v(k)-indexV(setdiff( S{i}(j,:) ,a(z)),S,v))/ factorial(numel(a));
					
				end
			end
			k=k+1;
		end
	end
disp(phi)

----------


## coronaa

چرا فی منفی در میاد؟
همه ی v ها که مثبت هستن!

----------


## rahnema1

> چرا فی منفی در میاد؟
> همه ی v ها که مثبت هستن!


این اصلاح آخری که کردم دیگه با این داده ها منفی نمیشه

----------


## coronaa

> این اصلاح آخری که کردم دیگه با این داده ها منفی نمیشه


بازم منفی میشه!

----------


## rahnema1

با اون x و y که به صورت rand هست چندین و چند بار اجرا کردم یک مورد هم منفی نشد

----------


## rahnema1

گذاشتم داخل فایل زیپ
http://www.sharefile.ir/uploads/1405710370.zip

----------


## coronaa

> با اون x و y که به صورت rand هست چندین و چند بار اجرا کردم یک مورد هم منفی نشد


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

----------


## rahnema1

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


هر سوالی داشتین بپرسید من هم در حد توانم اگه بتونم جواب میدم

----------


## coronaa

اینو میزنم p منفی در میاد :
p=(sum(b./c)+2*Pr)/(2*c/sum(c))-b./(2*c);

اینو میزنم خطا میده :
p=(sum(b.*(1/c))+2*Pr)/(2*c/sum(c))-b.*(1/(2*c));

پیغام :
??? Error using ==> mrdivide
Matrix dimensions must agree.

Error in ==> ProfitCode4 at 47
p=(sum(b.*(1/c))+2*Pr)/(2*c/sum(c))-b.*(1/(2*c));

----------


## rahnema1

الان من نمیدونم c و b , pr چی هستند

----------


## coronaa

> الان من نمیدونم c و b , pr چی هستند


همه ی اینها بردارهای عددی یک در سه هستن.

----------


## rahnema1

Pr که فکر کنم یک عدد باشه
این را امتحان کنید

 Pr=.32;
 c=rand(1,3);
 b=rand(1,3);
 p=(sum(b./c)+2*Pr)./(2*c./sum(c))-b./(2*c)

----------


## coronaa

> Pr که فکر کنم یک عدد باشهاین را امتحان کنید  Pr=.32; c=rand(1,3); b=rand(1,3); p=(sum(b./c)+2*Pr)./(2*c./sum(c))-b./(2*c)


Pr هم یک بردار یک در سه هست!اجرا کردم. p ها مثبت در اومد ولی دوباره Vk مفی در میاد.

----------


## rahnema1

مگه اینجور نمیشه؟ Pr=P1+P2+P3
سه تاP داریم که جمعشون بشه Pr

----------


## coronaa

> مگه اینجور نمیشه؟ Pr=P1+P2+P3
> سه تاP داریم که جمعشون بشه Pr


فکر کنم اینطوری باشه که برای i=1 میشه P1
برای i=2 میشه P2 
برای i=3 میشه P3

----------


## rahnema1

اینکه منفی میاد واسه اینکه شما ضرایب هزینه و سود را واقعی نمیدین به علت اینکه ضرایب هزینه خیلی بالا انتخاب شده این تابع باعث ضرر تولید کننده ها میشه

----------


## coronaa

من این یادم نبود که برای محاسبه ی سود قبل از همکاری از رابطه (1) و (2) استفاده میشه. همه رو از رابطه (9) استفاده کردیم.
حالا چطوری متوجه ش کنم قبل از همکاری رو با این رابطه حساب کن؟

----------


## rahnema1

> من این یادم نبود که برای محاسبه ی سود قبل از همکاری از رابطه (1) و (2) استفاده میشه. همه رو از رابطه (9) استفاده کردیم.
> حالا چطوری متوجه ش کنم قبل از همکاری رو با این رابطه حساب کن؟


اصلا لازم نیست حالیش کنی چونکه در هر دو حال I1 همون I1 میشه و فرقی نمی کنه

----------


## coronaa

> اصلا لازم نیست حالیش کنی چونکه در هر دو حال I1 همون I1 میشه و فرقی نمی کنه


 فرق میکنه!
توی معادله (9) جمله آخر (بتا) اضافه میشه که مخصوص همکاری هست و قبل از همکاری این هزینه وجود نداره.

----------


## rahnema1

درسته. شما درست می گی ف. باید از معادله 1و 2 استفاده بشه د یگه اون nchoosekو غیره لازم نیست

----------


## coronaa

> فرق میکنه!
> توی معادله (9) جمله آخر (بتا) اضافه میشه که مخصوص همکاری هست و قبل از همکاری این هزینه وجود نداره.


مهندس این P بزرگ فعلن مثل قبل باشه. این p کوچیک رو باید الآن درست کنم. مثل همون Vk.
منظور منو متوجه شدین؟

----------


## rahnema1

p کوچیک واسه همکاریه . قبل از همکاری دیگه نه nchoosek لازمه و نه p کوچک.

----------


## coronaa

> p کوچیک واسه همکاریه . قبل از همکاری دیگه نه nchoosek لازمه و نه p کوچک.


خب بعد از همکاری رو چیکار کنم الآن؟ ادامه همون برنامه رو میخوام کامل کنم.

----------


## rahnema1

باید بفهمیم P های بزرگ از کجا میان تا بتونیم اونها را داخل فرمول p کوچک بذاریم. اون جدول A2 هم که روشن شد به درد نمی خوره
دو تا کار میشه کرد:
 یا مساحت زیر منحنی را به دست بیاریم
یا از جدول 3 استفاده کنیم و مثلا مقدار Revenue را تقسیم بر مقادیر Sales price در جدول 2 کنیم. البته دقت کنید در جدول 2 بر حسب kw h هست که باید بر حسب mw h بدست بیاریم

----------


## coronaa

> باید بفهمیم P های بزرگ از کجا میان تا بتونیم اونها را داخل فرمول p کوچک بذاریم. اون جدول A2 هم که روشن شد به درد نمی خوره
> دو تا کار میشه کرد:
>  یا مساحت زیر منحنی را به دست بیاریم
> یا از جدول 3 استفاده کنیم و مثلا مقدار Revenue را تقسیم بر مقادیر Sales price در جدول 2 کنیم. البته دقت کنید در جدول 2 بر حسب kw h هست که باید بر حسب mw h بدست بیاریم


 استادم گفت از جدول A2 ولی با این حال من کاری به P بزرگ ندارم فعلن. در حال حاضر همونا باشن. من الآن فقط میخوام ساختار برنامه نوشته بشه!
قبل از همکاری و بعد از همکاری

----------


## coronaa

مشکل من الآن اینه که نحوه ی محاسبه p کوچیک در برنامه قبلی اشتباهه!

----------


## coronaa

با داده های خودم منفی در میاد که!

----------


## coronaa

یعنی الآن شما میگین p کوچیک باید دارای سه مقدار باشه؟ مثل V محاسبه نمیشه؟

----------


## rahnema1

> یعنی الآن شما میگین p کوچیک باید دارای سه مقدار باشه؟ مثل V محاسبه نمیشه؟


p کوچیک با اندکس i مشخص میشه اما V با اندکس s مشخص میشه

----------


## coronaa

> p کوچیک با اندکس i مشخص میشه اما V با اندکس s مشخص میشه


خب توی رابطه (9) هم وقتی میخواستیم V(1,3) رو بدست بیاریم اندکس i رو یک بار 1 گذاشتیم و یکبار 3
مگه اینطور نبود؟
وقتی میخوایم V(1,3) رو بدست بیاریم باید p1 و p3 رو داشته باشیم. حالا توی جمله ی دوم رابطه (9)  چطوری بگیم که p1 و p3 رو با هم جمع بزن؟

----------


## rahnema1

رابطه 8 و 9 را ببین. اندکس از 1 تا m هست و m هم حداکثر تا 3 میتونه باشه بنابراین p حداکثر 3 عضو خواهد داشت

----------


## coronaa

اینو قبول کردم  حالا وقتی میخوایم V(1,3) رو بدست بیاریم باید p1 و p3 رو داشته باشیم. حالا توی جمله ی دوم رابطه (9) چطوری بگیم که f(p1)و f(p3) رو با هم جمع بزن؟

----------


## coronaa

> اینو قبول کردم  حالا وقتی میخوایم V(1,3) رو بدست بیاریم باید p1 و p3 رو داشته باشیم. حالا توی جمله ی دوم رابطه (9) چطوری بگیم که f(p1)و f(p3) رو با هم جمع بزن؟


حل شد. فهمیدم. 
پس مشکل ما کجاست که جواب درست نمی گیریم؟
یعنی P بزرگ و Pr دقیقن مشخص نیست که چطوری استفاده میشن؟

----------


## rahnema1

توی کد از این عبارت استفاده کردیم

sum(aa(s(j,:)).*(pi(s(j,:)).*pi(s(j,:)))+b(s(j,:))  .*pi(s(j,:))+c(s(j,:)))

 دوباره یه نگاهی به s بینداز
هر کدوم از سطرهای s ترکیبی از اعداد هست مثل 1,3 یا مثلا 2,3
وقتی می گیم 

pi(s(j,:))

یعنی عناصر 1و3 از pi و یا عناصر 2,3 از pi

----------


## rahnema1

> حل شد. فهمیدم. 
> پس مشکل ما کجاست که جواب درست نمی گیریم؟
> یعنی P بزرگ و Pr دقیقن مشخص نیست که چطوری استفاده میشن؟


شاید باید G ها هم در نظر گرفته بشن. طول هر خط انتقال و ظرفیت اونها. همچنین جهت خطوط

----------


## coronaa

یعنی الآن برنامه بغیر از ورودیها، ساختارش هیچ مشکلی نداره؟

و اینکه کار setdiff چیه؟

----------


## rahnema1

> یعنی الآن برنامه بغیر از ورودیها، ساختارش هیچ مشکلی نداره؟
> 
> و اینکه کار setdiff چیه؟


فکر نکنم مشکلی داشته باشه . setdiff هم میاد یک عضو از مجموعه کم می کنه

----------


## coronaa

> فکر نکنم مشکلی داشته باشه . setdiff هم میاد یک عضو از مجموعه کم می کنه


میشه بیشتر توضیح بدی؟
عددهای داخل آرگومان دقیقن چیکار میکنن؟
indexV(setdiff( S{i}(j,:) ,aa(z)),S,v))

----------


## rahnema1

با اون تابع می خوایهم s-i را پیدا کنیم آرگوتنهاش مهم نیست داخلش مهمه
در هر صورت تونستم بخشی از جدول 3 را بازسازی کنم فق نمیدونم تابع هزینه f را چرا درست محاسبه نمی کنه ولی Wheelingcharge و Revenue درست حساب میشه
در مورد pi ها هم حرف شما درست بود. باید 7 تا تولید می شد که این را از مقایسه جدول 13 فهمیدم
http://www.sharefile.ir/uploads/1405863911.zip

----------


## coronaa

> با اون تابع می خوایهم s-i را پیدا کنیم آرگوتنهاش مهم نیست داخلش مهمه


خب من میخوام دقیقن بفهمم چطوری عمل میکنه که موقع ارائه به استادم خودم متوجه باشم چی دارم میگم! :)




> در هر صورت تونستم بخشی از جدول 3 را بازسازی کنم فق نمیدونم تابع هزینه f را چرا درست محاسبه نمی کنه ولی Wheelingcharge و Revenue درست حساب میشه


ظاهرن شما دارین از نتایج به صورت سوال میرسین. درسته؟  ما که از ابتدا Revenue نداریم که شما توی ورودی گذاشتین! یا من بد متوجه شدم؟
 این خط پرانتزش متوازن نبود. خطا میداد :
pi=((sum((b./c)(s(j,:)))+2*Pr)./(2.*c.*sum((1./c)(s(j,:))))-b./(2.*c));
به اینصورت نوشتم. خطا نمیده. درسته اینطوری؟
pi=(sum(b(s(j,:))./c(s(j,:)))+2*Pr)./(2*c(s(j,:))./sum(c(s(j,:))))-b(s(j,:))./(2*c(s(j,:)));

الآن توی این خط خطا میده :
Gene(k)=sum(aa(s(j,:)).*(pi(s(j,:)).^2)+b(s(j,:)).  *pi(s(j,:))+c(s(j,:)));

پیغام :
??? Index exceeds matrix dimensions.

----------


## rahnema1

این جورش درسته

pi=((sum(b(s(j,:))./c(s(j,:)))+2*Pr)./(2.*c.*sum(1./c(s(j,:))))-b./(2.*c));


 (( setdiff( S{i}(j,:) ,aa(z یعنی s-i
و S , v هم که به عنوان آرگومان تابع دادیم دقیقا همون S و v هست که می خواهیم در داخل تابع از اون استفاده کنیم

----------


## rahnema1

> ظاهرن شما دارین از نتایج به صورت سوال میرسین. درسته؟ ما که از ابتدا Revenue نداریم که شما توی ورودی گذاشتین! یا من بد متوجه شدم؟


شما می گی چیکار کنیم P را از کجا بیاریم؟ از مساحت زیر منحنی؟

----------


## coronaa

مرسی. جواب داد. فقط من هنوز نمیدونم برای چی اینو استفاده میکنین!

Revenue=[239657.2 67923.1 22466.4].*1000;
Wheeling=[9077.9 2358.4 739].*1000;
 P=Revenue./ro;

اینا رو که ما از قبل نمیدونیم چنده!؟

----------


## rahnema1

> مرسی. جواب داد. فقط من هنوز نمیدونم برای چی اینو استفاده میکنین!
> 
> Revenue=[239657.2 67923.1 22466.4].*1000;
> Wheeling=[9077.9 2358.4 739].*1000;
>  P=Revenue./ro;
> 
> اینا رو که ما از قبل نمیدونیم چنده!؟


حالا weeling که الکیه ولی P را شما چه راهی پیشنهاد می کنید برای بدست آوردنش؟ هر راهی شما بگید انجام می دیم ( مثل مساحت زیر منحنی یا ...)

----------


## coronaa

الآن با همون P که قبلن من بصورت زمانبندی گذاشتم جواب نمیده؟
اگه نه که بذارید من بیشتر مطالعه کنم تا سر در بیارم!

----------


## coronaa

> الآن با همون P که قبلن من بصورت زمانبندی گذاشتم جواب نمیده؟
> اگه نه که بذارید من بیشتر مطالعه کنم تا سر در بیارم!


تست کردم. جواب نداد!

----------


## coronaa

نتایج نشون میده pi (کوچیک) با توجه به weeling بدست اومده درسته. ولی بقول شما تابع هزینه اشتباه در میآد!

----------


## rahnema1

> نتایج نشون میده pi (کوچیک) با توجه به weeling بدست اومده درسته. ولی بقول شما تابع هزینه اشتباه در میآد!


گفتم که weeling را همین طور گذاشتم در کد تاثیری نداره
 از Revenue استفاده شده

----------


## coronaa

> گفتم که weeling را همین طور گذاشتم در کد تاثیری نداره
>  از Revenue استفاده شده


منظورم اینه :
Weel(k)=sum(omega*pi(s(j,:)));

اینجا weeling درست بدست میاد. پس نشون میده که pi درست محاسبه میشه.
پس الآن فقط میمونه نحوه ی محاسبه ی P (بزرگ) ؟

----------


## rahnema1

P بزرگ فکر کنم باید در ورودی مشخص باشه حالا اگه بتونی به صاحب مقاله یه ایمیل بزن بگو P را چرا در مقاله نذاشتی.

----------


## coronaa

> P بزرگ فکر کنم باید در ورودی مشخص باشه حالا اگه بتونی به صاحب مقاله یه ایمیل بزن بگو P را چرا در مقاله نذاشتی.


اوکی. حالا بیشتر مطالعه میکنم تا متوجه بشم.
ممنونم. کمک خیلی بزرگی کردی.
امشب حتمن براتون دعا میکنم :)  :لبخند:

----------


## coronaa

اگه بخوایم مقدار p1 و p3 رو توی متلب ببینیم چی باید بزنیم؟

----------


## rahnema1

> اگه بخوایم مقدار p1 و p3 رو توی متلب ببینیم چی باید بزنیم؟


pii یک سلوله که داخلش pi ها قرار گرفته
http://www.sharefile.ir/uploads/1405931395.zip


pii =
{
  [1,1] = 1.8156e+004
  [1,2] =  4716.9
  [1,3] =  1478.1
  [1,4] =

    9.8204e+003  1.3052e+004

  [1,5] =

    5.3175e+003  1.4316e+004

  [1,6] =

     2047.5   4147.5

  [1,7] =

    4.8494e+003  6.4454e+003  1.3056e+004

}

----------


## coronaa

این مربوط به مقدار p(1,3) هست 
[1,5] = 
  
    5.3175e+003  1.4316e+004

ولی با محاسبه دستی متفاوته

----------


## rahnema1

> این مربوط به مقدار p(1,3) هست 
> [1,5] = 
>   
>     5.3175e+003  1.4316e+004
> 
> ولی با محاسبه دستی متفاوته


این محاسبه p1

b(1)/c(1) + b(3)/c(3) + 2*(P(1)+P(3)) / (2*c(1)*(1/c(1)+1/c(3))) - b(1)/(2*c(3))

----------


## coronaa

فایلی که برای شما فرستادم رو دیدید؟ بصورت دستی حل کردم. یعنی اشتباه حل کردم؟

----------


## rahnema1

316 که مربوط به c2 میشه

----------


## coronaa

خب این 316 زیاد هم تاثیر نداره. بشتر 420 که زیر کسر قرار میگیره تاثیر دار با Pr 
جوابش زیاد تفاوت نمیکنه

----------


## coronaa

> خب این 316 زیاد هم تاثیر نداره. بشتر 420 که زیر کسر قرار میگیره تاثیر دار با Pr 
> جوابش زیاد تفاوت نمیکنه


مهندس حل شد. اشتباه از من بود.
ببخشید.

----------


## coronaa

مشکل تابع هزینه رو متوجه نشدین که از کجاست؟

----------


## rahnema1

> مشکل تابع هزینه رو متوجه نشدین که از کجاست؟


نه متوجه نشدم شاید از ضرایب a باشه

----------


## coronaa

> نه متوجه نشدم شاید از ضرایب a باشه


 من تازه متوجه شدم جای a و aa رو عوض کردی!
ضرایب a,b,c که همش داخل مقاله هست. دست خودمون که نیست بگیم اشتباه گذاشتیم.

----------


## coronaa

مهندس میشه توضیح بدی که تابع IndexV چطوری عمل میکنه؟ممنونم.

----------


## rahnema1

> مهندس میشه توضیح بدی که تابع IndexV چطوری عمل میکنه؟ممنونم.


در ابتدا اگه مجموعه تهی باشه صفر بر می گردونه
سپس در S می گردیم اگر تعداد اعضای s کمتر از از اون Smimi بود همین طور شمارش می کنیم تا برسیم به جایی که تعداد اعضای S با Smimi برابر باشه با استفاده از ismember عضوی از S که با Smini برابره پیدا کرده با شماره های اندکس قبلی که جمع کرده ایم جمع می کنیم در نتیجه اندکس مورد نظر به دست می آید بعدش هم v متناظر با اون اندکس بدست میاریم

----------


## coronaa

> در ابتدا اگه مجموعه تهی باشه صفر بر می گردونه
> سپس در S می گردیم اگر تعداد اعضای s کمتر از از اون Smimi بود همین طور شمارش می کنیم تا برسیم به جایی که تعداد اعضای S با Smimi برابر باشه با استفاده از ismember عضوی از S که با Smini برابره پیدا کرده با شماره های اندکس قبلی که جمع کرده ایم جمع می کنیم در نتیجه اندکس مورد نظر به دست می آید بعدش هم v متناظر با اون اندکس بدست میاریم


منظور از Smini چیه؟
و rows در این خط چیکار میکنه؟
[val,dx]=ismember(Smini, S{i},'rows');

----------


## rahnema1

> منظور از Smini چیه؟
> و rows در این خط چیکار میکنه؟
> [val,dx]=ismember(Smini, S{i},'rows');


smini همون s-i هست و rows باعث میشه مقایسه به جای اینکه عنصر به عنصر باشه، سطر به سطر باشه

----------


## coronaa

مهندس ببخشید که من هی سوال می پرسم.منظور از [val,dx] چیه؟

----------


## rahnema1

> مهندس ببخشید که من هی سوال می پرسم.منظور از [val,dx] چیه؟


val که کاری باهاش نداریم اما dx شماره سطری هست که smini درسلول مورد نظر s پیدا میشه

----------


## coronaa

ret رو بدست میاریم که چی بشه؟
 چرا یه عدد اعشاریه؟
در ضمن، Smini رو که از قبل معرفی نکردی چطوری مساوی صفر قرار دادی؟ توی خط :
if (numel(Smini)==0)

----------


## rahnema1

> ret رو بدست میاریم که چی بشه؟
>  چرا یه عدد اعشاریه؟
> در ضمن، Smini رو که از قبل معرفی نکردی چطوری مساوی صفر قرار دادی؟ توی خط :
> if (numel(Smini)==0)


چرا ما تابع تعریف می کنیم؟
برای اینکه یک کار تکراری که چند بار می خواهید انجام بدیدم یک بار کد اون را بنویسیم و تنها با صدا زدن نام اون و ورد چند تا پارامتر اون کد ( یعنی تابع) را اجرا کنیم
وقتی وسط برنامه این تابع داره صدا زده میشه
indexV(setdiff( S{i}(j,:) ,a(z)),S,v)
سه تا آرگیومنت داره بهت وارد میشه که با کاما جاد شدند. اولین مورد یعنی 
setdiff( S{i}(j,:) ,a(z))
همون Smini هست
دومین و سومین مورد هم اینجا نامهاشون با اسامی وافعی متغیرها یکی قرار داده شده در صورتی که می تونستیم یک اسم دیگه بذاریم مثلا تابع را به این صورت زیر تعریف می کردیم باز هم فرقی نمی کرد

function ret= indexV(Smini,SSS,vvv)
	ret=0;
	if (numel(Smini)==0)
		return;
	end
	for i=1:numel(SSS)
		if(size(SSS{i},2)<numel(Smini))
			ret=ret+size(SSS{i},1);
		else
			[val,dx]=ismember(Smini, SSS{i},'rows');
			ret=ret+dx;
		break;
		end
	
	end
	ret=vvv(ret);
end

واینکه چرا اعشاری هست ما در پایان نوشتیم 
ret=v(ret);
تا قبل از این دستور معنای ret اندکسی از v بود که متناظر بود با s-i 
وقتی که این دستور را زدیم یعنی اون V با این اندکس را استخراج کن و دوباره اون را به جای ret بذار. دراین حالت ret دیگه اندکس نیست بلکه v مورد نظر هست

----------


## coronaa

خدا عمرت بده. همون اول اینطوری توضیح میدادی  :لبخند: 
توضیحت عالی بود. ممنونم.

----------


## coronaa

مهندس میشه بگی هر یک از حلقه ها چیکار میکنن؟
for i=1:numel(S)
		for j=1:size(S{i},1)
			for z=1:numel(n)
				if (ismember(n(z),S{i}(j,:)))
					phi(z)=phi(z)+factorial(numel(S{i}(j,:))-1).* factorial(numel(n) -numel(S{i} (j,:))).* (v(k)-indexV(setdiff( S{i}(j,:) ,n(z)),S,v))./ factorial(numel(n));
				end
			end
			k=k+1;
		end
    end

----------


## rahnema1

ُS یک سلوله با 3 تا خونه که داخل هر خونه هم یک ماتریس قرار داره (اگه چاپ کنی معلوم میشه)
دو تا for اولی واسه پیمایش S هست
for سومی هم واسه پیمایش phi هست چون phi 3 تا خونه داره

----------


## coronaa

این معادلات جواب ندارن یا دستورش اشتباهه؟
h=solve('x1+x2=39815.1','x1+x3=35644.2','x2+x3=124  49.0','x1+x2+x3=53413.2')
h=[h.x1 h.x2 h.x3]

----------


## rahnema1

> این معادلات جواب ندارن یا دستورش اشتباهه؟
> h=solve('x1+x2=39815.1','x1+x3=35644.2','x2+x3=124  49.0','x1+x2+x3=53413.2')
> h=[h.x1 h.x2 h.x3]


میگم می خواهی nucleolus را حساب کنی؟

----------


## coronaa

نه. بخش 3.2 (هسته)
معادلات 15 تا 18

----------


## rahnema1

توی این سایت یه سری فایل زیپ مخصوص تئوری بازی ها در متلب هست که shapely و core و nucleolus و چیزهای مختلف را حساب می کنه دیگه فکر کنم دردسر نداشته باشه
http://webs.uvigo.es/mmiras/TUGlab

----------


## coronaa

> توی این سایت یه سری فایل زیپ مخصوص تئوری بازی ها در متلب هست که shapely و core و nucleolus و چیزهای مختلف را حساب می کنه دیگه فکر کنم دردسر نداشته باشه
> http://webs.uvigo.es/mmiras/TUGlab


ممنونم. این خیلی عالیه
phi رو با مقداری که خودمون بدست آوریم تست کردم. درست جواب داد. ولی سر هم کردنش سخته.
 بعضی فایلهاش اسپانیاییه. ولی راهنمای اصلیش انگلیسیه. فعلن دارم کار میکنم.
مرسی

----------


## coronaa

مهندس این برای قسمت nucleolus خطا میده بصورت زیر :
??? Undefined function or method 'colmmd' for input arguments of
type 'double'.
مفهومش چیه؟ یعنی فانکشن colmmd رو نمیشناسه؟ توی اسکریپتاش پیداش نکردم!

----------


## rahnema1

> مهندس این برای قسمت nucleolus خطا میده بصورت زیر :
> ??? Undefined function or method 'colmmd' for input arguments of
> type 'double'.
> مفهومش چیه؟ یعنی فانکشن colmmd رو نمیشناسه؟ توی اسکریپتاش پیداش نکردم!


این یک دستور در نسخه های قدیمی متلب هست ( توی یک سایت توضیح داده بود) این را بذاری درست میشه
colmmd=@(xxx) colamd(xxx);

----------


## coronaa

کجای برنامه باید بذارم؟

----------


## coronaa

> کجای برنامه باید بذارم؟


آقا حل شد. ممنونم.

----------


## coronaa

چطوری یه دستوری که معرفی نشده رو باید معرفی کرد مثل همین؟
قبلنم چند بار انجام داده بودی!

----------


## rahnema1

یک روش ساده همین روشی هست که گذاشتم اینجا xxx یعنی پارامتر ورودی تابع. ممکنه تابع چند تا ورودی داشته باشه که ما هم می تونیم چند تا بدیم مثل xxx,yyy
یک روش دیگه اینه که ما یک تابع بنویسیم با نام جدید و داخل اون از تابع استفاده کنیم

function ret=colmmd(xxx)
	ret=colamd(xxx);
end

function [a,b]=tabejadia(x,y)
	[a,b]=tabeghadim(x,y);
end

----------


## coronaa

آقای من هنوز توی محاسبه تابع هزینه مشکلم بر طرف نشد. گفته بودی که شاید ضرایب a مشکل داشته باشه. بررسی کردم دیدم زیاد فرقی نمیکنه . چون اعداد خیلی کوچیکی هستن.
خروجی pi ها رو که دیدم، دیدم p1,p2,p3 با P1,P2,P3 (بزرگ) برابرند!
راه حلی ندارین؟ کد مشکل نداره؟

----------


## rahnema1

p های کوچیک و بزرگ که باید باهم برابرا باشند. توی مقاله جدول 3 هم نگاه کنید برابرند
مشکل ما این بود که اولا P را نداده بود و ثانیا شاید ضرایب a مشکل داشته باشه از اون فایل ورد که واسه محاسبات بود چیزی دستتون نیومد؟

----------


## coronaa

نه متاسفانه. توی اون هم با محاسبات لاندا و اینا کار داره!
ضرایب a مشکلی نداره.
میگید که p بزرگ و کوچیک باید با هم برابر باشند، فقط برای سه تای اول دیگه!؟ چون بعد از ائتلاف دیگه pi ها متفاوت میشه. ضمن اینکه ما فقط سه تا مقدار برای P بزرگ داریم ولی 7 مقدار برای pi ها.

----------


## rahnema1

آره واسه همون سه تای اولی

----------


## coronaa

این تابع هزینه ای که از برنامه بدست میآد خیلی بزرگه که سود پایین میآد. تابع هزینه رو چطوری میشه بهینه کرد؟ برنامه ای وجود داره واسه optimization؟

----------


## rahnema1

> این تابع هزینه ای که از برنامه بدست میآد خیلی بزرگه که سود پایین میآد. تابع هزینه رو چطوری میشه بهینه کرد؟ برنامه ای وجود داره واسه optimization؟


مشکل اینه که ما ورودی درست نداریم حالا اگه تابع را هم بخواهیم بهینه کنیم فکر کنم صورت مساله پاک می شه

----------


## coronaa

کدوم ورودیهامون درست نیس؟ همه درسته دیگه!

----------


## rahnema1

> کدوم ورودیهامون درست نیس؟ همه درسته دیگه!


یا P ها درست نیست یا abc چون اینها را داخل فرمول ساده aP2+bP+c میذاریم جواب درست در نمیاد

----------


## coronaa

> یا P ها درست نیست یا abc چون اینها را داخل فرمول ساده aP2+bP+c میذاریم جواب درست در نمیاد


برای P که همون مقدار جدول رو قرار میدیم که! (همون تقسیم Revenue بر ro). در ضمن برای تابع هزینه که از pi (کوچیک) استفاده میشه!
اگه واقعن این piها رو اشتباه بدست میاریم پس چرا weel درست بدست میاد؟
نمیشه در جدول (3) ، از سطر سوم به بعد pi رو مجهول قرار داد تا ببینیم مقدارش چنده؟

----------


## rahnema1

> برای P که همون مقدار جدول رو قرار میدیم که! (همون تقسیم Revenue بر ro). در ضمن برای تابع هزینه که از pi (کوچیک) استفاده میشه!
> اگه واقعن این piها رو اشتباه بدست میاریم پس چرا weel درست بدست میاد؟
> نمیشه در جدول (3) ، از سطر سوم به بعد pi رو مجهول قرار داد تا ببینیم مقدارش چنده؟


اون سه تای اولی درست به دست بیاد بقیه اش صدقه سرمون . abc غلطه

----------


## coronaa

الآن به من بگو pi سه تای اولی ممکنه اشتباه بدست اومده باشه؟ اگه درست باشه که یعنی پارامترهای b,c درست هستن.
میمونه a که من یه بار  توی تابع هزینه بجای p پارامتر a رو مجهول قرار دادم بعد دوباره با a جدید اجرا کردم دیدم باز نتایج اشتباهه!
بعد مقاله ای که توی این ژورنال با پابلیشر Elsevier چاپ شده میشه اشتباه داشته باشه؟

----------


## rahnema1

> الآن به من بگو pi سه تای اولی ممکنه اشتباه بدست اومده باشه؟ اگه درست باشه که یعنی پارامترهای b,c درست هستن.
> میمونه a که من یه بار  توی تابع هزینه بجای p پارامتر a رو مجهول قرار دادم بعد دوباره با a جدید اجرا کردم دیدم باز نتایج اشتباهه!
> بعد مقاله ای که توی این ژورنال با پابلیشر Elsevier چاپ شده میشه اشتباه داشته باشه؟


Elsevier که وحی منزل نیست اون مقاله قبلی که در مورد otsu بود مگه مشکل نداشت؟
این راببین اصلا b و c ساده میشن
http://www.sharefile.ir/uploads/1406323933.png

----------


## coronaa

این اثباتی که نشون دادی خیلی خوب بود. مرسی. وقتی خروجی pii رو توی برنامه هم می بینیم، مشاهده میشه که دقیقن همون Revenue تقسیم بر ro هست. (فقط برای سه تای اول اینطوریه)
کدوم مقاله رو میگی؟

----------


## rahnema1

> این اثباتی که نشون دادی خیلی خوب بود. مرسی. وقتی خروجی pii رو توی برنامه هم می بینیم، مشاهده میشه که دقیقن همون Revenue تقسیم بر ro هست. (فقط برای سه تای اول اینطوریه)
> کدوم مقاله رو میگی؟


مگه همون مقاله که در مورد تشخیص حرکت لب بود شما نفرستادی ؟

----------


## coronaa

> مگه همون مقاله که در مورد تشخیص حرکت لب بود شما نفرستادی ؟


نه من نفرستادم!
پس شما الآن میگین ممکنه a,b,c اشتباه باشه؟
P که از روی Revenue/ro بدست اومد دیگه اشتباه نیست دیگه؟

----------


## rahnema1

> نه من نفرستادم!
> پس شما الآن میگین ممکنه a,b,c اشتباه باشه؟
> P که از روی Revenue/ro بدست اومد دیگه اشتباه نیست دیگه؟


P که از روی revenu بدست اومده  که مقادیر موجود در جدول گرد شده به خاطر همین نتایجی که ما در متلب به دست میاریم مخصوصا ردیف آخر مقداری با ردیف آخر جدول متفاوته

----------


## coronaa

سلام مهندس میشه ضرایب a,b,c رو توی تابع a*p^2+b*p+c=100 با برنامه خاصی بدست آورد؟ اگه p رو داشته باشیم!

----------


## coronaa

من در جدول (3)، برای تابع هزینه a رو مجهول قرار میدم ، a رو بدست میارم ولی با a=[.0009 .0022 .0024] متفاوته!
اینا بدست میاد :
a=[.005534   .00118279    .000008]
عجیب نیست؟

----------


## rahnema1

من فرض گرفتم b,c درست باشن. پس تصمیم گرفتم a ها را به دست بیارم که این شد نتیجه ولی نمیشه
http://www.sharefile.ir/uploads/1406517119.zip
ولی از نتیجه دوباره به abc برسیم و دوباره اونها را بذاریم تا نتیجه بدست بیاد چه فایده داره؟

----------


## coronaa

> من فرض گرفتم b,c درست باشن. پس تصمیم گرفتم a ها را به دست بیارم که این شد نتیجه ولی نمیشه
> http://www.sharefile.ir/uploads/1406517119.zip
> ولی از نتیجه دوباره به abc برسیم و دوباره اونها را بذاریم تا نتیجه بدست بیاد چه فایده داره؟


sqp چیه ؟
??? Undefined function or method 'sqp' for input arguments of type
'function_handle'.

سوال : در جدول (3) در هر سطر، چرا مقدار p که از Revenue بدست میاد با مقدار p که از تابع هزینه بدست میاد یکی نیست؟ مگه نگفتیم توی سه تای اولی P,p با هم برابرند؟

----------


## rahnema1

> sqp چیه ؟
> ??? Undefined function or method 'sqp' for input arguments of type
> 'function_handle'.
> 
> سوال : در جدول (3) در هر سطر، چرا مقدار p که از Revenue بدست میاد با مقدار p که از تابع هزینه بدست میاد یکی نیست؟ مگه نگفتیم توی سه تای اولی P,p با هم برابرند؟


توی برنامه خط آخر را با این عوض کن

[x,fval]=fminsearch (@pppz,[.0009 .0022 .0024]')

مقدار P به دست میاد از Rev نه p

----------


## coronaa

> توی برنامه خط آخر را با این عوض کن
> 
> [x,fval]=fminsearch (@pppz,[.0009 .0022 .0024]')
> 
> مقدار P به دست میاد از Rev نه p


خب این منظورش الآن چیه ؟
x =

    0.5974
    1.2274
    1.0865


fval =

  4.9029e+003
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــ
خب توی سه سطر اول که مقدار P بزرگ و p کوچیک که باید شبیه هم باشه! فرقی نمیکنه!

----------


## rahnema1

خب این x ها همون سه مقدار a هست که اشتباهه
با نفهمیدم این کار چه فایده ای داره

----------


## coronaa

> خب این x ها همون سه مقدار a هست که اشتباهه
> با نفهمیدم این کار چه فایده ای داره


من که دقیقن توی برنامه متوجه نشدم که چیکار کردی ولی من هدفم این بود که با مقدار p بدست آمده از revenue که مسلماً باید با p تابع هزینه برابر باشه، بتونیم ضریب a رو بدست بیاریم ببینیم همونی هست که توی مقاله داده یا نه!
نظرت در مورد حرفی که زدم چیه؟ :
توی سه سطر اول که مقدار P بزرگ و p کوچیک که باید شبیه هم باشه! فرقی نمیکنه!

----------


## rahnema1

> من که دقیقن توی برنامه متوجه نشدم که چیکار کردی ولی من هدفم این بود که با مقدار p بدست آمده از revenue که مسلماً باید با p تابع هزینه برابر باشه، بتونیم ضریب a رو بدست بیاریم ببینیم همونی هست که توی مقاله داده یا نه!
> نظرت در مورد حرفی که زدم چیه؟ :
> توی سه سطر اول که مقدار P بزرگ و p کوچیک که باید شبیه هم باشه! فرقی نمیکنه!


در سه تای اولی p با P برابره

----------


## coronaa

> در سه تای اولی p با P برابره


پس با بدست آوردن p از revenue و قرار دادن اون در تابع هزینه و مجهول قرار دادن a میشه مقدار صحیح a رو بدست آورد؟
این برنامه هم همینکارو میکنه؟

----------


## rahnema1

بله مثلا می خواهیم این کار را بکنیم ولی اصولا چه فایده ای داره از جواب به سوال برسیم تا دو باره به جواب برسیم؟ یعنی چی آخه؟!

----------


## coronaa

> بله مثلا می خواهیم این کار را بکنیم ولی اصولا چه فایده ای داره از جواب به سوال برسیم تا دو باره به جواب برسیم؟ یعنی چی آخه؟!


خب بالا گفتم دیگه. میخواستم ببینم همون مقدار a بدست میاد که توی مقاله هست یا خیر که دیدیم اشتباهه. ینی نمیتونیم نتیجه بگیریم که مقدار a داخل مقاله اشتباهه؟ من اینو میخواستم بفهمم!

----------


## rahnema1

> خب بالا گفتم دیگه. میخواستم ببینم همون مقدار a بدست میاد که توی مقاله هست یا خیر که دیدیم اشتباهه. ینی نمیتونیم نتیجه بگیریم که مقدار a داخل مقاله اشتباهه؟ من اینو میخواستم بفهمم!


فکر می کنم وارد یک دور تسلسل باطل شدیم
ببین الان 9 تا مجهول ( a,b,c هر کدوم 3 تا) داریم و تعداد معلوماتمون کمه. به کجا می خواهیم برسیم؟

----------


## coronaa

من اصلن کاری به سطر دوم و سوم ندارم. فعلن میخوام همون I1 رو بررسی کنم تا ببینم مشکل من کجاست که تابع هزینه درست بدست نمیاد!
گفتیم توی این سطر باید P(بزرگ) و p(کوچیک) با هم برابر باشند که نیستن. این از مشکل اول!
چون P که از revenue بدست میاد با p که از تابع هزینه بدست میاد باید یکی باشه که نیست.
حالا اگه فرض کنیم ضریب a اشتباه هست، اگه pرو از روی revenue بدست بیاریم و بذاریم توی تابع هزینه و a رو بدست بیاریم باید مقدار صحیح a  بدست بیاد.
با این تسلسل دیگه خودمم دارم دیوونه میشم!

----------


## rahnema1

> من در جدول (3)، برای تابع هزینه a رو مجهول قرار میدم ، a رو بدست میارم ولی با a=[.0009 .0022 .0024] متفاوته!
> اینا بدست میاد :
> a=[.005534   .00118279    .000008]
> عجیب نیست؟


میشه بگید چه طور این کار را کردید؟ (کد متلب)

----------


## coronaa

> میشه بگید چه طور این کار را کردید؟ (کد متلب)


اون اشتباهه. این مقدار درسته :
a=[.000607        .000172          .000553]

کد :
a1=solve('1.8156*1.8156*10e8*a+1.8156*10e5+420=200  581*10e3')
a2=solve('1.8156*1.8156*10e8*a+1.8156*10e5+316=571  48.9*10e3')
a3=solve('1.8156*1.8156*10e8*a+1.8156*10e5+156=184  40*10e3')

----------


## coronaa

> اون اشتباهه. این مقدار درسته :
> a=[.000607        .000172          .000553]
> 
> کد :
> a1=solve('1.8156*1.8156*10e8*a+1.8156*10e5+420=200  581*10e3')
> a2=solve('1.8156*1.8156*10e8*a+1.8156*10e5+316=571  48.9*10e3')
> a3=solve('1.8156*1.8156*10e8*a+1.8156*10e5+156=184  40*10e3')


آخ اشتباه شدم!

----------


## rahnema1

به نظر می رسه شما b  و c را درست فرض کردی و با استفاده از اونها a را به دست آوردی در صورتی که b و c هم خودشون مشکل دارن

----------


## coronaa

من اینو بدست آوردم :
a=[.6079            2.5663    8.4345]

----------


## coronaa

این خط از برنامه چیکار میکنه؟
[x,fval]=fminsearch (@pppz,[.0009 .0022 .0024]') 
و دستور fminsearch چیه؟

----------


## rahnema1

> این خط از برنامه چیکار میکنه؟
> [x,fval]=fminsearch (@pppz,[.0009 .0022 .0024]') 
> و دستور fminsearch چیه؟


من هم فرض کردم b و c درسته اما اشتباهه
این دستور برای پیدا کردن مینیمم یک تابع به کار میره
تابع مورد نظری که باید مینیمم اون بدست بیاد در واقع مقدار تابع هزینه ای که از محاسبات بدست اومده با مقدار واقعی را تفاضل به دست میاریو به توان 2 می رسونیم و با هم جمع می کنیم 
ولی همون طور که گفتم 9 تا مجهول داریم این طور نمیشه

----------


## coronaa

منحنی سطح زیر نمودار رو چطوری میشه بدست آورد؟
حالا هر نموداری باشه. فقط میخوام یاد بگیرم.

----------


## rahnema1

اگه نمودار به صورت عکس باشه، عکس را می بری داخل یه نرم افزار مثل paint یا فوتوشاپ. قسمتهای زیر منحنی را مثلا قرمز می کنی و بقیه را یک رنگ دیگه
بعد توی متلب یا هر جای دیگه هیستوگرام عکس را به دست میاری. تعداد پیکسلهای قرمز برابر خواهد بود با مساحت زیر منحنی . البته فراموش نکنید که ابعاد پیکسل را حتما در یک ضریب ضرب کنید تا به اندازه واحد محورهای منحنی بشه

----------


## coronaa

> اگه نمودار به صورت عکس باشه، عکس را می بری داخل یه نرم افزار مثل paint یا فوتوشاپ. قسمتهای زیر منحنی را مثلا قرمز می کنی و بقیه را یک رنگ دیگه
> بعد توی متلب یا هر جای دیگه هیستوگرام عکس را به دست میاری. تعداد پیکسلهای قرمز برابر خواهد بود با مساحت زیر منحنی . البته فراموش نکنید که ابعاد پیکسل را حتما در یک ضریب ضرب کنید تا به اندازه واحد محورهای منحنی بشه


 پردازش تصویر کار نکردم.  تعداد پیکسل عکس چطوری بدست میاد؟
دستورش چیه؟

----------


## rahnema1

این یک نمونه برنامه
ضریب طول و عرض هم میاد مقیاس عکس را با نمودار متناسب می کنه
http://www.sharefile.ir/uploads/1406847690.zip

----------


## coronaa

> این یک نمونه برنامه
> ضریب طول و عرض هم میاد مقیاس عکس را با نمودار متناسب می کنه
> http://www.sharefile.ir/uploads/1406847690.zip


ممنونم. عالی بود.
من نمیخواستم فقط برنامه شو داشته باشم. میخواستم یاد بگیرم. الآن من متوجه نشدم  ضریب طول و عرض از کجا اومد؟
این پیکسل رو مشخص میکنه؟
nemoodar2(:,:,1)
چطوری تشخیص میده 1 برای قرمزه یا 2 برای سبز؟
چرا مساحت قسمت های رنگی رو که جدا حساب میکنه بصورت ماتریسی نشون میده؟

----------


## coronaa

میشه یکمی روی این تصویر کار کنیم تا من مقدمات پردازش تصویر هم یاد بگیرم؟
چطوری میشه فهمید از نقطه ی ماکزیمم نمودار اصلی تا محور افقی چند سانتی متر هست؟
یا میشه تشخیص داد معادله ی این نمودار چیه؟

----------


## rahnema1

پردازش تصویر که نمیخواد. توی فوتو شاپ یا یه چیز دیگه مثلا اندازه بگیر چند تا پیکسل از صفر تا 1600 هست بعد 1600 را بخش بر تعداد پیکسل کن
برای طول هم همین طور 24 را تقسیم بر تعداد پیکسل می کنیم به همین سادگی
اون کد یه اشکال داشت

zaribetool=4.3360;
zaribearz=0.063830;

nemoodar2=imread('nemood2.bmp');
masahateghermez=sum(nemoodar2(:,:,1)(:))*zaribetoo  l*zaribearz
masahatesabz=sum(nemoodar2(:,:,2)(:))*zaribetool*z  aribearz
masahateabi=sum(nemoodar2(:,:,3)(:))*zaribetool*za  ribearz
masahatekol=sum(nemoodar2(:))*zaribetool*zaribearz

اولی قرمز دومی سبز و سومی هم آبی

----------


## coronaa

از توی متلب نمیشه تعداد پیکسل عکس رو بدست آورد؟

یه پیغام خطا هم میده :
??? Error: File: nemood2.m Line: 5 Column: 21
()-indexing must appear last in an index expression.

----------


## rahnema1

> از توی متلب نمیشه تعداد پیکسل عکس رو بدست آورد؟


توی متلب نمیدونم

masahateghermez= sum(sum(nemoodar2(:,:,1)))* zaribetool*zaribearz
masahatesabz= sum(sum(nemoodar2(:,:,2)))* zaribetool*zaribearz
masahateabi= sum(sum(nemoodar2(:,:,3)))* zaribetool*zaribearz

----------


## coronaa

> توی متلب نمیدونم
> 
> masahateghermez= sum(sum(nemoodar2(:,:,1)))* zaribetool*zaribearz
> masahatesabz= sum(sum(nemoodar2(:,:,2)))* zaribetool*zaribearz
> masahateabi= sum(sum(nemoodar2(:,:,3)))* zaribetool*zaribearz


شما توی octave جواب میگیری؟
پیغام :
??? Subscript indices must either be real positive integers or
logicals.

Error in ==> nemood2 at 7
masahateghermez= sum(sum(nemoodar2(:,:,1)))* zaribetool*zaribearz

----------


## rahnema1

> شما توی octave جواب میگیری؟
> پیغام :
> ??? Subscript indices must either be real positive integers or
> logicals.
> 
> Error in ==> nemood2 at 7
> masahateghermez= sum(sum(nemoodar2(:,:,1)))* zaribetool*zaribearz


توی اکتاو که من کار می کنم یک ماتریس سه بعدی دارم که می خوام مجموع مقادیر موجود در هر بعدش را بدست بیارم. توی اکتاو اینجور میشه باید متلب هم همین طور باشه

----------


## coronaa

این خط خطا میده :
Gene(k)+=sum(aa(s(j,:)).*(pi(s(j,:)).^2)+b(s(j,:))  .*pi(s(j,:))+c(s(j,:)));

پیغام :
??? Error: File: sets10.m  
The expression to the left of the equals sign is not a valid target
for an assignment.
منظورت از += چیه؟

----------


## rahnema1

http://www.sharefile.ir/uploads/1406987744.zip

----------


## coronaa

این خط خطا میده :
 I=imread('nemood3.bmp')(:,:,1);

پیغام :
??? Error: File: sets11.m 
()-indexing must appear last in an index expression.
نمودار3 همون رنگیه هست؟

----------


## rahnema1

به جای اون خط این دو تا را بذار ( متلب شما قدیمیه)

 I=imread('nemood3.bmp');
 I=I(:,:,1);

----------


## coronaa

> به جای اون خط این دو تا را بذار ( متلب شما قدیمیه)
> 
>  I=imread('nemood3.bmp');
>  I=I(:,:,1);


ans =

  431.6148  137.2873   57.2829 -894.5778 -326.6813 -230.8940

??? Subscript indices must either be real positive integers or
logicals.

Error in ==> sets11 at 26
 xha=sum(I);

----------


## rahnema1

ببین متلب شما قدیمیه
دستور sum باید مجموع هر ستون را پیدا کنه

----------


## coronaa

شما میگین I رو جمع بزن. سایز I به این صورته :
ans =

   447   499
درسته؟ اینطوری میتونه جمع بزنه؟

----------


## coronaa

همینطوری یه مثال فرض زدم و ماتریس رو جمع نکرد!
>> w=[1 2 3;4 5 6;7 8 9]

w =

     1     2     3
     4     5     6
     7     8     9

>> sum(w)
??? Index exceeds matrix dimensions.

----------


## rahnema1

hdk vh hljphk ;k
sum(I,1)

----------


## coronaa

> hdk vh hljphk ;k
> sum(I,1)


 باز همون پیغام قبلی رو میده.
nemood3 کدوم عکسه؟ رنگی یا اصلی؟

----------


## coronaa

مثل این فایل انجام میدم ولی نمیشه!http://uplood.ir/41x3

----------


## coronaa

آقا من معذرت میخوام. سیستمم قاطی کرده بود.
متلب رو دوباره بستم و باز کردم درست شد.
ببخشید. 
الآن جواب داد.

----------


## rahnema1

ببخشید تصویر یادم رفته بود
http://www.sharefile.ir/uploads/1406960989.zip

----------


## coronaa

ولی خب برنامه قبلی که جواب بهتری میده.

----------


## coronaa

مهندس یه مشکلی پیش اومد!
این کدی که شما برای فی نوشتین برای هر تعداد ائتلاف جواب میده و این خیلی خوبه. ولی اون برنامه های آماده که از سایت گرفتم فقط برای ائتلاف های 3 تایی و 4 تایی جواب میده.
میشه داخلش رو دستکاری کرد که واسه هر تعداد جواب بده؟

----------


## rahnema1

> مهندس یه مشکلی پیش اومد!
> این کدی که شما برای فی نوشتین برای هر تعداد ائتلاف جواب میده و این خیلی خوبه. ولی اون برنامه های آماده که از سایت گرفتم فقط برای ائتلاف های 3 تایی و 4 تایی جواب میده.
> میشه داخلش رو دستکاری کرد که واسه هر تعداد جواب بده؟


یه نگاهی به کد انداختم
متاسفانه طوری کد را نوشته که فقط به درد همین چند گزینه می خوره یعنی اومده تک تک مقادیر را جدا جدا حساب کرده بدون اینکه بخواد مثلا از حلقه یا تابع و امثال اینها استفاده کنه محاسبه با دست را توی متلب قرار داده
درست کردنش فکر کنم دردسر زیادی داشته باشه ضمن اینکه اصلا توی اکتاو اون nucleolus را اجرا کردم و تعدادی تابع را نمیشناخت و با متلب فرق می کرد

----------


## coronaa

مهندس من یه قسمت برنامه شرطی گذاشتم. میخوام بگم اگه این مقدار بود این عمل انجام بشه وگرنه دوباره سوال بپرس(یعنی بیاد اول برنامه).
باید return بذارم؟ و کجای برنامه باید بذارم؟

----------


## rahnema1

> مهندس من یه قسمت برنامه شرطی گذاشتم. میخوام بگم اگه این مقدار بود این عمل انجام بشه وگرنه دوباره سوال بپرس(یعنی بیاد اول برنامه).
> باید return بذارم؟ و کجای برنامه باید بذارم؟


شما واسه این کار می تونید از حلقه مثل while استفاده کنید

----------


## coronaa

> شما واسه این کار می تونید از حلقه مثل while استفاده کنید


یعنی ifها رو بردارم بجاش while بذارم؟

----------


## rahnema1

> یعنی ifها رو بردارم بجاش while بذارم؟


چون می خواهی بر گردی اول همه کد را داخل while بذار

----------


## coronaa

توی یه برنامه ای برای این عبارت خطا میده. دلیلش چیه؟
[~, n]=log2(N);

روی علامت ~ خطا میده. متلب نمیشناستش؟

----------


## rahnema1

> توی یه برنامه ای برای این عبارت خطا میده. دلیلش چیه؟
> [~, n]=log2(N);
> 
> روی علامت ~ خطا میده. متلب نمیشناستش؟


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

----------


## coronaa

> فکرکنم به خاطر اینه که نسخه متلب شما پایینه. یه ورزن جدیدتر احتنالا درست کار کنه


 بابت اون لینکها ممنونم. راستش همین سوال منم از همون برنامه های سایت بود که خودم قبلن دانلود کرده بودم که چنین مشکلی وجود داره.
 شما قبلن این کد رو برای من نوشته بودید و علامت ~ داشت که بعداً تغییر دادین درست شد. نمیشه اینو هم تغییر داد؟
کد قبلی :
a=rand(70,12);
 
[~,i1,~]=unique(a(:,1:7),'rows');
[~,i2,~]=unique(a(:,8:12),'rows');
i3=intersect(i1,i2);
i4=i3(randperm(35));
 
b=a(i4,1:7);
c=a(i4,8:12);

کد اصلاح شده :
a=rand(70,12);
 
i0=randperm(12);
[ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
[ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);
 
b=a(i5,i0(1:7));
c=a(i5,i0(8:12));
البته جدا از همه ی این کارها، فکر کنم این فانکشن ها هم برای حداکثر 4 بازیکن باشه!

----------


## rahnema1

> بابت اون لینکها ممنونم. راستش همین سوال منم از همون برنامه های سایت بود که خودم قبلن دانلود کرده بودم که چنین مشکلی وجود داره.
>  شما قبلن این کد رو برای من نوشته بودید و علامت ~ داشت که بعداً تغییر دادین درست شد. نمیشه اینو هم تغییر داد؟
> کد قبلی :
> a=rand(70,12);
>  
> [~,i1,~]=unique(a(:,1:7),'rows');
> [~,i2,~]=unique(a(:,8:12),'rows');
> i3=intersect(i1,i2);
> i4=i3(randperm(35));
> ...


مثلا میشه به جای ~ یک متغیر الکی گذاشت
اون کد ها را امتحان نکردم ببینم واسه چند تا هست

----------


## coronaa

مرسی مهندس. فعلن بجای ~ متغیر دیگه ای گذاشتم و خطا نمیده. اونوخت تاثیری در نتیجه نداره؟
یه سوال دیگه :
متلب من تابع narginchk رو نمیشناسه. خودم اگه بخوام معرفیش کنم باید اینطوری بنویسم؟ 
narginchk=@(xxx)  nargoutchk(xxx);

----------


## rahnema1

> مرسی مهندس. فعلن بجای ~ متغیر دیگه ای گذاشتم و خطا نمیده. اونوخت تاثیری در نتیجه نداره؟
> یه سوال دیگه :
> متلب من تابع narginchk رو نمیشناسه. خودم اگه بخوام معرفیش کنم باید اینطوری بنویسم؟ 
> narginchk=@(xxx)  nargoutchk(xxx);


سوال اول: توی نتیجه تاثیر نداره
سوال دوم
این تابعیه که توی سورس اکتاو بود

function narginchk (minargs, maxargs)

  if (nargin != 2)
    print_usage;
  elseif (!isnumeric (minargs) || !isscalar (minargs))
    error ("minargs must be a numeric scalar");
  elseif (!isnumeric (maxargs) || !isscalar (maxargs))
    error ("maxargs must be a numeric scalar");
  elseif (minargs > maxargs)
    error ("minargs cannot be larger than maxargs")
  end

  args = evalin ("caller", "nargin;");

  if (args < minargs)
    error ("not enough input arguments");
  elseif (args > maxargs)
    error ("too many input arguments");
  end

end

----------


## coronaa

> این تابعیه که توی سورس اکتاو بود
> 
> function narginchk (minargs, maxargs)
> 
>   if (nargin != 2)
>     print_usage;
>   elseif (!isnumeric (minargs) || !isscalar (minargs))
>     error ("minargs must be a numeric scalar");
>   elseif (!isnumeric (maxargs) || !isscalar (maxargs))
> ...


بعضی از کاراکترهای اوکتاو با متلب همخونی نداره مثل ! و ...
دستوری که خودم دادم ظاهرن میشناسه ولی الآن توی برنامه 
narginchk(1,5)
داره که خطایی که الآن میده اینه که تعداد آرگومانهای ورودی خیلی زیاده.

----------


## rahnema1

تمام ! ها را با ~ ریپلیس کن

----------


## coronaa

من دارم تابع CorePlot رو بررسی میکنم. میتونی از همون فایل یه نگاه بندازی؟

----------


## rahnema1

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

----------


## coronaa

ممنونم. جایگزین کردم حل شد ولی انقدر توابع ناشناس وجود داره که حالا به یه دستور دیگه گیر میده :)

----------


## coronaa

روی این دستور :
v1(S)=v(S)-tol;
این خطا رو میده :
??? Error using ==> minus
Matrix dimensions must agree.

مهندس فکر کنم همینطوری رفع اشکال کنیم بتونیم جواب بگیریم!

----------


## rahnema1

> روی این دستور :
> v1(S)=v(S)-tol;
> این خطا رو میده :
> ??? Error using ==> minus
> Matrix dimensions must agree.
> 
> مهندس فکر کنم همینطوری رفع اشکال کنیم بتونیم جواب بگیریم!


نمیتونی شما یه سی دی از نسخه جدید متلب گیر بیاری؟

----------


## coronaa

> نمیتونی شما یه سی دی از نسخه جدید متلب گیر بیاری؟


دیگه عصبانی شدی؟   :لبخند:  :لبخند: من نسخه 2013 متلب رو دارم. اول اینکه سیستم من نمیکشه و دوم اینکه من همون کدهایی که   گرفته بودم که اینجا یه سری توابع رو نمیشناخت روی سیستم دوستم که 2012 داشت هم تست کردم ولی نمیشناخت!برای من 2009 هست.

----------


## coronaa

حل شد .....................................

----------


## rahnema1

> دیگه عصبانی شدی؟  
> من نسخه 2013 متلب رو دارم. اول اینکه سیستم من نمیکشه و دوم اینکه من همون کدهایی که از TUGlab گرفته بودم که اینجا یه سری توابع رو نمیشناخت روی سیستم دوستم که 2012 داشت هم تست کردم ولی نمیشناخت!
> برای من 2009 هست.
> من یه سوال دارم.
> اون معادلات مقاله رو نمیشه نوشت؟ سخته؟


آخه مساله اینه که TUGlab  برای متلبهای خیلی قدیمیه ولی اون جدیده برای متلبهای جدید هستش!!
معادلات را میشه نوشت احتیاج هست که مطالعه کنیم چند و چون کار را بفهمیم اگه کار بدون مطالعه پیش بره یه وقت وسط کار می فهمیم که داشتیم اشتباه می رفتیم

----------


## rahnema1

> من یه بردار
> p=[10 20 40 55 60 70 100]
> دارم که میخوام اعداد زیر نصف بزرگترین عدد رو در یک گروه و بزرگتر از نصف بزرگترین عدد رو در گروه دیگه قرار بدم. کدش رو نوشتم ولی بلد نیستم هر گروه رو در یک ماتریس قرار بدم. چطوریه؟
> 
> بعد از این برنامه، حالا اگه بخوام با فازی این مقادیر رو گروهبندی کنم چطوریه؟



mx=max(p)/2;
g1=p(p<=mx);
g2=p(p >mx);


گروهبندی فازی واسه چی؟

----------


## coronaa

> آخه مساله اینه که TUGlab  برای متلبهای خیلی قدیمیه ولی اون جدیده برای متلبهای جدید هستش!!
> معادلات را میشه نوشت احتیاج هست که مطالعه کنیم چند و چون کار را بفهمیم اگه کار بدون مطالعه پیش بره یه وقت وسط کار می فهمیم که داشتیم اشتباه می رفتیم


خب یکی از دلایلی هم که من سراغ این کدها کمتر رفتم این بود که احتمال دادم اینها هم برای حداکثر 4 تا بازیکن باشه. اگه واقعن برای n بازیکن هست خب یه سیستم گیر میارم که متلب جدید نصب باشه! این کدها برای n بازیکن هست؟
در مورد جمله ی دوم هم حق با شماست، بدون مطالعه نمیشه برای معادلات کد نویسی کرد. یعنی الآن شما دارید مطالعه می کنید؟

----------


## coronaa

> mx=max(p)/2;
> g1=p(p<=mx);
> g2=p(p >mx);


مرسی. عالی بود.
حالا توی کدی که من نوشتم چطوری میشه هر گروه رو در یک ماتریس قرار داد. یا بطور کلی در یک حلقه for که چندتا مقادیر از یک معادله بدست میاد چطوری میشه بصورت برداری نشون داد؟




> [VB] 
> گروهبندی فازی واسه چی؟


خب میخوام در محدوده ی 50 درصد بصورت قطعی تفکیک نکنه و مثلاً در رنج بین 45 تا 55 درصد تصمیم گیری بصورت فازی باشه!
میشه با روشهای FCM یا روش های طبقه بندی دیگه این کار رو انجام داد، با توجه به تعداد کم داده؟
حتماً باید داده ی آموزش داشته باشیم برای FCM؟
اولویت اصلی من با فازی هست. میشه انجام داد؟

----------


## rahnema1

> این کدها برای n بازیکن هست؟


بله بر اساس pdf راهنمای برنامه تا 52 بازیکن (حداکثر ظرفیت متلب) ساپورت میکنه




> . یعنی الآن شما دارید مطالعه می کنید؟


کلا مطالعه چیز خوبیه

----------


## rahnema1

> مرسی. عالی بود.
> حالا توی کدی که من نوشتم چطوری میشه هر گروه رو در یک ماتریس قرار داد. یا بطور کلی در یک حلقه for که چندتا مقادیر از یک معادله بدست میاد چطوری میشه بصورت برداری نشون داد؟
> 
> 
> 
> خب میخوام در محدوده ی 50 درصد بصورت قطعی تفکیک نکنه و مثلاً در رنج بین 45 تا 55 درصد تصمیم گیری بصورت فازی باشه!
> میشه با روشهای FCM یا روش های طبقه بندی دیگه این کار رو انجام داد، با توجه به تعداد کم داده؟
> حتماً باید داده ی آموزش داشته باشیم برای FCM؟
> اولویت اصلی من با فازی هست. میشه انجام داد؟


فکر کنم fcm نیاز نباشه. تولباکس فازی داریم تو متلب که به صورت گرافیکی میشه انجام داد

----------


## coronaa

> بله بر اساس pdf راهنمای برنامه تا 52 بازیکن (حداکثر ظرفیت متلب) ساپورت میکنه
> کلا مطالعه چیز خوبیه


اگه اینطوری باشه که خیلی جلو میافتم!
روی چه نسخه ای از متلب کار میکنه؟
2012 کار میکنه؟

----------


## coronaa

> فکر کنم fcm نیاز نباشه. تولباکس فازی داریم تو متلب که به صورت گرافیکی میشه انجام داد


با تولباکس انجام دادم ولی توابع عضویتی که انتخاب کردم طوری در اومد که خروجی نامطلوب میده. تغییرات هم که میدم خروجی NaN میده.
میخواستم با کد بنویسم که بهتر جواب بگیرم.

----------


## rahnema1

> اگه اینطوری باشه که خیلی جلو میافتم!
> روی چه نسخه ای از متلب کار میکنه؟
> 2012 کار میکنه؟


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

----------


## coronaa

من میخوام فقط از فازی استفاده کنم که نیازی به دیتاست نباشه.

----------


## coronaa

داخل اون فولدری که کدهای آماده داره چندتا بخش داره. من باید با از توابع این فولدر استفاده کنم؟
بقیه واسه چیه؟

----------


## rahnema1

> مهندس کد فازی آماده نداری که من بتونم باهاش کار کنم؟
> سرچ کردم ولی معمولن بری طبقه بندی اعداد از فازی ترکیبی استفاده شده مثل ANFIS که اون هم باید داده های آموزش وجود داشته باشه!
> من میخوام فقط از فازی استفاده کنم که نیازی به دیتاست نباشه.


بالاخره برام مشخص نشد چرا میخواهید این کار بکنید

----------


## rahnema1

> داخل اون فولدری که کدهای آماده داره چندتا بخش داره. من باید با از توابع این فولدر استفاده کنم؟
> بقیه واسه چیه؟
> mat_tugames


طریق نصب در فایل readme گفته
To install the MatTuGames Toolbox, unzip the zip-file mat_tugV0d4.zip, 
and place the folder containing the functions on a local hard drive or 
a network drive accessible to your computer. In the next step rename 
the folder mat_tugV0d4 to mat_tug before including the folder location 
in the MATLAB path. To set the MATLAB path, start MATLAB and then
select the File/Set Path menu item. Then select Add Folder. Use the 
navigation window to select the folder containing the functions. Click 
OK and then click Save. The functions will then be ready for use within
MATLAB.

----------


## coronaa

> بالاخره برام مشخص نشد چرا میخواهید این کار بکنید


خب میخوام کلاس بندی کنم دیگه!

----------


## coronaa

> طریق نصب در فایل readme گفته
> To install the MatTuGames Toolbox, unzip the zip-file mat_tugV0d4.zip, 
> and place the folder containing the functions on a local hard drive or 
> a network drive accessible to your computer. In the next step rename 
> the folder mat_tugV0d4 to mat_tug before including the folder location 
> in the MATLAB path. To set the MATLAB path, start MATLAB and then
> select the File/Set Path menu item. Then select Add Folder. Use the 
> navigation window to select the folder containing the functions. Click 
> OK and then click Save. The functions will then be ready for use within
> MATLAB.


راهنماش رو خونده بودم ولی همه جاش رو متوجه نشده بودم. من فقط مسیر فولدر mat_tugames رو به متلب معرفی کردم و بقیه فولدرها رو کار نداشتم. 
الآن این میگه اسم فولدر اصلی mat_tugV0d4 رو به mat_tug تغییر بدم بعد در مسیر متلب قرار بدم؟

----------


## coronaa

آقای مهندس، من متلب 2013 رو روی یه سیستم دیگه نصب کردم و ظاهرن به همه ی فانکشن ها گیر نمیده. فقط بعضی از دستورات رو نمیشناسه.
دستور زیر رو اجرا کردم که یه خطایی داد :
crv=CoreVertices(bv,'float')
خطا :
Undefined function 'cddmex' for input arguments of type 'struct'.

Error in CddCoreQ (line 40)
کد برنامه این بوده :
IN=struct('obj',objective,'A',A1,'B',B1);
OUT = cddmex('solve_lp_DS',IN);
cddmex رو نمیشناسه یا آرگومانی که استفاده کرده؟

----------


## coronaa

xxxxxxxxxxx
یه سوال پرسیده بودم که حل شد  :لبخند:

----------


## rahnema1

> خب میخوام کلاس بندی کنم دیگه!
> یه سری اعداد، توی دو گروه قرار بگیرن. مثل همون برنامه ی چند پست قبل ولی بصورت فازی.
> مثلن انگار 20 تا دانشجو داری که رنج نمرات اونها بین صفر تا 100 هست. حالا میخوایم با فازی مشخص کنیم که اونهایی که زیر 50 هستن گروه 1 و اونهایی که بالای 50 هستن گروه 2 قرار بگیرن. فقط با این تفاوت که فازی میتونه نمره 48 یا 49 رو هم توی گروه 2 قرار بده تا مثلن مردود نشدن!
> منظورم رو فهمیدین؟


توی اکتاو میشه اینجور نوشت. نمیدونم منظورتون همینه یا نه

p=1:100;
a = newfis ('sefroyek', 'sugeno', ...
            'algebraic_product', 'algebraic_sum', ...
            'min', 'max', 'wtaver');
a = addvar (a, 'input', 'P', [min(p) max(p)]);
a = addmf (a, 'input', 1, 'Low', 'trapmf', [min(p)-1 min(p) range(p)*0.45+min(p) range(p)*0.55+min(p)]);
a = addmf (a, 'input', 1, 'High', 'trapmf', [range(p)*0.45+min(p) range(p)*0.55+min(p) max(p) max(p)+1]);
a = addvar (a, 'output', 'sefroyek', [0 1]);
a = addmf (a, 'output', 1, 'Low', 'constant', 0);
a = addmf (a, 'output', 1, 'High', 'constant',1);
a = addrule (a, [1 1 1 1;2 2 1 1]);
evalfis([48],a);

----------


## rahnema1

> آقای مهندس، من متلب 2013 رو روی یه سیستم دیگه نصب کردم و ظاهرن به همه ی فانکشن ها گیر نمیده. فقط بعضی از دستورات رو نمیشناسه.
> دستور زیر رو اجرا کردم که یه خطایی داد :
> crv=CoreVertices(bv,'float')
> خطا :
> Undefined function 'cddmex' for input arguments of type 'struct'.
> 
> Error in CddCoreQ (line 40)
> کد برنامه این بوده :
> IN=struct('obj',objective,'A',A1,'B',B1);
> ...


توی فایل readme یه چیزهایی در باره نصب cdd به همراه لینک اون گذاشته

----------


## coronaa

مرسی. این پیغام رو میداد :
Warning: Implication method should be "prod" for Sugeno systems. 
> In evalfis at 54
  In rahnemaFuzzy at 13
AND function 'algebraic_product' does not exist!
??? Error using ==> evalfismex
Exiting ...

Error in ==> evalfis at 84
[output,IRR,ORR,ARR] = evalfismex(input, fis, numofpoints);

Error in ==> rahnemaFuzzy at 13
evalfis([48],a)
که من به صورت زیر تغییر دادم درست شد :
a = newfis ('sefroyek', 'sugeno', ... 
            'min', 'max', ... 
            'min', 'max', 'wtaver');
توی Help متلب به این صورت بود :
        Name = newsys
        Type = mamdani
        NumInputs = 0
        InLabels =
        NumOutputs = 0
        OutLabels =
        NumRules   0
        AndMethod   min
        OrMethod   max
        ImpMethod   min
        AggMethod   max
        DefuzzMethod   centroid
ولی فعلاً جواب دقیق نمیده :
evalfis([48 50],a)
جواب :
ans =

    0.2475
    0.4495
--------------------------------------
مهندس میشه شکل های توابع عضویت رو نشون بدی ببینیم چطوریه؟

----------


## coronaa

> توی فایل readme یه چیزهایی در باره نصب cdd به همراه لینک اون گذاشته


مهندس شرمنده!
این لینک هایی که توی ReadMe گذاشته رو من دانلود میکنم فایل هاشو، ولی اصلاً متوجه نمیشم که کدوم رو باید کجا قرار بدم!
میشه یه کمکی بکنی؟

----------


## rahnema1

> مهندس شرمنده!
> این لینک هایی که توی ReadMe گذاشته رو من دانلود میکنم فایل هاشو، ولی اصلاً متوجه نمیشم که کدوم رو باید کجا قرار بدم!
> میشه یه کمکی بکنی؟
> http://control.ee.ethz.ch/~hybrid/cdd.php
> http://cs.mcgill.ca/~fukuda/download/cdd/


همون لینک اولی یکی ازفایلهای زیپ را بگیر که داخلش تابع cddmex قرار داره

----------


## rahnema1

> مرسی. این پیغام رو میداد :
> Warning: Implication method should be "prod" for Sugeno systems. 
> > In evalfis at 54
>   In rahnemaFuzzy at 13
> AND function 'algebraic_product' does not exist!
> ??? Error using ==> evalfismex
> Exiting ...
> 
> Error in ==> evalfis at 84
> ...


فکر کنم اینجور باید تفسیر بشه اگه بالای نیم باشه 1 در غیر اینصورت صفر
اینم پلات

plotmf (a, 'input', 1);
plotmf (a, 'output', 1);

----------


## coronaa

> فکر کنم اینجور باید تفسیر بشه اگه بالای نیم باشه 1 در غیر اینصورت صفر
> اینم پلات
> 
> plotmf (a, 'input', 1);
> plotmf (a, 'output', 1);


تفسیرتون درسته و منظور منم همینطوری بود.
ولی توی evalfis که چنین مقداری رو نمیده!
مثل همین مثالی که زدم. نمره 50 رو میده 0.4495

----------


## coronaa

توی راهنما که میگه یه چندتا فایل رو باید نصب کنی. اینا دیگه چیه؟

----------


## rahnema1

> تفسیرتون درسته و منظور منم همینطوری بود.
> ولی توی evalfis که چنین مقداری رو نمیده!
> مثل همین مثالی که زدم. نمره 50 رو میده 0.4495


مثلا 50.5 را میده 0.5
بستگی به تابع عضویت هم داره که چی تعریف بشه

----------


## rahnema1

> من همین کاری رو کردم. دانلود کردم که یه m-file وجود داره به نام cddmex
> ولی توش کدنویسی نیست. توضیحاتی در مورد cddmex هست. یه سری دستور داره ولی همش بصورت کامنت هست!
> توی راهنما که میگه یه چندتا فایل رو باید نصب کنی. اینا دیگه چیه؟


داخل cddmex  چند تا کد بعنوان نمونه گذاشته امتحان کنید اجرا میشه؟

حالا با همین فایلها برنامه اجرا کنید فکر کنم دیگه چیزی لازم نباشه نصب بشه

----------


## coronaa

برای فازی این خطا رو هم میده :
No plots for Sugeno Output MFs

Error in ==> rahnemaFuzzy at 19
plotmf (a, 'output', 1);
 وقتی به جای سوگنو از ممدانی استفاده میکنم متلب قاطی میکنه!
ظاهراً برای سوگنو خروجی پلات نمیکنه، چون در استنتاج نوع سوگنو توابع عضویت خروجی کاملاً ثابت و یا خطی هستن.

----------


## coronaa

> داخل cddmex  چند تا کد بعنوان نمونه گذاشته امتحان کنید اجرا میشه؟
> 
> حالا با همین فایلها برنامه اجرا کنید فکر کنم دیگه چیزی لازم نباشه نصب بشه


شما کدوم لینک و کدوم فایل رو میگید؟
اصلن مثالی نداره. میشه همون فایلی که دانلودش کردید رو اینجا بذارید منم دانلود کنم؟
مرسی

----------


## rahnema1

http://control.ee.ethz.ch/~hybrid/Downloads/cddmex.zip

----------


## coronaa

> http://control.ee.ethz.ch/~hybrid/Downloads/cddmex.zip


توی سیستم من اینطوری نشون میده :
http://www.uplooder.net/img/image/62...cdmex-x-xx.jpg

اونی که متلب میشناسه همونطوری که گفتم فقط بصورت کامنت توضیحاتش رو آورده. انگار فانکشن نیست.
 بقیه که ناشناسه! ظاهرن با C یا C++‎‎ نوشته شده.

----------


## rahnema1

داخل کامنت ها مثال هم هست کافیه کپی و پیست کنی

----------


## coronaa

> داخل کامنت ها مثال هم هست کافیه کپی و پیست کنی


آها اینو قبلن امتحان کردم. جواب نداد.

----------


## rahnema1

اصل کار همون فایل dll هست که فایل m با اون ارتباط برقرار می کنه هر دو تا باید داخل یه فولدر باشن یا به مسیر جاری متلب اضافه بشن

----------


## coronaa

> اصل کار همون فایل dll هست که فایل m با اون ارتباط برقرار می کنه هر دو تا باید داخل یه فولدر باشن یا به مسیر جاری متلب اضافه بشن


  آقا مرسی. 
 :تشویق:  :تشویق:  :تشویق:  :تشویق:

----------


## coronaa

xxxxxxxxxxxxxxxxx

----------


## rahnema1

اندکس ها را اینجورا میشه استخراج کرد

k1=pp<0.5
k2=pp>=0.5

k11=find(pp<0.5)
k22=find(pp>=0.5)

----------


## coronaa

> اندکس ها را اینجورا میشه استخراج کرد
> 
> k1=pp<0.5
> k2=pp>=0.5
> 
> k11=find(pp<0.5)
> k22=find(pp>=0.5)


ممنون. حل شد.
به این صورت نوشتم :
n=[10 20 30 40 44 45 46 60 70 80 49 51 48 50 90];
pp=evalfis(n,a) ;
Group1=n(pp<0.5) 
Group2=n(pp>=0.5)

----------


## coronaa

> ممنون. حل شد.
> به این صورت نوشتم :
> n=[10 20 30 40 44 45 46 60 70 80 49 51 48 50 90];
> pp=evalfis(n,a) ;
> Group1=n(pp<0.5) 
> Group2=n(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];

----------


## rahnema1

میشه یک متغیر جدید با چند تابع عضویت درست کرد

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]);


البته قواعد هم باید طور دیگه ای بنویسیم
همه اینها توی مثالها و آموزشها هست

----------


## coronaa

> میشه یک متغیر جدید با چند تابع عضویت درست کرد
> 
> 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]

----------


## coronaa

اگه دقت بکنید سن ها گروهبندی نشدن. فقط مثلن دانش آموز دوازدهم که نمره آن 51 بود رفت گروه 2 ، باید مشخصاتش هم بره گروه 2
و ضمن اینکه الآن توی گروه دوم پنجمین درایه هست باید در Age2 هم پنجمین درایه باشه.

----------


## rahnema1

گفتم که با همون find اندکس ها را در میارید و به عناون هم اندکس gae و هم اندکس نمره قابل استفاده هست

----------


## coronaa

> گفتم که با همون find اندکس ها را در میارید و به عناون هم اندکس gae و هم اندکس نمره قابل استفاده هست


تقریبن به هدفم نزدیک شدم ولی میخوام بجای اندکس ها خود مشخصات کنار هم قرار بگیرن.
 از چه دستوری باید استفاده کنم؟

----------


## rahnema1

دوتا ماتریس را به هم بچسبون تا کنار همدیگه قرار بگیره

----------


## coronaa

شرمنده. متوجه نمیشم.
منظورم اینه که مثلن اندکس های K22 که بصورت 
k22 =

     8
     9
    10
    12
    15
هستن بجاش خود سن قرار بگیره یا خود نمره ها قرار بگیره. نمیخوام سن و نمره رو به هم بچسبونم تا توی یه ماتریس قرار بگیرن!

----------


## rahnema1

منظورم اینه

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)

----------


## coronaa

> منظورم اینه
> 
> 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)


مرسی. عالی بود
مهندس تفاوت کدنویسی من و شما رو مشاهده می کنید؟
برنامه ای که من 15 خط مینویسم رو شما توی 3 خط می نویسید :)  :لبخند:

----------


## rahnema1

چند تا دستور هست که زیاد در متلب کاربرد داره برای پیدا کردن اندکس ها یا مثلا کار با ماتریسها که توی اغلب جزوه های مختصر هم دیده میشه چیز خاصی نیست
لیست اینها هم میشه مثلا در گوگل در matlab refcard  پیدا کرد

----------


## coronaa

مهندس من دارم توی کدهام از یه دستور شرطی استفاده میکنم. داخل این شرط میخوام بگم مثلن اگه n=10 بود فلان برنامه ای که توی یه m-file دیگه هست رو اجرا کن ولی اون برنامه بصورت تابع نیست. باید چیکار کنم؟

----------


## coronaa

واسه ی قوانین چطوری 1 یا 2 مشخص میکنی؟ بر چه اساسیه؟
aa = addrule (aa, [1 1 1 1;2 2 1 1]);

----------


## rahnema1

> مهندس من دارم توی کدهام از یه دستور شرطی استفاده میکنم. داخل این شرط میخوام بگم مثلن اگه n=10 بود فلان برنامه ای که توی یه m-file دیگه هست رو اجرا کن ولی اون برنامه بصورت تابع نیست. باید چیکار کنم؟


فرقی نمیکنه کافیه اسم فایل را بنویسی تا اجرا بشه

----------


## rahnema1

> واسه ی قوانین چطوری 1 یا 2 مشخص میکنی؟ بر چه اساسیه؟
> aa = addrule (aa, [1 1 1 1;2 2 1 1]);


اینها داخل هلپ متلب یا مثالها هست

if(input1) then (output1) [1 1 1 1]
if(input2) then (output2) [2 2 1 1]

اول input ها میاد بعد هم output ها میاد و دو تای آخر که من 1 گذاشتم مربوط به وزن و یک پارامتر دیگه هست که پیش فزض یک گذاشتم

----------


## coronaa

اگه بخوام n جمله ی اول رو بصورت یک بردار نشون بدم چطوریه؟
مثلن وقتی n=5 هست بصورت زیر بشه
P=[ 1 2 3 4 5]

----------


## rahnema1

> اگه بخوام n جمله ی اول رو بصورت یک بردار نشون بدم چطوریه؟
> مثلن وقتی n=5 هست بصورت زیر بشه
> P=[ 1 2 3 4 5]


متوجه منظور شما نشدم

----------


## coronaa

> متوجه منظور شما نشدم


 میخواستم n جمله ی اول اعداد طبیعی رو نمایش بدم. مثلاً اگه n برابر با 10 بود، بنویسه :
P=[ 1 2 3 4 5 6 7 8 9 10]

حل شد. به این صورت منظورم بود :
1:n
 :لبخند:  :لبخند:  :لبخند:

----------


## coronaa

> اینم پلات
> 
> plotmf (a, 'input', 1);
> plotmf (a, 'output', 1);


چطوری میشه نموداری که رسم میکنه رو ضخیمتر کنم یا سایزش رو تغییر بدم؟
توی فازی این امکان وجود داره؟

----------


## rahnema1

> چطوری میشه نموداری که رسم میکنه رو ضخیمتر کنم یا سایزش رو تغییر بدم؟
> توی فازی این امکان وجود داره؟


دقیقا نمیدونم یه نگاه به هلپش بینداز

----------


## coronaa

این یه مثال ساده هست.
همونطوری هم که گفتین جواب رو بر میگردونه دیگه!
چطوری باید جدا جدا توی 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);

----------


## rahnema1

این جوری
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);

----------


## coronaa

ممنونم.
ولی من همینو قبلن نوشته بودم. اینطوری نمیخواستم.
بیخیال. مرسی :)

----------


## coronaa

همونطوری که توی مقاله گفت این دو تا تابع باید maximize بشن. ولی این دستور که مینیمم سازی میکنه ویک نقطه مینیمم رو بدست میاره که!
مگه اینطور نیست؟

----------


## rahnema1

> همونطوری که توی مقاله گفت این دو تا تابع باید maximize بشن. ولی این دستور که مینیمم سازی میکنه ویک نقطه مینیمم رو بدست میاره که!
> مگه اینطور نیست؟


اگه پشت تابع یه علامت منفی بذارید، مینیمم تبدیل میشه به ماکسیمم

----------


## coronaa

> اگه پشت تابع یه علامت منفی بذارید، مینیمم تبدیل میشه به ماکسیمم


 من یه فایل آموزشی از متلب سایت گرفتم که دقیقن همین منفی رو گفته ولی اونجا اول یه تابع هدف معرفی کرده و سپس توابع خودش رو نوشته. من که اینجا تابع هدف ندارم!
در ضمن توی هلپ متلب گفته این دستور برای تک متغیره هست ولی من اینجا دوتا متغیر دارم. p و q
فکر کنم از دستور  fmincon باید استفاده بشه.
اینطوری نیست؟

----------


## rahnema1

درسته واسه رابطه 5  فکر کنم fminbnd کافی باشه اما برای رابطه 6 همونطور که اشاره کردیدfmincon باید به کار بره.  فکر کنم فقط لازم باشه تابع خودتون را داخل این دستور بذارید اون چیزهایی که لازم نیست را  [  ]  بذارید

----------


## coronaa

> درسته واسه رابطه 5  فکر کنم fminbnd کافی باشه اما برای رابطه 6 همونطور که اشاره کردیدfmincon باید به کار بره.  فکر کنم فقط لازم باشه تابع خودتون را داخل این دستور بذارید اون چیزهایی که لازم نیست را  [  ]  بذارید


از چه جهت میگین رابطه (5) با fminbnd و معادله (6) با fmincon حل میشه؟اگه از نظر تعداد متغیر بگیم یا هردو ، دو متغیر p و q دارند و یا هر دو ، فقط یک متغیر q دارند.شما از این الگوریتمی که تو صفحه سوم داده سر در میارید؟فکر کنم این دوتا تابع رو باید با الگوریتمی که داده بهینه کنیم. با همون روش تکرار و آپدیت کردن.دقیقاً متوجه نشدم که باید چیکارش کنم!

----------


## rahnema1

زیر کلمه max را نگاه کنید. در رابطه 5 فقط یک متغیر می بینیم اما در رابطه 6 چند تا می بینیم. دلیلش اینه.

----------


## coronaa

آها. مرسی.
من هر کاری کردم نتونستم با اون کدها جواب بگیرم. یک تابع هدف و چندتا قید معرفی میکنه ولی اینجا اصلن اینطوری نیست!
یه مثال نمونه که داد اینطوری بود :
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);
این کدوم رو میخواد ماکزیمم کنه؟

----------


## coronaa

من اینطوری نوشت. ولی خطا میده!
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);

اشتباهه؟

----------


## rahnema1

فرمول 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);

----------


## coronaa

1- چرا فرمول 6 رو اینطوری نوشتین؟ به این صورت نیست؟
sum(diff(Cq)+k.*(D-sum(q)).*q)-Cq ;
2- چرا k رو بصورت برداری ننوشتین؟ (بخاطر اینکه مقادیر یکسانی داره؟)
3- پارامت آخر آرگومان fmincon چرا لاندا گذاشتین؟ لاندا ماکزیمم عدد q نیست؟

----------


## rahnema1

> 1- چرا فرمول 6 رو اینطوری نوشتین؟ به این صورت نیست؟
> sum(diff(Cq)+k.*(D-sum(q)).*q)-Cq ;
> 2- چرا k رو بصورت برداری ننوشتین؟ (بخاطر اینکه مقادیر یکسانی داره؟)
> 3- پارامت آخر آرگومان fmincon چرا لاندا گذاشتین؟ لاندا ماکزیمم عدد q نیست؟


فرمول ساده شده را میشه در انتهای مقاله پیدا کرد
k ها که یکسان هستند
ub همون لاندا باید باشه دیگه

----------


## coronaa

مرسی. کاملاً منطقیه.
 اون کد آماده NLC رو بخاطر  چی  قرار میداد؟
و سوال دیگه اینکه الآن وقتی این اجرا میشه یک عدد منفی میده. یعنی اون نقطه، نقطه ی بهینه هست؟
باید معادله ی اولی هم به همین صورت حل بشه ولی با fminbnd و سپس این دوتا رو بذارم توی الگوریتمی که وجود داره؟

----------


## rahnema1

> مرسی. کاملاً منطقیه.
>  اون کد آماده NLC رو بخاطر  چی  قرار میداد؟
> و سوال دیگه اینکه الآن وقتی این اجرا میشه یک عدد منفی میده. یعنی اون نقطه، نقطه ی بهینه هست؟
> باید معادله ی اولی هم به همین صورت حل بشه ولی با fminbnd و سپس این دوتا رو بذارم توی الگوریتمی که وجود داره؟


فکر کنم رابطه 5 را لازم نداریم چون محاسبه برای موقعیه که فقط یک تولید کننده را در نظر می گیریم
NLC را لازم نداریم فکر کنم برای موقعی هست که بخواهیم شروط دیگه برقرار کنیم
یه چیزی برام مشخص نیست. لاندا که باید برابر باشه با بیشترین ظرفیت تولید هر تولید کننده را اینجا گذاشته 1 که برام مبهمه
در مورد جواب منفی هم دقت کنید که آیا x منفی شده؟ چون اگه اینجور باشه یه جای کار اشکال وجود داره که احتمالا مقدار لاندا باشه

----------


## coronaa

منم دقیقاً متوجه نشدم واسه چی 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

----------


## rahnema1

فکر کنم q ها  اشتباه هست باید حداکثر 1 باشه

----------


## coronaa

شاید حرف شما درست باشه. آخه من مقادیر p و q رو بصورت فرضی گرفته بودم و اصلن به فکر لاندا نبودم!
مهندس کد نباید به این صورت باشه؟
D = 3.3; 
lb=[0 0 0 0]; 
q=[25     30   40      50];   % Amount of Energy 
alpha = .3;
lambda = 1 ; 
k = 0.38; 
f=@(q)   sum(alpha.*q.^2+k.*(D-sum(q)).*q); 
[x, fx]=fmincon(f,q,[],[],[],[],lb,lambda)
داخل هر میکرو گرید ظاهرن یه سری DG وجود داره که اونا توان تولید میکنند و اطلاعات جدول برای هر میکرو گرید هست و q هم مقدار تک تک انرژی داخل میکروگرید که توسط DG تولید میشه!
q رو بین صفر و یک میگیرم جواب صفر در میاد.
به نظرم مقادیر، بغیر از q نباید برداری باشه.

----------


## rahnema1

توی مقاله در جدول 1 هم برای هر کدوم فقط یک مقدار  گذاشته (ص 426)

این q ها فقط مقدار حدس اولیه را نشون میده رای ورود به الگوریتم. حالا هر کدوم را 0.5 بذارید مشکلی نیست و اجرا کنید
دفعه دیگه مثلا هر کدوم را مقادیر مختلف بین 0 و یک بذارید در هر صورت فکر کنم جواب fmincon یکسان باشه

----------


## rahnema1

علامت منفی پشت تابع فراموش نشه

----------


## coronaa

> توی مقاله در جدول 1 هم برای هر کدوم فقط یک مقدار  گذاشته (ص 426)
> 
> این q ها فقط مقدار حدس اولیه را نشون میده رای ورود به الگوریتم. حالا هر کدوم را 0.5 بذارید مشکلی نیست و اجرا کنید
> دفعه دیگه مثلا هر کدوم را مقادیر مختلف بین 0 و یک بذارید در هر صورت فکر کنم جواب fmincon یکسان باشه


 q رو بین صفر و یک قرار میدم جواب صفر در میاد.

----------


## coronaa

تو صفحه 423 ، بعد از رابطه (1) هم دوتا شرط داره اینکه مجموع q نباید بزرگتر یا کوچیکتر از D(دیماند) باشه. اگه بود جریمه میشه یا ضرر میکنه.
پس یعنی باید 4 تا q بدست بیاریم که مجموعشون برابر D بشه دیگه. درسته؟

----------


## coronaa

من داده های کد رو بصورت زیر تغییر دادم (مطابق داده های جدول شماره 1) :
D = 6.3; 
lb=0 ; 
q=[1 1.3 0.5 0.5];   % Amount of Energy 
alpha = .3;
lambda = 1 ; 
k = 0.38; 
f=@(q)   -sum(alpha.*q.^2+k.*(D-sum(q)).*q); 
[x, fx]=fmincon(f,q,[],[],[],[],lb,lambda)
جوابی که میده :
Active inequalities (to within options.TolCon = 1e-006):
  lower      upper     ineqlin   ineqnonlin
    1                                 

x =

  1.0e+017 *

         0    2.9234   -0.8373   -0.8373


fx =

 -2.3920e+034

----------


## rahnema1

برای تولید تصویر 3 یعنی efficiency از این استفاده کردم ( بر اساس الگوریتم) یه چیزی شبیه این شد
400 را یه مقدار زیاد کی گیریم که طی اون مقدار همگرا بشه

alpha=.3;beta=1.2;k=.38;D=6.3;
f=@(q)   -sum(alpha.*q.^2+k.*(D-sum(Q)).*q); 
efficiency=zeros(1,10);
for numsupplier=2:10
	Q=ones(1,numsupplier)*.5;
	lb=zeros(1,numsupplier);
	ub=ones(1,numsupplier);
	[x1, fx1]=fmincon(f,Q,[],[],[],[],lb,ub);
	for tekrar=1:400
		for supplier=1:numsupplier
			[x2, fx2]=fminbnd(f,0,1);
			Q(supplier)=x2;
		end
	end
	efficiency(numsupplier)=fx1/fx2;
end
plot(2:10,efficiency(2:10).*(2:10));

----------


## coronaa

ممنونم. میشه بگی چیکار کردی؟
نمودار تقریبن برعکس شکل (3) شد!

----------


## coronaa

Q برای چیه؟ با q فرق میکنه؟
مقادیر q بصورت فرضیه دیگه. درسته؟ چون اینا مقادیر انرژی هر DG هستن و ممکنه متفاوت هم باشند.

----------


## rahnema1

ببخشید اینجا را درست کنید

efficiency(numsupplier)=fx2/fx1;

Q ثابته اما q قراره بهینه بشه

----------


## coronaa

Q کجا تعریف شده؟
برنامه نمیشناستش.
??? Undefined function or variable 'Q'.

----------


## rahnema1

> Q کجا تعریف شده؟
> برنامه نمیشناستش.
> ??? Undefined function or variable 'Q'.


داخل حلقه تعریف شده

----------


## coronaa

خب اول توی خط دوم Q آوردی متلبم گیر میده!
??? Undefined function or variable 'Q'.

Error in ==> @(q)-sum(alpha.*q.^2+k.*(D-sum(Q)).*q)

----------


## rahnema1

پس چه طور دیشب نمودار کشیدی؟
می تونی علاوه بر داخل حلقه یک بار هم بیرون حلقه تعریف کنی تا گیر نده

----------


## coronaa

> پس چه طور دیشب نمودار کشیدی؟
> می تونی علاوه بر داخل حلقه یک بار هم بیرون حلقه تعریف کنی تا گیر نده


من فکر کرده بودم شما Q رو اشتباهی گذاشتی واسه همین همه رو q گرفته بودم. جواب داده بود.
اونوقت به numsupplier  گیر میده. اینو چیکار کنم. همینطوری بجاش 10 بذارم؟

----------


## coronaa

اگه بصورت زیر بنویسم نمودارش خط صاف میشه.
Q=ones(1,10)*.5; 
f=@(q)   -sum(alpha.*q.^2+k.*(D-sum(Q)).*q);

http://www.uplooder.net/img/image/53...b7ece73/aa.jpg

----------


## coronaa

اگه همه رو q بذارم نمودارش به این صورت میشه.
شما چه نموداری میگیری؟
http://www.uplooder.net/img/image/9/...95f0cd3/bb.jpg

----------


## coronaa

مهندس ببخشید.
اگه منظور شما از این خط:
 efficiency(numsupplier)=fx2/fx1; 
رابطه ی شماره 15 مقاله هست ، فکر کنم مخرج کسر با الگوریتم گیم تئوری بدست میاد!
این الگوریتم (1) که در مقاله اومده و شما ازش استفاده کردین ، فکر کنم فقط برای صورت کسر باشه. اینطوری نیست؟

----------


## rahnema1

یه اصلاح کردم فکر کنم مشکلی نباشه
این که مخرج کسر از گیم تئوری به دست میاد هم من نمیدونم اگه اینطوره امتحان کن چون مقاله خیلی گنگ و مبهمه

global Q;global k;global D;global alpha;
alpha=.3; beta=1.2; k=.38; D=6.3;
function ret = f(q)
	global Q;global k;global D;global alpha;
	ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q); 
end
efficiency=zeros(1,10);
for numsupplier=2:10
	Q=ones(1,numsupplier)*.5;
	lb=zeros(1,numsupplier);
	ub=ones(1,numsupplier);
	[x1, fx1]=fmincon(f,Q,[],[],[],[],lb,ub);
	for tekrar=1:400
		for supplier=1:numsupplier
			[x2, fx2]=fminbnd(f,0,1);
			Q(supplier)=x2;
		end
	end
	efficiency(numsupplier)=fx2/fx1;
end
plot(2:10,efficiency(2:10).*(2:10));

----------


## coronaa

مهندس توی متلب function با برنامه اصلی باید جدا باشه.
الآن من به این صورت جدا کردم ولی خطا میده :
function ret = f(q) 

alpha=.3; beta=1.2; k=.38; D=6.3; 

     global Q;global k;global D;global alpha; 
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);  
end

efficiency=zeros(1,10); 
for numsupplier=2:10 
    Q=ones(1,numsupplier)*.5; 
    lb=zeros(1,numsupplier); 
    ub=ones(1,numsupplier); 
    [x1, fx1]=fmincon(f,Q,[],[],[],[],lb,ub); 
    for tekrar=1:400 
        for supplier=1:numsupplier 
            [x2, fx2]=fminbnd(f,0,1); 
            Q(supplier)=x2; 
        end 
    end 
    efficiency(numsupplier)=fx2/fx1; 
end 
plot(2:10,efficiency(2:10).*(2:10)), grid
چطوری باید جدا بشه؟

----------


## rahnema1

توی اکتاو کتاسفانه این تابعها را نداشت من در یه نرم افزار دیگه به دست آوردم اینم نمودارش
http://www.sharefile.ir/uploads/1409943242.png
و صورت کسر هم مطابق با fminbnd یعنی رابطه 5 هست

----------


## coronaa

مهندس من پست قبلیم رو ادیت کردم. اون کد رو باید جدا کنم! چطوریه؟

----------


## rahnema1

function ret = f(q) 
    global Q;global k;global D;global alpha; 
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);  
end


global Q;global k;global D;global alpha;
alpha=.3; beta=1.2; k=.38; D=6.3; 
efficiency=zeros(1,10); 
for numsupplier=2:10 
    Q=ones(1,numsupplier)*.5; 
    lb=zeros(1,numsupplier); 
    ub=ones(1,numsupplier); 
    [x1, fx1]=fmincon(f,Q,[],[],[],[],lb,ub); 
    for tekrar=1:400 
        for supplier=1:numsupplier 
            [x2, fx2]=fminbnd(f,0,1); 
            Q(supplier)=x2; 
        end 
    end 
    efficiency(numsupplier)=fx2/fx1; 
end 
plot(2:10,efficiency(2:10).*(2:10)), grid

----------


## coronaa

جدا کردم ولی این پیغام رو میده :??? Input argument "q" is undefined.Error in ==> f at 3    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);

----------


## rahnema1

قبل از اجرا یک clear all بزن
تابع را در فایل f.m ذخیره کن

----------


## coronaa

همین کار رو کردم.
برنامه فانکشن بصورت زیره :
function ret = f(q)  
    global Q;global k;global D;global alpha; 
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);   
end
برنامه اصلی :
clc; close all; clear;
global Q;global k;global D;global alpha; 
alpha=.3; beta=1.2; k=.38; D=6.3; 
efficiency=zeros(1,10);  
for numsupplier=2:10  
    Q=ones(1,numsupplier)*.5;  
    lb=zeros(1,numsupplier);  
    ub=ones(1,numsupplier);  
    [x1, fx1]=fmincon(f,Q,[],[],[],[],lb,ub);  
    for tekrar=1:400  
        for supplier=1:numsupplier  
            [x2, fx2]=fminbnd(f,0,1);  
            Q(supplier)=x2;  
        end  
    end  
    efficiency(numsupplier)=fx2/fx1;  
end  
plot(2:10,efficiency(2:10).*(2:10)), grid
ولی خطا میده. توی فانکشن q رو نمیشناسه!

----------


## rahnema1

حتما یک فایل یا تابع با همین نام در یک فولدر بالاتر داری اگه بتونی نام تابع را تغییر بده یا اون فایل را حذف کن

----------


## coronaa

برنامه اصلی رو که ران میکنم خطای زیر رو میده :
??? Input argument "q" is undefined.

Error in ==> f at 3
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);

----------


## rahnema1

kاصلا نام تابع را در همه جا تبدیل کن به fff

----------


## coronaa

> حتما یک فایل یا تابع با همین نام در یک فولدر بالاتر داری اگه بتونی نام تابع را تغییر بده یا اون فایل را حذف کن


نه اسمشم تغییر دادم. باز همون خطا!

----------


## rahnema1

داخل fminbnd و fmincon بذار @f

----------


## coronaa

وقتی برنامه اصلی رو ران میکنم، به خط 9 که میرسه میره به برنامه fff .
حالا فانکشن رو که اجرا میکنه ، توی خط سوم برنامه :
 ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
میگه q رو نمیشناسه!

----------


## coronaa

> داخل fminbnd و fmincon بذار @f


همه ی این تغییرات رو انجام دادم.
??? Input argument "q" is undefined.

Error in ==> fff at 3
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);

Error in ==> plotjadid1 at 9
    [x1, fx1]=fmincon(fff,Q,[],[],[],[],lb,ub);

----------


## rahnema1

چیزی به ذهنم نمیرسه
با چند نمونه تابع ساده امتحان کن شاید معلوم بشه
از global هم استفاده کن

----------


## coronaa

> چیزی به ذهنم نمیرسه
> با چند نمونه تابع ساده امتحان کن شاید معلوم بشه
> از global هم استفاده کن


کار global چیه؟
یه بار global q هم گذاشتم دیدم نشد.

----------


## rahnema1

global باعث میشه متغیرهایی که خارج تابع تعریف شده در داخل تابع هم شناخته بشن

----------


## coronaa

نمیشه تابع رو بصورت جداگانه تعریف نکنی و توی همون برنامه اصلی قرار بدی؟
آخه توی فانکشن ، مقادیر آلفا، دیماند و Q در برنامه اصلی تعریف شده ولی q اصلن هیچ جا بعنوان متغیر تعریف نشده.

----------


## rahnema1

q که پارامتر ورودی تابع هست

----------


## coronaa

پس چرا توی همون فانکشن رابطه ی 
ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
q رو نمیشناسه؟

----------


## rahnema1

چرا علامت @ را نذاشتی؟ گفتم به شما که

[x1, fx1]=fmincon(@f,Q,[],[],[],[],lb,ub);

----------


## coronaa

> چرا علامت @ را نذاشتی؟ گفتم به شما که
> 
> [x1, fx1]=fmincon(@f,Q,[],[],[],[],lb,ub);


آخ ببخشید. نمیدونم اصن اینو فراموش کرده بودم. جواب داد. همون نموداری که شما بدست آوردین رو بدست آورد.
حالا یه سوال :
شما توی این برنامه اومدین رابطه ی شماره 6 (یا همون ساده شده ش در رابطه شماره 24)، یک بار با روش fminbnd و یک بار با روش fmincon حل کردین و بعد تقسیم بر هم کردین؟
اونوقت معادله 5 نباید هیچ نقشی داشته باشه و همچنین مقدار p؟

----------


## rahnema1

5و6 هر دو یکی هستند فقط بستگی داره چند تا ورودی باشه

----------


## coronaa

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

----------


## rahnema1

فکر کنم این برنامه اشتباه باشه
باید مطالب ستون سمت چپ صفحه 424 هم در نظر گرفته بشه

----------


## coronaa

> فکر کنم این برنامه اشتباه باشه
> باید مطالب ستون سمت چپ صفحه 424 هم در نظر گرفته بشه


مهندس، فکر کنم اینی که تو بدست آوردی باید برای صورت کسر باشه. واسه مخرج از گیم تئوری استفاده میشه و مطالب سمت چپ صفحه 424 هم شاید واسه مخرج کسر باشه.

----------


## coronaa

مهندس ببخشید، این برنامه رو بصورت زیر تغییر دادم. مخرج کسر رو یک عدد ثابت گرفتم که همون ماکزیمم سود ائتلاف بین DG های یک MG هست. طبق متن بالای رابطه (15) گفتم احتمالن باید به این صورت باشه. نظر شما چیه؟ اون تکرار 1 تا 400 رو حذف کردم مشکلی توی الگوریتم بوجود نمیاد؟
clc; close all; clear;
global Q;global k;global D;global alpha; 
alpha=.3; beta=1.2; k=.38; D=6.3; 
V_opt=3.4713;  % Tebghe jadvale 4
efficiency=zeros(1,10);  
for numsupplier=2:10  
    Q=ones(1,numsupplier)*.5;  
    lb=zeros(1,numsupplier);  
    ub=ones(1,numsupplier);  
    [x1, V_ne]=fmincon(@fff,Q,[],[],[],[],lb,ub);  
%     for tekrar=1:400  
%         for supplier=1:numsupplier  
%             [x2, fx2]=fminbnd(@fff,0,1);  
%             Q(supplier)=x2;  
%         end  
%     end  
    efficiency(numsupplier)=V_ne/V_opt;  
end  
plot(2:10,efficiency(2:10).*(2:10)), grid 
ylabel('Symmetric NE efficiency');
xlabel('Number of Suppliers in Microgrid')

----------


## rahnema1

فکر کنم اینجوری فایده ای نداشته باشه. احتمالا باید روابط موجود در ستون چپ ص 424 را به عنوان محدودیت الگوریتم بهینه سازی وارد مثلا fmincon کنیم

----------


## coronaa

> فکر کنم اینجوری فایده ای نداشته باشه. احتمالا باید روابط موجود در ستون چپ ص 424 را به عنوان محدودیت الگوریتم بهینه سازی وارد مثلا fmincon کنیم


کاملن درسته ولی هنوز متوجه نشدم که این قیدها رو چطوری باید در نظر بگیرم.
یه سوال :
 توی این برنامه یه جورایی بازده Lowerbound پلات شده واسه upperbound هم میشه همین کار رو کرد؟

----------


## rahnema1

حداقل در این مقاله که به روشنی مشخص نیست باید مطالب دیگه را ببینیم

----------


## rahnema1

یک برنامه متلب به نام NIRA هست که اینجور مسائل را حل می کنه
http://www.sharefile.ir/uploads/1410456153.zip

این مقالات هم مطالعه کنید
RELAXATION ALGORITHMS IN FINDING NASH EQUILIBRIA 

Relaxation algorithms to find Nash equilibria with economic applications

Numerical solutions to coupled-constraint (or generalised Nash) equilibrium problems 

NIRA-3  AN   IMPROVED  MATLAB  PACKAGE FOR  FINDING  NASH EQUILIBRIA  IN  INFINITE  GAMES

----------


## coronaa

آقا ممنونم. به زحمت افتادی. شرمنده.
مقالات رو هم دانلود کردم. این برنامه های NIRA چطوری کار میکنه؟ مثل همون mat-tug هست؟
توی فولدر Scripts توی بعضی برنامه هاش آدرس یه فایل داره به اسم :
filename='C:\\MAStools\\workspace\\NetMason\\outpu  ts\\temp\\incomeRate.txt';
اینو باید تغییر بدم؟
همچنین توی فولدر NIRA_10_2006 برنامه interfac رو اجرا میکنم یه اسم میخواد. نمیدونم چی باید بنویسم. خروجیش بصورت زیره :
>> interfac
 ************************** interfac.m ***************************
 
User interface for the relaxation algorithm
 
Enter the name of the script file containing the parameters [default=river_j]:
میگه دیفالتش هم کد river_j هست ولی چنین کدی توی اون فایلها نیست!
برنامه آخری ظاهرن یه چیزایی در مورد این برنامه داره توضیح میده. دارم میخونم.
 در ضمن، من نباید  جایی constraint های مقاله خودم رو در نظر بگیرم؟
بازم مرسی.

----------


## rahnema1

اصل کار همون NIRA هستش
دقیقا باهاش کار نکردم ولی با توجه به اینکه مربوط بهinfinite game می شه به این مساله هم میخوره یه سری تنظیمات باید صورت بگیره که داخل pdf هم اشاره شده

----------


## coronaa

من باید یه اسکریپت به اسم river-j درست کنم و پارامترهای زیر توش تعریف بشه؟
function[relaxfun, constrfun, description, dims,...
lowerbound, upperbound, precision, maxits, start,...
alphamethod, toler] = river j()
یا هر کدوم از اینا باز جدا یه فانکش است؟
ظاهرن دو تای اولی باید فانکشن جدا باشن. بقیه پارامترها باید تو خود river تعریف بشه؟
میشه کمک کنی؟

----------


## coronaa

من ساختار اسکریپت های زیر رو نوشتم ولی کامل نیست.
river_j   ,  river_fj  ,   river_cj
صفحه ی 17 میگه relaxfun و constrfun رو باید از طریق فانکشن های بالایی صدا بزنی. چطوری باید این کار رو بکنم؟
http://uplood.ir/t4VZ

----------


## rahnema1

یه نسخه جدید NIRA پیدا کردم که در محیط گرافیکی انجام می دهیم و فکر کنم راحت تره
این را امتحان کن manual هم داره
https://drive.google.com/folderview?...&usp=drive_web

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

----------


## coronaa

ممنونم مهندس
محیط GUI اینو توی گوگل دیده بودم ولی نتونسته بودم دانلودش کنم. دستت درد نکنه.
امیدوارم که بتونم جواب بگیرم.
واقعاً ازت ممنونم.

----------


## coronaa

مهندس ظاهرن این GUI روی ورژنهای جدید متلب کار میکنه. توی هلپش که صحبت از 2014 میکنه ولی توی Readme صحبت از 2013b میکنه.
من که ندارم. فردا باید برم روی سیستم یکی از بچه ها که 2013a داره چک کنم ببینم چطوریه!
ولی همچنان پیگیر کدنویسی اونم هستم.
یه سوال دارم :
برنامه river-j رو باید بصورت زیر بنویسم؟
نمیخوام تستش کنی. فقط ساختارش به این صورت هست یا نه؟ (صفحه 15)
function[relaxfun, constrfun,, description, dims,...
lowerbound, upperbound, precision, maxits, start,...
alphamethod, toler] = river_j()


relaxfun = river_fj ;
constrfun = river_cj;
description = 'River Basin Pollution Game';
dims = ones(1,10);
lowerbound = zeros(1,10);
upperbound = ones(1,10);
precision = [1e-5,1e-5];
maxits = 100;
start = zeros(1,3);
alphamethod = 3;
toler  = [1e-10];

end

river-fj و river-cj خودشون دوتا فانکشن جدا هستن.

----------


## rahnema1

فکر کنم اینجا محدودیت لازم نداریم پس river_cj لازم نیست
حالا یه تغییراتی دادم 
numplayers در فایل interface را برابر 10 گذاشتم که میشه تغییر داد
http://www.sharefile.ir/uploads/1410841460.zip

----------


## coronaa

شاید محدودیت لازم نباشه ولی باید تابعش وجود داشته باشه. من فعلن فعالش کردم و برابر تهی قرار دادم.
مشکل الآن اینجاست که میگه برای فانکشن river-j تعداد آرگومانهاش زیاده!
وقتی تابع interfac رو توی command window اجرا میکنم پیغام زیر مشاهده میشه :
>> interfac
************************************* interfac.m **********************
 
User interface for the relaxation algorithm
 
??? Error using ==> river_j
Too many output arguments.

Error in ==> interfac at 35
        [relaxfun,constrfun,description,gametype,dims,lower  bound,upperbound,...

----------


## rahnema1

این یکی
http://www.sharefile.ir/uploads/1410869820.zip

----------


## coronaa

توی interfac پارامتر gametype نبود که اضافه کردم خودم.
الآن i رو نمیشناسه (توی فانکشن river-fj )
>> interfac
*************************** interfac.m **************************
 
User interface for the relaxation algorithm
 
??? Input argument "i" is undefined.

Error in ==> river_fj at 3
f=alpha.*q(i).^2+k.*(D-sum(q)).*q(i);

Error in ==> river_j at 5
relaxfun = river_fj ;

Error in ==> interfac at 35
        [relaxfun,description,dims,gametype,lowerbound,uppe  rbound,...

 توی فانکشن river-fj هیچکدوم از پارامترهای i , q,  جایی تعریف نشده!
مهندس river-cj برای تابع هزینه هست. فکر نکنم باید حذفش کنی! خودش باید وجود داشته باشه ولی قیدی براش در نظر نگیریم. نظرتون چیه ؟
function [c, ceq] = river_cj(q, varargin)

alpha=.3;beta=1.2; 
    
c = alpha.*q.^2+beta.*q;

ceq = [ ];            % no equality constraints

end

----------


## rahnema1

یه اشتباه
توی فایل river_j این را درست کن
alphamethod = 3;

----------


## coronaa

ببخشید. ظاهرن قسمت دوم پست خودم رو اشتباه شدم. اون تابع هزینه نیست!
ولی فانکشن river-fj هم که رابطه ای رو نوشتید فکر نکنم واسه این اسکریپت باشه.
توی این اسکریپت باید تابع payoff نوشته بشه که من خودم هنوز نفهمیدم این تابع رو از کجا باید گیر بیارم ولی مقادیری که تابع payoff میتونه بدست بیاد رو از برنامه گیم تئوری قبل که کار کردیم میتونم بذارم اینجا.
یک بردار 1 در 3 میتونه باشه.

----------


## rahnema1

یه سری تغییرات دادم
http://www.sharefile.ir/uploads/1410941311.zip

----------


## coronaa

یکمی بهتر شد. متغیرها رو میشناسه فعلن!
پیغام :
>> interfac
******************************** interfac.m **************************
 
User interface for the relaxation algorithm
 
************************************* relax.m ********************************************
 
Number of players is 10.
 
The starting point is: [ [0] [0] [0] [0] [0] [0] [0] [0] [0] [0] ]
 
Iteration 1
??? Attempted to access toler(2); index out of bounds because
numel(toler)=1.

Error in ==> z_const at 14
options = optimset('Diagnostics','off','Display','off','Larg  eScale', 'off',
'MaxFunEvals', 500, 'FunValCheck', 'on', 'TolCon', toler(1), 'TolFun',
toler(2), 'TolX', toler(3));

Error in ==> relax at 101
    [z, lambda, exitflag]=z_const(x,dims,lowerbound,upperbound, toler);

Error in ==> interfac at 45
[p, ps, c, cs, n, a, l, t, exitflag] = relax(start, dims, lowerbound,
upperbound, precision, maxits, alphamethod, toler);

ظاهرن toler باید یک بردار باشه ولی اینجا یک عدد هست برابر با :
toler =

  1.0000e-010

----------


## rahnema1

فایل river_j این اصلاح بشه
toler  = [1e-10, 1e-10, 1e-10];

----------


## coronaa

به اشتباهم پی برده بردم :)
انجامش دادم. مهندس ، در ادامه باز constrfun مزاحم میشه. چطوره باشه ولی تهی باشه؟ الآن باز گیر داد.
پیغام :
>> interfac
**************************** interfac.m *************************
 
User interface for the relaxation algorithm
 
************************************* relax.m ********************************************
 
Number of players is 10.
 
The starting point is: [ [0] [0] [0] [0] [0] [0] [0] [0] [0] [0] ]
 
Iteration 1
Warning: Options LargeScale = 'off' and Algorithm =
'trust-region-reflective' conflict.
Ignoring Algorithm and running active-set method. To run
trust-region-reflective, set
LargeScale = 'on'. To run active-set without this warning, use Algorithm =
'active-set'. 
> In fmincon at 412
  In z_const at 16
  In relax at 101
  In interfac at 45
z(x) = [ [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] ]
Warning: Options LargeScale = 'off' and Algorithm =
'trust-region-reflective' conflict.
Ignoring Algorithm and running active-set method. To run
trust-region-reflective, set
LargeScale = 'on'. To run active-set without this warning, use Algorithm =
'active-set'. 
> In fmincon at 412
  In relax at 122
  In interfac at 45

alpha =

    0.5000


x0 =

  Columns 1 through 7

    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000

  Columns 8 through 10

    0.5000    0.5000    0.5000

Warning: Options LargeScale = 'off' and Algorithm =
'trust-region-reflective' conflict.
Ignoring Algorithm and running active-set method. To run
trust-region-reflective, set
LargeScale = 'on'. To run active-set without this warning, use Algorithm =
'active-set'. 
> In fmincon at 412
  In op_alph3 at 26
  In fmincon at 519
  In relax at 122
  In interfac at 45
??? Undefined function or method 'str2func' for input arguments of type
'double'.

Error in ==> relaxconstr at 9
cf = str2func(constrfun);

Error in ==> fmincon at 599
        [ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});

Error in ==> relax at 122
        alpha =
        fmincon(@op_alph3,0.5,[],[],[],[],0,1,@relaxconstr,options,x,z,dims,lowerbound,uppe  rbound,[],[],toler);
        
Error in ==> interfac at 45
[p, ps, c, cs, n, a, l, t, exitflag] = relax(start, dims, lowerbound,
upperbound, precision, maxits, alphamethod, toler);

Caused by:
    Failure in initial user-supplied nonlinear constraint function
    evaluation. FMINCON cannot continue.

----------


## rahnema1

http://www.sharefile.ir/uploads/1410905537.zip

----------


## coronaa

ممنونم مهندس. خیلی خیلی دستت درد نکنه  :لبخند: 
  خطا نداد و تا آخر اجرا شد. حالا واقعن درسته یا نه رو نمیدونیم. چون 100 در 100 قیدهایی باید لحاظ بشه و جوابها هم همه یکسان شد.
جوابش زیاد بود مستقیم اینجا نذاشتم. به pdf تبدیل کردم.
حالا اگه بخوایم مثل همون برنامه قبلی پلات کنیم ببینیم مثل همون شکل میشه یا نه باید چیکار کنیم؟
این تازه جواب صورت کسر رابطه 15 بود یا جواب کلی بدست اومد؟
 مهندس، من هنوز متوجه نشدم که توی اسکریپت river-fj چرا از اون رابطه استفاده کردین. مگه نباید تابع payoff باشه؟
و سوال بعدی اینکه numplayers چطوری 10 میشه؟ مقدارش رو کجا وارد کردی؟


http://uplood.ir/8N4C

----------


## rahnema1

numplayers همون تعداد ژنراتوهاست که از 2 تا 10 میذاریم که من اینجا 10 گذاشتم.
مطابق قبل مخرج کسر را از این برنامه ها میشه پیدا کرد:

function ret = fffu(q)  
    global Q;global k;global D;global alpha; 
    ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);   
end


clc; close all; clear;
numplayers=10
global Q;global k;global D;global alpha; 
alpha=.3; beta=1.2; k=.38; D=6.3; 
lb=zeros(1,numplayers);
ub=ones(1,numplayers);
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5;,[],[],[],[],lb,ub);
disp('makhraj=')
disp(-fx1)

در برنامه interfac هم در قسمت پایانی که 10 تا عدد 0.035774 به دست اومده
مجموع اونها میشه 0.35774  که فکر کنم صورت کسر efficiency میشه یعنی مقدار صورت برابر است با sum(c)

----------


## coronaa

شما تازه توی این برنامه تعداد numplayersرو مشخص کردین. توی برنامه های قبلی که استفاده می شد از کجا عددش رو میگرفت؟ جایی وارد کرده بودین؟
طبق شکلهایی که توی مقاله هست باید واسه هر supplier یه راندمان وجود داره. یعنی یه عدد تقسیم بر عدد دیگه. اینجا من اگه صورت رو تقسیم بر مخرج کنم فقط یه عدد بدست میاد. اینطوری که نمیتونم پلات کنم!
ضمن اینکه صورت کسر، نقاط تعادل نش هست که عددش 0.66872 هست و اون اعداد 0.035774 بردار payoff هست ظاهرن!
و اینکه چرا همه ی عددها یکسان در میاد؟

----------


## rahnema1

برنامه را که گفتم اجرا کن حداقل ببین جوابش مثل جواب اون نمودار شده یا نه. اگر هم اشکالی وجود داشت معلوم می شد. چرا اینقدر چک و چونه می زنی؟ :))
من نمیتونم این را اجرا کنم وگرنه جوابش را الان با نمودار اینجا میذاشتم
مثلا numplayers در برنامه قبلی numsupplier بوده

برای نمودار هم که معلمه . این کار را 9 بار اجرا کن یعنی
یکبار numplayers  را برابر 2 قرار بده
یکی برای 3
یکی برای 4
یکی برای 5
...
یکی برای 10
در نتیجه 9 تا عدد داریم که میشه باهاش نمودار کشید البته با یک حلقه ساده هم می تونیم انجام بدیم

عدد 0.66872 چیه؟ میزان تولیده
عدد 0.035774 چیه؟ پول به دست امده هست
در فرمول efficiency میزان پول یا سود به دست اومده تقسیم میشه نه میزان تولید

اینکه یکسان به دست میاد هم علتش اینه که ما در ارائه ورودی  ها برای هیچ تولید کننده ای ارجحیتی نسبت به بقیه قائل نشدیم که انتظار داشته باشیم میزان تولید یا سود او با دیگران متفاوت باشه و هدف ما تنها به دست آورد میزان سودی بوده که از طریق تولید کننده ها در تعادل نش به دست میاد

----------


## coronaa

ببخشید که انقدر سوال می پرسم. چون می خوام بدونم که چیکار می کنی  :لبخند: 
 جوابش  در زیر پیوست شد.
 مگه این خودش از numplayer دو تا 10 اجرا نمیکنه؟ پس چرا دوباره یه حلقه براش تعریف کنیم؟
http://uplood.ir/DD4W
دیگه دارم مجبور می شم یه پک کامل متلب رو برای شما بصورت اشانتیون بفرستم تا روی سیستمت نصب کنی  :لبخند:

----------


## rahnema1

این برنامه فقط برای 10 انجام شده حلقه ای در کار نیست اون حلقه هم اگه دقت کنی کامنت شده
برنامه قبلی یه اشتباه داشت باید مخرج برابر 4 و خورده ای بشه

function ret = fffu(q)  
    alpha=.3; beta=1.2; k=.38; D=6.3; 
    ret=-sum(alpha.*q.^2+k.*(D-sum(q)).*q);   
end


clc; close all; clear;
numplayers=10
lb=zeros(1,numplayers);
ub=ones(1,numplayers);
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5;,[],[],[],[],lb,ub);
disp('makhraj=')
disp(-fx1)

----------


## coronaa

برای پلات کردنش حلقه for هم گذاشتم :
clc; close all; clear; 
interfac
global Q;global k;global D;global alpha;  
alpha=.3; beta=1.2; k=.38; D=6.3;
efficiency = zeros(1,10)
for numplayers=2:10 
lb=zeros(1,numplayers); 
ub=ones(1,numplayers); 
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub); 
disp('makhraj=') 
disp(-fx1)
disp('Soorat=') 
disp(sum(c))
efficiency(numplayers) = sum(c)/(-fx1)
end
plot(2:10,efficiency(2:10).*(2:10)), grid 
ylabel('Symmetric NE efficiency');
xlabel('Number of Suppliers in Microgrid')

جواب efficiency
efficiency =

  Columns 1 through 7

         0    0.0664    0.0443    0.0332    0.0266    0.0221    0.0190

  Columns 8 through 10

    0.0166    0.0148    0.0133

http://www.uplooder.net/img/image/66...c5dcb8/fig.png

----------


## coronaa

پست بالایی رو تازه دیدم . اینطوری شد :
clc; close all; clear; 
interfac
global Q;global k;global D;global alpha;  
alpha=.3; beta=1.2; k=.38; D=6.3;
efficiency = zeros(1,10)
for numplayers=2:10 
lb=zeros(1,numplayers); 
ub=ones(1,numplayers); 
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub); 
disp('makhraj=') 
disp(-fx1)
disp('Soorat=') 
disp(sum(c))
efficiency(numplayers) = sum(c)/(-fx1)
end
plot(2:10,efficiency(2:10).*(2:10)), grid 
ylabel('Symmetric NE efficiency');
xlabel('Number of Suppliers in Microgrid')
جواب :
No active inequalities.
makhraj=
    4.0937

Soorat=
    0.3577
efficiency =

  Columns 1 through 7

         0    0.0925    0.0767    0.0762    0.0799    0.0824    0.0842

  Columns 8 through 10

    0.0855    0.0866    0.0874
نمودار :
http://www.uplooder.net/img/image/67...315ef/fig2.png

----------


## rahnema1

اصلا یه کاری کنیم
در ابتدا نمی خواهیم صورت را به دست بیاریم
تنها کاری که شما می کنید اینه که در فایل interfac بدون حلقه for فقط مقدار numplayers را از 2 تا 10 تغییر بده و برای هر بار که اجرا کردی یکی از اعدادی که در قسمت 
 with payoffs [ [0.035774
را کپی می کنی در یک جایی مثل نوت پد میذاری 
بنابراین نوت پد میشه شامل 9 تا خط که خط اولش یک عدد مثل 0.035774 هست
لطفا این عدد ها را اینجا بذار

این مرحله اول که انجام شد و صورت را به دست آوردیم می ریم سراغ مرحله دوم یعنی به دست آوردن مخرج

clc; close all; clear; 

makhraj = zeros(1,10)
for numplayers=2:10 
lb=zeros(1,numplayers); 
ub=ones(1,numplayers); 
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub); 
disp('makhraj=') 
disp(-fx1)
makhraj(numplayers) =(-fx1)
end

----------


## coronaa

اگه بخوام اون payoff ها رو بدست بیارم کافیه interfac رو توی command window بنویسم.
ولی نمیدونم numplayer رو تو کجا گذاشتی که تغییر بدم. توی کدوم اسکریپت هست؟

----------


## rahnema1

خط 30 از فایل interfac که به این صورته 
numplayers=10
را تغییر بده

----------


## coronaa

payoff های دو تا 10 :
[1.934] , [1.554] , [1.174] , [0.794] , [0.414] , [0.077012] , [0.057655] , [0.044775] , [0.035774]

----------


## rahnema1

حالا اینها را که به دست آوردی بذار داخل یه بردار به نام a  و ضرب در 2:10 کن
a.*(2:10)
تا مخرج به دست بیاد
صورت را هم که برنامه اش را گذاشتم

----------


## coronaa

اینطوری شد :
clc; close all; clear;  
a=[1.934 ,1.554 ,1.174 ,0.794 , 0.414 ,0.077012 ,0.057655 ,0.044775 ,0.035774];
soorat=a.*(2:10)
 makhraj = zeros(1,10) 
for numplayers=2:10  
lb=zeros(1,numplayers);  
ub=ones(1,numplayers);  
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);  
disp('makhraj=')  
disp(-fx1) 
makhraj(numplayers) =(-fx1) 
efficiency(numplayers) = soorat(numplayers-1)/(-fx1)
end

plot(2:10,efficiency(2:10).*(2:10)), grid 
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid')
نمودار :
http://www.uplooder.net/img/image/83...2f7ae/fig3.png

این الآن درسته؟

----------


## coronaa

تو این برنامه که سایز صورت و مخرج یکی نیست!

 مهندس وقتی ما payoff تغذیه کننده های مختلف رو بدست آوردیم دیگه نیازی نیست که ما بیایم مثلن برای تغذیه کننده های با تعداد 5 تا رو ضرب در 5 بکنیم.(این خودش payoff پنج تا تغذیه کننده هست!) منظورم این خطه :
soorat=a.*(2:10)
من الآن فقط خود بردار payoff رو بعنوان صورت در نظر گرفتم نمودارش اینطوری شد :
http://www.uplooder.net/img/image/84...c6eeb/fig5.png

معقول تره به نظرم!
اگه شکل (2) مقاله رو نگاه کنید دقیقن مثل نمودارهای upperbound و simulated شد.

----------


## rahnema1

علتش اینه که توی برنامه ای که گذاشتی دو بار ضربدر 2:10 کردی
a.*2:10
و
plot(2:10,efficiency(2:10).*(2:10)), grid 

که لازمه موقع plot دیگه در 2:10 ضرب نشه

----------


## coronaa

پس برنامه کلی به این صورت شد با نمودار دومی که گذاشتم؟

clc; close all; clear;  

payoff=[1.934 ,1.554 ,1.174 ,0.794 , 0.414 ,0.077012 ,0.057655 ,0.044775 ,0.035774];
soorat=payoff.*(2:10)
% soorat=payoff;
makhraj = zeros(1,10) ;
efficiency = zeros(1,10);
for numplayers=2:10  
lb=zeros(1,numplayers);  
ub=ones(1,numplayers);  
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);  
disp('makhraj=')  
disp(-fx1) 
makhraj(numplayers) =(-fx1); 
efficiency(numplayers) = soorat(numplayers-1)/makhraj(numplayers);
end
خب ما تا حالا از جدول 3 و 4 استفاده نکردیم. اینطوری باشه که این واسه همه ی مسائل که یکی در میاد!
سایز صورت و مخرج یکینیست. چیکار کنم؟

----------


## rahnema1

تا اینجا که پیش رفتیم مربوط به رقابت بین تولید کننده ها بود از این به بعد که در جدول 3و 4 اومده مربوط به همکاری بین اونهاست که فکر کنم از shapley استفاده کرده ( فکر کنم مقاله را به صورت کامل مطالعه نکردی)

----------


## coronaa

مطالعه کردم ولی فکر میکردم که صورت کسر باید با نقطه تعادل نش بدست بیاد و مخرج کسر با گیم تئوری مثل shapley !
الآن باید چیکار کنیم؟
این قسمت رو که دیگه توی همون مقاله اولی بدست آوردیم دیگه. داریم کدش رو. با همون mat-tug

----------


## rahnema1

> مطالعه کردم ولی فکر میکردم که صورت کسر باید با نقطه تعادل نش بدست بیاد و مخرج کسر با گیم تئوری مثل shapley !
> الآن باید چیکار کنیم؟
> این قسمت رو که دیگه توی همون مقاله اولی بدست آوردیم دیگه. داریم کدش رو. با همون mat-tug


شاید با اون قبلی متفاوت باشه باید دقیقا مقاله را بخونیم چون خوم هم این قسمتش را دقیقا مطالعه نکردم

----------


## coronaa

ما توی این برنامه تونستیم تازه مطابق شکل(4)، نمودار simulated efficiency رو رسم کنیم. نمودار upperbound و lowerbound هم از همین برنامه باید بدست بیاد؟
قبلن توی اولین کد یه همچین نموداری بدست آوردی که شبیه lowerbound هست. همینه یا اون کد اشتباس؟
http://www.uplooder.net/img/image/93...768b7/fig5.png

----------


## coronaa

> p=1:100;
> a = newfis ('sefroyek', 'sugeno', ...
>             'algebraic_product', 'algebraic_sum', ...
>             'min', 'max', 'wtaver');
> a = addvar (a, 'input', 'P', [min(p) max(p)]);
> a = addmf (a, 'input', 1, 'Low', 'trapmf', [min(p)-1 min(p) range(p)*0.45+min(p) range(p)*0.55+min(p)]);
> a = addmf (a, 'input', 1, 'High', 'trapmf', [range(p)*0.45+min(p) range(p)*0.55+min(p) max(p) max(p)+1]);
> a = addvar (a, 'output', 'sefroyek', [0 1]);
> a = addmf (a, 'output', 1, 'Low', 'constant', 0);
> ...


مهندس این کدی هست که قبلن واسه تقسیم بندی نمرات انجام داده بودی.
 قسمت rules اگه بخوام اینو روی کاغذ بصورت if و then بنویسم چطوریه؟
به این صورته ؟
if (input is Low) then (out1 is Low)
if (input is High) then (out2 is High)

----------


## rahnema1

> ما توی این برنامه تونستیم تازه مطابق شکل(4)، نمودار simulated efficiency رو رسم کنیم. نمودار upperbound و lowerbound هم از همین برنامه باید بدست بیاد؟
> قبلن توی اولین کد یه همچین نموداری بدست آوردی که شبیه lowerbound هست. همینه یا اون کد اشتباس؟
> http://www.uplooder.net/img/image/93...768b7/fig5.png


این اشتباه بود

----------


## rahnema1

> مهندس این کدی هست که قبلن واسه تقسیم بندی نمرات انجام داده بودی.
>  قسمت rules اگه بخوام اینو روی کاغذ بصورت if و then بنویسم چطوریه؟
> به این صورته ؟
> if (input is Low) then (out1 is Low)
> if (input is High) then (out2 is High)


اینو یادم رفته فقط میدونم متلب میتونه همین قاعده را با یک دستور ( که یادم نیست) به صورت if then بنویسه

----------


## coronaa

> اینو یادم رفته فقط میدونم متلب میتونه همین قاعده را با یک دستور ( که یادم نیست) به صورت if then بنویسه


حالا بیا یه چیز من بهت یاد بدم :))
 این دوتا دستور باید زیر برنامه نوشته بشه. بعد بصورت GUI اینو بالا میاریم و داخلش قوانین نوشته شده.
writefis(a,'myfile.fis');
fuzzy('myfile.fis');

----------


## coronaa

مهندس  نمودار upperbound و lowerbound از روی همین برنامه بدست نمیآد؟
این کد  زیر رو به برنامه اضافه کردم. نمودار relative error برای upperbound بدست اومد. شکل(4)
error(numplayers) = abs(ub(numplayers-1)-efficiency)/efficiency;

http://www.uplooder.net/img/image/16...upperbound.png

ولی lowerbound بدست نمیآد. فقط یه خط راست میشه. شاید ورودی lowerbound که همه رو صفر در نظر گرفتیم اشتباه باشه!
http://www.uplooder.net/img/image/60...d_relative.png
شما نظرتون چیه؟

----------


## rahnema1

upperbound و lowerbound  در ص 425 و در Corollary 2  توضیح داده شده
ببینم چی کار می کنی

----------


## coronaa

من الآن روی مقدار lowerbound مشکل دارم. فکر میکنم صفر نباید باشه!
نمودار error of upperbound درسته؟ تائید کردی؟
یه مشکل دیگه ای هم که دارم. توی برنامه اصلی سایز صورت و مخرج یکی نیست!

----------


## rahnema1

> من الآن روی مقدار lowerbound مشکل دارم. فکر میکنم صفر نباید باشه!
> نمودار error of upperbound درسته؟ تائید کردی؟
> یه مشکل دیگه ای هم که دارم. توی برنامه اصلی سایز صورت و مخرج یکی نیست!


اینها اشتباهه ظاهرا پست من را نخوندی .  باید از fmincon یا fminbnd استفاده کنی
ببینیم چی کار می کنی

----------


## coronaa

من از این برنامه استفاده کردم. شما اون برنامه اولی رو گفتی اشتباهه!
clc; close all; clear;  

payoff=[1.934 ,1.554 ,1.174 ,0.794 , 0.414 ,0.077012 ,0.057655 ,0.044775 ,0.035774];
soorat=payoff.*(2:10)
makhraj = zeros(1,10) ;
efficiency = zeros(1,10);
error =zeros(1,10);
for numplayers=2:10  
lb=zeros(1,numplayers);  
ub=ones(1,numplayers);  
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);  
disp('makhraj=')  
disp(-fx1) 
makhraj(numplayers) =(-fx1); 
efficiency(numplayers) = soorat(numplayers-1)/makhraj(numplayers);
error(numplayers) = abs(ub(numplayers-1)-efficiency)/efficiency;
end
plot(2:10,efficiency(2:10)), grid 
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid')
axis([2  10  0  1.1])
% ----------------------------------------------
figure
plot(2:10,error(2:10)), grid 
ylabel('relative error of the upperbound');
xlabel('Number of Suppliers in Microgrid')
% legend('cos_x','sin_x')
axis([2  10  0  1.1])

----------


## rahnema1

این lb,ub برابر با upperbound  و lowerbound نیست که
خواهشا و لطفا به همون صفحه مراجعه کن

----------


## coronaa

ای بابا ینی این مقادیر payoff و چیزهای دیگه رو بدست آوردیم همه اشتباه بود؟
پس نمودارا چرا درست در اومد؟؟؟

----------


## rahnema1

> ای بابا ینی این مقادیر payoff و چیزهای دیگه رو بدست آوردیم همه اشتباه بود؟
> پس نمودارا چرا درست در اومد؟؟؟


چرا اون صفحه را مطالعه نمی کنی؟؟ 
اصلا به حرفهام گوش نمی دی
اون چیزی که قبلا به دست آوردیم درست بود و lb و ub که 0 و 1 بود و ثابت بودند و نیازی به محاسبه اونها نیست
اما اینجا حدبالا و پایین برای effciency  را می خواهیم به دست بیاریم نه برای supply

----------


## coronaa

چشم! فقط منو نزن  :))
من یه لحظه داشتم ناامید می شدم. فکر کردم همه اشتباهه.
باشه من میخونمش. ببینم میتونم کاری انجام بدم یا نه.
ممنونم.

----------


## coronaa

سلام دوست عزیز  :لبخند: 
من یه فانکشن ساختم به اسم Lmax و یکی هم به اسم Jmax ، طبق روابط 16 و 17 . بصورت زیر :
function ret = Lmax(L)  

  global k;global D;global alpha; 
   
    ret=-((alpha-k)./m).*L.^2+k.*D.*L;   
end
function ret = Jmax(J)  

    global k;global D;global alpha; 
   
    ret=-(((alpha./m-k).*J.^2)+K.*D.*J);   
end
 بعد اومدم توی برنامه اصلی حد بالا و پایین راندمان رو بصورت شرطی قرار دادم.(بالای روابط 16)
حالا دیگه نمیدونم مقادیر fminbnd و fmincon رو چطوری مشخص کنم.
لاندا از کجا باید بدست بیاد؟ 
clc; close all; clear;
global q;global k;global D;global alpha ;global lambda; 
alpha=.3; beta=1.2; k=.38; D=6.3; m=10;
L=sum(q);
J=sum(q); 
for numsupplier=2:10  
    if lambda > k*D/((m+1)*k-2*alpha)
    lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);  
    upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax); 
    end
    if lambda < k*D/((m+1)*k-2*alpha)
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*d*Lmax);
        upbnd= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*d*Jmax);
    end
    [x1, fx1]=fmincon(@fff,Q,[],[],[],[],lobnd,upbnd);  
    for tekrar=1:400  
        for supplier=1:numsupplier  
            [x2, fx2]=fminbnd(@fff,0,1);  
            Q(supplier)=x2;  
        end  
    end  
    efficiency(numsupplier)=fx2/fx1;  
end  
plot(2:10,efficiency(2:10).*(2:10)), grid 
ylabel('Symmetric NE efficiency');
xlabel('Number of Suppliers in Microgrid')
در ضمن، ظاهرن با روابط 40 و 41 و 42 میشه بازده رو بدست آورد. هم رابطه ی V_NE مشخصه و هم رابطه ی V_opt
اینجا دیگه انگار payoff هم نمیخواد!

----------


## rahnema1

چه دلیلی داشته که از این حلقه ها استفاده کردی؟

    for tekrar=1:400  
        for supplier=1:numsupplier

----------


## coronaa

> چه دلیلی داشته که از این حلقه ها استفاده کردی؟
> 
>     for tekrar=1:400  
>         for supplier=1:numsupplier


آخه گفته بودی از fminbnd و fmincon باید استفاده کنی فکر کردم مثل اون برنامه اولی باید نوشته بشه!
الآن این قسمت برنامه رو حذف کنم؟
for tekrar=1:400  
        for supplier=1:numsupplier  
            [x2, fx2]=fminbnd(@fff,0,1);  
            Q(supplier)=x2;  
        end  
    end  
    efficiency(numsupplier)=fx2/fx1;

----------


## rahnema1

بخشهایی را خوب پیش رفتی
اولا توضیح بده اون صفحه چیکار می خواهد بکنه و مراحلش را بگو
ثانیا در هلپ متلب در مورد دو تابع fmincon و fminbnd مطالعه کن و بگو هر کدوم برای چه کاری مناسبه و اینکه میشه یکی را به جای دیگری استفاده کرد؟

----------


## coronaa

ما میخوایم حد بالا و پایین راندمان رو بدست بیاریم. یعنی مشخص کنیم که راندمانی که بدست میاد از این مقادیر نباید تجاوز کنه.
توی این کرانهای بالا و پایین، دو متغیر Lmax و Jmax هم دارم که باید مشخص بشن. یعنی خود این دوتا هم باید اول ماکسیمم بشن تا توی کرانها قرار بگیرن.
L و J مجموع مقادیر انرژی تغذیه کننده ها هستن که ما اول باید این دوتا رو با روابط 16 و 17 بیشینه کنیم و بعد توی کرانهای بالا و پایین قرار بدیم.
ضمن اینکه خود این راندمای که میخواد بدست بیاد بصورت شرطی باید باشه. یعنی اگه لاندا از اون مقدار بزرگتر بود ، کران بالا و پایین راندمان به این صورته و اگر لاندا کوچکتر از اون مقدار بود ، راندمان باید توی این بازه قرار بگیره. یعنی حد بالا و پایین یا همون upperbound و lowerbound آن به این صورت میشه.
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــــــــ
در مورد توابع fmincon و fminbnd ، خدمت شما عرض کنم که هر دو برای مسائل غیر خطی مقید شده استفاده میشن. ولی fminbnd برای یک متغیر استفاده شده و fmincon برای توابع چند متغیره استفاده میشه. پس نمیشه جای همدیگه هم استفاده کرد!
به نظرم توی این مسئله هم باید از fmincon استفاده کنیم.

----------


## rahnema1

> به نظرم توی این مسئله هم باید از fmincon استفاده کنیم.


شاید بشه برای مسائل یک متغیره هم از fmincon استفاده کرد فقط به جای چند متغیر از یک متغیر استفاده می کنیم ( من که متلب ندارم شما امتحان کن ببین میشه یا نه)

سوال: در اینجا یک تابع داریم که در اون تابع باید همزمان دو تا متغیر max بشن
یا اینکه دو تا تابع داریم که برای هرکدوم باید یک متغیر max بشه؟

ببینم چی کار می کنی نمودار را بکش

----------


## coronaa

طبق روابط 16 و 17 دو تا تابع داریم که باید ماکزیمم بشن و هر تابع هم یک متغیر جدا داره. L  و J دوتا متغیر هستن که L برای کران پایین و J برای کران بالا استفاده میشه. 
 مهندس من سوادم در همین حده! خب همون برنامه ای که بالا گذاشتم در همین حد بلدم. ران که میکنم یه سری متغیرها مثل لاندا رو نمیشناسه.
باید چیکار کنم؟

----------


## rahnema1

یه همچین چیزی
بعضی ها را کد خودت کپی کردم ( ضمانتش با خودت)

alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
for m=2:10  
parameterfunL=@(L,apha,k,m,D) (alpha-k)/m*(L^2)+k*D*L;
parameterfunJ=@(j,apha,k,m,D) (alpha/m-k)*(j^2)+k*D*j;

fl=@(L) parameterfunL(L,apha,k,m,D);
fj=@(j) parameterfunJ(j,apha,k,m,D);

Lmax=fminbnd(@fl,0,m*lambda);  
Jmax=fminbnd(@fj,0,m*lambda);  

    if lambda > k*D/((m+1)*k-2*alpha)
	lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);  
	upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax); 
    end
    if lambda < k*D/((m+1)*k-2*alpha)
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*d*Lmax);
        upbnd= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*d*Jmax);
    end
end

----------


## coronaa

برای خط 9 و 10 اشاره گر رو برداشتم. خطا میداد :
Lmax=fminbnd(fl,0,m*lambda);   
Jmax=fminbnd(fj,0,m*lambda);
خب حالا این upbnd و lobnd رو بدست میاده. یک عدد هست. همین درسته یا باید یک بردار بده؟

----------


## coronaa

بالایی اشتباه شدم. به ازای m های مختلف up,lo بدست میاد ولی نمیدونم چطوری باید توی یه بردار بذارم!

----------


## coronaa

حل شد.
الآن به دوتا بردار تبدیل شد ولی عدداش یه طوریه!
upbnd
1.0e+004 *

  Columns 1 through 7

         0    1.6698    1.5303    0.7856    0.7421    0.2988    0.0941

  Columns 8 through 10

    0.0000    0.0000    0.0000
lobnd
1.0e+004 *

  Columns 1 through 7

         0    3.3397    4.5908    3.1424    3.7103    1.7930    0.6588

  Columns 8 through 10

    0.4396    0.3148    0.2507

----------


## coronaa

مهندس دوتا برنامه رو با هم ترکیب کردم و بجای lp و ub از برنامه جدید استفاده کردم تا ببینم نمودارش چطوری میشه.
این کارم اشتباهه؟
فانکشن fffu 
function ret = fffu(q)   
    alpha=.3; beta=1.2; k=.38; D=6.3;  
    ret=-sum(alpha.*q.^2+k.*(D-sum(q)).*q);    
end

برنامه اصلی :
clc; close all; clear; 
alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1; 

for m=2:10   
 parameterfunL=@(L,alpha,k,m,D) (alpha-k)/m*(L^2)+k*D*L; 
 parameterfunJ=@(j,alpha,k,m,D) (alpha/m-k)*(j^2)+k*D*j; 
  
fl=@(L) parameterfunL(L,alpha,k,m,D); 
fj=@(j) parameterfunJ(j,alpha,k,m,D); 
  
Lmax=fminbnd(fl,0,m*lambda);   
Jmax=fminbnd(fj,0,m*lambda);  
  
    if lambda > k*D/((m+1)*k-2*alpha) 
    lobnd(m)=((m*(k^2)*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);   
    upbnd(m)=((m*(k^2)*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax);  
    end 
    if lambda < k*D/((m+1)*k-2*alpha) 
        lobnd(m)= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*D*Lmax); 
        upbnd(m)= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*D*Jmax); 
    end 

end
fprintf('Lowerbound\n ');
disp(lobnd)
fprintf('\n---------------------------------------\n');
fprintf('Upperbound \n');
disp(upbnd)
% ---------------------------------------------------
% ---------------------------------------------------
payoff=[1.934 ,1.554 ,1.174 ,0.794 , 0.414 ,0.077012 ,0.057655 ,0.044775,0.035774];
soorat=payoff.*(2:10);
makhraj = zeros(1,10) ;
efficiency = zeros(1,10);
error =zeros(1,10);
for numplayers=2:10  
 lb=lobnd(1:numplayers);  
 ub=upbnd(1:numplayers);  
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);  
disp('makhraj=')  
disp(-fx1) 
makhraj(numplayers) =(-fx1); 
efficiency(numplayers) = soorat(numplayers-1)/makhraj(numplayers);
error(numplayers) = abs(ub(numplayers-1)-efficiency)/efficiency;
end
plot(2:10,efficiency(2:10)), grid 
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid')
axis([2  10  0  1.1])
% ----------------------------------------------
figure
plot(2:10,error(2:10)), grid 
ylabel('relative error of the upperbound');
xlabel('Number of Suppliers in Microgrid')
% legend('cos_x','sin_x')
axis([2  10  0  1.1])
% ----------------------------------------------
یه پیغام خطا هم میده :


Exiting due to infeasibility:  1 lower bound exceeds the corresponding upper bound.
makhraj=
???  In an assignment  A(I) = B, the number of elements in B and
 I must be the same.

Error in ==> plot5 at 42
makhraj(numplayers) =(-fx1);

----------


## coronaa

ظاهرن توی مرحله یک ، fx1 پوچ در میاد!

چیکار باید بکنم؟

----------


## coronaa

مهندس من وقتی برای خط پایینی مقدار lb و ub رو بصورت زیر انتخاب میکنم، واسه اولین مرحله( یعنی m برابر 2)، fx1 رو پوج میده. این کارم اشتباهه؟
lb=lobnd(1:numplayers);
    ub=upbnd(1:numplayers);
[x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);

میخواستم طبق شکل (4)، نمودار حد بالا و پایین رو بدست بیارم.
خواهش میکنم یه کمکی بکن.

----------


## rahnema1

ین یکی را امتحان کن

alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ll=zeros(1,10);
uu=zeros(1,10);

for m=2:10  
parameterfunL=@(L,alpha,k,m,D) -(alpha-k)/m*(L^2)+k*D*L;
parameterfunJ=@(j,alpha,k,m,D) -(alpha/m-k)*(j^2)+k*D*j;

fl=@(L) parameterfunL(L,alpha,k,m,D);
fj=@(j) parameterfunJ(j,alpha,k,m,D);

Lmax = fmincon(@fl,m*lambda/2,[],[],[],[],0,m*lambda);  
Jmax = fmincon(@fj,m*lambda/2,[],[],[],[],0,m*lambda);  

    if lambda > k*D/((m+1)*k-2*alpha)
	lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);  
	upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax); 
    end
    if lambda < k*D/((m+1)*k-2*alpha)
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*D*Lmax);
        upbnd= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*D*Jmax);
    end
    ll(m)=lobnd;
    uu(m)=upbnd;
end

----------


## coronaa

من توی خط 12 و 13 اشاره گرها رو بر میدارم. وگرنه خطا میده:
جواب :
ll =

     0   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf

>> uu

uu =

  1.0e+015 *

  Columns 1 through 7

         0       Inf       Inf    2.2085       Inf       Inf       Inf

  Columns 8 through 10

    0.0542       Inf       Inf

----------


## rahnema1

دو تا فایل برای این تابعها درست کن

function ret=fj(j)
global m;
alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ret= -(alpha/m-k)*(j^2)+k*D*j;
end

function ret=fl(L)
global m;
alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ret= -(alpha-k)/m*(L^2)+k*D*L;
end


بعدش هم این یکی را اجرا کنچ

global m;
alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ll=zeros(1,10);
uu=zeros(1,10);

for m=2:10  


Lmax = fmincon(@fl,m*lambda/2,[],[],[],[],0,m*lambda);  
Jmax = fmincon(@fj,m*lambda/2,[],[],[],[],0,m*lambda);  

    if lambda > k*D/((m+1)*k-2*alpha)
	lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);  
	upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax); 
    end
    if lambda < k*D/((m+1)*k-2*alpha)
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*D*Lmax);
        upbnd= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*D*Jmax);
    end
    ll(m)=lobnd;
    uu(m)=upbnd;
end

----------


## coronaa

جواب :
http://uplood.ir/53lR

----------


## rahnema1

علامت منفی پشت تابع ها حواسم نبود که کل تابع را در پرانتز بذارم
این جور درسته:

ret= -((alpha/m-k)*(j^2)+k*D*j);
ret= -((alpha-k)/m*(L^2)+k*D*L);

----------


## coronaa

مرسی. فعلن ll و uu جواهای قابل قبولی هستن.
ll

ll =

  Columns 1 through 7

         0    0.8358    0.6716    0.5073    0.3431    0.1789    0.0333

  Columns 8 through 10

    0.0249    0.0193    0.0155

>> uu

uu =

  Columns 1 through 7

         0    0.5000    0.3333    0.2499    0.1773    0.0954    0.0098

  Columns 8 through 10

    0.0074    0.0057    0.0046
حالا وقتی اینا رو بعنوان lb و ub انتخاب میکنم باز مرحله اول fx1 پوچ میشه.
clc; close all; clear;
alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ll=zeros(1,10); 
uu=zeros(1,10); 
  
for m=2:10   
parameterfunL=@(L,alpha,k,m,D) -((alpha-k)/m*(L^2)+k*D*L); 
parameterfunJ=@(j,alpha,k,m,D) -((alpha/m-k)*(j^2)+k*D*j); 
  
fl=@(L) parameterfunL(L,alpha,k,m,D); 
fj=@(j) parameterfunJ(j,alpha,k,m,D); 
  
Lmax = fmincon(fl,m*lambda/2,[],[],[],[],0,m*lambda);   
Jmax = fmincon(fj,m*lambda/2,[],[],[],[],0,m*lambda);   
  
    if lambda > k*D/((m+1)*k-2*alpha) 
    lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);   
    upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*m*D*Jmax);  
    end 
    if lambda < k*D/((m+1)*k-2*alpha) 
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*D*Lmax); 
        upbnd= (m.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*D*Jmax); 
    end 
    ll(m)=lobnd; 
    uu(m)=upbnd; 
end 
fprintf('Lowerbound\n ');
disp(lobnd)
fprintf('\n---------------------------------------\n');
fprintf('Upperbound \n');
disp(upbnd)
% ---------------------------------------------------
% ---------------------------------------------------
payoff=[1.934 ,1.554 ,1.174 ,0.794 , 0.414 ,0.077012 ,0.057655 ,0.044775,0.035774];
soorat=payoff.*(2:10);
makhraj = zeros(1,10) ;
efficiency = zeros(1,10);
error =zeros(1,10);
for numplayers=2:10
    lb=ll(1:numplayers);
    ub=uu(1:numplayers);
    [x1, fx1]=fmincon(@fffu,ones(1,numplayers)*.5,[],[],[],[],lb,ub);
    disp('makhraj=')
    disp(-fx1)
    makhraj(numplayers) =(-fx1);
    efficiency(numplayers) = soorat(numplayers-1)/makhraj(numplayers);
    error(numplayers) = abs(ub(numplayers-1)-efficiency)/efficiency;
end
plot(2:10,efficiency(2:10)), grid
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid')
axis([2  10  0  1.1])
% ----------------------------------------------
figure
plot(2:10,error(2:10)), grid
ylabel('relative error of the upperbound');
xlabel('Number of Suppliers in Microgrid')
% legend('cos_x','sin_x')
axis([2  10  0  1.1])
% ----------------------------------------------

جواب :
http://uplood.ir/bfF8
خط 45 و 46 رو باید از 1 شروع کنم یا جور دیگه باید نوشته بشه؟

----------


## rahnema1

شما یه دونه M را جا انداخته بودی
داخل مقاله هم یک توان 2 جا افتاده بود

alpha=.3; beta=1.2; k=.38; D=6.3;lambda=1;
ll=zeros(1,10);
uu=zeros(1,10);
for m=2:10  
parameterfunL=@(L,alpha,k,m,D) -((alpha-k)/m*(L^2)+k*D*L);
parameterfunJ=@(j,alpha,k,m,D) -((alpha/m-k)*(j^2)+k*D*j);

fl=@(L) parameterfunL(L,alpha,k,m,D);
fj=@(j) parameterfunJ(j,alpha,k,m,D);

Lmax =fminbnd(fl,0,m*lambda);  
Jmax =fminbnd(fj,0,m*lambda);  
    if lambda > k*D/((m+1)*k-2*alpha)
	lobnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/(((alpha-k).*Lmax^2/m)+k*D*Lmax);  
	upbnd=((m*k^2*D^2*(k-alpha))/(((m+1)*k-2*alpha))^2)/((alpha/m-k)*Jmax^2+k*D*Jmax); 
    end
    if lambda < k*D/((m+1)*k-2*alpha)
        lobnd= (m^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k).*Lmax.^2)+k*m*D*Lmax);
        upbnd= (m.^2.*(alpha.*lambda.^2+k.*(D-m*lambda).*lambda))/(((alpha-k*m).*Jmax.^2)+k*m*D*Jmax);
    end
    ll(m)=lobnd;
    uu(m)=upbnd;
end  
plot(2:10,([ll' uu'](2:end,:))),grid

----------


## coronaa

حل شد.......................................

----------


## coronaa

من برنامه بالایی رو اجرا کردم که جوابهای بالایی رو داد.
برای شما رو تازه میخوام اجرا کنم ولی این خط خطا میده :
plot(2:10,([ll' uu'](2:end,:))),grid 

خطا :
??? Error: File: plot7.m Line: 27 Column: 21
Unbalanced or unexpected parenthesis or bracket.

----------


## coronaa

آقا فعلن حل شد.
صبر کنید تا  کدها رو مرتب کنم. نمودارا درست در اومد.  :لبخند:  :تشویق:  :تشویق:  :تشویق:  :تشویق:

----------


## coronaa

من کدها رو مرتب کردم و نمودارها رو پلات کردم. شکل(2)، نمودار simulated efficiency و efficiency upperbound روی هم میوفته.
احتمال داره که نمودار simulated اشتباه بدست اومده باشه؟؟
 شکل(4) رو هم رسم کردم ولی اینجا هم نمودار خطای lowerbound اشتباه بدست میاد!
http://www.uplooder.net/img/image/40...14cd6/fig9.png
http://www.uplooder.net/img/image/93...61514/fig7.png
http://www.uplooder.net/img/image/69...30256/fig8.png
تا اینجا هم خیلی ازت ممنونم.

----------


## coronaa

مهندس من lowerbound برای محاسبه simulated رو بصورت زیرگرفتم نموداراش بهتر شد.
lb=ll(2:numplayers);
 کد بالا رو بجای 
lb=zeros(1,numplayers); 
گذاشتم.
http://www.uplooder.net/img/image/41...f/simulate.png
http://www.uplooder.net/img/image/97...5c3d/error.png

 هنوز به جواب دقیق نرسیدیم. به نظرم مشکل از lb هست.(همونی که برای fmincon) استفاده شد. نباید همه صفر باشه.
 الآن lb جدید که همون مقادیر ll هست. نموداره بهتر شد. مقادیر ll بصورت زیر هست :
Columns 1 through 7

         0    0.8358    0.6716    0.5074    0.3431    0.1789    0.0333

  Columns 8 through 10

    0.0249    0.0193    0.0155

نظر شما چیه؟

----------


## coronaa

مهندس یه سوال دارم.
منظور از payoff یعنی سود و revenue یعنی درآمد.
توی مقاله گفته*V-NE بیانگر درآمد کلی بدست‌آمده تمامی ژنراتورها در تعادل نش متقارن و V-opt معادل با ماکزیمم سود اخذشده در MG* * می‌باشد.
*ما توی کدها اومدیم توی صورت کسر بجای درآمد کلی از سود ژنراتورها استفاده کردیم. به نظرتون مشکلی نداره؟

----------


## coronaa

و سوال بعدیم اینه که وقتی ما برای simulated efficiency کران بالا و پایین تعریف کردیم، نباید این رو بعنوان یک قید تعریف کنیم که دیگه راندمانمون از این محدوده خارج نشه؟

----------


## rahnema1

> مهندس یه سوال دارم.
> منظور از payoff یعنی سود و revenue یعنی درآمد.
> توی مقاله گفته*V-NE بیانگر درآمد کلی بدست‌آمده تمامی ژنراتورها در تعادل نش متقارن و V-opt معادل با ماکزیمم سود اخذشده در MG* * می‌باشد.
> *ما توی کدها اومدیم توی صورت کسر بجای درآمد کلی از سود ژنراتورها استفاده کردیم. به نظرتون مشکلی نداره؟


داشتم بررسی می کردم، فکرر کنم مشکل این نباشه

----------


## rahnema1

> و سوال بعدیم اینه که وقتی ما برای simulated efficiency کران بالا و پایین تعریف کردیم، نباید این رو بعنوان یک قید تعریف کنیم که دیگه راندمانمون از این محدوده خارج نشه؟


از محدوده که خارج نشده. تنها چیزی که به عنوان محدودیت عناون شده حد بالا و پایین supply هست

----------


## coronaa

> مهندس یه سوال دارم.
>  توی مقاله گفته*V-NE بیانگر درآمد کلی بدست‌آمده تمامی ژنراتورها در تعادل نش متقارن و V-opt معادل با ماکزیمم سود اخذشده در MG* * می‌باشد.
> *


 مهندس به نظرم برای مخرج کسر باید از جدول (4) استفاده کنیم. وقتی میگه ماکزیمم سود اخذ شده بین میکروگریدها یعنی ائتلاف بین 4 تا میکروگریدی که وجود داره. توی جدول 3 هم همین رو در نظر گرفته. اومد سود هر میکروگرید رو توی ائتلاف 4 تایی میکروگریدها بدست آورد.
ولی یه مشکلی داریم اینه که صورت کسر یک بردار 9 عددی است و مخرج کسر یک بردار 4 عددی میشه. اینطوری میشه راندمان رو بدست آورد؟

----------


## rahnema1

> مهندس به نظرم برای مخرج کسر باید از جدول (4) استفاده کنیم. وقتی میگه ماکزیمم سود اخذ شده بین میکروگریدها یعنی ائتلاف بین 4 تا میکروگریدی که وجود داره. توی جدول 3 هم همین رو در نظر گرفته. اومد سود هر میکروگرید رو توی ائتلاف 4 تایی میکروگریدها بدست آورد.
> ولی یه مشکلی داریم اینه که صورت کسر یک بردار 9 عددی است و مخرج کسر یک بردار 4 عددی میشه. اینطوری میشه راندمان رو بدست آورد؟


اون جدول برای همکاری بین چند میکروگرید هست اما در مساله نش فقط رابطه بین تولید کننده های داخل یک میکروگرید بررسی میشه. ضمن اینکه پارامترها نش هم در جدول 1 گذاشته شده که با موارد جدول 2 متفاوته

----------


## coronaa

یعنی توی این مقاله اومد دوتا موضوع جدا از هم رو بررسی کرد؟
پس همکاری بین میکروگریدها ربطی به اون شبیه سازیها و نمودارها نداره دیگه. درسته؟

----------


## rahnema1

> یعنی توی این مقاله اومد دوتا موضوع جدا از هم رو بررسی کرد؟
> پس همکاری بین میکروگریدها ربطی به اون شبیه سازیها و نمودارها نداره دیگه. درسته؟


 جواب این سوال را نمیدونی؟

----------


## coronaa

خب وقتی تا حالا از این گیم و ائتلاف ها توی کدهامون استفاده نکردیم ربطی نداره دیگه!میخواستم نظر شما رو بدونم. گفتم شاید دارم اشتباه متوجه میشم.

----------


## coronaa

مهندس یه سوال دارم
اگه بخوام در هر سطر عددهایی که بزرگتر از صفر هستند رو نشون بده باید چطوری بنویسم؟

0    3.6000         0    1.6448
         0    3.6000         0    1.9814
    0.9283         0         0    3.1717
         0         0         0    4.4521
         0         0         0    6.6977

به این صورت نشون بده :
    3.6000          1.6448
          3.6000          1.9814
    0.9283          3.1717
          4.4521
          6.6977

----------


## rahnema1

به این دو صورت میشه انجام داد

a=[0    3.6000         0    1.6448;
         0    3.6000         0    1.9814;
    0.9283         0         0    3.1717;
         0         0         0    4.4521;
         0         0         0    6.6977];
cellfun(@(x) x(x>0) ,num2cell(a,2) ,'UniformOutput', false)

for i=1:size(a,1); disp(a(i,a(i,:)>0)); end

----------


## coronaa

و اگر هم بخوایم بگیم سطرهایی که بیشتر مساوری دوتا المان دارند رو نشون بده چی؟

----------


## coronaa

> و اگر هم بخوایم بگیم سطرهایی که بیشتر مساوری دوتا المان دارند رو نشون بده چی؟


مرسی. حل شد :
for i=1:size(a,1); 
   r=a(i,a(i,:)>0);
   if numel(r)>=2
disp(r);
   end
end
ولی نمیدونم چطوری اینو توی یه ماتریس قرار بدم!

----------


## rahnema1

توی cellarray قرار بدید.

----------


## coronaa

34.1401   11.7570    7.1426

phi(Total) =    53.0398

----------


## coronaa

یه سوال دیگه.
ببخشید که موضوع های این پست یکمی قاطی شد ولی دوست دارم که همه ی سوالاتم توی یک پست جواب داده بشه :)
میشه توی یک متلب یک محیط گرافیکی درست کرد؟
مثلن یه پنجره درست بشه و متنی داخلش نوشته بشه؟ میشه کد نویسی کرد؟
منظورم inputdlg و اینچیزا نیست!

----------


## rahnema1

> یه سوال دیگه.
> ببخشید که موضوع های این پست یکمی قاطی شد ولی دوست دارم که همه ی سوالاتم توی یک پست جواب داده بشه :)
> میشه توی یک متلب یک محیط گرافیکی درست کرد؟
> مثلن یه پنجره درست بشه و متنی داخلش نوشته بشه؟ میشه کد نویسی کرد؟
> منظورم inputdlg و اینچیزا نیست!


بله امکان ایجاد پنجره هست توی همین تولباکس ها مثالهای مختلفی میشه دید که پنجره درست کرده اند

----------


## coronaa

> بله امکان ایجاد پنجره هست توی همین تولباکس ها مثالهای مختلفی میشه دید که پنجره درست کرده اند


خب این همون دستور inputdlg میشه. از این پنجره هایی که yes or no داره یا انتخاب میکنیم کدوم برتامه اجرا بشه نه!
یه پنجره یا اصلن بهتره بگم یه صفحه که سایزش رو خودمون انتخاب کنیم و متنی روش بنویسیم یا رنگی رنگیش کنیم. منظورم گرافیکیه.
شما چیز دیگه ای مد نظرتون بود؟

----------


## rahnema1

> خب این همون دستور inputdlg میشه. از این پنجره هایی که yes or no داره یا انتخاب میکنیم کدوم برتامه اجرا بشه نه!
> یه پنجره یا اصلن بهتره بگم یه صفحه که سایزش رو خودمون انتخاب کنیم و متنی روش بنویسیم یا رنگی رنگیش کنیم. منظورم گرافیکیه.
> شما چیز دیگه ای مد نظرتون بود؟


دقیقا نمیتونم بگم چون با octave سرو کار دارم توی هلپ متلب باید به خوبی توضیح داده باشه

----------


## coronaa

مهندس ببخشید، من آرگومان  CorePlot رو از همون فایل mat-tug بصورت زیر نوشتم درسته؟
اگه v های ما بصورت 
v=[29.7999 8.2776 3.2196 39.5726 35.4018 12.1579 53.0398 ]
باشه 
CorePlot(bw,'float',0,'none',10^5*eps)
bw همون v هست!
توی فانکشنش اینطوری تعریف کرد :
CorePlot(varargin)
که ظاهرن خود varargin چند تا پارامتر داره.
پیغامی که میده به اینصورته :
??? Error using ==> optimset at 242
Invalid value for OPTIONS parameter Algorithm:
 must be 'active-set', 'trust-region-reflective', 'interior-point',
 'levenberg-marquardt', 'trust-region-dogleg', or 'lm-line-search'.

Error in ==> coreQ at 43
opts=optimset('Simplex','on','LargeScale','on','Al  gorithm','simplex','MaxIter',128);

Error in ==> CorePlot at 130
if coreQ(v,tol)==0

Error in ==> testShapley1 at 52
 CorePlot(bw,'float',0,'none',10^5*eps)
توی optimset چه مشکلی وجود داره؟
خط 242 این فانکشن به این صورته :
 checkfield(Names{j,:},arg,optimtbx);

----------


## rahnema1

اولا باید متلب ورژن جدید نصب شده باشه و ثانیا باید cddmex هم نصب شده باشه ( در فایل pdf گفته)

----------


## coronaa

توی متلب 2013 هم اجرا کردم نشد.
من متلب 2009 دارم که cddmex هم نصبه. یعنی همون فایل cddmex.dll توی مسیر قرار داره که قبلن بحث شده بود و اجرا هم میشد.
الآن دستوراتی که به این فایل ربط داره اجرا میشه ولی این یکی نمیدونم مشکلش چیه!
مثلن دستورات زیر اجرا میشه :
[core_vert crst]=CddCoreVertices(bw,10^5*eps)
[acrq]=CddAntiCoreQ(bw,10^5*eps); 
 ولی coreplot اجرا نمیشه!

----------


## coronaa

میخوام نمودار سطح رسم کنم ولی میگه مقادیر pe و pm بصورت ماتریسی نیستند. باید چیکار کنم؟
pe= [5 10 15 20 25 30 35 40 45 50]; 
pm=[20 28 36 44 52 60 72 80 92 100]; 
DeltaP=[];
for i=1:10
DeltaP=pm(i)-pe(i);
DeltaPP(i)=DeltaP;
end
disp(DeltaPP)
 surf(pe,DeltaPP,pm);
پیغامش اینه :
??? Error using ==> surf at 78
Z must be a matrix, not a scalar or vector.

----------


## rahnema1

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

----------


## coronaa

> آخه مشکل اینجاست که من octave دارم و نسخه متلب ندارم که تست کنم


این الآن در جواب کدوم یک از دوتا مشکل بالا بود؟
coreplot یا surf  ؟؟؟

----------


## rahnema1

> این الآن در جواب کدوم یک از دوتا مشکل بالا بود؟
> coreplot یا surf  ؟؟؟


جواب اولی بود
با surf چه چیزی می خواهد رسم بشه؟ (توضیح بیشتر)

----------


## coronaa

> جواب اولی بود
> با surf چه چیزی می خواهد رسم بشه؟ (توضیح بیشتر)


خب من سه تا بردار 1 در 10 به اسم های pe, pm , DeltaPP دارم که میخوام نمودار سطح این سه تا بردار رو رسم کنم.
نمیشه اینطوری؟
بردار 1 در 10 با ماتریس 1 در 10 چه فرقی میکنه که متلب میگه باید بصورت ماتریسی باشه؟

----------


## rahnema1

> خب من سه تا بردار 1 در 10 به اسم های pe, pm , DeltaPP دارم که میخوام نمودار سطح این سه تا بردار رو رسم کنم.
> نمیشه اینطوری؟
> بردار 1 در 10 با ماتریس 1 در 10 چه فرقی میکنه که متلب میگه باید بصورت ماتریسی باشه؟


نمودار سطح دیگه چیه؟ میشه یه کم بیشتر توضیح بدید چیکار می خواهید بکنید/

----------


## coronaa

به اینجور نمودارا میگن نمودار سطح :
aaaaaa.jpg
 حالا این پارامترهایی که من توی کدم داشتم همون x,y,z هستن.

----------


## rahnema1

> به اینجور نمودارا میگن نمودار سطح :
> aaaaaa.jpg
>  حالا این پارامترهایی که من توی کدم داشتم همون x,y,z هستن.


تابع trisurf واسه همین کار میشه استفاده کرد

----------


## coronaa

مهندس یه سوال دارم.
اگه چندتا فانکشن داشته باشیم و یک برنامه اصلی که یک متغیری به اسم m وجود داره که هم توی فانکشن ها هست، هم توی برنامه اصلی.
آیا میشه کدی نوشت که وقتی مقدار m رو توی برنامه اصلی تغییر دادم همین مقدار توی فانکشن ها هم تغییر کنه؟

----------


## rahnema1

> مهندس یه سوال دارم.
> اگه چندتا فانکشن داشته باشیم و یک برنامه اصلی که یک متغیری به اسم m وجود داره که هم توی فانکشن ها هست، هم توی برنامه اصلی.
> آیا میشه کدی نوشت که وقتی مقدار m رو توی برنامه اصلی تغییر دادم همین مقدار توی فانکشن ها هم تغییر کنه؟


متغیر را به صورت global تعریف کنید

global a;
a=5;

function ret = myfunc()
global a;
%...
end

----------


## coronaa

> متغیر را به صورت global تعریف کنید
> 
> global a;
> a=5;
> 
> function ret = myfunc()
> global a;
> %...
> end


فانکشن های من توی یه m-file دیگه هستن. با برنامه اصلی جداست!

----------


## rahnema1

اشکالی نداره با همون global درست میشه

----------


## coronaa

مرسی حل شد :)
توی متلب یه سری فرمت ها هست که برای نشان دادن چند رقم اعشار هست.
مثلن 2 رقم اعشار ،  4 رقم اعشار یا 15 رقم اعشار . ولی من میخوام 6 رقم اعشار نشون بده. چطوریه؟
با digits خواستم انجام بدم نشد. شما میدونید چطوریه؟

----------


## rahnema1

> مرسی حل شد :)
> توی متلب یه سری فرمت ها هست که برای نشان دادن چند رقم اعشار هست.
> مثلن 2 رقم اعشار ،  4 رقم اعشار یا 15 رقم اعشار . ولی من میخوام 6 رقم اعشار نشون بده. چطوریه؟
> با digits خواستم انجام بدم نشد. شما میدونید چطوریه؟


sprintf('%.6f',12.34567658)

----------


## coronaa

> sprintf('%.6f',12.34567658)


منظورم این بود همه ی اعدا رو با یک نماد علمی بنویسه.
 یعنی همه رو با 10e-6 نشون بده!

----------


## rahnema1

یعنی این جوری؟
sprintf('%f x 10e-6',12.34567658/10e-6)

----------


## coronaa

من به این صورت زیر نوشتم و جوابی که گرفتم اینطوری بود :
sprintf('%10e\n',v')
جواب :
6.140758e+005
2.023135e+006
3.572194e+006
2.637223e+006
4.186298e+006
5.595317e+006
6.209423e+006
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ــــــــــــــــــــ
sprintf('%f x 10e-6\n',v')
جواب :
614075.750000 x 10e-6
2023134.500000 x 10e-6
3572194.000000 x 10e-6
2637222.808247 x 10e-6
4186297.933594 x 10e-6
5595317.432922 x 10e-6
6209423.423902 x 10e-6

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

----------


## coronaa

سلام
 ببخشید چندتا سوال داشتم
شما توی کدهای nira بغیر از river-fj, river-cj, river-j چیز دیگه ای رو هم کم و زیاد کردین؟
مثلن توی interfac یا relax و ... !
 numplayers رو که میدونم تغییر دادین توی interfac
* توی interfac چرای این کد رو اضافه کردین؟ دلیلتون چی بود؟ درسته که میخواستیم payoff رو بدست بیاریم ولی اگه میخواست توی این قسمت بدست بیاد که ادامه برنامه واسه چی بود؟ (البته جوابها رو مشکلی ندارم. درست در اومدن!)
payoff(numplayers)=c(1,1);

----------


## rahnema1

والا این کد را من نذاشتم داخل interfac فکر کنم خودتون گذاشتید
من فقط گفتم شما به طور دستی numplayer را از 1 تا 10 تغییر بدید و هر دفعه که اجرا کردید نتیجه را در نوت پد کپی کنید تا 10 تا نتیجه داشته باشیم

----------


## coronaa

نه منم نذاشتم. با کد اصلیش مقایسه کردم دیدم این اضافه شد. احتمالن خودتون گذاشتید!

----------


## rahnema1

فایل زیپ که برای شما فرستادم محتواش را نگاه کردم . داخل interfac چنین چیزی نبود!

----------


## coronaa

خب منم همینو میگم دیگه!
حالا کی اون خط رو اضافه کرد خدا میدونه :))

----------


## coronaa

من یه celldata درست کردم که ابعادش 1 در 4 هست و در هر سلول، یک ماتریس 1 در 10 وجود داره.
به این صورت :
celldata = 

    [1x10 double]    [1x10 double]    [1x10 double]    [1x10 double]
 حالا چطوری میتونم ماتریس های موجود در هر سلول رو پشت سر هم بصورت سطری بنویسم؟
یعنی یه ماتریس 4 در 10 داشته باشم!

----------


## coronaa

مهندس با دستور nchoosek نمیشه حالت های مختلف Merge & Split رو نوشت؟
مثل تصویر زیر :
http://www.uplooder.net/img/image/88...collection.jpg

من 46 حالت رو نوشتم. نمیدونم چند حالت بوجود میاد!

----------


## coronaa

ببخشید من امروز زیاد سوال دارم :)
این یه قسمت برنامه هست که به ازای numk مختلف ، که تشکیل celldata میدن، میاد نمودار رو رسم میکنه :

numk =[0.2000    0.4000    0.6000    0.8000];
for i=1:length(numk)
mat=celldata{1,i};
plot((2:10),mat(2:10),'r')
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid');
legend('simulated efficiency')
axis([2  10  0  1.1])
hold on
end
 حالا نمیدونم چطوری توی نمودار مشخص کنم که هر نمودار به ازای کدوم numk هست! میشه نشون داد؟
fig.png

----------


## rahnema1

> یعنی یه ماتریس 4 در 10 داشته باشم!


متوجه نشدم

----------


## rahnema1

> مهندس با دستور nchoosek نمیشه حالت های مختلف Merge & Split رو نوشت؟
> من 46 حالت رو نوشتم. نمیدونم چند حالت بوجود میاد!


ترکیب چندتا دستور باید باشه

----------


## rahnema1

> حالا نمیدونم چطوری توی نمودار مشخص کنم که هر نمودار به ازای کدوم numk هست! میشه نشون داد؟
> fig.png


تو دستورات پلات دستوری به نام legend هم هست که میشه مشخص کرد

----------


## coronaa

> متوجه نشدم


ببین اون سلولی که ساخته شد، 4 تا سلول داخلی داره که هر سلول داخلی یه ماتریس 1 در 10 هست. یعنی من کل این سلول، 4 تا متریس 1 در 10 دارم.
حالا میخوام این بردارهای 1 در 10 رو توی یک ماتریس قرار بدم. بصورت زیر :
[1x10 double]
[1x10 double]
[1x10 double]
[1x10 double]

که بشه یک ماتریس 4 در 10

----------


## coronaa

> تو دستورات پلات دستوری به نام legend هم هست که میشه مشخص کرد


این کار رو قبلن انجام دادم. توی کد بالایی هم قرار داره. ولی چون توی حلقه قرار میگیره انگار متمایز نمیکنه!

----------


## rahnema1

legend را چند بار نباید اجرا کنید تنها یکبار کافیه ( پس از اجرای حلقه) توی هلپ ببینید

سلول:

c = {}
for i = 1:4
    c{i} = rand(1, 10);
end
m = zeros(4, 10);
for i = 1:4
    m(i, :) = c{i};
end

----------


## coronaa

> legend را چند بار نباید اجرا کنید تنها یکبار کافیه ( پس از اجرای حلقه) توی هلپ ببینید
> 
> سلول:
> 
> c = {}
> for i = 1:4
>     c{i} = rand(1, 10);
> end
> m = zeros(4, 10);
> ...


دستت درد نکنه. سلول درست شد!
ولی legend هنوز درست نشد. توی legend چی باید قرار بدم؟ من که نمیدونم چه تعداد نمودار رسم میشه که بخوام برای تک تکش نامگذاری کنم!
for i=1:length(numk)
mat=celldata{1,i};
plot((2:10),mat(2:10),'r')
ylabel('Symmetric NE Efficiency');
xlabel('Number of Suppliers in Microgrid');
axis([2  10  0  1.1])
hold on
end
legend('simulated efficiency')
grid

----------


## rahnema1

واضحه! تعدادش برابر با length(numk) هست

----------


## coronaa

> واضحه! تعدادش برابر با length(numk) هست


:)
اینطوری که میدونم تعداد نمودارها برابر length(numl) هست. چطوری به legend بفهمونم که مثلن 4 تا نمودار کشیده شد حالا تو بیا از 1 تا 4 بهشون lable بزن!
نمیدونم منظورم رو رسوندم یا نه! میخوام وقتی 10 تا نمودار کشید. بیاد مشخص کنه که کدوم نمودار برای کدوم k هست.

----------


## rahnema1

این مثال هلپ متلب یه کم تغییر دادم
خیلی واضحه نمیدونم کجا مشکل دارید

x = -pi:pi/20:pi;
y1 = sin(x);
y2 = cos(x);

figure
plot(x,y1,'-ro',x,y2,'-.b')
strings= {'sin(x)', 'cos(x)'};
legend(strings)

----------


## coronaa

تفاوت من و شما اینه که شما از قبل میدونستید دوتا نمودار دارید و برای هر کدوم مشخص کردین ro باشه یا b- باشه. ولی من توی string نمیدونم چندتا جمله باید داشته باشم.با حلقه for میشه مشخص کرد؟
  منم همچین نموداری رو رسم کردم و چون میدونستم چندتا نمودار هست برای هر کدوم نامگذاری کردم :
fig4.png

----------


## rahnema1

گفتم که تعدادش مشخصه

----------


## coronaa

> گفتم که تعدادش مشخصه


 خب فرض کنید برنامه شما 5 تا نمودار sin با زوایای مختلف رسم میکنه. البته از قبل نمیدونی 5 تا هست چون  توی حلقه for قرار داره!
حال این دوتا خط پایینی رو چطوری تغییر میدی؟
plot(x,y1,'-ro',x,y2,'-.b') 
strings= {'sin(x)', 'cos(x)'};

----------


## rahnema1

a=rand(5,10);
symb = {'-r',':b','-.g','--c','-om'};
strings = {'a','b','c','d','e'}
figure,hold on;
for i =1:5
	plot( a(i,:),symb{i}); 
end
legend(strings)

----------


## coronaa

خب فرقی نکرد!
شما از قبل میدونستی که میخوای 5 تا نمودار رسم کنی.
symb = {'-r',':b','-.g','--c','-om'}; 
strings = {'a','b','c','d','e'}

----------


## rahnema1

حالا شما یه مثال ساده بزنید که نشه با این روش ترسیم کرد

----------


## coronaa

n=input('tedade nemoodarha ra vared konid')
a=rand(n,10); 
symb = {'-r',':b','-.g','--c','-om'}; 
strings = {'a','b','c','d','e'} 
figure,hold on; 
for i =1:n 
    plot( a(i,:),symb{i});  
end 
legend(strings)

حالا چی؟
دو جمله پایینی باید با تغییر n تغییر کنه!
symb = {'-r',':b','-.g','--c','-om'}; 
strings = {'a','b','c','d','e'}

----------


## coronaa

حالا من نمیخوام حتمن نمودارها رنگی بشه. همه یه رنگ باشه ولی از k1 تا kn شماره گذاری باشه.

----------


## rahnema1

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

n=10;
a=rand(n,20);
rang={'b','g','r','c','m','y' ,'k'};
symb={'.' ,'o' ,'x' ,'+' ,'*' ,'s' ,'d' ,'v'  ,'^'  ,'<' ,'>' };
szrg = numel(rang);
szsy =numel(symb);
figure,hold on
for i =1:n
	plot(a(i,:), sprintf('-%c%c', rang{mod(i, szrg) + 1}, symb{mod(i, szsy) + 1}))
end
legend(int2str((1:n)'))

----------


## rahnema1

n=10;
a=rand(n,20);
plot(1:20,a)
legend(int2str((1:n)'))

----------


## coronaa

طیب الله :)
چیزی که میخواستم همین بود. حالا باید با برنامه ی خودم تطبیقش بدم.
دستت درد نکنه مهندس.

----------


## coronaa

سلام
من یه چند جمله ای دارم بصورت زیر :
2x^4 + 3x^2 + 1.5x +5
 چطوری میتونم بگم ضریب x^4 و x با هم جمع بشه؟

----------


## rahnema1

چند جمله ای شما به این صورت نوشته میشه
mypol =[2 0 3 1.5 5];
برای چاپ اون اینجور میشه
polyout(mypol)
جمع ضرایب:
mypol(1) + mypol(3)

----------


## coronaa

درسته ولی اگه کاربر نتونه به چندجمله ای دسترسی داشته باشه و در حین یه عملیاتی توی برنامه ساخته بشه اونوقت چی؟منظورم اینه که mypol خودش باید ساخته بشه؟

----------


## rahnema1

سوالتون واضح نیست. لطفا یک مثال عملی بزنید

----------


## coronaa

مرسی. اون چیزی که تو ذهنم بود اشتباه بود. توی متلب همون ضرایب چند جمله ای تولید میشه. در حالی که من فکر میکردم خود چند جمله ای رو مینویسه.
تشکر. حل شد.

----------


## coronaa

سلام آقای مهندس :)
من یه کد دارم که در هر حلقه for میاد یه مقدار رو توی خروجی نشون میده. مثلن 10 بار این حلقه باید اجرا بشه. من چطوری میتونم در پایان برنامه، تمام مقادیر رو در یک سلول 1 در 10 ذخیره کنم؟

----------


## rahnema1

سلام
این جور میشه

mycelll = {};
for i = 1:10
    mycell{i} = i*i;
end

----------


## coronaa

> سلام
> این جور میشه
> 
>  mycell = {};
> for i = 1:10
>     mycell{i} = i*i;
> end


مرسی. قبلنم اینو گفته بودین. هر کاری میکردم نمیشد. الآن درست شد.
حالا اگه بخوام کل این مجموعه، 5 بار تکرار بشه و هر بار که اجرا میشه در یک سطر قرار بگیره و حلقه بعدی در سطر زیرین قرار بگیره چطوریه؟
به این صورت :aa.jpg

----------


## coronaa

من اینطوری نوشتم ولی ظاهرن اشتباهه!
celltotal = {};
for j = 1:5
    
mycell = {};
for i = 1:10
    mycell{i} = i*i;
end
celltotal{j} = mycell{j};

end
m = zeros(5, 10); 
for ii = 1:5
    m(ii, :) = celltotal{ii}; 
end

----------


## rahnema1

این جور میشه نوشت

mycell ={};
for i = 1:5
    for j= 1:10
        mycell{i,j} = i*j;
    end
end

----------


## coronaa

این کد بالایی که نوشتم اشتباهه؟ جوابش به این صورته :
m =

     1     1     1     1     1     1     1     1     1     1
     4     4     4     4     4     4     4     4     4     4
     9     9     9     9     9     9     9     9     9     9
    16    16    16    16    16    16    16    16    16    16
    25    25    25    25    25    25    25    25    25    25

----------


## rahnema1

فکر کنم اینجور باید بنویسید

celltotal = {};
for j = 1:5   
    mycell = {};
    for i = 1:10
        mycell{i} = i*i;
    end
    celltotal{j} = mycell;
end
m = zeros(5, 10); 
for ii = 1:5
    m(ii, :) = cell2mat(celltotal{ii}); 
end


اگه قرار بود توی آرایه بریزید خب از همون اول این کار را می کردید

m = zeros(5, 10); 
for i=1:5
    for j=1:10
        m(i,j) = i*j;
    end
end

----------


## ostadsho

ممنون..مشکل منم تقریبا همین بود حل شد

----------


## ostadsho

ییییییییییییییییییییییییی  ییییییییییییییییییییییییی  ییییییییییییییییییییییییی  ییی

----------


## coronaa

سلام
 چطوری میتونم یه بردار ستونی بسازم که ستون اول از 1 تا 10 باشه و ستون دوم فقط یک عدد ثابت؟
clc; clear all;

 p=input('Enter x :');
x=zeros(10,2);
for t=1:10
    
    x(t,1)=p;
%      x(t,:)= x(t,p)
    
end
x

----------


## rahnema1

x = [(1:10)', repmat(6,10,1)]
یا
x = zeros(10, 2);
x(:, 1) = 1:10;
x(:, 2) = 6;

----------


## coronaa

اگه بخوام این بردار که از نوع double هست به نوع struct تبدیلش کنم میشه؟

----------


## rahnema1

لطفا دقیقا بگید چیکار میخواهید بکنید

----------


## coronaa

> لطفا دقیقا بگید چیکار میخواهید بکنید


  مرسی از کمکتون.
 مشکلم که بر طرف شد ولی میخواستم بدونم میشه یه داده عددی که بصورت double هست رو به فرمت struct تبدیلش کرد. احتمال داده بودم که داده هایی که تو سیمولینک کار میکنن فرمت struct رو قبول می کنند. 
حالا اگه منظورم رو متوجه نشدین، دیگه بیخیال شید. شاید سوال پوچی پرسیدم!

----------


## coronaa

سلام
میشه فهمید تابع نمودار زیر چیه؟
یا اصلن میشه نمودار اینچنینی رو توی متلب تخمین زد؟
http://www.uplooder.net/img/image/74...ba9f37/zzz.bmp

----------


## rahnema1

> سلام
> میشه فهمید تابع نمودار زیر چیه؟
> یا اصلن میشه نمودار اینچنینی رو توی متلب تخمین زد؟
> http://www.uplooder.net/img/image/74...ba9f37/zzz.bmp


سلام
باید ابتدا نقاط نمودار x و y  را به یک طریقی استخراج کنید 
تابع احتمالا یک تابع نمایی هست که با روش زیر میتونید فرمول اون را بدست بیارید
با استفاده از polyfit هم میشه یک چند جمله ای را به نمودار فیت کرد

data = [
	 0  126.6;
	 1  101.8;
	 2   71.6;
	 3   85.1;
	 4  101.6;
	 5   67.5;
	 6   68.1;
	 7   55.2;
	 8   62.9;
	 9   45.5;
	10   41.9;
	11   46.3;
	12   34.1;
	13   38.2;
	14   41.7;
	15   24.7;
	16   41.5;
	17   24.5;
	18   36.6;
	19   19.6;
	20   22.8;
	21   29.6;
	22   23.5;
	23   15.9;
	24   15.3;
	25   13.4;
	26   26.8;
	27    9.8;
	28   18.8;
	29   25.9;
	30   19.3
];
x= [ones(size(data, 1), 1), data(:, 1)];
y = log (data(:, 2));
zaraeb = pinv (x) * y;
plot(data (:, 1), data (:, 2), 'o')
hold on;
plot(data (:, 1), exp (zaraeb' * x'))

----------


## coronaa

این داده ها رو بصورت فرضی در نظر گرفتین؟
دستور pinv چه کاری انجام میده؟
راستش هدف من برازش منحنی نبود. من هدفم اینه که این نمودار رو توی متلب رسم کنم. حالا صرفنظر اینکه بدونم چه تابعی هست.
 الآن با این برازشی هم که انجام دادین زیاد دقیق به اون تابع نیست!

----------


## rahnema1

> این داده ها رو بصورت فرضی در نظر گرفتین؟
> دستور pinv چه کاری انجام میده؟
> راستش هدف من برازش منحنی نبود. من هدفم اینه که این نمودار رو توی متلب رسم کنم. حالا صرفنظر اینکه بدونم چه تابعی هست.
>  الآن با این برازشی هم که انجام دادین زیاد دقیق به اون تابع نیست!


با استفاده از روش کمترین مربعات منحنی را فیت می کنیم
این داده ها فرضی هستند
همون طور که گفتم باید داده ها را از  روی نمودار استخراج کنید حالا به صورت چشمی نقاط x و y را استخراج کنید یا یک روش اتوماتیک پیدا کنید که مختصات منحنی را بکشه بیرون

----------

