Имя: Пароль:
IT
 
Экстремум нелинейной функции многих переменных
0 jcage
 
18.02.08
12:08
Какие вычислительные способы существуют? Какие из них можно в 1С-ке реализовать? Если поделитесь примерами - буду крайне признателен:)
Особенно интересно как найти экстремум нелинейной функции, где значения переменных целое.. Конечно кроме перебора :)
1 Череп
 
18.02.08
12:08
Симплекс метод.
2 jcage
 
18.02.08
12:10
(1) Симплекс только для линейных функций. В случае с функцией x^2 + z^2 = F симплекс безполезен.
3 Ненавижу 1С
 
гуру
18.02.08
12:17
То есть интересуют только целочисленные решения? в этом случае такой экстремум, может лежать далеко от настоящего (подобрать такую функцию можно). И получается, что в общем случае только перебор. Но может быть известен вид функции?
4 NS
 
18.02.08
12:19
В общем случае метода нет и не может быть. Например для таблично заданной функции без закономерностей - только перебор. Если функция задана аналитически, тогда те-же методы что и для действиетельных значений функции.
5 nop
 
18.02.08
12:20
6 NS
 
18.02.08
12:27
(5) Особенно интересно как найти экстремум нелинейной функции, где значения переменных целое..
7 dk
 
18.02.08
12:27
Хм, была такая курсовая лет 7 назад.
разбивал на кубы с заданным шагом и в узлах кубов искал через производные направление прирощения. хотя вспоминается уже с трудом, помню что назывался "кенгуру и мыши", но я как-то иначе решил :)
8 jcage
 
18.02.08
12:29
(5) Меня интересует мнение 1С:общественности. Особенно вычислительные способы, реализуемые в 1С.
9 NS
 
18.02.08
12:30
(7) Методы основные понятны, это разнообразные методы случайных направлений, поиск по сетке, спуски (покоординатные, градиентные методы) и т.д.
Если экстремумов много - то спуски с несколькими начальными точками и всё в этом духе.
Только в условии на целочисленной области определения - для нелинейных функций никаких общих методов нет.
10 NS
 
18.02.08
12:31
(8) Для твоей функции - градиентный метод, на действительной области определения, а потом смотришь целочисленные значения рядом.
11 dk
 
18.02.08
12:31
(8) Имхо скорость рассчета будет дико маленькая, да и список функций в 1С, прямо скажем, не фонтан.
12 jcage
 
18.02.08
12:31
(4) Функция аналитическая. Но как от действительных значений перейти к целым? В общем случае вероятность сразу попасть на целое решение трудно.
(7) А если переменных 5?
13 dk
 
18.02.08
12:34
(12) Гиперкубы конечно :)
14 NS
 
18.02.08
12:35
(12) Так используй градиентный спуск. Либо покоординатный, тогда сразу можешь бежать по целочисленным значениям. Сделай только переменный шаг.
То что в (7) - и есть градиентный спуск, только по человечески - находим градиент через частные производные, и с некоторым шагом двигаемся в направлении градиента. Если получили прирост значения - фиксируем новую точку, и делаем повторную попытку двинуться в этом направлении.
15 ШтушаКутуша
 
18.02.08
12:36
(1) Симплекс метод не работает на нелинейных ф-иях,
а вот симплекс поиск(метод девормируемого многогранника;Нелдер-Мид)
работает и вполне хорошо, правда его эффективность зависит от кол-ва переменных.
16 dk
 
18.02.08
12:38
(14) Угу, по человечески как-то так :)
Только надо еще учесть, что экстремумов может быть несколько, поэтому сетка таки нужна для поиска всех экстремумов.
17 NS
 
18.02.08
12:39
(2) Блин, посмотрел твоё уравнение - тут вообще не может быть стандартных алгоритмов. Даже в случае если не минимум стоит, а стоит знак равенства - есть доказанная теорема что не существует алгоритма сообщающего есть решение или нет для общего случая. Это десятая проблема гильберта (разрешимость диофантовых уравнений)
18 ШтушаКутуша
 
18.02.08
12:45
(0)общее решение здесь существует:Метод Монте-Карло. :)
19 NS
 
18.02.08
12:48
(18) Чтоб использовать монте-карло должна быть ограниченная область определения.
а если она неограничена?
20 jcage
 
18.02.08
12:51
(17) Это просто пример был. На самом деле у меня такое уравнение:

