>>референс [1], издательство "Прогресс", формула (2.3.2) - смотри как там обозначается градиент
:) там градиент обозначен правильно df/dx, с _закругленными_ d, оно может означать _частную_ производную или вектор, или матрицу частных производных (как градиент или матрица якоби).
У тебя в статье d _прямые_ (у градиента и матрицы якоби), а это историческое обозначение полного дифференциала, в этом случае df/dx нужно понимать как "приращение функции разделить на приращение аргумента", то есть скаляр разделить на вектор.Очевидно df/dx * dx/dt = df/dt с _прямыми_ d не обобщается на случай нескольких переменных. Выражение df/dt с закругленными атомарно, а с прямыми - нет, с ним можно обращаться как с обычной дробью. Так что смысловая разница огромна.
Принцип Даламбера можно из статьи выкинуть. Про координаты уже объяснять надоело.
Ладно, если ты все понимаешь именно так и считаешь что это придирки, ради бога.
ЗЫ: твоя статья помогла мне понять некоторые вещи, но из за неточностей пришлось привлекать другие источники.
tikka
Ну с д'Аламбером-то зачем обижаешь? Он там нужен хотя бы для того, чтобы обосновать, с чего это вдруг мы принялись минимизировать работу сил ограничений на r. Кроме того, он нужен для того, чтобы понять, что r выбирается из множества виртуальных перемещений момента t0, и по этой причине Fc момента t0 не зависят от r, ибо r выбирается из множества тех, которые допускаются связями. Это в дальнейших формулах проявляется в том, что градиент работы оказывается равен Fc...
Вообще судя по тому, что ты производишь впечатление человека, который не понял все вышеприведенные намеки, считаю своим долгом объяснить подробно. Я не знаю, как Экспа, но я не считаю эту статью идеальной, более того, я вообще считал, что ее не стоит в таком виде выкладывать в публичный доступ. Однако мое мнение об этой статье обусловлено несколько иными, на мой взгляд, более мутными и серьезными нестыковками, чем те, моменты, на которые ты обращаешь внимание. То, что ты говоришь, либо сравнительно мелко (как, например, то, что Экспа поставил нескругленные d там), или не в кассу (как твои попытки убедить меня, что принцип д'Аламбера там не нужен). Я рассчитывал, что когда я тебе скажу, что вообще-то эта статья сырая, ты поможешь придать ей более стройный вид, анализируя ее по существу и внося конструктивные коррективы, а ты, похоже, воспринял мое замечание как карт-бланш на то, чтобы метать в этот текст говно широкими неприцельными мазками. Я вовсе не рассчитывал на то, что кто-то ее прочитает по диагонали и уйдет тихонько в стороночку восхищаться, как ты предположил. Так же ты ошибся в своем предположении, что тут кто-то любит закоживать что-либо бездумно по чужим пейперам - тут нет таких, тут все с точностью до наоборот. Как можешь заметить, сложилось стойкое впечатление, что ты критикуешь статью поверхностно, малоконструктивно, с намеком на переход на личности. Этого нельзя одобрить. С другой стороны, никто тут не защищает ревностно этот текст, поэтому если от тебя будет поступать фидбек в форме "предметное замечание - обоснование - предложение, как улучшить", то мы все тебе будем премного благодарны.
SoRRoW
Аминь!
tikka
По поводу градиента опять же, я спорил про то что можно обозначать дробью, а не только наблой :) Даже не обратил внимание на форму "д". Но я все равно считаю подобное обозначение (через полную производную) жизнеспособно, однако я постараюсь это проанализировать в ближайшее время. В остальном - поддерживаю предыдущего оратора.
У меня есть к тебе просьба - ты говорил о неточностях, которые заставили тебя обратиться к другим источникам; было бы очень хорошо, если бы ты прям написал пронумерованный список: цитата, что конкретно непонятно, и то, как оно должно выглядеть на твой взгляд (с указанием, по каким источникам ты сделал такие выводы - совсем хорошо бы было еще и с выдержками текстовыми :) ).
По нестыковкам есть только такие соображения.
В условиях Каруша-Куна-Такера g почему-то равен 0, хотя ci >= 0. Учтены не все достаточные условия, на некоторые можно забить, но где lambda_i >= 0 ?
В формулировке LCP в конце нет ограничений, и для меня самое темное место это получение неравентства через ряд тейлора, удовлетворинием мгновенному условию. XperienS ты это где то прочитал, или сам вывел? И как в этом случае получить complementarity conditions? Как учесть joint связи?
В общем проанализировать это не удалось:)
Как все представляется мне: условие стационарности позволяет нам выразить Fc через Jt, (в той литературе что я читал даже этого не делали, а просто констатировали Fc = Jt * lambda, потому что строки J - базис для Fc). Ну еще от туда можно взять lambda_i >= 0, как ограничение для LCP. Для решения на уровне скоростей мы достаточно сузили множество Fc, больше никаких условий выполнять не нужно.
Далее, доходим до момента где выражена V на очередном шаге:
>>Теперь, рассмотрим первичное условие допустимости из условий ККТ решения задачи..
Вот в этом месте надо бы вспомнить про ограничение на скорости JV = 0
Подставляем в уравнение для новой скорости, добавляем ограничения на lambda, получаем LCP.
Рассмотри JV = 0. Это диф. уравнение относительно ограничения: dC/dt = JV = 0. Интегрируя его через временные промежутки dt мы по сути аппрксимируем решение ломаной, в которой точки перелома соответствуют точкам, интегрирования, а направление отрезка исходящего из точки совпадает с касательной к точному решению в данный момент. В итоге через какое то время ломаная уходит далеко от решения, это эффект дрифта объектов друг в друга. Что бы от этого избавиться применяют техники стабилизации позиций. Баумгарте: заменяем dC/dt = 0 на dC/dt + k * C = 0, получаем более стабильную дифуру. Т.е. вместо JV = 0, подставляем в выражение для скорости JV = bias * C. Получили LCP со стабилизацией позиций.
>>Ну с д'Аламбером-то зачем обижаешь? Он там нужен хотя бы для того, чтобы обосновать, с чего это вдруг мы принялись минимизировать работу сил ограничений на r. Кроме того, он нужен для того, чтобы понять, что r выбирается из множества виртуальных перемещений момента t0, и по этой причине Fc момента t0 не зависят от r, ибо r выбирается из множества тех, которые допускаются связями. Это в дальнейших формулах проявляется в том, что градиент работы оказывается равен Fc...
Еще раз: "говоря проще, Д'Аламбер постулировал, что в системе с идеальными ограничениями, перемещения являются "допустимыми" - ортогональными к вектору". Не в этом суть принципа, а в том что он позволяет не учитывать работу Fc, и это нам нигде нафиг не упало. Можно просто сказать "потребуем от связей что бы они были идеальными". Все. Идеальные связи по определению не совершают работы, и перемещения ортоганальны реакциям.
>>Это в дальнейших формулах проявляется в том, что градиент работы оказывается равен Fc...
Это следует из условия стационарности, что в свою очередь из того что мы приказали связям быть идеальными. На этом цепочка достаточных условий заканчивается.
Вопрос с координатами позиций и скоростей для меня все еще не ясен, но я над этим поразмыслю.
>>было бы очень хорошо, если бы ты прям написал пронумерованный список
Все неточности я уже называл. Другие источники: википедия, статьи про множители Лагранжа и принцип Даламбера.
>>Но я все равно считаю подобное обозначение (через полную производную) жизнеспособно, однако я постараюсь это проанализировать в ближайшее время.
Все уже проанализировали еще в 17 веке;)
Внезапно вспомнил еще одну хрень.
В статье уравнения движение имеют вид: F(t) = M * x''
В реальности в этой дифуре может присутствовать и x':
F(t) = M * x'' + k * M * x', [Michael Cline]
где k - условный коэффициент с особого вида. Этому общему виду соостветствуют уравнения Ньютона-Элера. k * M * x' - член отвечающий за силы Кориолиса. При выводе LPC он игнорится, об этом надо упомянуть.
tikka
в инерциальной системе отсчёта вид именно такой: dP/dt = F. линейный по скорости член появляется в неинерциальной системе отсчёта.
>>в инерциальной системе отсчёта вид именно такой: dP/dt = F. линейный по скорости член появляется в неинерциальной системе отсчёта.
Ну да.
>>В условиях Каруша-Куна-Такера g почему-то равен 0, хотя ci >= 0.
Это-то как раз правильно. g - ci(x) <= 0; g = 0 => ci(x) >= 0. Тут g обозначает константу в неравенствах. Если в условиях-неравенствах сделать не 0, то мне кажется, что съедет условие идеальности, и трение и моторы, а также стабилизация, к этой схеме прихаканы потом уже, сбоку-припеку.
>>Учтены не все достаточные условия, на некоторые можно забить, но где lambda_i >= 0 ?
Косяк, да. Вообще по уму там на минимуме целевой функции образуется такая пурга:
dF/dr - J^t * lambda = 0; (т.к. r- неограниченная переменная, тут простое условие экстремума)
c_i(r) >=0;
lambda_i >=0;
c_i(r) * lambda_i = 0;
(т.к. это ограничения-неравенства)
c_e(r) = 0;
(т.к. это ограничения-равенства).
Что же касается ряда Тейлора, то тут воистину все мутно. Идея была в том, чтобы как-то избавиться от потенциально нелинейных
функций ограничений с_e и c_i. А именно, приблизить их рядом тейлора вблизи r = 0, т.е. вблизи x0, обобщенных координат системы на момент t0, начала кадра. Тогда с(r) = c(0) + dc/dr * r. Поскольку у нас r считается = v * deltat, а dc/dr = dc/dx = J (поскольку x = x0 + r), то c(r) = с(0) + J * v * deltat, а если пока не учитывать стабилизацию и считать связь выполненной на начало кадра, т.е. c(0) = 0, то c(r) = J * v * deltat. Из этого в сочетании с приведенными выше условиями ККТ и SUM(F) - Ma = 0, и a = (v1 - v0)/deltat, мы можем получить систему в виде Michael Cline.
Лично для меня тут мутным кажется такой вот нюанс. Мы оперируем тут ограничениями c(r), т.е. c(x0 + r), т.е. c(x1), т.е. ограничениями в той точке, в которую смещаемся. Как это сочетается с тем, что dF/dr = d(Fc * r)/r = Fc ? Ведь чтобы это вывести, мы утверждаем, что dFc/dr = 0 по причине идеальности связей, а потом сами же рассматриваем связь как функцию от r. Правда, в одном случае речь идет о силе реакции, которая получается Fc = J^T*lambda, в другом случае речь идет о самой связи c(r), которая, однако, получается равна J * r. Вроде бы противоречия нет, но у меня в башке что-то замыкается в этот момент...
>>Это-то как раз правильно. g - ci(x) <= 0; g = 0 => ci(x) >= 0. Тут g обозначает константу в неравенствах.
стоп стоп, у вас g == ce(x), правильно я понимаю? Если так то g(x) = 0 это не константа а уравнение, и градиент g != 0.
или у вас ce(x) и ci(x) совмещены в c(x)?? это тоже не совсем корректно.
>>Что же касается ряда Тейлора, то тут воистину все мутно. Идея была в том, чтобы как-то избавиться от потенциально нелинейных функций ограничений с_e и c_i.
Если уж избавляться то избавляться от обоих сразу, как я понял вы аппроксимируете только c_i. И что получится в итоге, если добавить c_e, система из неравентва и равенства?
Кстати с таким интересным подходом стабилизация не нужна, так как вы автоматически удовлетворяете ограничениям на позиции, и ряд тейлора добавляет стабилизационные члены. И все же я склонясь к тому что это тупиковый подход. Если вы хотите получить уравнение в виде Michael Cline, почему не использовать его подход. Если нужно могу попробовать его изложить в моем понимании (описанный ранее мной подход был из Erin Catto).
>>Лично для меня тут мутным кажется такой вот нюанс. Мы оперируем тут ограничениями c(r), т.е. c(x0 + r), т.е. c(x1), т.е. ограничениями в той точке, в которую смещаемся. Как это сочетается с тем, что dF/dr = d(Fc * r)/r = Fc ? Ведь чтобы это вывести, мы утверждаем, что dFc/dr = 0
нормально сочетается, если работа равна 0 это еще не значит что ее градиент равен 0. Аналогично f(x) == 0 не означает что f'(x) == 0
Кстати, что по поводу Даламбера, все еще не убедительно?:)
Блин перечитал Karush–Kuhn–Tucker conditions, и до меня дошло! все стало на свои места! Это ж так очевидно.
ЭТАП 1)
Рассматриваем только идеальные связи => Приказываем связям быть идеальными.
Из условий стационарности получаем:
Fc = Je_t * lambda_e + Ji_t * lambda_i (1)
Из Dual feasibility:
lambda_i >= 0 (2)
Из Primal feasibility:
ci(x) >= 0 (3)
ce(x) = 0 (4)
Из Complementary slackness:
ci_е_t * lambda_i = 0 (5)
Дифференцируем Primal feasibility:
Jе * V = 0 (6)
Ji * V >= 0 (7)
Дифференцируем Complementary slackness:
lambda_i_t * (J i * V) = 0 (8)
ЭТАП 2)
Составляем уравнения движения:
Fext + Fc = M*x'' (9)
Дискретизируем его по временным шагам:
Fext + Fс = M * (Vcur - Vprev) / dt (10)
Положим w = Ji * V (11),
тогда из (7): w >= 0 (12)
из(8): w_t * lambda_ i = 0 (13)
Составляем систему из (10), (6), (11), добавляем complemebtarity conditions (2), (12), (13) получаем MLPC.
Никакого приближения тейлором не делаем, вместо этого применяем техники стабилизации позиций.
ЭТАП3)
выражаем lambda_e и Vcur через lambda_i , получаем LCP в виде Cline.
Красота!:)
tikka
Ну то, что ты написал, это ж ровно то, о чем статья :) Я не вижу в твоей логике вообще ни одного расхождения. Да, это то, что мы хотели сказать.
Единственное, это "Дифференцируем Primal feasibility и Дифференцируем Complementary slackness: ". То, что дифференцируем, это понятно, но зачем и по какому праву дифференцируем? Ведь условия ККТ - на сами ограничения, а не на их производные, и подменять их просто так на ограничения на производные не очень-то правомерно. Я тут вспомнил о том, что на практике передача ограничений через якобиан приводит к тому, что линейно аппроксимируются вокруг точки начала кадра. Соответственно, подумал я, заменю-ка я в Primal feasibility и Complementary slackness функции констрейнтов на их разложение по тейлору с точностью до 1 производной вокруг точки начала кадра. Если принять, что в начале кадра ограничения удовлетворены, то константный член разложения c(0) = 0, и по факту получается то же самое, что у тебя от простого дифференцирования этих условий. Я согласен с тем, что стабилизация вводится дополнительно; я ввожу тут Тейлора не для того, что бы потом перебросить c(0) в правую часть (хотя можно было бы, наверное, но мне это тоже кажется странным маневром), а лишь для того, чтобы обосновать, с какой такой стати вдруг мы заменили сами ограничения на их производные; чтобы это получилось, я считаю, что связи были удовлетворены на начало кадра, то есть c(0) = 0. Кстати, в более старых подходах, где система решалась в ускорениях, а не в скоростях, была еще одна матрица, на которую множились ускорения, а не только наш родной якобиан, что подталкивает меня к мысли, что дифференцирование там действительно обусловлено именно разложением по Тейлору.
По поводу д'Аламбера - я по-прежнему считаю, что не вспомнив всуе его имя, мы не можем обосновать, с чего вдруг мы бросились минимизировать работу.
И, если еще актуально:
>>стоп стоп, у вас g == ce(x), правильно я понимаю? Если так то g(x) = 0 это не константа а уравнение, и градиент g != 0.
>>или у вас ce(x) и ci(x) совмещены в c(x)?? это тоже не совсем корректно.
Нет, g у нас - константная часть ограничения. То есть если ограничение 5 * x0 + 6 * x1 = 7, то c(e) = 5 * x0 + 6 * x1, а g = 7. Мутно, согласен. c(x) я использую кое-где для скорости для обозначения действий, общих для c_i и с_e. Можно его считать объединением c= {c_e, c_i}. Что у Экспы в статье - не знаю, но думаю, что так же.
>>Если уж избавляться то избавляться от обоих сразу, как я понял вы аппроксимируете только c_i. И что получится в итоге, если >>добавить c_e, система из неравентва и равенства?
Нет, оба аппроксимируем одинаковым образом, и с_e, и c_i
кстати, еще фишка - у Клайна твой этап 3 вообще отсутствует, я так понимаю, он большую MLCP с кучей нулей решает, а "этап 3" - это преобразование Шура или Шнура или как там, и там только Vcur выражается через обе лямбды, т.е. в результате все равно остается MLCP, но меньшей размерности, и оно уже и решается, в классическом случае projected gauss-seidel'ем или попсовым саксессив импульсес. Еще большая тема - паралелить этого гаусс-зйделя. А мы, не могу не похвалиться, приспособили один забубенный алгоритм на базе сопряженных градиентов, он хоть и тяжелый, но параллелится отменно.
>>Нет, g у нас - константная часть ограничения. То есть если ограничение 5 * x0 + 6 * x1 = 7, то c(e) = 5 * x0 + 6 * x1, а g = 7. Мутно, согласен. c(x) я использую кое-где для скорости для обозначения действий, общих для c_i и с_e. Можно его считать объединением c= {c_e, c_i}. Что у Экспы в статье - не знаю, но думаю, что так же.
Что то я этого не понял. если вы совмещаете c_i и c_e в одном с, и получете Fx = J_c * lambda, то почему потом удовлетворяете только c_i > 0, причем для _всех_ lambda?
>>По поводу д'Аламбера - я по-прежнему считаю, что не вспомнив всуе его имя, мы не можем обосновать, с чего вдруг мы бросились минимизировать работу.
:) ну я не знаю как еще объяснить, разве что вы молитесь на даламбера, и задобряете его дух=)
Чет заинтересовала меня эта задачка:)
Я даже порешал что то на бумаге, и таки удалось проанализировать разложение в ряд Тейлора:)
Основная ваша идея в том чтобы приблизить ограничения в момент t1 и удовлетворить им. То есть находясь в точке x0 в момент t0, мы подбираем такую скорость V что бы стрельнуть за dt точно на кривую решения. Но вследствии погрешности разложения точно на решение мы не попадем, однако будем постояннно болтаться около его кривой. Математически это эквивалентно применению стабилизации (разложение в ряд скорее всего и было основной идеей стабилизации так что математически это эквивалент).
Далее, в статье автор удовлетворил только одному условию из Каруша-Куна-Такера:
Сi >= 0 (1)
а нужно еще двум:
Ce = 0 (2)
Сi_t * lambda_i = 0 (3)
с (2) все прокатит, из (1) и (2) получим решаюмую систему.
С (3) уже проблемы, т.к. там будет присутствовать квадратичная форма от (lambda_i, lambda_e) и (lambda_i), короче коворя нелинейное уравнение, не решеаемое LPC.
Как делают чуваки в пейперах: они заменяют ограничения на позиции ограничениями на скорости. То есть находясь в момент t0 в точке x0 стреляют по напраявлению касательной к решению (надеясь что решение не слишком отклонится за dt). Через некоторое время мы уходим далеко от точного решения. Что бы этого избежать применяют стабилизацию (которая следует из того же разложения).
Что делать со статьей: Можно попытаться удовлетворить условиям (1) и (2) на позицию, а условие (3) продифференцировать. Или дифференцировать все условия и добавлять стабилизацию как я описал постом выше. Так же в статье непонятная (имхо лишняя) хрень с приближением матрицы якоби.
Все, вопрос казалось бы исчерпан:)
Ну почти:)
>>а "этап 3" - это преобразование Шура или Шнура или как там, и там только Vcur выражается через обе лямбды, т.е. в результате все равно остается MLCP, но меньшей размерности,
Не, там есть описание как преобразовать MLCP в pure LCP. я говорил про выражение Vcur и lambda_e через lambda_i. Подучится чистая LCP.
Возвращаясь к Даламберу. Все же попробую сформулировать свою точку зрения с другой стороны.
Ваша цель сделать перемещения "допустимыми". "Допустимый" в вашей трактовке это что абсолютное, то есть только те перемещения возможны, которые ортогональны реакциям. Тоесть в нашей модели будут присутчтвовать только те перемещения которые ортогональны реакциям. Допустим мы хотим добавить не идеальное ограничение. Из за него могут появится "недопустимые", неортогональные перемещения. Это плохо. Мы же вначале решили что в нашей модели будут только ортогональные. Значит такое ограничение нам не подходит. А вот остальные - идеальные подходят. То есть все ограничения должны быть идеальными.
Основной критерий выбора ограничений в том какие перемещения вы считаете "допустимыми". (только ортогональные перемещения) => (только идеальные ограничения)
Или же с другой стороны: если решили что все ограничения идеальны то все перемещения ортогональны:
(только идеальные ограничения) => (только ортогональные перемещения)
то есть получили критерий:
идеальные... <=> ортогональные...
не важно с чего начать, выберете что то одно и делайте очстальные выкладки.
Возможно вас ввела в конфуз формулировка принципа "Среди всех движений системы с идеальными ограничениями, кинематически возможным является такое...". Вот это вот "кинематически возможное" - характеристика не абсолютная, а только в контексте системы. И такое ограничение на перемещения обусловлено именно тем фактом что рассматриваем систесу с идеальными связями.
Даламбер тоже воспользовался этим критерием и начал с идеальных ограеничений:
идеальные... => ортогональные...
По вашей логике если вы пользуетесь принципом даламбера, то пользуетесь цепочкой:
идеальные... => ортогональные... => идеальные...
И мозг начинает кружиться в танце при попытке осознать.
Тема в архиве.