کسی نیست کمکم کنه ؟؟؟
Printable View
سلام.
مشکل در رسم نمودار هست.
من فقط با دو ستون آخر کار دارم و بقیه استفاده نمیشه.
من نمودار بصورت ستونی نمیخوام. میخوام نقاطی رو توی نمودار نشون بده که کمترین تابع هزینه رو دارن.
بصورت زیر
مثلا اگه همچین ستونی داشته باشیم که 100 تا سطر داشته باشه و بخوایم ده تا از زوج مرتب هایی که کمترین مقدار رو دارند رو رسم کنیم ، (2,3) یکی از اونها خواهد بود.
مثلا ستون اول را در محور x ها و ستون دوم را در محور y ها رسم کنید.
اگه همون فایل اکسل رو پلات کنید تصویر پایین رو خواهید داشت. ولی من فقط نقاطی که خودم با خط مشکی به هم وصل کردم رو میخوام.
در ضمن ، همه اعداد مثبت هستن.
چه مسئله جالبی!
نتیجه سعی من کدهای زیر شد. دقیقا اون چیزی که رسم کردید در نمیاد ولی امیدوارم کارتون رو راه بندازه.
تو این کدها روش کار به این صورته که ابتدا داده ها بر حسب مقدار x شون، مرتب میشن. داده ی اول و آخر رسم میشه. همچنین داده ای که دارای کمترین تابع هزینه ست رسم میشه. تا اینجا سه نقطه رسم شدن. از ابتدای بازه تا نقطه ی مینیمم بررسی میشه که آیا سایر نقاط زیر این خط (خط عبور کرده از نقطه اول و مینیمم) قرار گرفتند یا نه؟ و در صورتی که زیر خط باشن رسم میشه. این کار تا پوشش دادن تمام بازه اعداد تکرار میشه.
در قسمت بعدی این کار برای نقطه ی مینیمم تا انتهای بازه تکرار میشه.
کد اصلی (اعداد خودتون رو جایگزین کنید):
clc
clear
close
global Data
Data=[1 4
1.6 45
8 12
1.7 2
2.2 31
4 12
5.5 6
9 15
2.4 1];
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
min_inx_g=find(Data(:,2)==min(Data(:,2)));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
تابع:
function [k is_upper]=plot_min_point(i,j)global Data
is_upper=[];
for k=j-1:-1:i+1
if ~(Data(k,2)>Data(i,2)+(Data(j,2)-Data(i,2))/(Data(j,1)-Data(i,1))*(Data(k,1)-Data(i,1)))
plot(Data(k,1),Data(k,2),'ro','markersize',8)
if k==2
is_upper=0;
end
break;
else
if k==2
is_upper=1;
end
end
end
end
نمودار خروجی برای داده های خودتون:
http://www.sharefile.ir/uploads/1497905283.jpg
سلام
یه متغیر global تعریف کنید و کد رو تغییر بدید. اونجاهایی که نقاط رسم میشه، به جای رسم نمودار، نقطه رو به عنوان درایه ی جدید توی متغیر ذخیره کنید. اخرش هم اون نقطه هایی رو که نمی خواید با دستور زیر حذف کنید:
var(3,:)=[];
در انتها با استفاده از این متغیر نمودار رو رسم کنید.
این نقاطی که رسم شدن، برای دو ستون آخر هستن؟ من رسم میکنم بصورت زیر میشه :
عکس باز نشد. ولی میتونم حدس بزنم مشکل کجاست. اعداد خیلی بزرگی در بین داده های بود (10 به توان 20!). نموداری که گذاشتم بزرگنمایی یک قسمت کوچک بود تا عملکرد کد بهتر دیده بشه. در واقع نموداری رو که گذاشتم میتونید با استفاده از دستور زیر (بعد از اجرای کد یا در خط اخر کد اصلی) یا با زوم کردن تولید کنید.
axis([0 5 0 3])
پ.ن: هفت بیجار یعنی چی؟:لبخندساده: این تاپیک مخصوص سوالای خودتونه؟
آره. برای اینکه متغیر سراسری تعریف کنید دستور زیر رو در کد اصلی و کد تابع قرار بدید (بهتره قبل از مقداردهیش باشه):
global var
البته چون چند تا متغیر سراسری داریم میشه این جوری هم نوشتش:
global var Data
بعدش به جای اینکه نقطه اول رو رسم کنید (یا در کنار رسم نقطه ی اول) کد زیر رو اضافه کنید:
var(1,:)=Data(1,:)
یا در خط پنجم تابع (و همچنین در کنار رسم نقطه ی آخر)، کد زیر رو اضافه کنید:
var(end+1,:)=Data(k,:)
مهندس انجام دادم. نشد!
توی خط 31 اضافه کردم.
clc ;
clear ;
close all ;
% global Data
global var Data
Data = xlsread('C:\Users\User\Desktop\Pareto Front\2\natayej1.xlsx',1);
% save Data.mat
% load('Data.mat');
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
min_inx_g=find(Data(:,2)==min(Data(:,2)));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
var(1,:)=Data(1,:)
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
axis([0 5 0 3])
تابع هم باید تغییر کنه. اندیس ها رو فک کنم اشتباه گذاشتید. منظورم این طوری بود:
کد اصلی:
clc
clear
close
global Data var
Data=[1 4
1.6 45
8 12
1.7 2
2.2 31
4 12
5.5 6
9 15
2.4 1];
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
var(1,:)=Data(1,:);
min_inx_g=find(Data(:,2)==min(Data(:,2)));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
var(end+1,:)=Data(min_inx_g,:);
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
min_inx=min_inx_g;
var(end+1,:)=Data(end,:);
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
var=sortrows(var);
% axis([0 5 0 3])
تابع:
function [k is_upper]=plot_min_point(i,j)
global Data var
is_upper=[];
for k=j-1:-1:i+1
if ~(Data(k,2)>Data(i,2)+(Data(j,2)-Data(i,2))/(Data(j,1)-Data(i,1))*(Data(k,1)-Data(i,1)))
plot(Data(k,1),Data(k,2),'ro','markersize',8)
var(end+1,:)=Data(k,:);
if k==2
is_upper=0;
end
break;
else
if k==2
is_upper=1;
end
end
end
end
البته برای داده های خودتون باید تغییرش بدید.
مهندس سلام.
ببخشید این کد مگه نقاط دو ستون آخر رو پلات نمیکنه؟؟؟
پس چرا اون نقاط مرزی که با قرمز مشخص شده توی دو ستون آخر نیست؟
داده هام رو با دو فرمت mat و xlsx در لینک زیر قرار دادم:
سلام
اون کد، مینیمم داده های زیر رو رسم میکنه:
Data=[1 4 1.6 45 8 12
1.7 2
2.2 31
4 12
5.5 6
9 15
2.4 1];
همون تغییراتی که توی کد اول اعمال کردید، روی این هم اعمال کنید تا داده های خودتون رو رسم کنه. مثلا این خط:
Data = xlsread('C:\Users\User\Desktop\Pareto Front\2\natayej1.xlsx',1);
ضمنامتوجه نشدم منظورتون از نقاط مرزی رو کدومه ...
منظورم همون نقاطی بود که با دایره قرمز مشخص میشه!
منم همینکار رو کردم. یعنی داده های خودم رو قرار دادم.
به صورت زیر پلات شد ولی نقاطش توی ستون end و end-1 وجود نداره!
یه سوال دیگه هم دارم اینه که چطوری میتونم یه ماتریسی که با فایل dat ذخیره شده رو به اکسل تبدیل کنم؟
من با دستور زیر انجام میدم ولی خطا میده :لینک داده :
xlswrite('natayej.xlsx',matt)
http://www.sharefile.ir/uploads/1498708715.rar
مگه میشه؟؟! برای رسم نمودار از نقطه های فایلی که دادید استفاده شده. امکان نداره که نقطه ی جدیدی رسم بشه. مطمئنید توی لیست اعداد نیست؟
اگه داده هاتون با فرمت mat ذخیره شده، میتونید با کد زیر اونو باز کنید:
x=open('C:\temp\data.mat');
و با کد زیر ذخیره کنید:
xlswrite('natayej.xlsx',x.matt)
میشه همین داده هایی که گذاشتم رو شما خودتون پلات کنید؟
من دقیقا کاری انجام دادم که شما گفتید.
آدرس دیتا خودم رو دادم کد رو اجرا کردم.
به نظرم مشکل از تکراری بودن ستون آخر در بین داده ها بود. این کد رو امتحان کنید:
clc
clear
close
global Data var
Data1=xlsread('C:\Users\Mohsen\Desktop\natayej1.xl sx',1);
Data=Data1(:,end-1:end);
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
var=zeros(1,2);
var(1,:)=Data(1,:);
min_inx_g=max(find(Data(:,2)==min(Data(:,2))));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
var(end+1,:)=Data(min_inx_g,:);
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
min_inx=min_inx_g;
var(end+1,:)=Data(end,:);
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
var=sortrows(var);
% axis([0 5 0 3])
اگه بازم مشکلی بود، نقطه ای که داره به داده هاتون اضافه میشه رو بگید و روی نمودار مشخص کنید.
سلام دوستان.
ببخشید من یه ماتریس 10 در 10 دارم که میخوام اینو بین 0 تا 1 نرمالیزه کنم و بعد از انجام کارم دوباره اون رو به اعداد اصلی برگردونم.
به چه صورتی باید کد زد؟
سلام دوست عزیز
نمیدونم درست متوجه شدم یا نه؟ این کد رو ببینید:
clc
clear
a=100*rand(10,10)
m=max(max(a));
a=a/m % normalized
a=a*m % anormalized!
پ.ن: حالا دیدم که حل شد :)
سلام.
میخوام با متلب به وبکم دوربین دسترسی داشته باشم و در هر 10 ثانیه برای مدت یک دقیقه یه عکس بگیره و اون عکس رو به چهار قسمت (4 برش) تبدیل کنه.
کسی هست کمکم کنه؟
سلام.
کسی میتونه راهنمایی کنه بگه این معادله دیفرانسیل چطوری حل میشه؟
http://www.sharefile.ir/uploads/1562455634.jpg
کدش رو بصورت زیر نوشتم ولی خطا میده!
clc
syms T(t)
syms R
syms U
M=1 ; Cp=2 ; I=3 ; h=4 ; A=5; Tinf=25 ;
% dsolve('DT=(1/M.Cp).*((I^2*R+I*T*U)-(h*A(T-Tinf)))','t')
o = diff(T) == (1/(M.Cp)).*(((I.^2*R)+(I*T*U))-(h*A(T-Tinf)));
T(t) = dsolve(o,'T(0)=1')
خطا :
نقل قول:
Dot indexing is not supported for variables of this type.
Error in diffffff (line 11)
o = diff(T) == (1/(M.Cp)).*(((I.^2*R)+(I*T*U))-(h*A(T-Tinf)));