F = (S1/K1)*x1 + (S1+S2-(S1/K1)*x1)/(K1+K2-x1) * x2

где переменные - x1 и x2, остальное - константы, зависящие от условий задачи.
21 ШтушаКутуша
 
18.02.08
12:52
(19) Ну да :) Но в данном случае, трудно представить одинЭсника имеющего
чего то там в неогранич. количестве. :)))
22 ШтушаКутуша
 
18.02.08
12:54
(20) область определения озвуч :)
23 dk
 
18.02.08
12:55
Кстати, а Эксель проде тоже что-то подобное могет или я ошибаюсь?
24 ШтушаКутуша
 
18.02.08
12:56
да
25 NS
 
18.02.08
12:59
(20) Перебирай x1 начиная с нуля. (0,1,-1,2,-2,3,-3) и т.д.
У тебя получается линейное уравнение относительно x2, решаешь его, округляешь x2, подставляешь, сравниваешь с ранее достигнутым минимумом и т.д.
Врятли за короткое время можно придумать чего лучше.
26 Wasya
 
18.02.08
13:02
(20) А если тупо взять производные и приравнять их к нулю?!
27 ШтушаКутуша
 
18.02.08
13:07
1. Генеришь случ. знач. для x1, х2
2. вычисляешь знач функции;
3. строишь гистограмму;
28 NS
 
18.02.08
13:09
(26) Так целочисленная область определения! И уравнение с двумя неизвестными на вещественной оси имеет бесконечное количество решений.
29 jcage
 
18.02.08
13:09
(22) Сорри, важное забыл:)
x1 <= 5
x1 + x2 <= 12

(25) Вообще я привел часть функции, что бы понять принцип решения. Общий вид:
(S1/K1)*x1 + //1-ое значение = 1Знач
(S1+S2-1Знач)/(K1+K2-x1) * x2 + //2-ое значение = 2Знач
(S1+S2+S3-1Знач-2Знач)/(K1+K2+K3-x1-x2) * x3 //3-ое значение = 3Знач
(S1+S2+S3+S4-1Знач-2Знач-3Знач)/(K1+K2+K3+K4-x1-x2-x3) * x4

и так далее до n, где n конечно и известно. Все ограничения известны и имеют вид, указанный выше, x1 <= C1; x1+x2 <= C2; x1+x2+x3 <= C3 и т.д.
30 NS
 
18.02.08
13:11
(27) Не надо так делать. При известном x1
- x2 с лучшим значением функции легко вычисляется.
(0) Дай пример коэффициентов.
31 NS
 
18.02.08
13:13
(29) Чего ты путаешь, теперь у тебя количество неизвестных равно количеству уравнений. И теперь исчез критерий оптимальности решения.
32 jcage
 
18.02.08
13:14
(29) + x >= 0 всегда.

Меня тут смущает ,что есть x в знаменателе дробей. Если бы его не было бы можно было бы просто перебрать комбинации максимальных значений x1, x2 и других. А так не понятно, что будет больше.
33 Jaha_strannik
 
18.02.08
13:18
Годик назад в Excelе решали оптмизационные задачи.  Может там написать макрос, а средствами 1С передавать и получат даные из екселя
34 jcage
 
18.02.08
13:22
(31) не исчез - я его изначально забыл сказать, сорри:)
Критерий - максимум функции.

(S1/K1)*x1 +
(S1+S2-1Знач)/(K1+K2-x1) * x2 +
(S1+S2+S3-1Знач-2Знач)/(K1+K2+K3-x1-x2) * x3 +
(S1+S2+S3+S4-1Знач-2Знач-3Знач)/(K1+K2+K3+K4-x1-x2-x3) * x4
это все одна функция.
35 jcage
 
18.02.08
13:41
Пока писал - пришла в голову идея: x с верху ограничены. Обходим симплексом сочетания x, удовлетворяющих условию ограниченности с верху и для каждого сочетания считаем функцию.
Получается сложность симплекса примерно 3*n^2 (3*кол условий*кол переменных) Если за базовую взять операцию умножения в функции и учесть, что результаты определенных вычислений можно хранить в соответствии, то получиться сложность 3*n^3. Для меня вполне подойдет:)
36 NS
 
18.02.08
14:00
(34) Уверен что критерий просто сумма, а не сумма квадратов отклонений?
37 jcage
 
18.02.08
14:02
(36) Сумма всей функции есть критерий.
38 NS
 
18.02.08
14:08
(35) А снизу x ограничены?
39 jcage
 
18.02.08
14:22
(38) х больше или равны нулю, целые и ограничены сверху.
40 NS
 
18.02.08
14:50
(39) А дай пимер коэффициентов (вместе с ограничениями)
41 NS
 
18.02.08
14:51
(+40) пример.
42 jcage
 
18.02.08
15:09
S1 = 2000, K1 = 10
S2 = 3000, K2 = 15
S3 = 4000, K3 = 21
S4 = 3000, K4 = 14
43 jcage
 
18.02.08
15:13
NS, а что скажешь насчет (35)?
44 NS
 
18.02.08
16:11
(43) Симплексом бежать по вершинам не выйдет. В отличии от задач линейного программирования экстремум в твоей задаче достигается не на вершинах (не обязательно на вершинах)
45 NS
 
18.02.08
16:33
(42) А ограничения?
46 NS
 
18.02.08
16:36
(+45) А 1Знач, 2Знач и т.д.?
47 jcage
 
18.02.08
16:46
(S1/K1)*x1 +
(S1+S2-1Знач)/(K1+K2-x1) * x2 +
(S1+S2+S3-1Знач-2Знач)/(K1+K2+K3-x1-x2) * x3 +
(S1+S2+S3+S4-1Знач-2Знач-3Знач)/(K1+K2+K3+K4-x1-x2-x3) * x4

1Знач = (S1/K1)*x1;
2Знач = (S1+S2-1Знач)/(K1+K2-x1) * x2
3Знач = (S1+S2+S3-1Знач-2Знач)/(K1+K2+K3-x1-x2) * x3

Т.е. "Знач" - это просто строчка выше. Использую для сокращения формулы.
х1 <= 10
х1+x2 <= 25
х1+x2+x3 <= 46
х1+х2+х3+x4 <= 60
x1+x2+x3+х4 = 15

А почему ты решил, что решение лежит не на вершинах?
48 NS
 
18.02.08
17:38
А почему оно должно лежать на вершине?
Простейший случай 100-(X-2)^2, X>=0,X<=10
максимум не на вершине, а при X=2.

х1 <= 10
х1+x2 <= 25
х1+x2+x3 <= 46
х1+х2+х3+x4 <= 60
x1+x2+x3+х4 = 15

Ничего не понял, Если всё написано правильно - все ограничения кроме первого и последнего лишние.
49 jcage
 
19.02.08
00:40
(48) Условия из головы брал.
Суть в том что условий будет по количеству переменных + 1. Давай сделаем последнее условие
x1+x2+x3+х4 = 59.
50 jcage
 
19.02.08
09:16
Новый день, новые идеи! NS, перебор даже на 4-ех переменных дело не благодарное...
51 ШтушаКутуша
 
19.02.08
09:25
4!=4*3*2*1=24
ничего страшного для совр числодробилок
52 NS
 
19.02.08
10:54
(50) Сегодня сделаю пример, для начала совсем без ограничений.
53 jcage
 
19.02.08
11:40
(51) Перебор получается следующий
х1 = 0;
Пока x1 <= максимум1 Цикл
х2 = 0;
Пока х1 + х2 <= максимум2 Цикл
х3 = 0;
Пока х1 + х2 + х3 <= максимум3 Цикл
х4 = 0;
Пока х1 + х2 + х3 + х4 <= максимум4 Цикл
ПроверитьЗначениеФункции();
х4 = х4 + 1;
КонецЦикла;
х3 = х3 + 1;
КонецЦикла;
х2 = х2 + 1;
КонецЦикла;
х1 = х1 + 1;
КонецЦикла;

это получается максимум1*максимум2*максимум3*максимум4. Страшно? Мне да..
54 jcage
 
19.02.08
13:17
(53) + хотя немного ошибся. Количество иттераций второго цикла будет уменьшаться на x1, третьего на x2 и т.д. Решать реккурентное соотношение для такой процедуры лениво. Но думаю, что это будет где то
0.5 * максимум1*максимум2*максимум3*максимум4
55 jcage
 
26.02.08
15:14
На самом деле функция оказалась очень простой. Т.е. все экстремумы лежат в точках, где х1, х2, ... хn имеют свое максимально возможное значение. Т.е. по сути достаточно по ограниченям вершины обойти:)
56 jcage
 
26.02.08
15:15
(55) + Т.е. если при х1 = max(x1) функция больше, чем при x2 = max(x2) то промежуточные значения точно не гарантируют лучшее значение.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс