Rectangular Membrane Fundamental Modes Of vibration

Manipulate[
Module[{xx,yy,opt={PerformanceGoal->"Quality",ImageMargins->1},r,r0,c0,a00,b00,color0},
c0=Sqrt[tension*1000/(ρ0*10^6)];
a00=a0/1000; (*mm to meter*)
b00=b0/1000;
r=w[x,y,a00,b00,m0,n0,c0,t,t0]; (*saved for tooltip to show analytical form*)
r0=r/.{t->t0,x->xx,y->yy}; (*used for plotting*)
Which[
color==1,color0=Automatic,
color==2,color0=(ColorData["TemperatureMap"][#3]&),
color==3,color0=Function[{x,y,z},Hue[z]],
color==4,color0="BlueGreenYellow",
color==5,color0="Rainbow",
color==6,color0=Function[{x,y},ColorData["NeonColors"][y]]
];

Grid[{
{
Which[plotType=="3D",

Plot3D[Tooltip[Evaluate@r0,Text[Style[TraditionalForm[r],12]]],{xx,0,a00},{yy,0,b00},
Evaluate@opt,
ImageSize->{350,436},
PlotRange->{{0,a00},{0,b00},{-yMax,yMax}},
Mesh->meshLines,
AxesLabel->{x,y,u},
PreserveImageOptions->True,
(*RotationAction->"Clip",*)
SphericalRegion->True,
PlotStyle->Directive[Opacity[opacity]],
ColorFunction->color0,
ImagePadding->{{25,5},{10,10}}],

plotType=="contour",

ContourPlot[Evaluate@r0,{xx,0,a00},{yy,0,b00},
Evaluate@opt,
ImageSize->{350,436},
FrameLabel->{{y,None},{x,None}},
ColorFunction->"Pastel",
ImagePadding->30,
FrameTicksStyle->8,
Contours->contoursLines],

plotType=="both",

Grid[{
{Plot3D[Tooltip[Evaluate@r0,Text[Style[TraditionalForm[r],12]]],{xx,0,a00},{yy,0,b00},
Evaluate@opt,
ImageSize->{350,210},
PlotRange->{{0,a00},{0,b00},{-yMax,yMax}},
Mesh->meshLines,
ImagePadding->{{25,5},{10,10}},
PreserveImageOptions->True,
SphericalRegion->True,
PlotStyle->Directive[Opacity[opacity]],
AxesLabel->{x,y,u}]
},
{
ContourPlot[Evaluate@r0,{xx,0,a00},{yy,0,b00},
Evaluate@opt,
ImageSize->{350,210},
FrameLabel->{{y,None},{x,None}},
ColorFunction->"Pastel",
ImagePadding->30,
FrameTicksStyle->8,
Contours->contoursLines]
}
},Spacings->{0,0},Alignment->Center
]
]
,SpanFromLeft}
},Alignment->Center,Spacings->0
]
],
Text@Grid[{
{
Style[TraditionalForm[Defer[D[u[x,y,t],{x,2}]+D[u[x,y,t],{y,2}]]==Defer[HoldForm[1/c^2] D[u[x,y,t],{t,2}]]],14],SpanFromLeft
},
{
Grid[{
{Grid[{
{
Row[{Style[TraditionalForm[Defer[HoldForm[(Subscript[ω, mn])=c π (Sqrt[((m^2)/(a^2))+((n^2)/(b^2))])]]],14],Spacer[3],"(hz)"}]
},
{
Dynamic[getW[Sqrt[tension/ρ0],a0/1000,b0/1000]]
}
},Spacings->.1
]
},
{
Dynamic[Grid[
{
{Row[{Style["c",Italic,12],Spacer[2],"(m/s)"}],Row[{λ," = ",Style[a/b,Italic]}]},
{padIt2[Sqrt[tension/ρ0],{4,2}],padIt2[N[a0/b0],{4,2}]}
},Frame->All,FrameStyle->Directive[Thickness[.001],Gray],Spacings->{.8,.4}
]]
}
},Alignment->Center,Spacings->{.1,.1}
]
},
{Grid[{
{
Grid[{
{
Style["T",Italic,12],
Manipulator[Dynamic[tension,{tension=#}&],{0.1,10,0.1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[tension,{3,1}]],"N/mm"
},
{
Style[ρ,Italic,12],
Manipulator[Dynamic[ρ0,{ρ0=#}&],{0.1,2,0.1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[ρ0,{2,1}]],"kg/(mm^2)"
},
{
Style["a",Italic,12],
Manipulator[Dynamic[a0,{a0=#}&],{10,1000,1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[a0,4]],"mm"
},
{
Style["b",Italic,12],
Manipulator[Dynamic[b0,{b0=#}&],{10,1000,1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[b0,4]],"mm"
}
},Spacings->{.4,0},Alignment->Left
]
}
},Spacings->{.5,.6},Alignment->Center
],SpanFromLeft
},
{
Grid[{
{
Grid[{
{Item[Style["modes to excite",12],Alignment->Center],SpanFromLeft},
{
Grid[{
{Style["m",Italic,12],
TogglerBar[Dynamic[m0,{m0=#}&],Range[5]]
},
{Style["n",Italic,12],
TogglerBar[Dynamic[n0,{n0=#}&],Range[5]]
}
},Spacings->{.3,.2},Alignment->Left
]
}
},Spacings->{.5,.6},Alignment->Center
],

Grid[{
{
Style["plot type",10],
PopupMenu[Dynamic[plotType,{plotType=#}&],
{ 
"3D"->Style["3D plot",10],
"contour"->Style["contour plot",10],
"both"->Style["3D+contour",10]
},ImageSize->All
]
}
,
{
Style["3D color",10],
PopupMenu[Dynamic[color,{color=#}&],
{ 
1,
2,
3,
4,
5,
6
},ImageSize->All
]
}
},Spacings->{0.2,0.1},Alignment->Left
]

}
},Spacings->{.3,.6},Alignment->Center,Frame->True,FrameStyle->Directive[Thickness[.001],Gray]
]
}
,
{
Grid[{
{
Grid[{
{
Text@"animate",Trigger[Dynamic[t0,{t0=#}&],{0,10000},AnimationRepetitions->Infinity,AnimationRate->10,ImageSize->Tiny,AppearanceElements->{"TriggerButton","PauseButton","ResetButton"},DisplayAllSteps->True],Dynamic[padIt2[t0,{7,2}]]," sec"
},
{Text@"plot range",Manipulator[Dynamic[yMax,{yMax=#}&],{0.1,15,0.1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[yMax,{3,1}]]," m"
},
{Text@"mesh lines",Manipulator[Dynamic[meshLines,{meshLines=#}&],{0,20,1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[meshLines,2]]
},
{Text@"opacity",Manipulator[Dynamic[opacity,{opacity=#}&],{0.01,1,0.01},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[opacity,{2,2}]]
},
{
Text@"contour lines",
Manipulator[Dynamic[contoursLines,{contoursLines=#}&],{1,16,1},ImageSize->Small,ContinuousAction->True],Dynamic[padIt2[contoursLines,2]],""
}
},Spacings->{.3,.1},Alignment->Left
]
}
},Spacings->{.5,.6},Alignment->Center,Frame->False],SpanFromLeft
}

},Alignment->Center,Spacings->{0.5,.4},Frame->True,FrameStyle->Directive[Thickness[.001],Gray]
],

{{color,1},None},
{{tension,0.1},None},
{{ρ0,1},None},
{{opacity,.8},None},
{{yMax,1.6},None},
{{t0,0},None},
{{a0,100},None},
{{b0,100},None},
{{m0,{1}},None},
{{n0,{1}},None},
{{meshLines,10},None},
{{plotType,"3D"},None},
{{contoursLines,10},None},

SynchronousUpdating->False,
Alignment->Center,
ImageMargins->2,(*important*)
FrameMargins->1,
SynchronousInitialization->True,
ContinuousAction->False,
Alignment->Center,
Paneled->True,
Frame->False,
AutorunSequencing-> Automatic,

ControlPlacement->Left,
Initialization:>
{
integerStrictPositive=(IntegerQ[#]&&#>0&);
integerPositive=(IntegerQ[#]&&#≥0&);
numericStrictPositive=(Element[#,Reals]&&#>0&);
numericPositive=(Element[#,Reals]&&#≥0&);
numericStrictNegative=(Element[#,Reals]&&#<0&);
numericNegative=(Element[#,Reals]&&#≤0&);
bool=(Element[#,Booleans]&);
numeric=(Element[#,Reals]&);
integer=(Element[#,Integers]&);

(*--------------------------------------------*)
(* helper function for formatting             *)
(*--------------------------------------------*)
padIt1[v_?numeric,f_List]:=AccountingForm[Chop[v] ,f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
(* helper function for formatting             *)
(*--------------------------------------------*)
padIt2[v_?numeric,f_List]:=AccountingForm[Chop[v] ,f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];
padIt2[v_?numeric,f_Integer]:=AccountingForm[Chop[v] ,f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
w[x_,y_,a_,b_,mm_,nn_,c_,t_,t0_]:=Module[{m,n,f},
Sum[Sum[
If[MemberQ[mm,m]&&MemberQ[nn,n],
f=N@freq[c,a,b,m,n];
Sin[((m Pi x)/a)]Sin[((n Pi y)/b)]If[t0==0,1,(Cos[f t]+Sin[f t])],0],
{m,1,5}],
{n,1,5}]
];
(*--------------------------------------------*)
freq[c_,a_,b_,m_,n_]:=Pi c(Sqrt[((((m/a)))^2)+((((n/b)))^2)]);
(*--------------------------------------------*)
getW[c_,a_,b_]:=Module[{m,n,g,wmn},
g=Table[0,{6},{6}];
wmn=Table[padIt2[N@freq[c,a,b,m,n]/(2*Pi),{6,2}],{m,1,5},{n,1,5}];
g[[1,All]]={"",1,2,3,4,5};
g[[All,1]]={"",1,2,3,4,5};
g[[2;;,2;;]]=wmn;
g[[1,1]]=Style["n\\m",Italic];
Grid[g,Frame->All,FrameStyle->Directive[Thickness[.001],Gray],Spacings->{.8,.8}]
];

}

]

This is an animates of 2D membrane vibration for a selected combination of modal vibration shapes. The membrane is fixed on all four edges. You can select any combination of the first five spatial modes (m,n). The fundamental mode is given by m=1 and n=1. The PDE is given by (∇^2)u=(1/(c^2))(((∂^2)u)/(∂(t^2))) where u(x,y,t)is the amplitude of membrane. You can change the width and length of the membrane using the sliders, change the tension and surface density and see the new motion played in time. 3D and contour plots are available. The contour plot can be used to observe the modal shape lines as is commonly displayed in text books diagrams on this subject.

The characteristic frequencies for 2D membrane motion are given by (Subscript[ω, mn])=c π (Sqrt[((m^2)/(a^2))+((n^2)/(b^2))]) where a is the length in the x dimension and b is the length in the y direction. These characteristic frequencies also called the eigenvalues of the solution. These are the frequencies that the membrane vibrates with in time. The spatial frequencies are given by ((mπ)/a) and ((nπ)/a) along the x  and y directions respectively.

The full solution of the PDE is made up of the spatial and time parts of the solution (obtained using separation of variables method) and is given by (∑_(m=1)^∞)(∑_(n=1)^∞)((Subscript[A, mn]) cos((Subscript[ω, mn])t)+(Subscript[B, mn]) sin((Subscript[ω, mn])t))sin(((mπx)/a))sin(((nπx)/b)). The coefficients (Subscript[A, mn]) and (Subscript[B, mn]) are found from initial conditions. To simplify this demonstration it is assumed that initial conditions (initial position and velocity of the membrane) are such that they result in (Subscript[A, mn]) and (Subscript[B, mn]) being unity. Hence the solution becomes (∑_(m=1)^∞)(∑_(n=1)^∞)(cos((Subscript[ω, mn])t)+sin((Subscript[ω, mn])t))sin(((mπx)/a))sin(((nπx)/b)) and this is the solution which is animated.

This demonstration support up to m=5 and n=5 modes. You select the parameter a,b,T,ρ from the sliders and see the resulting vibration using those selected modes. The wave speed is c=(Sqrt[(T/ρ)])where T is the tension the membrane bears per unit length of its boundary. Hence T has units of N/m and ρ is the membrane mass per unit of surface area, therefore ρ has units of kg per (m^2). c represents the wave speed (in the transversal direction) and has units of m per sec.

Tension is assumed constant and gravity effect is ignored and no damping is assumed.

In the entry of the parameters, the tension and density are read per mm and internally converted to the SI unit of meter.

A table of the characteristic frequencies (Subscript[ω, mn]) is printed in the left side in units of hz. You select the modes to excite by using the dialog shown on the left. A mode is selected and un-selected by pressing on the button specific to that mode. Moving the mouse over the 3D plot you can see the full analytical solution using the selected modes.

The boundary conditions is that the membrane is fixed on all four edges.

References

[1] Robert D. Belvins, Formula For Natural Frequency And Mode Shape, New York: Van Nostrand, 1979

[2] Professor Engelstad's Lecture notes. April 2, 2013. ME 740, Advanced Vibration. University of Wisconsin, Madison

[3] H. Esoy, "free vibration analysis of rectangular membranes with variable density using the discrete singular convolution approach" Asian Journal Of Civil Engineering (Building and Housing) vol. 11, no. 1 (2010), pages 83-94

Contributed by: Nasser M. Abbasi