Как я могу использовать элементы FiniteSet для моих следующих расчетов? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь растворить уравнение с использованием решающего набора (уравнение, переменная), которое в результате даст мне значение переменной. В результате я получаю FiniteSet {значение}. Доступен ли этот FiniteSet, чтобы я мог использовать значение (которое, мы надеемся, типа float) для следующих вычислений?

Проблема заключается в следующем: Я определяю три символа SymPy (drift1, drift2, drift3 = symbols('drift1 drift2 drift3')), которые должны быть своего рода заполнителями для следующих вычислений. У них нет ценностей. Они являются частью двух уравнений (equation1 и equation2, оба являются функциями drift1, drift2 и drift3). Моя цель - запрограммировать цикл итерации для оптимизации всех трех символов drift1, drift2 и drift3 путем решения обоих уравнений и использования результатов для следующего шага итерации. Для этого я определяю три переменные Python x, y и z, начальные значения a и y равны 0.0188 и 0.0099. z является функцией от x и y и будет вычисляться как новая с каждым шагом итерации. На первом шаге z вычисляется с использованием x и y (и других переменных, которые я определил в коде), и я заменяю drift2 и drift3 на y и z в уравнении 1 (уравнение теперь является функцией drift1). Активируя equation1=0 в сторону drift1, я использую solveset(equation1.subs(drift2, y).subs(drift3, z), drift1) и получаю FiniteSet, который содержит результат. Я буду использовать этот результат для решения второго уравнения, выполнив solveset(equation2.subs(drift1, result from FiniteSet).subs(drift3, z), drift2). Это не работает, потому что результатом является не переменная float, а тип sympy.sets.sets.FiniteSet.

Может кто-нибудь сказать мне, как я могу использовать значение FiniteSet («внутри» FiniteSet; {значение}) для следующих вычислений? Я использую Pyhton 3 и SymPy.

import numpy as np
from sympy import *
import scipy as sp

drift1, drift2, drift3 = symbols('drift1 drift2 drift3')
init_printin(use_unicode=True)

equation1 =  0.005*(drift1*(-23.88*drift2*(15.16*drift3 + 1.15)-20.31*drift3
                       +00.47*drift2*(15.16*drift3+1.15)+1.03*drift3+0.05))/drift1

equation2 = 0.005*(drift1*(35.73*drift2*(-13.79*drift3 + 0.86)+7.91*drift3+2.09)
                       +1.65*drift2*(-13.79*drift3+0.86)+0.75*drift3+0.07)/drift1

x, y = 0.0188, 0.0099
gesamtlaenge = 1.676
laenge1 = 0.04
laenge2 = 0.02

# the loop for the iteration is not included in this code
# the only thin I wanna know is how to substitute drift1 by the solution of 
# the first calculation sol1

z = gesamtlaenge-laenge1-laenge2-x-y
expr1 = equation1.subs(drift2, y).subs(drift3, z)
sol1 = solveset(equation, drift1)
# up to this point, the code is running, but now, I get a FiniteSet {0.047} as
# result for sol1 and I wanna use this value to substitute drift1 in the next calculation
expr2 = equation2.subs(drift1, sol1).subs(drift3, z)
sol2 = solveset(equation, drift2)
print(drift1, drift2, drift3)

Когда я выполняю expr2 = equation2.subs(drift1, sol1).subs(drift3, z), я получаю уравнение2 как функцию drift1 и drift2, потому что оно не может использовать значение в FiniteSet {0,047} (0,047 - это нужное мне значение). Я понимаю, почему это так, но у меня нет решения.

Я благодарен за любую помощь! Приветствия

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете получить доступ к элементу (ам) FiniteSet, преобразовав его в список. В этом случае, где есть одно решение, list(sol1).pop() будет работать:

>>> sol1 = FiniteSet(1)
>>> x.subs(x, list(sol1).pop())
1
...