PDA

View Full Version : جریان در لوله



hojjat1
دوشنبه 22 مهر 1392, 20:26 عصر
سلام
من یه ماتریس با تابع رندوم درست کردم طوری که تمام درایه هاش 0 یا 1 حالا میشه کدی رو نوشت که درایه هایی که یک هستن رو به هم وصل کنه مثل لوله های اب اونای که یکن جریان داریم اونای که صفرن جریان نداریم.

ممنون میشم کمک کنید یا هر روشی دیگه رو بگید.

rahnema1
دوشنبه 22 مهر 1392, 23:03 عصر
سلام
من یه ماتریس با تابع رندوم درست کردم طوری که تمام درایه هاش 0 یا 1 حالا میشه کدی رو نوشت که درایه هایی که یک هستن رو به هم وصل کنه مثل لوله های اب اونای که یکن جریان داریم اونای که صفرن جریان نداریم.

ممنون میشم کمک کنید یا هر روشی دیگه رو بگید.

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

hojjat1
سه شنبه 23 مهر 1392, 18:04 عصر
ببینید کد رو خیلی ساده گرفتم فعلا بعدا کد نرمال رو وارد می کنم
clear all
clc
ax=1;
by=1;
nax=10;
nby=10;
x=linspace(0,ax,nax);
y=linspace(0,by,nby);
[X,Y]=meshgrid(x,y);
z=rand(nax,nby);
for i=1:nby
for j=1:nax
if z(i,j)>=0.4
z(i,j)=1;
else
z(i,j)=0;
end
end
end
Z=z
حالا یه ماتریس داریم سوال من نوشتن کد ویژال واسه یک ها و حذف کردن صفرا

rahnema1
چهارشنبه 24 مهر 1392, 00:28 صبح
دستور gplot این کار رو انجام میده فقط باید ماتریس همجواری ساخته بشه که کدش رو می ذارم
البته گراف ممکنه به نظر برسه که سروته هست ولی این بعلت اینه که اندیس ماتریس از بالا به پایینه ولی
مختصات y گراف از پایین به بالاست که می تونی دستور ( flipud(Z رو بزنی


arr=Z;
ind=[0,-1;-1,0;1,0;0,1];
c=columns(arr)
r=rows(arr)
inde=reshape(1:c*r,c,r)';
adj=zeros(r*c);
for i=1:r
for j=1:c
for w=1:4
if(i+ind(w,1)>0 &j+ind(w,2)>0&i+ind(w,1)<r+1 & j+ind(w,2)<c+1)
if(arr(i,j)==1&arr(i+ind(w,1),j+ind(w,2))==1)
adj(inde(i,j),inde(i+ind(w,1),j+ind(w,2)))=1;
end
end
end
end
end
[m,n]=find(ones(r,c));
gplot(adj,[m,n]);

hojjat1
چهارشنبه 24 مهر 1392, 12:15 عصر
سلام دوست عزیز خطا میده
Undefined function or method 'column' for input arguments of type 'double'
ممنون که وقت گذاشتی

rahnema1
چهارشنبه 24 مهر 1392, 19:03 عصر
ببخشید به جای columns باید بذاریم cols که البته توی octave جواب میده


arr=Z;
ind=[0,-1;-1,0;1,0;0,1];
c=cols(arr)
r=rows(arr)
inde=reshape(1:c*r,c,r)';
adj=zeros(r*c);
for i=1:r
for j=1:c
for w=1:4
if(i+ind(w,1)>0 &j+ind(w,2)>0&i+ind(w,1)<r+1 & j+ind(w,2)<c+1)
if(arr(i,j)==1&arr(i+ind(w,1),j+ind(w,2))==1)
adj(inde(i,j),inde(i+ind(w,1),j+ind(w,2)))=1;
end
end
end
end
end
[m,n]=find(ones(r,c));
gplot(adj,[m,n]);

hojjat1
چهارشنبه 24 مهر 1392, 20:00 عصر
میکم فایده نداره :تشویق:یه الگوریتمی دیگه نوشتم فقط مونده مقادیر ماتریس رو وارذ شبکه بشه؟بعدش پلات بشه

hojjat1
چهارشنبه 24 مهر 1392, 20:29 عصر
clear all
clc
ax=1;
by=1;
nax=10;
nby=10;
% Draw large bounding box
xstart = 0;
ystart = 0;
xlen = ax;
ylen =by;
rectangle('position', [xstart, ystart, xlen, ylen])
% Draw smaller boxes
dx = 1/nax;
dy = 1/nby;
nx = floor(xlen/dx);
ny = floor(ylen/dy);
for i = 1:nx
x = xstart + (i-1)*dx;
for j = 1:ny
y = ystart + (j-1)*dy;
rectangle('position', [x, y, dx, dy])
end
end
K=rand(nax,nby);
for i=1:nby
for j=1:nax
if K(i,j)>=0.2
K(i,j)=1;
else
K(i,j)=0;
end
end
end
k=K;
حالا چطور میشه 0 و 1 ماتریس رو داخل مربع کوچیک گذاشت بعد با دستور پلات مشخص کرد جریانو چونکه با پلات یه اختلاف رنگ بوجود میاد ؟

rahnema1
چهارشنبه 24 مهر 1392, 22:58 عصر
clear all
clc
nax=10;
nby=10;
K=rand(nax,nby);
for i=1:nby
for j=1:nax
if K(i,j)>=0.2
K(i,j)=1;
else
K(i,j)=0;
end
end
end
k=K;
ax=1;
by=1;
ccc=["r","g"];
% Draw large bounding box
xstart = 0;
ystart = 0;
xlen = ax;
ylen =by;
rectangle('position', [xstart, ystart, xlen, ylen])
% Draw smaller boxes
dx = 1/nax;
dy = 1/nby;
nx = floor(xlen/dx);
ny = floor(ylen/dy);
for i = 1:nx
x = xstart + (i-1)*dx;
for j = 1:ny
y = ystart + (j-1)*dy;
rectangle('position', [x, y, dx, dy],'FaceColor', ccc(k(i,j)+1))
end
end

hojjat1
چهارشنبه 24 مهر 1392, 23:39 عصر
سلام ممنون از اینکه جواب میدی دوباره خطا داد:
??? Undefined function or method 'ccc' for input arguments of type 'double'.

Error in ==> Untitle1d at 34
rectangle('position', [x, y, dx, dy],'FaceColor', ccc(k(i,j)+1))

??? Error: File: Untitle1d.m Line: 18 Column: 6
The input character is not valid in MATLAB statements or expressions.

rahnema1
پنج شنبه 25 مهر 1392, 00:08 صبح
clear all
clc
nax=10;
nby=10;
K=rand(nax,nby);
for i=1:nby
for j=1:nax
if K(i,j)>=0.2
K(i,j)=1;
else
K(i,j)=0;
end
end
end
k=K;
ax=1;
by=1;
ccc=['r','g'];
% Draw large bounding box
xstart = 0;
ystart = 0;
xlen = ax;
ylen =by;
rectangle('position', [xstart, ystart, xlen, ylen])
% Draw smaller boxes
dx = 1/nax;
dy = 1/nby;
nx = floor(xlen/dx);
ny = floor(ylen/dy);
for i = 1:nx
x = xstart + (i-1)*dx;
for j = 1:ny
y = ystart + (j-1)*dy;
rectangle('position', [x, y, dx, dy],'FaceColor', ccc(k(i,j)+1))
end
end

ASedJavad
پنج شنبه 25 مهر 1392, 00:45 صبح
سلام
MATLAB مخفف دو کلمه MATrix LABoratory به معنای آزمایشگاه ماتریسی هست.
و این یعنی اساس کار متلب، ماتریسها هستند. یعنی اینکه اگه میخواید برنامتون بیشترین سرعتو داشته باشه، کار رو ببرید به فضای ماتریسی.
او این یعنی تا حد امکان سعی کنید از حلقه ها استفاده نکنید.
مثلا تو این کدی که دوست عزیز آقا حجت گذاشتن:
خیلی راحت میشه این ده خط دستور رو که:

for i=1:nby
for j=1:nax
if K(i,j)>=0.2
K(i,j)=1;
else
K(i,j)=0;
end
end
end
k=K;
با یه خط دستور جابجا کرد:

k=(K>=0.2)

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

hojjat1
پنج شنبه 25 مهر 1392, 12:14 عصر
سلام دوست عزیز ممنون:تشویق:
میتونی در مورد خط 18 و34 بهم یه توضیح بدی

hojjat1
پنج شنبه 25 مهر 1392, 12:15 عصر
سلام دوست عزیز ممنون:تشویق:
میتونی در مورد خط 18 و34 بهم یه توضیح بدی

راستی رنگ قرمز یعنی عدد 1

rahnema1
پنج شنبه 25 مهر 1392, 16:31 عصر
سلام دوست عزیز ممنون:تشویق:
میتونی در مورد خط 18 و34 بهم یه توضیح بدی

راستی رنگ قرمز یعنی عدد 1

هر جا تو ماتریس صفر بود بذار قرمز هر جا هم یک بود بذار سبز

hojjat1
پنج شنبه 25 مهر 1392, 18:23 عصر
خیلی ممنون ایشا لا سوالای دیگه:لبخند: