Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Математический Вопрос   Найти похожие ветки 

 
Elen ©   (2006-10-13 13:51) [0]

Доброго Времени Суток! Господа Мастера!

Я не математик, поэтому просьба помидорами не кидаться! :)

Задача такова :
Есть произвольно заданное число Р.
Требуется найти такие целые числа a,b,c,d
чтоб выполнялось условие :

     I    a   b
  Р= -  = - * -    Где I=a*b J=c*d
     J    c   d  

Расчет и проверка ведется с заданной точностью для P

Способ из старой книжки по фортрану (который
был переделан на фокспро не мной) таков :

Задается I перебором в диапазоне, далее определяется J
А дальше полный перебор сочетаний a,b и c,d в цикле.

Это достаточно медленно работает.
Вопрос : Можно ли ускорить процесс расчета математически?
Есть ли какой-нибудь другой алгоритм?

Если что - спрашивайте, уточню.


 
Думкин ©   (2006-10-13 14:04) [1]

Для начала - более четко сформулировать задачу без лирических вставок и этажных формул.


 
Alien1769 ©   (2006-10-13 14:21) [2]

Хоть диапазон по числам уточни


 
Думкин ©   (2006-10-13 14:26) [3]

Вообще-то таких чисел - счетное множество. Поэтому о чем речь - пока не ясно. Если я конечно все правильно не понял.


 
MBo ©   (2006-10-13 14:30) [4]

P - вещественное число, которое нужно приблизить дробью (рациональным числом)?


 
Думкин ©   (2006-10-13 14:34) [5]

> MBo ©   (13.10.06 14:30) [4]

Даже  втакой постановке - нужно что-то минимизировать или т.п.
Ибо тогда достаточно приближения десятичными дробями, например.


 
Elen ©   (2006-10-13 14:40) [6]

Всем Всем Всем! Спасибо что откликнулись

Не знаю как бы по точнее описать задачу но попробую :


Имеется два набора зубчатых колес с количеством зубьев от 24 до 100.
Необходимо подобрать таких четыре колеса с количеством зубьев A,B,C,D,
которые обеспечивали бы заданное передаточное отношение P с заданной точностью Eps.
Общая формула такова P=(A*B)/(C*D),при этом фактическое P отличается от заданного
не более, чем на Eps.
Алгоритм: Задаются 2 матрицы I(76,76) и J(76,76)
Задавая в цикле значения I от 24^2 (минимальное значение)
до 100^2 (максимальное значение), вычисляем J=P/I.
Реализация на ФОКСПРО
********************************************************
nBMin=24                  &&Нижняя граница значений  - Размерность I
nBMax=100                 &&Верхняя граница значений - Размерность J
nOffset=nBMin             && Начальный сдвиг числа зубьев
nCountElem=nBMax-nOffset  &&Количество элементов матрицы
DIMENSION ArrElemI(nCountElem,nCountElem) &&Создание массива с пустыми значениями
nP=0.543251               &&Передаточное отношение, в реале вводится пользователем
nEps=0.000001             &&Погрешность вычисления, задается пользователем
STORE 0 TO nA,nB,nC,nD    &&Искомые числа зубьев
=ACOPY(ArrElemI,ArrElemJ) &&Копирование массива I в J
**
nAllElem=ALEN(ArrElemI)   &&Определение общего количества элементов массива
                         && В Фоксе с двумерным массивом можно работать как с одномерным, линейным
