Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

3D matrix manipulation problems

Asked by Tom on 19 Sep 2013
Latest activity Commented on by Tom on 20 Dec 2013

I struggle with this generally and have come up against a barrier again.

I'm trying to create vibrational mode functions for a rectangular membrane. The equation is simple enough: -

 W_n = sin(x*pi*i/L_x)*sin(y*pi*i/L_y)

Here's where I'm up to: -

L_x             = 27.4e-3;  %membrane width (m)
L_y             = 27.4e-3;  %membrane height (m)
N_x             = 10;       %no. of eigenfreqs considered in x dimension
N_y             = 10;       %no. of eigenfreqs considered in y dimension
N               = N_x*N_y;  %total no. of eigenfreqs considered
x               = (linspace(0.5*L_x/N_x,L_x - 0.5*L_x/N_x,N_x))'; 
                            %membrane x-dimension mapping points
                            %each at the centre of an element
y               = (linspace(0.5*L_y/N_y,L_y - 0.5*L_y/N_y,N_y));  
                            %membrane y-dimension mapping points
                            %each at the centre of an element
x_ref           = 1:length(x);
y_ref           = 1:length(y);
W_n             = zeros(N_x,N_y,N);
W_n(:,:,01)     = (sin(x(x_ref,:,:)*1*pi/L_x)...
                   *sin(y(:,y_ref,:)*1*pi/L_y));
W_n(:,:,02)     = (sin(x(x_ref,:,:)*1*pi/L_x)...
                   *sin(y(:,y_ref,:)*2*pi/L_y));
W_n(:,:,18)     = (sin(x(x_ref,:,:)*2*pi/L_x)...
                   *sin(y(:,y_ref,:)*8*pi/L_y));
W_n(:,:,46)     = (sin(x(x_ref,:,:)*5*pi/L_x)...
                   *sin(y(:,y_ref,:)*6*pi/L_y));            
W_n(:,:,89)     = (sin(x(x_ref,:,:)*9*pi/L_x)...
                   *sin(y(:,y_ref,:)*9*pi/L_y));            
W_n(:,:,100)    = (sin(x(x_ref,:,:)*10*pi/L_x)...
                   *sin(y(:,y_ref,:)*10*pi/L_y));            

The numbers on the left hand side - 01, 02, 18, 46, 89, 100 - actually need to be 1,2,3,...,100, i.e.

n               = 1:100;    %mode number counting from 1 to 100

These refer to the mode numbers - although this is a bit odd - but still not too complicated. Basically if n = 01, then the mode is (1,1). If n = 59 the mode is (6,9), i.e. i = 6 & j = 9. I have solved this using the following: -

i               = floor((n/10 - n/1000)) + 1;       
                            %mode number from 1 to 10 in x dimension
j               = n - 10*(floor((n/10 - n/1000)));  
                            %mode number from 1 to 10 in y dimension

Now I just need to put n, i and j into my W_n equation, but I can't figure out how!

Any help would be greatly appreciated :)

0 Comments

Tom

Products

1 Answer

Answer by Simon on 19 Sep 2013
Accepted answer

Hi!

I don't understand why the x and y spacing depends on the number of modes/frequencies.

Take a look at the following code:

L_x             = 27.4e-3;  %membrane width (m)
L_y             = 27.4e-3;  %membrane height (m)
N_x             = 5;       %no. of eigenfreqs considered in x dimension
N_y             = 10;       %no. of eigenfreqs considered in y dimension
N               = N_x*N_y;  %total no. of eigenfreqs considered
NumX = 50; % number of mapping points in x-direction
NumY = 50; % number of mapping points in y-direction
% create X and Y array in 2d
[X,Y] = meshgrid(...
    (linspace(0.5*L_y/NumY, L_y - 0.5*L_y/NumY, NumY)), ...
    (linspace(0.5*L_x/NumX, L_x - 0.5*L_x/NumX, NumX)));
% modify X and Y array for 3d
XFull = repmat(X, [1 1 N]);
YFull = repmat(Y, [1 1 N]);
% create mode array for X
Mx = ones(NumX, NumY, N_y);
MxFull = [];
for n = 1:N_x
    MxFull = cat(3, MxFull, n*Mx);
end
% create mode array for Y
My = ones(NumX, NumY);
MyFull = [];
for n = 1:N_y
    MyFull = cat(3, MyFull, n*My);
end
MyFull = repmat(MyFull, [1 1 N_x]);
% modes for each direction
Wx_n = arrayfun(@(x,mx) sin(x .* (mx *pi/L_x)), XFull, MxFull);
Wy_n = arrayfun(@(y,my) sin(y .* (my *pi/L_x)), YFull, MyFull);
% superposition of modes
W_n = Wx_n .* Wy_n;
% plot
figure(1); cla
surface(W_n(:,:,23));

7 Comments

Tom on 19 Sep 2013

That's perfect - thank you!!

Tom on 20 Dec 2013

Hi again Simon, I'm just getting into this again and I've noticed that when I examine the 1st mode, it appears off-centre - whereas it should be completely central on the membrane.

This can be seen when the end of the surface command is

 W_n(:,:,1);

Do you know why this is?

Many thanks,

Tom

Tom on 20 Dec 2013

I think I may have solved this by using

 (linspace(L_y/NumY, L_y, NumY))

instead of

 (linspace(0.5*L_y/NumY,L_y - 0.5*L_y/NumY,NumY))

Do you think this solution is correct?

Thanks

Simon

Contact us