Я новичок в программировании, и это мой первый вопрос. Я трачу много времени на эту проблему. Это абстракция из программы, которую я пишу для моей диссертации. Может быть, для некоторых из вас эксперты тривиальны, но мне даже не хватает математических знаний.Runtime Оптимизация символьного кода с использованием numpy или scipy
Я хочу, чтобы решить следующую систему уравнений для b1, b2 и с3:
0 = cos(b1)+ cos(b2)- 0.0166
0 = sin(b1)+ sin(b2)+ 0.3077*c3 - 0.6278
0 = cos(b1)- cos(b2)+ 5.4155*c3 - 4.3547
b1 и b2 являются углы и должны, следовательно, между [0, 2 * пи] и с3 должно быть между [0, 1], но это необязательно. Я могу фильтровать результаты позже.
Я нашел решение с помощью SymPy:
import sympy as sy
b1 = sy.Symbol('b1',real=True)
b2 = sy.Symbol('b2',real=True)
c3 = sy.Symbol('c3',real=True)
a = sy.cos(b1)+sy.cos(b2)-0.0166
b = sy.sin(b1)+sy.sin(b2)+0.3077*c3-0.6278
c = sy.cos(b1)-sy.cos(b2)+5.4155*c3-4.3547
Erg = sy.solve([a,b,c,],[b1,b2,c3],dict=True)
[{с3: -0,4634, b1: 2,7245, б2: 0,3739}]
Результаты являются обоснованными, но, к сожалению, это приводит к вычислению время 6s, что приведет к полному времени вычисления более 7 часов для моей программы. Пожалуйста, помогите мне найти более быстрое решение. Я попытался SciPy
from scipy.optimize import fsolve
import numpy as np
def equations(p):
b1, b2, c3 = p
return (np.cos(b1)+np.cos(b2)-0.0166, np.sin(b1)+np.sin(b2)+0.3077*c3-0.6278,np.cos(b1)-np.cos(b2)+5.4155*c3-4.3547)
b1, b2, c3 = fsolve(equations, (-0.4634, 2.7245, 0.3739))
В результате под 1s в (-9.8418e-14, 5.6621e-15, -7.5495e-14). Я не знаю, какое число принадлежит какой переменной, но они не имеют никакого смысла. Другим вариантом было бы оптимизировать уравнение для минимального c3. Пожалуйста, не стесняйтесь спрашивать, не ясно ли я о чем-либо.
Корпус «numpy» может знать только порядок переменных из определения функции: вы передаете 'p' как' b1, b2, c3'. Но тогда вы должны ввести свои данные в следующем порядке: 'fsolve (уравнения, (2.7245, 0.3739, -0.4634))'. Но в любом случае вы правы, что '(0,0,0)' не решает ваше уравнение. Разве вам не хватает скобки в вашем 'numpy'' return'? –
Да, вы правы, что он потерялся при изменении вопроса, но он есть в исходном коде. Спасибо за комментарий к правильному порядку переменных! – Fips
Интересно, если я попробую ваше символическое решение, я получаю сообщение об ошибке «не могу решить» ... sympy 0.7.4.1. –