**
*******************************************************
FOR k=1 TO nAllElem       &&Перебор ВСЕХ элементов массива I
   FOR t=1 TO nAllElem   &&Перебор ВСЕХ элементов массива J
      *В фоксе имеется функция, орпеделяющая по позиции в одномерном массив ДВА индекса в ДВУМЕРНОМ!!!
      nA=ASUBSCRIPT(ArrElemI,k,1)+nOffset &&Определение по индексу к-того элемента в массиве I 1го индекса
      nC=ASUBSCRIPT(ArrElemJ,t,1)+nOffset &&Определение по индексу t-того элемента в массиве J 1го индекса
      nB=ASUBSCRIPT(ArrElemI,k,2)+nOffset &&Определение по индексу к-того элемента в массиве I 2го индекса
      nD=ASUBSCRIPT(ArrElemJ,t,2)+nOffset &&Определение по индексу t-того элемента в массиве J 1го индекса
      nCurP=ROUND((nA*nB)/(nC*nD),10)     &&Вычисление Вычисление ФАКТИЧЕСКОГО передаточного отношения
      *
      IF BETWEEN(nCurP,nPMin,nPMax) &&Проверка на вхождение в допустимый диапазон
        * Дальше что-то делаем
         ?nA,nC,nB,nD,(nA*nC),(nB*nD),nCurP pict "9.999999999"
          APPEND BLANK IN OUT
          REPLACE ;
            OUT.FA WITH nA,OUT.FC WITH nC,;
            OUT.FB WITH nB,OUT.FD WITH nD
      ENDIF
   ENDFOR
ENDFOR



> MBo

P вещественное должно быть представленно в виде произведения двух дробей, числители и знаменатели которых целые


> Вообще-то таких чисел - счетное множество

В постановке задачи ограничение на допустимые числа для a b c d от 24 до 100

Sorry за, может, некоректность!


 
Elen ©   (2006-10-13 14:42) [7]


> Даже  втакой постановке - нужно что-то минимизировать

А что имено минимизировать?


 
Думкин ©   (2006-10-13 14:43) [8]


> В постановке задачи ограничение на допустимые числа для
> a b c d от 24 до 100

Вот. С этого и надо было заканчивать. :)


 
Думкин ©   (2006-10-13 14:44) [9]

> Elen ©   (13.10.06 14:42) [7]

Теперь - ничего. Набор конечный по постановке.


 
Elen ©   (2006-10-13 14:47) [10]


> Думкин

Жду вопросов и пояснений. Господа.


 
default ©   (2006-10-13 14:56) [11]

учти коммутативность, во сколько раз числитель может быть большн знаменателя и тд и тп


 
Elen ©   (2006-10-13 15:02) [12]


> default

Пары дробей могут быть :
                a    c       b    d
Минимум   (24/100)*(24 /100)
Максимум (24/24  )*(100/100)


 
Vlad433 ©   (2006-10-13 15:06) [13]

А почему максимум не (100/24)*(100/24) ?


 
default ©   (2006-10-13 15:09) [14]

Elen ©   (13.10.06 15:02) [12]
так подожди, P не больше 1 у тебя может быть? и каждая дробь также не больше единицы?
ты давай все условия! некоторые люди тратят время(не столько про себя) на твою задачу, уважай их время


 
MBo ©   (2006-10-13 15:14) [15]

Перебором проще всего, но не все варианты перебирать
Пусть P>1 (иначе просто обратный случай)
for N := 576 to 10000/P do
 M := N*P
 if (M/N - P)/P < Eps then
    раскладываем M и N на множители 24-100


 
Elen ©   (2006-10-13 15:15) [16]


> Vlad433

Передача только понижаюшая (P<1)


> default

Да. Так... В числителях и знаменателях не должно быть более 2-х одинаковых чисел (Два комплекта шестерен), но это не проблема. Ну условий вроде больше нет...

Вопрос задается по тому что проргамма сейчас в виде перебора работает около 3-4 мин. на один цикл перебора. Хотелось бы быстрее.

Заранее спасибо Вам за потраченное время


 
Elen ©   (2006-10-13 15:20) [17]


>  раскладываем M и N на множители 24-100

Это и есть проблема. Подскажи как преобразовать M и N на множители? Тоже перебором?


>  но не все варианты перебирать

Я и так отсекаю по условию  (M/N - P)/P < Eps :
 IF BETWEEN(nCurP,nPMin,nPMax) &&Проверка на вхождение в допустимый диапазон


 
Alien1769 ©   (2006-10-13 15:38) [18]


> Это и есть проблема. Подскажи как преобразовать M и N на
> множители? Тоже перебором?

Выдели простые числа и будут тебе множители. По моему так


 
Elen ©   (2006-10-13 15:42) [19]


> Alien1769

Как? У нас числа зубьев не всегда простые.


 
default ©   (2006-10-13 15:44) [20]


> Подскажи как преобразовать M и N на множители? Тоже перебором?

ну это не проблема
например, так
for i := 24 to 100 do
 if (X mod i = 0) and (X div i in [24..100]) then // разложили


 
Elen ©   (2006-10-13 16:00) [21]


> default

Допустим Х=900. I добежало до 30.
(900 mod 30 = 0) True
(900 div 30 in [24..100]) тоже True.
И что это означает? Перебор все таки остается... Мне нужно получить два числа при перемножении которых было бы 900


 
Jeer ©   (2006-10-13 16:19) [22]

Elen ©   (13.10.06 14:40) [6]

Если это "чисто школьная" задача - делайте как угодно с учетом подсказок.

Если реальное проектирование - с точностью до наоборот.

Из АРМ можно рекомендовать ShaftPlus, T_Flex, WinMachine, AutoCad+Gear, MechSoft, SolidWorks+GearTrax и пр.


 
Elen ©   (2006-10-13 16:27) [23]


> Jeer

Скажем так Это нужно для нашего технолога. Стоит только задача по расчету передаточного отношения гитары станка и все пока, поэтому эти пакеты ставить на их компьютер никто не даст (у меня нет даже таких полномочий). Но это тоже мысль хорошая. Спасибо за совет.


 
euru ©   (2006-10-13 16:33) [24]


> Elen ©   (13.10.06 15:20) [17]
> >  раскладываем M и N на множители 24-100Это и есть проблема.
>  Подскажи как преобразовать M и N на множители? Тоже перебором?

Можно, наоборот, сначала сформировать таблицу произведений a * b. А потом проверять, существует ли нужное произведение.


 
Jeer ©   (2006-10-13 16:35) [25]

Тогда открываем Артоболевского, Артемьева и не мучаемся ерундой на этой стадии.
В общем случая - весьма сложная задача оптимизации, в том числе и целочисленной, с учетом допустимых нагрузок, коэф-то трения, массо-габаритных хар-к.
Как Вы думаете, почему в коробке передач на Жигулях шестеренки ломаются, а на Мерседесах - нет ? :))

Почему "наши" станки требуют пятикратного начального крутящего момента, хотя по запасу достаточно 1.5 - 2 ?

И еще много риторических вопросов.


 
Elen ©   (2006-10-13 16:45) [26]


> Тогда открываем Артоболевского, Артемьева и не мучаемся
> ерундой на этой стадии.

Мне тут конструктора подсказывают, что Артаболевский занимается Теорией машин и механизмов, а не оптимизацией подбора технол. параметров. В общем наши ОГТшники использовали таблицы из справочников, в которых искомые значения представленны в виде дроби в числителе и знаменателе которых имеется произведение нескольких простых чисел - (2*5*13*37)/(5*7*13*23). Но после этого вот это нужно домножать и группировать для получения 4-х чисел. В ручную морочно, вот и попросили сделать, а то наши админы-программеры пока зачешутся... Сейчас уже побыстрее пошло за счет некоторой оптимизации (спасибо советы помогли додуматься). Задача точно оптимизационная по времени, но что поделаеш - надо решать.


 
MBo ©   (2006-10-13 17:22) [27]

>Подскажи как преобразовать M и N на множители?

procedure TForm1.Button2Click(Sender: TObject);
const
 Eps = 0.000001;
var
 P, x: Double;
 i, j, Ch, Zn, a, b, c, d: Integer;
 FoundC, FoundZ: Boolean;
