Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.045 c
15-1160656122
Slava812
2006-10-12 16:28
2006.11.05
Вкладка безопасность


4-1148999649
Turbid
2006-05-30 18:34
2006.11.05
Программа в оперативной памяти


15-1161079948
Empleado
2006-10-17 14:12
2006.11.05
Интересно, через какое время оно придет в каждый дом?


3-1157093965
Delphi basic
2006-09-01 10:59
2006.11.05
Неправильный расчет выражений в SQL


6-1150374450
qazwsx
2006-06-15 16:27
2006.11.05
Как подключиться к mysql из cgi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский