добавление ограничений в систему нелинейных уравнений - PullRequest
0 голосов
/ 02 мая 2020

Это мой первый вопрос по stackoverflow. Извините, если это немного неуклюже.

Я пытаюсь решить статическое c равновесие, описывающее луч в слоистой почве. С точки зрения сил, действующих на балку, существует некоторая внешняя сила, и есть реакция почвы на эту силу. Действие и реакция, очевидно, должны быть сбалансированы. Реакция - сумма сил от почвы, объединенной по различным слоям. Почва реагирует нелинейно в зависимости от смещения. По сути, это конкретное равновесие является скаляром, потому что это просто сумма реакции = действия.

С другой стороны, внутренние силы внутри балки также должны быть сбалансированы с локальной силой, действующей на рассматриваемый элемент балки , Допустим, у нас есть 40 таких элементов. Итак, проблема, с которой я сталкиваюсь в двух словах, заключается в следующем:

Мне нужно найти root от F1 (x1, x2, ... x40), где x1, x2 ... x40 описывают смещение кучи в почве. Я передаю и исходное предположение о смещении, и Fsolve возвращается с вектором длиной 40, который дает F1 = [0,0 ... 0]. Таким образом, это в основном уравновешивает внутренние силы с локальной силой на балке (фактически кривизна с моментом).

Проблема в том, что я не могу добавить дополнительное ограничение, которое является глобальным равновесием, которое я описал выше, потому что оно нарушает условие в fsolve, что длина выходного вектора должна равняться длине входного вектора , Я не могу добавить такое ограничение в Fsolve. Я также пошел по пути оптимизации, где вы можете добавлять ограничения, но это не работает, потому что оптимизирует скаляр и не работает с векторными корнями.

Возможно, я просто пропустил что-то глупое, но я ' мы напрасно стекались через стекпоток несколько дней. Я, вероятно, могу решить это с помощью решателей дифференциальных уравнений, но я не хочу go таким образом по разным причинам, если я могу избежать этого. Что-нибудь, чтобы дать мне новый угол, помогло бы! Абсолютно новый для python, поэтому я очень ценю все полезные решения, которые я прочитал до сих пор, даже если это не совсем помогло мне.

1 Ответ

0 голосов
/ 03 мая 2020

Обычно у нас есть n уравнений и n переменных, то есть квадратная система. Если решение не уникально, это означает, что ваши уравнения не являются независимыми. При добавлении дополнительных ограничений вы больше не можете использовать квадратный системный решатель. Однако вполне возможно использовать решатель нелинейной оптимизации. Например, мы можем написать:

 min 0
 subject to 
      F(x) = 0   (n equations) 
      G(x) = 0   (additional constraints)

Если вы хотите решение, которое близко, вы можете добавить слабины и минимизировать сумму квадратов ошибок:

 min ||s|| + ||t||
 F(x) = s
 G(x) = t

Я использую этот подход довольно много.

...