Форум: "Прочее";
Текущий архив: 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.073 c