2015-03-24 5 views
0

***** ***** 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 
+0

Было бы полезно, если бы вы включили фактический результат, которого ожидали уравнения, с которыми имеете дело? – will

+0

Вы включили в список равенств 'T == floorPickers * periodOfInterest/timePerPickFloor + modPickers * periodOfInterest/timePerPickMod', поэтому неудивительно, что это дает вам это как результат. Что вы хотите делать? – will

ответ

1

Что вы хотите, чтобы SymPy обновить все соответствующие переменные и даст вам результат вы хотите уравнения, которые вы определили и, значения для a - d должны быть одновременно true. Способ сделать это дать значения в качестве дополнительных одновременных уравнений, которые должны быть истинными:

>>> solve((EqA,EqB,EqC,Eq(a,1),Eq(b,3),Eq(c,3),Eq(d,4))) 
{c: 3, F_a: 4, a: 1, d: 4, F_b: 7, b: 3, T: 11} 

И это показывает ваше T = 11 значение, которое вы ищете.

+0

фантастический, спасибо! – TraxusIV

0

Как о:

results[T].subs({floorPickers: 15, modPickers: 35, periodOfInterest: 60*60, timePerPickMod: 1.0, timePerPickFloor: 1.0}) 
+0

Это приводит к результату, но timePerPickMod и timePerPickFloor являются рассчитанными значениями, а не константами. – TraxusIV

Смежные вопросы