begin
 P := 1 + 3 * Random;
 for Zn := 576 to Round(10000 / P) do begin
   Ch := Round(Zn * P);
   if Abs(Ch / Zn - P) / P < Eps then begin
     FoundC := False;
     FoundZ := False;
     for i := 24 to Min(Ch div 24, 100) do
       if Ch mod i = 0 then begin
         a := Ch div i;
         if (a >= 24) and (a <= 100) then begin
           b := i;
           FoundC := True;
         end;
       end;

     if FoundC then
       for i := 24 to Min(Zn div 24, 100) do
         if Zn mod i = 0 then begin
           c := Zn div i;
           if (c >= 24) and (c <= 100) then begin
             d := i;
             FoundZ := True;
           end;
         end;
     if FoundC and FoundZ then
       Memo1.Lines.Add(Format("%12.9f  =  %d*%d/(%d*%d)",[p,a,b,c,d]));
   end;
 end;
end;


 
Jeer ©   (2006-10-13 17:23) [28]

Elen ©   (13.10.06 16:45) [26]

Вам, конструкторы, правильно подсказывают, но ТММ включает как теоретические, так и практические вопросы конструирования механизмов, к которым, без всякого сомнения относятся и передачи.


 
Jeer ©   (2006-10-13 17:49) [29]


> В общем наши ОГТшники использовали таблицы из справочников,


Конечно же, их составляли растяпы.


> имеется произведение нескольких простых чисел - (2*5*13*37)/(5*7*13*23)


Это "нам" ни о чем не говорит - ну, произведение, а есть еще сложение - еще проще.


> Но после этого вот это нужно домножать и группировать для
> получения 4-х чисел


Да какая разница, что там в итоге "домножение и группировки" получится.


> Сейчас уже побыстрее пошло за счет


А как насчет "ребенок, выплеснутый вместе с водой" ?


> но что поделаеш - надо решать.


Корень вопроса - "надо", "решать", "кому", "средства".

Был у меня один инженер в давности - не ту степень изоляции применил в проводах.
16 кV не шутка.
Жив остался, но два пальца выгорели.


 
Vlad433 ©   (2006-10-13 19:01) [30]

ИМХО, можно перебором найти быстро, только перебор по списку перемноженных делать. У меня за 6 сек. считает (Celeron-366), вроде правильно...


 
Vlad433 ©   (2006-10-13 19:09) [31]

>Elen
Код не нужен ?


 
default ©   (2006-10-13 19:12) [32]

Vlad433 ©   (13.10.06 19:01) [30]
можно эти перемноженные хранить в порядке возрастания и бинарным поиском искать в них


 
Vlad433 ©   (2006-10-13 19:18) [33]

default
 Так и делал. Завел список перемноженных, отсортировал, а дальше перебором (что такое бинарный поиск, не знаю). Вроде быстро.


 
Elen ©   (2006-10-16 07:54) [34]


> Vlad433

Идея понятна. Я пожалуй себе один раз расчет сделаю без условий и загоню его в БД. А дальше выборкой. В общем ладно

Всем спасибо! Тема Закрыта!


 
Jeer ©   (2006-10-16 16:10) [35]

А тема все равно открыта, т.к. проектирование или репроектирование редукторов (понижение осности, как я понял, в данном случае), это не только манипуляция простыми или не очень простыми числами.:)

В основе все равно будет лежать оптимизация по критериям: ГОСТ/не ГОСТ, массо-габариты, требуемое межцентровое и тп.

Кто-то будет резать "свои" зубчатые колеса ?
Сомневаюсь, а по ГОСТУ-у число зубьев у выпускаемых колес вовсе не образует сплошной ряд чисел от мин до мак и в зависимости от модуля имеется свой ряд "дырчатый" ряд.



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.052 c
2-1161624363
Busik
2006-10-23 21:26
2006.11.05
ini-файл в теле exe


3-1157698560
angelsaint
2006-09-08 10:56
2006.11.05
как сделать ввод дат "до н.э."


2-1161063939
svt
2006-10-17 09:45
2006.11.05
Мастера, подскажите как сделать так, чтобы


3-1157904227
так себе
2006-09-10 20:03
2006.11.05
Подредактируйте запрос


3-1157457783
.ruslan
2006-09-05 16:03
2006.11.05
пустая строка в DBGrid