Нуждаюсь в помощи по оптимизации решения системы нелинейных уравнений, которые изо всех сил пытается сделать Симпи - PullRequest
0 голосов
/ 19 мая 2019

Я новичок в Python и полный новичок в Sympy.Для школьного проекта я хочу смоделировать (на удивление) сложное движение.Я нашел 4 уравнения, которые мне нужно решить.Уравнения являются нелинейными и используют тригонометрию на 2 разных углах и на 2 изменяющихся длинах. У меня нет надежды решить ее самостоятельно, не потерпев неудачу или не умирая в процессе.

Уравнения следующие:

- eq1 = Fr1*((2*r+a)*cos(a1+gam)-h*sin(a1+gam+beta))+Fr2*(a*cos(gam-a2)-h*cos(gam-a2-beta))+Fpv*((r+a)*cos(gam)-h*cos(gam-beta)) - eq2 = OGx[t+2]-(L2*cos(a2)+a*sin(gam)+h*sin(beta-gam)) - eq3 = OGy[t+2]-(2*R-L2*sin(a2)-L2*cos(a2)*(R/(L2*sin(a2))-1)-L1*sin(a1)-(r+a)*cos(gam)+h*cos(beta-gam)) - eq4 = L2-demi*(2*L1*(cos(a1)*cos(a2)-sin(a1)*sin(a2))+4*R*sin(a2)-sqrt((2*L1*(cos(a1)*cos(a2)-sin(a1)*sin(a2))+4*R*sin(a2))**2-16*(L1**2+R**2-r**2-R*L1*sin(a1))))

Где:

  • a1, a2 - два независимых угла (физически ограниченных определенными значениями)
  • L1, L2 длина двух строк (пружин) (L0 - базовая длина пружины)
  • Fr1, Fr2, OGx [t + 2], OGy [t + 2] зависят от параметров прецедента (Iне будем их здесь подробно описывать)
  • demi = Fractional (1,2) (я где-то читал, что это может быть лучше, чем 0,5, правда?)
  • gam = asin ((L2* ca2-L1 * ca1) / (2 * r))

Параметры здесь a1, a2, L1 and L2.

Я обнаружил модуль Sympy и подумал, что он будетрешить мою систему и мои проблемы в то же время!К сожалению, с помощью функции nonlinsolve решение слишком длинное для решения (на самом деле у меня нет доказательств того, что есть решение, поскольку я «только» ждал 2 часа после сценария, прежде чем его остановить)

Поэтому я подумалчто замена всего косинуса и синуса переменными, такими как ca1, ca2 ... будет проще для Sympy иметь дело с.(Примечание: это еще не полиномиальная система, поскольку gam - это arcsin чего-то, и я не нашел способа преобразовать cos (arcsin (что-то)) в лучшую форму (ср. Eq1, eq2, eq3))

- eq1 = Fr1*((2*r+a)*(ca1*cos(gam)-sa1*sin(gam))-h*(sa1*cos(gam+beta)+sin(gam+beta)*ca1))+Fr2*(a*(cos(gam)*ca2+sin(gam)*sa2)-h*(cos(gam-beta)*ca2+sin(gam-beta)*sa2))+Fpv*((r+a)*cos(gam)-h*cos(gam-beta) - eq2 = OGx[t+2]-(L2*ca2+a*sin(gam)+h*sin(beta-gam)) - eq3 = OGy[t+2]-(2*R-L2*sa2-L2*ca2*(R/(L2*sa2)-1)-L1*sa1-(r+a)*cos(gam)+h*cos(beta-gam)) - eq4 = L2-demi*(2*L1*(ca1*ca2-sa1*sa2)+4*R*sa2-sqrt((2*L1*(ca1*ca2-sa1*sa2)+4*R*sa2)**2-16*(L1**2+R**2-r**2-R*L1*sa1)))

В этом случае я создал новый набор из 2 уравнений (тригонометрическое соотношение cos(a)**2+sin(a)**2 = 1), чтобы убедиться, что решения для косинуса и синуса в порядке, поэтому:

- eq5 = ca1**2+sa1**2-1 - eq6 = ca2**2+sa2**2-1

Теперь, когда я даю это nonlinsolve:

from sympy import nonlinsolve,cos,sin,symbols

L1,L2,L0,ca1,ca2,sa1,sa2 = symbols('L1 L2 L0 ca1 ca2 sa1 sa2', real=True)

# Here I paste the aformentioned equations and stuff related to the function in which I put the solver (like lists OGx and OGy...)

nonlinsolve([eq1,eq2,eq3,eq4,eq5,eq6],[sa1,sa2,ca1,ca2,L1,L2])

Здесь я получаю ошибку: AttributeError: 'And' object has no attribute 'as_base_exp'

Я полагаю, что это исходит отуравнения 5 и 6, потому что без них система получает решения, но только L1 задается с использованием других параметров (что является нормальным, потому что не хватает уравнений для числа неизвестных).

Я действительно застрял, потому что у меня даже нет словарного запаса, чтобы искать свою проблему в Интернете (я искал ее за несколько часов до публикации этой статьи), поэтому я даже не знаю, является ли мой подход самым умным.Более того, этот проект должен закончиться очень скоро, и мне нужно решить мои уравнения.

Поэтому у меня следующие вопросы:
- Является ли nonlololve лучшим решением здесь?
- Почему я получаю эту ошибку?
- Есть ли способ упростить работу для Sympy, зная, что интервал, в котором находятся a1 и a2, равен [-pi / 2, pi / 2]
- Здесь не упоминается, но как использовать полученный результаткак FiniteSet от nonlinsolve, как {(2n * pi) | n естественно)} (способ сказать Python, что я хочу n = 1, например)?

Спасибо, мы ценим любую помощь, даже советы и подсказки по этому вопросу, потому что я практически ничего не знаю о Sympy.

...