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.

Note: Cross-posted at http://community.wolfram.com/groups/-/m/t/137895?p_p_auth=8QnKtT9I.

I am to design a two step gearbox. The first step is to choose the number of teeth in each cog wheel in order to achieve a gear ratio of 17.3. In other words:

 (N1 N2)/(n1 n2) == 17.3

where N1 and N2 are the number of teeth in gear 1 and 2, and n1 and n2 are the number of teeth in pinion 1 and 2. Is it possible to get Mathematica to "guess" the lowest number of teeth possible and still get as close as possible to 17.3? The number of teeth in the pinions must not be lower than 20. In addition, the number of cog teeth in the gears must not be divisible, i.e. only common factor has to be 1.

share|improve this question
1  
Is this a question about the software Mathematica? It looks like you might have intended to post this at our sister site, math.SE –  Verbeia Oct 12 '13 at 20:24

2 Answers 2

up vote 8 down vote accepted

I think in general you might have to enforce the gcd (divisibility) constraint after the fact. For this particular example I get a result on the first try that has those numbers relatively prime, so we can accept that solution.

Anyway, here is the code. For objective function I sum the teeth and add a penalty term for that ratio straying (discrepancing itself?) from 17.3.

obj = c1 + c2 + p1 + p2 + (c1*c2 - 17.3*p1*p2)^2;
cs1 = {p1 >= 20, p2 >= 20, c1 >= 2, c2 >= 2};

In[368]:= {min, vals} = 
 NMinimize[{obj, 
   Flatten[{cs1, Element[{c1, c2, p1, p2}, Integers]}]}, {c1, c2, p1, 
   p2}]

Out[368]= {223., {c1 -> 91, c2 -> 76, p1 -> 20, p2 -> 20}}

As 91 is prime, it is of course relatively prime to 76, so this set of values appears to suit the requirements.

share|improve this answer
    
Adding MaxIterations -> 500 comes up with a superior solution: {c1 -> 79, c2 -> 92, p1 -> 21, p2 -> 20}; delta -0.0047619 –  Mr.Wizard Oct 12 '13 at 21:57
    
Actually in v7 I get that result anyway. –  Mr.Wizard Oct 12 '13 at 21:59

Another approach is to use FindInstance:

FindInstance[(172/10 <= (N1 N2)/(n1 n2) <= 174/10) && 
     (n1 >= 20) && (n2 >= 20) && (N1 > 10) && (N2 > 10), {n1, n2, N1, N2}, Integers]

{{n1 -> 20, n2 -> 20, N1 -> 11, N2 -> 630}}

By playing around with the exact criteria used, it is possible to find many answers

FindInstance[(Abs[(N1 N2)/(n1 n2) - 17.3] <= 0.02) && (n1 >= 25) && (n2 >= 25) 
   && (N1 > 10) && (N2 > 10) && (n1 + n2 + N1 + N2 < 300), {n1, n2, N1, N2}, Integers]

{{n1 -> 25, n2 -> 25, N1 -> 56, N2 -> 193}}
share|improve this answer

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.