Помощь - Поиск - Пользователи - Календарь
Полная версия: Как разложить число на составляющие по заданному уравнению? > Разное
Образовательный студенческий форум > Высшая математика > Разное
&y JOKER
Здравствуйте!
Я не студент и не математик,и даже не программер,а просто интересующийся различными сферами деятельности.
Возникла необходимость написать софтинку, которая бы раскладывала число на составляющие по заданному уравнению:

дано число S, которое может принмать значения от 8 до 234881024
S=x*(y*(4+z1)+4+z2)+z3 , где
x может принимать значение от 1 до 255
y - от 1 до 65535
z1,z2,z3 - от нуля, до 20
Имея на входе значение S необходимо вычислить: x,y,z1,z2,z3
Хотя-бы одно из множеств решений.

Вариант перебора отпадает - это некрасиво как-то и неинтересно. smile.gif
Была мысль начать с того, на какие числа вообще делится S, но это опять-же только перебором.
Поэтому у меня вопрос к профессионалам, возможно-ли это решить красиво и каким образом? smile.gif
Спасибо!

p.s. прошу прощения если не в тот топик, просто я не знаю что такое дифуры и относится-ли к ним моя задача.
kaa
с каждого промежутка можно выбрать любое число)и подставить в формулу)
тень
Хорошая задача для линейного или нелинелийногопрограммирования. грубо говоря оптимизации.
Зайдите на Excel, вызовите solver, сформулируйте и
через секунду получите ответ.
tig81
Цитата(&y JOKER @ 15.9.2009, 14:33) *

p.s. прошу прощения если не в тот топик, просто я не знаю что такое дифуры и относится-ли к ним моя задача.

Раздел действительно не тот, переехали.
Дифуры не знаете, а вот дифференциальные уравнения "сократили" правильно.
&y JOKER
Цитата
Дифуры не знаете, а вот дифференциальные уравнения "сократили" правильно.

ну это вот единственнное, чему меня научили в ВУЗе. smile.gif

формула претерпела некоторые изменения, но суть осталась та-же:
S=(x*((y*(4+z1))+5+z2))+1+z3
в общем, алгоритм получился примерно следующий:
1. находим x перебором от 1 до 255 и z3 от 0 до 10 проверяем делится-ли (S-1-z3) на x без остатка и находится-ли частное n в пределе 65535. Таким образом нашли x, z3 и частное n.
2. получается: S=(x*n)+1+z3. Далее работаем с n.
перебором z1 и z2 от 0 до 10 проверяем целочисленное деление выражения: y=n-5-z2/(4+z1)

И вроде-бы все работает замечательно, но только в пределах до значаения S=9387296. Далее, диапазон "поправочного" коэфф. z3 приходится увеличивать, что собссно не есть гуд. sad.gif
тень
составляете функцию abs(S- ваша формула.) (
Задаете произвольный набор исходных переменных внутри
разрешенной области
1. изменяете первую переменную на +1
-если функция уменьшается продолжаете увеличивать первую переменную до тех пор пока она не начнет увеличиваться или
вы не упретесь в ограничение
- если увеличилась, то изменяете на -1 и далее как выше
2. Далее последовательно для всех переменных п.1
3. Если любое изменение любых переменных приводит к увеличению
функции - найдено решение
Метод без производных, проэтому походит abs, иначе лучше использовать квадрат, чтобы сохранить непр. производной
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.