***** ***** EDITНе удается получить SymPy численно оценивать результаты решения системы уравнений
Добавление упрощенный пример, чтобы показать проблему более четко. Оригинальное сообщение после редактирования.
Я пытаюсь получить большую массу уродливого кода в исходном сообщении, чтобы получить простой численный результат. В этом приведенном примере у меня есть три уравнения: EqA, EqB и EqC. EqA и EqB оба принимают числовые входы. Затем EqC выводит результат из EqA и добавляет его к выходу из EqB. После выполнения решения() и evalf() я ожидал получить в результате значение 11, но он просто дает мне выражение. Как бы я правильно оценил такую систему уравнений?
from sympy import *
from sympy.printing.mathml import print_mathml
init_printing()
Fa,Fb,a,b,c,d,T = symbols('F_a F_b a b c d T')
EqA = Eq(a+b,Fa)
print(EqA)
EqB = Eq(c+d,Fb)
print(EqB)
EqC = Eq(Fa + Fb,T)
print(EqC)
results = (solve([EqA,EqB,EqC],T))
print(results)
print('printing results')
print(results[T].evalf(subs={a:1,b:3,c:3,d:4}))
Это дает следующий результат:
-F_a + a + b
-F_b + c + d
F_a + F_b - T
{T: F_a + F_b}
printing results
F_a + F_b
Ожидаемый выход для заявления evalf() является 11.
*****/РЕДАКТИРОВАТЬ *****
Кажется, что этот код не дает никакого числового вывода. Я пытаюсь создать более сложное уравнение, разбивая его на более мелкие части, чтобы упростить поиск неисправностей. Желаемый выход должен решаться для T. Однако, когда я запускаю решатель, а затем пытаюсь evalf() на выходе, он просто выводит на меня то же выражение. Поведение идентично тому, когда я не могу определить все необходимые числовые входы, но я думаю, что у меня есть все соответствующие, определенные в вызове evalf(). Любые идеи относительно того, что я делаю неправильно?
from sympy import *
init_printing()
periodOfInterest = symbols('P') #constant
modDensity = symbols('D_m') # result of calculation
floorDensity = symbols('D_f') # result of calculation
distanceTraveledPerPickMod = symbols('x_m') # result of calculation
distanceTraveledPerPickFloor = symbols('x_f') # result of calculation
travelTimePerPickMod = symbols('t_modTravel') # result of calculation
travelTimePerPickFloor = symbols('t_floorTravel') # result of calculation
timePerPickMod = symbols('t_totalMod') # result of calculation
timePerPickFloor = symbols('t_totalFloor') # result of calculation
T = symbols('Total_picks') # result of calculation
unitsMod = symbols('U_m') #constant
zonesMod = symbols('Z_m') #constant
pathLengthMod = symbols('L_m') #constant
travelRate = symbols('R_p') #constant
pickTime = symbols('k_p') #constant
unitsFloor = symbols('U_f') #constant
zonesFloor = symbols('Z_f') #constant
pathLengthFloor = symbols('L_f') #constant
floorPickers = symbols('N_floor') #constant
modPickers = symbols('N_mod') #constant
modDensityEq = Eq(unitsMod/zonesMod , modDensity)
floorDensityEq = Eq(unitsFloor/zonesFloor , floorDensity)
distanceTraveledPerPickModEq = Eq(pathLengthMod/modDensity , distanceTraveledPerPickMod)
distanceTraveledPerPickFloorEq = Eq(pathLengthFloor/floorDensity , distanceTraveledPerPickFloor)
travelTimePerPickModEq = Eq(distanceTraveledPerPickMod/travelRate , travelTimePerPickMod)
travelTimePerPickFloorEq = Eq(distanceTraveledPerPickFloor/travelRate , travelTimePerPickFloor)
timePerPickModEq = Eq(travelTimePerPickMod+pickTime , timePerPickMod)
timePerPickFloorEq = Eq(travelTimePerPickFloor + pickTime , timePerPickFloor)
totalPicksEq = Eq(floorPickers*periodOfInterest/timePerPickFloor + modPickers*periodOfInterest/timePerPickMod, T)
results = (solve([totalPicksEq,timePerPickFloorEq,timePerPickModEq,travelTimePerPickFloorEq,
travelTimePerPickModEq,distanceTraveledPerPickModEq,distanceTraveledPerPickFloorEq,
floorDensityEq,modDensityEq],T))
(results)
results[T]
(results[T]).evalf(subs={
periodOfInterest:60*60,
unitsMod:5000*2/3,
zonesMod:4,
pathLengthMod:3000,
travelRate:1.34,
pickTime:10,
unitsFloor:5000/3,
zonesFloor:2,
pathLengthFloor:3000,
floorPickers:15,
modPickers:35
})
Это производит следующий вывод:
N_floor*P/t_totalFloor + N_mod*P/t_totalMod
Было бы полезно, если бы вы включили фактический результат, которого ожидали уравнения, с которыми имеете дело? – will
Вы включили в список равенств 'T == floorPickers * periodOfInterest/timePerPickFloor + modPickers * periodOfInterest/timePerPickMod', поэтому неудивительно, что это дает вам это как результат. Что вы хотите делать? – will