Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I am trying to calculate where a beam hits a mirror. The mirror is described by this curve (two facing spherical mirrors):

Mirror[x_] := Piecewise[{
   {{Sin[-87.5 °] + 0.5, Cos[-87.5 °]}, x < 0},
   {{Sin[-x ° - 87.5 °] + 0.5, 
     Cos[-x ° - 87.5 °]}, x >= 0 && x < 5},
   {{Sin[x ° + 82.5 °] - 0.5, 
     Cos[x ° + 82.5 °]}, x >= 5 && x < 10}
   }, {Sin[92.5 °] - 0.5, Cos[92.5 °]}]

Now, I am just trying to get the crossing point with a line:

p = {0, 0};
v = {1, 0};
Solve[Evaluate[
  Simplify[Mirror[s].{1, 0}] == (p + v t).{1, 0} &&
   Simplify[Mirror[s].{0, 1}] == (p + v t).{0, 1} 
  ], {s, t}]

The manual projection (.{1, 0}) is done because of the piecewise defined function, as they do not work with the usual Thread - we worked this out here. This code has been working well since then, but it does not for the current Mirror function. I have no idea what the problem could be. Any ideas?

share|improve this question
add comment

1 Answer 1

For example:

f[x_] := x Pi/180;
Mirror[x_NumericQ] := 
 Piecewise[{{{Sin[-f[87.5 ]] + 0.5, Cos[-f[87.5 ]]}, x < 0}, 
            {{Sin[-x - f[87.5 ]] + 0.5, Cos[-x - f[87.5 ]]}, x >= 0 && x < f[5]}, 
            {{Sin[x + f[82.5 ]] - 0.5, Cos[x + f[82.5 ]]}, x >= f[5] && x < f[10]}},      
             {Sin[f[92.5 ]] - 0.5, Cos[f[92.5 ]]}]
p = {0, 0};
v = {1, 0};
FindRoot[Mirror[s].{1, 0} == (p + v t).{1, 0} && 
         Mirror[s].{0, 1} == (p + v t).{0, 1}, 
         {{s, 0}, {t, 0}}]
(*
{s -> 0.0436332, t -> -0.5}
*)

graphical insight:

ParametricPlot[{Mirror[t], (p + v t)}, {t, -.6, .6},  AxesOrigin -> {Automatic, -.04}]

Mathematica graphics

share|improve this answer
    
Unfortunately, this just gives me one solution. In this case, for example, it is the wrong one, as my beam is going in +t direction. The solving is done in a module, where the beam path is calculated recursively. With Solve, I could add "&& t > 0", with FindRoot, this doesn't seem to work. I do not understand why at least NSolve cannot solve the equation. –  mcandril Sep 21 '12 at 10:31
    
Yes this is the way to go (with some refinement), +1 –  acl Oct 20 '12 at 18:32
    
@acl Yep, but it's a pity the OP wasn't able to understand it –  belisarius Oct 20 '12 at 18:44
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.