علامت منفی پشت تابع ها حواسم نبود که کل تابع را در پرانتز بذارم
این جور درسته:
ret= -((alpha/m-k)*(j^2)+k*D*j);
ret= -((alpha-k)/m*(L^2)+k*D*L);
Printable View
علامت منفی پشت تابع ها حواسم نبود که کل تابع را در پرانتز بذارم
این جور درسته:
ret= -((alpha/m-k)*(j^2)+k*D*j);
ret= -((alpha-k)/m*(L^2)+k*D*L);
مرسی. فعلن 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 شروع کنم یا جور دیگه باید نوشته بشه؟
شما یه دونه 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
حل شد.......................................
من برنامه بالایی رو اجرا کردم که جوابهای بالایی رو داد.
برای شما رو تازه میخوام اجرا کنم ولی این خط خطا میده :
plot(2:10,([ll' uu'](2:end,:))),grid
خطا :
??? Error: File: plot7.m Line: 27 Column: 21
Unbalanced or unexpected parenthesis or bracket.
آقا فعلن حل شد.
صبر کنید تا کدها رو مرتب کنم. نمودارا درست در اومد. :لبخندساده::تشویق::تشویق::تش یق::تشویق:
من کدها رو مرتب کردم و نمودارها رو پلات کردم. شکل(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
تا اینجا هم خیلی ازت ممنونم.
مهندس من 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
نظر شما چیه؟
مهندس یه سوال دارم.
منظور از payoff یعنی سود و revenue یعنی درآمد.
توی مقاله گفتهV-NE بیانگر درآمد کلی بدستآمده تمامی ژنراتورها در تعادل نش متقارن و V-opt معادل با ماکزیمم سود اخذشده در MG میباشد.
ما توی کدها اومدیم توی صورت کسر بجای درآمد کلی از سود ژنراتورها استفاده کردیم. به نظرتون مشکلی نداره؟
و سوال بعدیم اینه که وقتی ما برای simulated efficiency کران بالا و پایین تعریف کردیم، نباید این رو بعنوان یک قید تعریف کنیم که دیگه راندمانمون از این محدوده خارج نشه؟
مهندس به نظرم برای مخرج کسر باید از جدول (4) استفاده کنیم. وقتی میگه ماکزیمم سود اخذ شده بین میکروگریدها یعنی ائتلاف بین 4 تا میکروگریدی که وجود داره. توی جدول 3 هم همین رو در نظر گرفته. اومد سود هر میکروگرید رو توی ائتلاف 4 تایی میکروگریدها بدست آورد.
ولی یه مشکلی داریم اینه که صورت کسر یک بردار 9 عددی است و مخرج کسر یک بردار 4 عددی میشه. اینطوری میشه راندمان رو بدست آورد؟
یعنی توی این مقاله اومد دوتا موضوع جدا از هم رو بررسی کرد؟
پس همکاری بین میکروگریدها ربطی به اون شبیه سازیها و نمودارها نداره دیگه. درسته؟
خب وقتی تا حالا از این گیم و ائتلاف ها توی کدهامون استفاده نکردیم ربطی نداره دیگه!میخواستم نظر شما رو بدونم. گفتم شاید دارم اشتباه متوجه میشم.
مهندس یه سوال دارم
اگه بخوام در هر سطر عددهایی که بزرگتر از صفر هستند رو نشون بده باید چطوری بنویسم؟
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
به این دو صورت میشه انجام داد
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
و اگر هم بخوایم بگیم سطرهایی که بیشتر مساوری دوتا المان دارند رو نشون بده چی؟
توی cellarray قرار بدید.
34.1401 11.7570 7.1426
phi(Total) = 53.0398
یه سوال دیگه.
ببخشید که موضوع های این پست یکمی قاطی شد ولی دوست دارم که همه ی سوالاتم توی یک پست جواب داده بشه :)
میشه توی یک متلب یک محیط گرافیکی درست کرد؟
مثلن یه پنجره درست بشه و متنی داخلش نوشته بشه؟ میشه کد نویسی کرد؟
منظورم inputdlg و اینچیزا نیست!
مهندس ببخشید، من آرگومان 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);
اولا باید متلب ورژن جدید نصب شده باشه و ثانیا باید cddmex هم نصب شده باشه ( در فایل pdf گفته)
توی متلب 2013 هم اجرا کردم نشد.
من متلب 2009 دارم که cddmex هم نصبه. یعنی همون فایل cddmex.dll توی مسیر قرار داره که قبلن بحث شده بود و اجرا هم میشد.
الآن دستوراتی که به این فایل ربط داره اجرا میشه ولی این یکی نمیدونم مشکلش چیه!
مثلن دستورات زیر اجرا میشه :
[core_vert crst]=CddCoreVertices(bw,10^5*eps)
[acrq]=CddAntiCoreQ(bw,10^5*eps);
ولی coreplot اجرا نمیشه!
میخوام نمودار سطح رسم کنم ولی میگه مقادیر 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.
آخه مشکل اینجاست که من octave دارم و نسخه متلب ندارم که تست کنم
به اینجور نمودارا میگن نمودار سطح :
ضمیمه 124283
حالا این پارامترهایی که من توی کدم داشتم همون x,y,z هستن.
مهندس یه سوال دارم.
اگه چندتا فانکشن داشته باشیم و یک برنامه اصلی که یک متغیری به اسم m وجود داره که هم توی فانکشن ها هست، هم توی برنامه اصلی.
آیا میشه کدی نوشت که وقتی مقدار m رو توی برنامه اصلی تغییر دادم همین مقدار توی فانکشن ها هم تغییر کنه؟