Мне нужно решить большую систему нелинейных уравнений (статическая ферменная система).Уравнения выводятся из узлов (xyz) и их ограничений (положение, силы).
На данный момент мы используем Mathematica для этой задачи, но мы хотели бы перейти на Python.Но с Mathematica (или EES (решение инженерных уравнений) или SymPy) это довольно удобно.Я добавляю кучу вещей в подобные позиции узлов или силы на узлах, и это делает некоторую магию и создает уравнения самостоятельно, комбинируя входные данные и решая их.
Если я хочу использовать scipy.optimize.root
, мне нужно как-тополучить уравнения.
scipy.optimize.root
и scipy.optimize.fsolve
нужны уравнения в следующем формате:
def func(x):
out = [x[0]*cos(x[1]) - 4],
x[1]*x[0] - x[1] - 5)
return out
Но в моем случае будет до 5000 уравнений, которые определяют систему.
Одна вещь, которая пришла мне в голову, - это использовать eval()
и как-то смешать уравнения в строку.
В конце я хотел бы использовать объектно-ориентированный подход, в которомузел или ограничение знает, как преобразовать себя в уравнение.Очень простым скелетом может быть
n = Node(5, 2, 6)
n.to_equation()
f = ForceConstraint(1, 2, 3)
f.to_equation()
, и это каким-то образом преобразуется в уравнения типа
x[0] - 5,
x[1] - 2,
x[2] - 6,
x[2] ** 2 - x[1] * x[0] # and some non-linear stuff
для описания всей системы.
По сути, должно быть какое-то волшебствочасть, которая смотрит на совпадающие части уравнений и ограничений.Например, просмотрите всю информацию, имеющуюся у вас в направлении x
Узла1, и объедините ее в уравнения, или найдите всю информацию о силах в направлении y
в Узле 2.
Является ли scipy
правильным инструментомдля работы вообще?У кого-нибудь есть хорошая идея, как это сделать?