فکر کنم 300 مگ
Printable View
فکر کنم 300 مگ
سلام
میدونید برای رسم این نوع تصویر از چه دستوری باید استفاده کنم؟
با plot3 که اینطوری طبقه طبقه در نمیاد! دستور خاصی داره؟؟؟
سلام، داده های شما به چه صورت هست؟
چطوری نشون بدم؟
مثلاً سه تا پارامتر دارم که هر کدوم 11000 تا عدد هستن بین 0 تا 100
یکیش رو پلات کردم :
شما لازمه ابتدا تولباکس geom3d را از این سایت دریافت کنید:
http://www.mathworks.com/matlabcentr...e/24484-geom3d
این تابع برای ترسیم استفاده کنید:
function plotSlices(NODES, level)
FACES = minConvexHull(NODES);
figure, hold on;
for i = level
PLANE = createPlane([0 0 i],[0 1 i], [ 1 1 i]) ;
SLICE = polyhedronSlice(NODES, FACES, PLANE);
fillPolygon3d(SLICE);
end
end
این هم نحوه استفاده
NODES = randn(50, 3);
plotSlices(NODES, (-1:1))
NODES که نقاط شماست و level هم که ارتفاع سطوحی هست که می خواد رسم بشه
سلام
دستت درد نکنه. نصبش کردم.
کد شما رو هم اجرا کردم ولی چرا سه بعدی نشون نمیده؟؟؟
باشه امتحان میکنم.
فعلن شبیه سازیم در حال اجراست که حدود 18 ساعت طول میکشه :)
بعد از اون تستش میکنم.
بازم ممنونم.
سلام
آقا من کد رو با داده های خودم اجرا کردم ولی خطا میده.
من سه پارامتر Kp1 , Ki1 , Kd1 دارم که هر کدوم 10857 نقطه دارند و همچنین همه بین 0 تا 100 رنجشون هست. به صورت زیر نوشتم :
load Data_Conventional
Kp1 = kp1co;
Ki1 = ki1co;
Kd1 = kd1co;
NODES = [Kp1 Ki1 Kd1];
plotSlices(NODES, (0:100))
با داده های شما اجرامیکنم پلات میکنه. ولی با داده های خودم نه. خطاش به این صورته :
??? Attempted to access px(1); index out of bounds because numel(px)=0.
Error in ==> fillPolygon3d at 71
px = [px; px(1)];
Error in ==> plotSlices at 7
fillPolygon3d(SLICE);
Error in ==> plottt3d at 10
plotSlices(NODES, (0:100))
نمیدونم دقیقا مشکل کجاست ولی سعی کنید تعداد level ها را کم کنید مثلا
10:10:90
تعداد level چه تاثیری داره و اون عکس اصلی که گذاشتم اصلن چطوری میشه فهمید که اعدا kp , ki , kd نهایتن به چه عددی ختم شد؟
چون با گذشت زمان این سه تا پارامتر هر کدوم به سمت یک عدد ثابتی میل می کنن.
منظورم از روی نمودار بود!نقل قول:
از minو max می تونید بفهمید محدوده این متغیرها چی هستند
این شکلش بصورت زیر شد ولی خب از روی نمودار چطوری میشه فهمید پارامتراش از چند به چند رفتن؟؟؟نقل قول:
این دستور هم خوبه:
FACES = minConvexHull(NODES);
drawMesh(NODES,FACES)
میشه شما هم نموداری که با اوکتاو پلات میکنید رو نشون بدین؟ (با دستور اولی)
توی اکتاو تابع fillPolygon3d کار نمی کنه و مجبورم به جای اون از drawPolygon3d استفاده کنم که چندضلعی تو خالی ایجاد میشه
اولی شکل سه بعدی
دومی پولیگونهای چند طبقه
و سومی ترکیب اون دو تا
http://www.sharefile.ir/uploads/1430785334.png
http://www.sharefile.ir/uploads/1430821213.png
http://www.sharefile.ir/uploads/1430816215.png
از شکل این جور متوجه میشم که داده های شما outlier داره بهتره نقاط را به این صورت پلات کنید
plot3(NODES(:,1),NODES(:,2),NODES(:,3),'*')
که همچین شکلی ایجاد می شه:
http://www.sharefile.ir/uploads/1430829270.png
داده های من outlier نداره. همونیه که توی پست 104 گذاشتم.
ضمن اینکه من اصلن این شکل ها رو نمیخواستم. همونی که توی پست 102 گذاشتم رو میخواستم. ولی شکل دوم شما یکمی شبیه هست. اگه نمیشه که دیگه بیخیال شید تا وقت شما هم گرفته نشه.
الان من نمیدونم مشکل چیه با مثال و شکل هم برای شما گذاشتم اگه تو متلب جواب نمیده تقصیر من نیست
سلام
مهندس اینو میشه توی اکتاو اجرا کنید؟
توی متلب که خطا میده.
Kp1 =0:60 ;
Ki1 =0:200 ;
Kd1 =0:1000 ;
NODES = [Kp1 Ki1 Kd1];
figure
plotSlices(NODES, 9 )
اینجور که نمیشه آرایه درست کرد باید سه تا ستون هم اندازه داشته باشه
اون پست قبلی را که گفتم با try انجام بدید اگه ارور داد از ارور صرفنظر کنه
NODES = randn(50, 3);
try
plotSlices(NODES, (-1:1))
catch
end
اون برنامه قبلی شما که اجرا میشه. عکسش رو توی پست 106 گذاشته بودم.
من مشکلم اینه که چرا با داده های خودم پلات نمیشه. داده ها رو بصورت ستونی درست کردم و هم اندازه هم هستن :
Kp =linspace(0,60,50)';
Ki =linspace(0,200,50)';
Kd =linspace(0,1000,50)';
% -----------------
NODES = [Kp Ki Kd];
plotSlices(NODES,(-1:1))
داده های من همین چیزی هست که گذاشتم. با try خطا نمیده ولی چیزی هم پلات نمیکنه!
Kp =linspace(0,60,50)';
Ki =linspace(0,200,50)';
Kd =linspace(0,1000,50)';
% -----------------
NODES = [Kp Ki Kd];
try
plotSlices(NODES,(-1:1))
catch
end
شما داده ها رو یکدفعه تولید کردین ولی من جدا جدا داشتم و پیش هم گذاشتم. چه فرقی میکنه؟
من تصویر اصلی رو هم از اینجا گرفتم.
مگه نگفتید یکی از پارامترها به این صورته؟
https://barnamenevis.org/attachment.p...2&d=1430328678
یه کم دارم گیج می شم
شما بالاخره تونستید پلات را به صورت سه بعدی بچرخونید؟
چرا این که میگم انجام نمیدید؟ لطفا با try اون سه تا پارامتر را با تابع plotSlices که سطوح اون 10:10:90 باشه پلات کنید. خواهشا
با drawMesh هم پلات کنید و بچرخونید و تصویر سه بعدی را اینجا بذارید
منظورت کدوم پارامترها بود؟
من با این داده ها انجام دادم :
clc; clear; close all;
Kp =linspace(0,60,50)';
Ki =linspace(0,200,50)';
Kd =linspace(0,1000,50)';
NODES = [Kp Ki Kd];
try
plotSlices(NODES, (10:10:90))
catch
end
% -------------------------------
figure
FACES = minConvexHull(NODES);
try
drawMesh(NODES,FACES)
catch
end
خطای زیر رو داد :
??? Error using ==> qhullmx
qhull precision error: initial facet 3 is coplanar with the interior point
ERRONEOUS FACET:
While executing: | qhull Qt
Options selected for Qhull 2003.1 2003/12/30:
Qtriangulate _pre-merge _zero-centrum _max-width 1e+003
Error-roundoff 1.1e-012 _one-merge 7.5e-012 _near-inside 3.7e-011
Visible-distance 2.1e-012 U-coplanar-distance 2.1e-012
Width-outside 4.3e-012 _wide-facet 1.3e-011
The input to qhull appears to be less than 3 dimensional, or a
computation has overflowed.
Qhull could not construct a clearly convex simplex from points:
The center point is coplanar with a facet, or a vertex is coplanar
with a neighboring facet. The maximum round off error for
computing distances is 1.1e-012. The center point, facets and distances
to the center point are as follows:
facet
p42
p49
p0
distance= -7.1e-015
facet
p9
p49
p0
distance= -7.1e-015
facet
p9
p42
p0
distance= 0
facet
p9
p42
p49
distance= -1.4e-014
These points either have a maximum or minimum x-coordinate, or
they maximize the determinant for k coordinates. Trial points
are first selected from points that maximize a coordinate.
The min and max coordinates for each dimension are:
0: 0 60 difference= 60
1: 0 200 difference= 200
2: 0 1000 difference= 1000
If the input should be full dimensional, you have several options that
may determine an initial simplex:
- use 'QJ' to joggle the input and make it full dimensional
- use 'QbB' to scale the points to the unit cube
- use 'QR0' to randomly rotate the input for different maximum points
- use 'Qs' to search all points for the initial simplex
- use 'En' to specify a maximum roundoff error less than 1.1e-012.
- trace execution with 'T3' to see the determinant for each point.
If the input is lower dimensional:
- use 'QJ' to joggle the input and make it full dimensional
- use 'Qbk:0Bk:0' to delete coordinate k from the input. You should
pick the coordinate with the least range. The hull will have the
correct topology.
- determine the flat containing the points, rotate the points
into a coordinate plane, and delete the other coordinates.
- add one or more points to make the input full dimensional.
Error in ==> convhulln at 71
[k,vv] = qhullmx(x', opt);
Error in ==> minConvexHull at 44
hull = convhulln(nodes);
Error in ==> plot4 at 15
FACES = minConvexHull(NODES);
به اینصورت اجرا کردم :
clc; clear; close all;
NODES = randn(50,3);
try
plotSlices(NODES, (10:10:90))
catch
end
% -------------------------------
figure
FACES = minConvexHull(NODES);
try
drawMesh(NODES,FACES)
catch
end
که دستور اولی رو پلات نکرد (خطایی هم نداد) و دستور دومی رو بصورت زیر پلات کرد :
به این صورت که انجام دادم :
clc; clear; close all;
NODES = randn(50,3);
plotSlices(NODES, (-1:1))
% -------------------------------
figure
FACES = minConvexHull(NODES);
try
drawMesh(NODES,FACES)
catch
end
هر دو رو پلات کرد ولی level اون چیزی که خواستین نیست. با اون level خطا میده که توی پست قبلی انجام دادم.
من میخوام با این رنج های زیر نموداری مثل مقاله رسم بشه :
Kp =linspace(0,60,50)';
Ki =linspace(0,200,50)';
Kd =linspace(0,1000,50)';
میشه؟؟؟
level رو میشه هر طوری انتخاب کرد؟
همه چیز را ترسیم کردید به جز اون چیزی که باید ترسیم کنید :)
از linspace استفاده نکنید
سه تا بردار دارید که یکی از اونها به این شکل هست:
https://barnamenevis.org/attachment.p...2&d=1430328678
اون سه تا را به عنوان سه ستون NODES در نظر بگیرید و با plotSlices و drawMesh ترسیم کنید و بچرخونید و حتما از try هم استفاده کنید
مگه توی اون تصویر اصلی نیومد فقط رنج پارامترها رو نشون بده؟ فکر نکنم اومده باشه که نقاط بین این دو رنج رو هم پلات کرده باشه!
به هر حال من همون چیزی که گفتید رو قرار دادم.
clc; clear; close all
load Data_Conventional
Kp =kd1co;
Ki =kp1co;
Kd =ki1co;
% -----------------
NODES = [Kp Ki Kd];
try
plotSlices(NODES,(-1:1))
catch
end
figure
FACES = minConvexHull(NODES);
try
drawMesh(NODES,FACES)
catch
end
قسمت اولی رو پلات نمیکنه ولی قسمت دومی بصورت زیر شد :
مهندس ببخشید من هنوز نتونستم کامپایلر رو نصب کنم. یعنی sdk که گفته بودی رو هم دانلود کردم ولی وسط راه یه پیغامی میده به این صورت :
ضاهراً یه فایل وجود نداره. درسته؟
اون -1:1 برای اون مثال دیگه بود واسه داده های خودتون اینجور بذارید
plotSlices(NODES,(5:5:50))
واسه نصب هم گزینه دوم را انتخاب کنیدو مسیر فولدر sdk را معرفی کنید
انجام دادم. اتفاق خاصی نیوفتاد!نقل قول:
اون -1:1 برای اون مثال دیگه بود واسه داده های خودتون اینجور بذارید
2 plotSlices(NODES,(5:5:50))
من داده ها رو توی اکسل ذخیره کنم و اینجا آپ کنم میتونید خودتون با اکتاو بررسی کنید؟
تصویر دومی که گذاشتم واسه همین بود. وقتی از مسیر کامپیوتر فراخونی میکنم خطای تصویر دوم رو میده.نقل قول:
واسه نصب هم گزینه دوم را انتخاب کنیدو مسیر فولدر sdk را معرفی کنید
ظاهرا دانلود نکردید لینکش داخل همون فایل
Win8.1SDKFiles.txt هست
http://download.microsoft.com/downlo....29750/Windows Software Development Kit-x86_en-us.msp
داده ها را بفرستید
درست شد.
ولی خب دلیلش چیه که level رو این اعداد انتخاب کردین و بر چه اساسی؟
دوم اینکه از روی نمودار حالا چطوری میشه فهمید که Kp به سمت چه عددی میل کرد؟
گفتم که از min و max استفاده کنید تا محدوده متغیر ها را متوجه بشید از روی نمودار mesh یا نمودار نقطه ای هم میشد فهمید محدوده اونها چه قدره
اینکه kp به سمت چه عددی میل کرده نمیدونم از روی نمودار که مشخصه
سلام
مهندس ببخشید. اون لینکی که واسه sdk گذاشته بودین رو دانلود کردم و توی فولدر مربوطه قرار دادم ولی همچنان همون خطا رو میده!
من فایلهایی که دانلود کردم به صورت زیره :
فایلی که شما گفتید، شماره 1 هست و چیزی که ظاهرن موقع نصب میخواد فراخونی کنه شماره 2 هست. فایله وجود داره ولی خطا میده.
نمیشه کامپایلر دیگه ای نصب کرد؟
نمیدونم مشکل کجاست. اگه بتونید توی تنظیمات folder option در ویندوز گزینه نشون دادن extension ها رافعال کنید تا مشخص بشه پسوند فایل exe هست یا msu
من خودم تا به حال این را نصب نکردم توی اون سایت لینکش را دیدم گفتم شاید به درد شما بخوره حالا اگه تو نصبش مشکل دارید فکر کنم بهتره یه عدد dvd ویژوال استادیو کامل البته همون نسخه ای که می خواهید فکر کنم 2012 بود را یه جا پیدا کنید که این سی دی ها همه جا ریخته و فراوان هست
سلام آقای مهندس. وقت شما بخیر.
ببخشید یه مشکل دیگه داشتم. من فرمول زیر رو میخوام کد بزنم و پلات کنم :
بصورت زیر نوشتم ولی توی لحظه ی صفر خطا میگیره :
clc; close all;
tic
Time=linspace(1,10,250000);
P=rand(1,250000);
soc=zeros(1,250000);
soc(0)=100;
for i=1:length(Time)
soc(i)=(soc(i-1)+(P(i)*(Time(i)-Time(i-1))))/100;
end
socc=soc';
plot(Time,socc);
toc
خطا :
??? Attempted to access soc(0); index must be a positive integer or
logical.
Error in ==> Soc at 7
soc(0)=100;
سلام
این را امتحان کنید
soc(2:end) = (soc(1:(end -1)) + P(2:end) .*deta(2:end)) * 0.01;
soc = cumsum(soc);
deta الآن چیه؟
البته من از لحظه ی اول میخوام. وگرنه از لحظه ی دوم رو بدست میارم. وقتی که بصورت زیر باشه :
soc(1)=100;
for i=2:length(Time)
soc(i)=(soc(i-1)+(P(i)*(Time(i)-Time(i-1))))/100;
end
این را امتحان کنید
P = rand(1,250000);
soc=zeros(1,250000);
soc(1) = 100;
delta = diff(1:250000);
soc(2:end) = (soc(1:(end -1)) + P(2:end) .* delta) * 0.01;
soc = cumsum(soc);