Я новичок в 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.