मैं मैटलैब में 3D बेलनाकार निर्देशांक में एक फ़ंक्शन को परिभाषित करने का प्रयास कर रहा हूं, और फिर इसे परिवर्तित करने के लिए प्लॉटिंग उद्देश्यों के लिए 3डी कार्टेशियन।

enter image description here

उदाहरण के लिए, यदि मेरा कार्य केवल रेडियल निर्देशांक r पर निर्भर करता है (मान लें कि सरलता के लिए रैखिक रूप से कहें), तो मैं निम्नलिखित की तरह f = 70 के मान पर एक 3D समस्थानिक प्लॉट कर सकता हूं:

x = linspace(-10,10,100);
y = linspace(-10,10,100);
z = linspace(-2,2,100);

[X,Y,Z] = meshgrid(x,y,z);
R = sqrt( X.^2 + Y.^2 ); % Calculate the radius for each [x,y] coordinate pair

f = 100*R; % Calculate the function f, dependent only on the radius

isosurface(X,Y,Z,f,70);

enter image description here

हालाँकि, चूंकि फ़ंक्शन केवल r पर निर्भर करता है, मुझे इसके बजाय केवल r समन्वय के लिए एक वेक्टर को परिभाषित करने में सक्षम होना चाहिए, और इसके बजाय f की गणना करना चाहिए:

r = 0:0.1:1 ;   % define radial coordinate
f = 100*r ;     % make the function linearly dependent on radial coorindate for simplicity

मेरा उद्देश्य अब केवल r और f जानने के आधार पर एक समद्विबाहु रेखांकन करना है। मैं z और थीटा निर्देशांक का एक सदिश निर्दिष्ट करना चाहूंगा, शायद इस तरह

z = linspace(-2,2,100);
theta = linspace(0,2*pi,50);

और [x, y, z] निर्देशांक उत्पन्न करने के लिए r के साथ इनका उपयोग करें। इसके अलावा, f अब पहले उदाहरण की तरह 3D सरणी के बजाय 1D सरणी है, इसलिए किसी तरह f को फिर से आकार देने की आवश्यकता है?

इसका कारण यह है कि मैं कई बार लूप के अंदर f पर जोड़तोड़ करने की कोशिश कर रहा हूं, और पहले मामले के साथ इसका परिणाम 3D मैट्रिक्स पर कई ऑपरेशनों में होता है, जो बहुत धीमा है। मैं इसके बजाय 1 डी वेक्टर पर संचालन करना चाहता हूं, और केवल प्लॉटिंग के लिए 3 डी संस्करण उत्पन्न करना चाहता हूं।

मुझे आशा है कि मेरा प्रश्न स्पष्ट है। मुझे नहीं लगता कि pol2cart फ़ंक्शन वह करता है जो मैं चाहता हूं, लेकिन मैं गलत हो सकता हूँ।

0
teeeeee 3 पद 2020, 20:21

1 उत्तर

सबसे बढ़िया उत्तर

4D डेटा का प्रतिनिधित्व करना काफी कठिन कार्य है। आप उल्लेख करते हैं कि आप isosurface फ़ंक्शन के साथ 4D डेटा की कल्पना करना चाहते हैं। दूसरा विकल्प है, रंग पैमाने का उपयोग करके चौथे चर का प्रतिनिधित्व करना, स्लाइस फ़ंक्शन।

इन कार्यों के साथ समस्या यह है कि वे कार्तीय निर्देशांक [एक्स, वाई, जेड] के लिए काम करते हैं। आपको क्या करना है, इन 4D डेटा का प्रतिनिधित्व करने के लिए फ़ंक्शंस का उपयोग करने से पहले, कार्टेशियन निर्देशांक में अपने डेटा को अपने डोमेन में इंटरपोलेट करना है, जैसा कि यहां या यहां

अनिवार्य रूप से, आप किसके साथ समाप्त होते हैं:

% generate mesh in cylindrical coordinates
theta = linspace(0,2*pi,50);
r = 0:0.1:1;
z = linspace(-2,2,100);

[Theta,R,Z] = meshgrid(theta,r,z);

% Evaluate function in cylindrical coordinates
f = 100*r; % f is function only of radial coordinate
f = f'; % make sure f is column vector
f = repmat(f,1,length(theta),length(z)); % f must be 3D matrix to plot surface

% transform to cartesian coordinates
[X,Y,Z] = pol2cart(Theta,R,Z)

[xg, yg, zg] = meshgrid(linspace(-1,1,20),linspace(-1,1,20),linspace(-2.1,2.1,20));

Px = squeeze(X);
Py = squeeze(Y);
Pz = squeeze(Z);
v = squeeze(f);
F = scatteredInterpolant([Px(:) Py(:) Pz(:)],v(:),'linear','nearest');

f_interp = F(xg,yg,zg);

और अब आप 4D डेटा की कल्पना करने के लिए किसी भी फ़ंक्शन का उपयोग कर सकते हैं:

isosurface(xg,yg,zg,f_interp,70);

आप अपने डेटा को scatteredinterpolant फ़ंक्शन या griddata फ़ंक्शन, जो भी आपको सबसे अच्छा लगे।

1
Thales 4 पद 2020, 13:08