توی اکتاو کتاسفانه این تابعها را نداشت من در یه نرم افزار دیگه به دست آوردم اینم نمودارش
http://www.sharefile.ir/uploads/1409943242.png
و صورت کسر هم مطابق با fminbnd یعنی رابطه 5 هست
Printable View
توی اکتاو کتاسفانه این تابعها را نداشت من در یه نرم افزار دیگه به دست آوردم اینم نمودارش
http://www.sharefile.ir/uploads/1409943242.png
و صورت کسر هم مطابق با fminbnd یعنی رابطه 5 هست
مهندس من پست قبلیم رو ادیت کردم. اون کد رو باید جدا کنم! چطوریه؟
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
جدا کردم ولی این پیغام رو میده :??? Input argument "q" is undefined.Error in ==> f at 3 ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
قبل از اجرا یک clear all بزن
تابع را در فایل f.m ذخیره کن
همین کار رو کردم.
برنامه فانکشن بصورت زیره :
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 رو نمیشناسه!
حتما یک فایل یا تابع با همین نام در یک فولدر بالاتر داری اگه بتونی نام تابع را تغییر بده یا اون فایل را حذف کن
برنامه اصلی رو که ران میکنم خطای زیر رو میده :
??? Input argument "q" is undefined.
Error in ==> f at 3
ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
kاصلا نام تابع را در همه جا تبدیل کن به fff
داخل fminbnd و fmincon بذار@f
وقتی برنامه اصلی رو ران میکنم، به خط 9 که میرسه میره به برنامه fff .
حالا فانکشن رو که اجرا میکنه ، توی خط سوم برنامه :
ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
میگه q رو نمیشناسه!
چیزی به ذهنم نمیرسه
با چند نمونه تابع ساده امتحان کن شاید معلوم بشه
از global هم استفاده کن
global باعث میشه متغیرهایی که خارج تابع تعریف شده در داخل تابع هم شناخته بشن
نمیشه تابع رو بصورت جداگانه تعریف نکنی و توی همون برنامه اصلی قرار بدی؟
آخه توی فانکشن ، مقادیر آلفا، دیماند و Q در برنامه اصلی تعریف شده ولی q اصلن هیچ جا بعنوان متغیر تعریف نشده.
q که پارامتر ورودی تابع هست
پس چرا توی همون فانکشن رابطه ی
ret=-sum(alpha.*q.^2+k.*(D-sum(Q)).*q);
q رو نمیشناسه؟
چرا علامت @ را نذاشتی؟ گفتم به شما که
[x1, fx1]=fmincon(@f,Q,[],[],[],[],lb,ub);
آخ ببخشید. نمیدونم اصن اینو فراموش کرده بودم. جواب داد. همون نموداری که شما بدست آوردین رو بدست آورد.
حالا یه سوال :
شما توی این برنامه اومدین رابطه ی شماره 6 (یا همون ساده شده ش در رابطه شماره 24)، یک بار با روش fminbnd و یک بار با روش fmincon حل کردین و بعد تقسیم بر هم کردین؟
اونوقت معادله 5 نباید هیچ نقشی داشته باشه و همچنین مقدار p؟
5و6 هر دو یکی هستند فقط بستگی داره چند تا ورودی باشه
مهندس قسمت اول سوالم رو جواب میدین؟
هنوز خوب متوجه نشدم که این برنامه داره چیکار میکنه!
فکر کنم این برنامه اشتباه باشه
باید مطالب ستون سمت چپ صفحه 424 هم در نظر گرفته بشه
مهندس ببخشید، این برنامه رو بصورت زیر تغییر دادم. مخرج کسر رو یک عدد ثابت گرفتم که همون ماکزیمم سود ائتلاف بین 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')
فکر کنم اینجوری فایده ای نداشته باشه. احتمالا باید روابط موجود در ستون چپ ص 424 را به عنوان محدودیت الگوریتم بهینه سازی وارد مثلا fmincon کنیم
حداقل در این مقاله که به روشنی مشخص نیست باید مطالب دیگه را ببینیم
یک برنامه متلب به نام 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
آقا ممنونم. به زحمت افتادی. شرمنده.
مقالات رو هم دانلود کردم. این برنامه های 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 های مقاله خودم رو در نظر بگیرم؟
بازم مرسی.
اصل کار همون NIRA هستش
دقیقا باهاش کار نکردم ولی با توجه به اینکه مربوط بهinfinite game می شه به این مساله هم میخوره یه سری تنظیمات باید صورت بگیره که داخل pdf هم اشاره شده
من باید یه اسکریپت به اسم river-j درست کنم و پارامترهای زیر توش تعریف بشه؟
function[relaxfun, constrfun, description, dims,...
lowerbound, upperbound, precision, maxits, start,...
alphamethod, toler] = river j()
یا هر کدوم از اینا باز جدا یه فانکش است؟
ظاهرن دو تای اولی باید فانکشن جدا باشن. بقیه پارامترها باید تو خود river تعریف بشه؟
میشه کمک کنی؟
من ساختار اسکریپت های زیر رو نوشتم ولی کامل نیست.
river_j , river_fj , river_cj
صفحه ی 17 میگه relaxfun و constrfun رو باید از طریق فانکشن های بالایی صدا بزنی. چطوری باید این کار رو بکنم؟
http://uplood.ir/t4VZ
یه نسخه جدید NIRA پیدا کردم که در محیط گرافیکی انجام می دهیم و فکر کنم راحت تره
این را امتحان کن manual هم داره
https://drive.google.com/folderview?...&usp=drive_web
من متلب ندارم امتحان کنم توی اکتاو هم تابعهایی مثل fmincon نداره
ممنونم مهندس
محیط GUI اینو توی گوگل دیده بودم ولی نتونسته بودم دانلودش کنم. دستت درد نکنه.
امیدوارم که بتونم جواب بگیرم.
واقعاً ازت ممنونم.
مهندس ظاهرن این 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 خودشون دوتا فانکشن جدا هستن.
فکر کنم اینجا محدودیت لازم نداریم پس river_cj لازم نیست
حالا یه تغییراتی دادم
numplayers در فایل interface را برابر 10 گذاشتم که میشه تغییر داد
http://www.sharefile.ir/uploads/1410841460.zip
شاید محدودیت لازم نباشه ولی باید تابعش وجود داشته باشه. من فعلن فعالش کردم و برابر تهی قرار دادم.
مشکل الآن اینجاست که میگه برای فانکشن 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,...
توی 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
یه اشتباه
توی فایل river_j این را درست کن
alphamethod = 3;
ببخشید. ظاهرن قسمت دوم پست خودم رو اشتباه شدم. اون تابع هزینه نیست!
ولی فانکشن river-fj هم که رابطه ای رو نوشتید فکر نکنم واسه این اسکریپت باشه.
توی این اسکریپت باید تابع payoff نوشته بشه که من خودم هنوز نفهمیدم این تابع رو از کجا باید گیر بیارم ولی مقادیری که تابع payoff میتونه بدست بیاد رو از برنامه گیم تئوری قبل که کار کردیم میتونم بذارم اینجا.
یک بردار 1 در 3 میتونه باشه.
یه سری تغییرات دادم
http://www.sharefile.ir/uploads/1410941311.zip
یکمی بهتر شد. متغیرها رو میشناسه فعلن!
پیغام :
>> 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
فایل river_j این اصلاح بشه
toler = [1e-10, 1e-10, 1e-10];
به اشتباهم پی برده بردم :)
انجامش دادم. مهندس ، در ادامه باز 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.
ممنونم مهندس. خیلی خیلی دستت درد نکنه :لبخندساده:
خطا نداد و تا آخر اجرا شد. حالا واقعن درسته یا نه رو نمیدونیم. چون 100 در 100 قیدهایی باید لحاظ بشه و جوابها هم همه یکسان شد.
جوابش زیاد بود مستقیم اینجا نذاشتم. به pdf تبدیل کردم.
حالا اگه بخوایم مثل همون برنامه قبلی پلات کنیم ببینیم مثل همون شکل میشه یا نه باید چیکار کنیم؟
این تازه جواب صورت کسر رابطه 15 بود یا جواب کلی بدست اومد؟
مهندس، من هنوز متوجه نشدم که توی اسکریپت river-fj چرا از اون رابطه استفاده کردین. مگه نباید تابع payoff باشه؟
و سوال بعدی اینکه numplayers چطوری 10 میشه؟ مقدارش رو کجا وارد کردی؟
http://uplood.ir/8N4C
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)