Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2004
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

mechanical sound amplifications using a Limacon

  • To: mathgroup at smc.vnet.net
  • Subject: [mg48158] mechanical sound amplifications using a Limacon
  • From: Roger Bagula <tftn at earthlink.net>
  • Date: Fri, 14 May 2004 20:59:18 -0400 (EDT)
  • Reply-to: tftn at earthlink.net
  • Sender: owner-wri-mathgroup at wolfram.com

The sound box of a guitar is  an Oval of Cassini based cylinder.
It is known for it's resonance and sound amplification properties.
Modeling these simple figures as billiards games showed me a unique 
feature of the Limacon:
The bulb acts as a focal reflecting point. I've attached a picture that 
shows one of the
billiards pictures.
It would appear if you put a microphone inside the bulb
all the sounds in a Limacon cylinder made like a guitar sound box would 
be amplified
since the all hit this relatively small area.
I was really trying to get a fractal border as an implicit, but
all the more complex implicits just don't work.
In my investigation of 2d implicits I also found a fuzzy logic implicit:
(1-Abs(x-y))+(1-abs(x+y-1))-1=0
and as simple as that seems the billiards program won't do it either on 
my machine.

My proposal is that an electric guitar made in the limacon cylinder shape
with the microphone pick up inside the bulb would be more effective than 
current designs. .
(* Ovals of Cassini:guitar sound box*)
a=2.9
c=3
play[(x^2+y^2+a^2)^2-4*a^2*x^2-c^4,NumPts->100]

(* Limacon Billiards: *)
a=2
c=3
play[(x^2+y^2-c*x)^2-a^2*(x^2+y^2),NumPts->100,StartV    -> {0, 
N[Sqrt[3]/2]}]

-- 
Respectfully, Roger L. Bagula
tftn at earthlink.net, 11759Waterhill Road, Lakeside,Ca 92040-2905,tel: 619-5610814 :
URL :  http://home.earthlink.net/~tftn
URL :  http://victorian.fortunecity.com/carmelita/435/ 

Billiards Library file:
(* Copyright 1992 David Glaubman. *)

(*:Version: Mathematica 2.0 *)

(*:Title: billiards.m *)

(*:Author:
	David Glaubman
*)

(*:Keywords:
	billiards, ergodic
*)

(*:Sources: none. *)

(*:Summary:  Given a planar region bounded by level curves, draws billiard
trajectory.  Modified by Sha Xin Wei to run on NeXt and Mac's too.
*)

BeginPackage["`billiards`", "Graphics`Animation`", 
			    "Graphics`ImplicitPlot`"]

play::usage=
"play[expression, options] animates the motion of a billiard ball\n
 on a table whose shape is given by the equation 'expression == 0'.\n
 expression should be given in terms of global variables x and y.\n 
 Examples:\n
    play[] -- animates circular table of radius 1, ball starting\n
\tfrom {0,.2} at angle Pi/4, for 25 collisions.\n
    play[x^2 + 2y^2 -1, NumPts-> 40] -- elliptical table, longer\n
\tanimation, other values the same.
\n\n
 Bugs:\tUser supplied boundary test function not implemented.\n
\tNo sanity checking or error handling.\n
\tShould highlight foci and boundary regions of interest.\n"


Options[play] = 
	{	StartPt   -> {0,.2},
		StartV    -> {N[Sqrt[2]/2], N[Sqrt[2]/2]},
		NumPts    -> 25,
		BdryTest  -> bordertest,
		Title     -> "Billiards"
	}

StartPt::usage="Billiard ball starts here. (Default: {0,.2})"
StartV::usage="Initial direction of motion. (Default: {Sqrt[2]/2,Sqrt[2]/2})"
NumPts::usage="How many bounces to compute. (Default: 25)"
Title::usage="Title of animation. (Default: Billiards)"
BdryTest::usage="Not yet implemented. Test to determine hitting of wall."

Begin["`Private`"]

Clear[x,y]
normed[a_,b_] := {a,b}/Sqrt[a^2 + b^2]; (* returns unit vector *)
size[{a_,b_}] := a^2 + b^2;		(* square of length *)

play[ function_:Automatic, opts___ ] :=
	Module[ {expr  = function,
		 start,
		 n,j,
		 v, numPts, title,
		 next, oneframe, border,
		 w, pt,oldv, curve,i},

	If[function === Automatic,
		expr   = Global`x^2 + Global`y^2 -1];

	start  = StartPt   /. {opts} /. Options[play];
	v      = StartV	   /. {opts} /. Options[play];
	numPts = NumPts	   /. {opts} /. Options[play];
 	inside = BdryTest  /. {opts} /. Options[play];
	title  = Title	   /. {opts} /. Options[play];

	(* Binary search: returns interior point within sqrt(epsilon)
	                  of bounding curve *)
	bsearch[start_, v_List] := Module[ 
		{hi, lo, delta = .1, epsilon = .00000001},
		lo = hi = start;
		While[ inside[expr,hi], hi += delta v ];
		While[ size[hi - lo] > epsilon,
		       mid = (hi + lo)/2;
		       If[ inside[expr, mid], lo = mid, hi = mid ] ];
		Return[lo]
		];

	(* Plots border curve for superposition with billiard path *)
	border[conic_] := 
		ImplicitPlot[conic == 0, 
			{Global`x, 0, 4},
			AspectRatio -> Automatic, 
			PlotStyle -> RGBColor[0,0,1],
			PlotRange -> {{0,4}, {0,4}},
			AxesOrigin -> {0,0},
			DisplayFunction -> Identity];

	(* returns $\partial f/\partial y, -\partial f/\partial x$ *)
	der[expr_] := normed[D[expr,Global`y], - D[expr,Global`x]];

	(* tests if f(pt) is negative (i.e., within bounding curve)*)
	bordertest[expr_, {a_,b_}] := 
		(expr /. {Global`x->a, Global`y->b}) < 0;

	(* next[i] is the i'th point of the billiard path. *)
	Clear[next];
	next[1]   = start;
	next[i_] := next[i] = Module[{},
	pt = bsearch[next[i - 1], v];
	w = der[expr] /. {Global`x -> pt[[1]], Global`y -> pt[[2]]};
		v = Apply[normed,2 (v . w) w - v];
		Return[pt]
		];

	curve = border[expr];		(* Create bounding curve *)
	
	(* returns Graphics object depicting first n-1 bounces *)
	oneframe[n_] := Graphics[Line[Table[next[i], {i, 1, n}]]];


	(* Creates numPts frames of path and bounding curve *)
	all = Table[{oneframe[j], curve}, {j,1,numPts}];

	(* rigamarole to change animation window name *)
	saveDisplayTitle = $DisplayTitle;
	$DisplayTitle    = title;

	(* Display the animation *)
	(* If on NeXT or Mac, show in Front End window *)
	If[
		Length[StringPosition[$MachineType, {"NeXT", "Mac"}]]>0,
		Show[#, DisplayFunction->$DisplayFunction]& /@ all,
		ShowAnimation[all, DisplayFunction -> $DisplayFunction, 
			PlotRange -> {{0,4},{0,4}}];
	];


	(* restore the default window name *)
	$DisplayTitle    = saveDisplayTitle;
]

End[]
EndPackage[]




  • Prev by Date: RE : Maen
  • Next by Date: Re: Re: FindRoot cannot find obvious solution
  • Previous by thread: RE : Maen
  • Next by thread: A question about sort