用于减排计算的 Python 代码问题

问题描述 投票:0回答:1

我在计算两个行业(MACA 和 MACB)的减排量 (EA) 时遇到了 Python 代码问题。该代码没有给出 EA 和 MACA 的预期结果。

这是代码:

import sympy as sp

EA, EB = sp.symbols('EA EB')
abatement_percentage = 40

MACA = 450 - 3 * EA
MACB = 300 - 2 * EB

EA_value = sp.solve(sp.Eq(MACA, 0), EA)[0]
EB_value = sp.solve(sp.Eq(MACB, 0), EB)[0]

EA_abatement = EA_value * (abatement_percentage / 100)
EB_abatement = EB_value * (abatement_percentage / 100)

total_abatement = EA_abatement + EB_abatement

EB_value = sp.solve(sp.Eq(MACA, MACB), EB)[0]
EA_value = total_abatement - EB_value

MACA_value = MACA.subs(EB, EB_value)

print("EA =", EA_value)
print("EB =", EB_value)
print("EA after abatement:", EA_abatement)
print("EB after abatement:", EB_abatement)
print("Total abatement:", total_abatement)
print("MACA =", MACA_value)

预期输出:

EA = 78
EB = 42
EA after abatement: 31.2
EB after abatement: 16.8
Total abatement: 48.0
MACA = 216

采取的数学步骤:

  1. 已知:MACA = 450 - 3EA 和 MACB = 300 - 2EB

  2. 求 MACA = 0 且 MACB = 0 时:

    • 450 - 3EA = 0,求解 EA 得出 EA = 150
    • 300 - 2EB = 0,求解 EB 得出 EB = 150
  3. 减少40%:

    • EA = 150 * 40% = 60
    • EB = 150 * 40% = 60
  4. EA + EB = 60 + 60 = 120

  5. EA = 120 - EB

  6. 求当MACA=MACB时EB的值:

    • 450 - 3EA = 300 - 2EB
    • 将 EA = 120 - EB 代入上式中,我们得到: 450 - 3(120 - EB) = 300 - 2EB
    • 简化方程式,我们发现 5EB = 210,从而得出 EB = 42
    • EA = 120 - 42 = 78
  7. 现在玛卡 = 450 - 3EA = 450 - 3(78) = 216

问题: MACA 和 EA 的计算值不正确,并且代码未提供预期结果。 MACA 的计算值应为 216,而当前代码生成的值不正确。 EA 的计算值也应该是 78,但当前代码生成不同的值。

请帮助修复代码以获得正确的减排计算结果。任何见解或建议都将受到高度赞赏。谢谢!

python math formula sympy equation
1个回答
0
投票

首先,您在写出的步骤之上的预期值不匹配,因此我将使用写出的步骤中的值。

代码结果与您的手动计算不匹配的原因是您没有告诉代码执行相同的计算。例如,在步骤 5 中,您的手工计算显示您将符号

EA
定义为
120 - EB
,但在您的代码中,您将
EA_value
(之前计算的)替换为 120 减去 EB 的减排前
EB_value

下面写的是复制您的数学步骤的代码(这些步骤已注释)并获得完全相同的结果。

import sympy as sp

EA, EB = sp.symbols("EA EB")
abatement_percentage = 40

# step 1
MACA = 450 - 3 * EA
MACB = 300 - 2 * EB

# step 2
EA_before_abatement = sp.solve(sp.Eq(MACA, 0), EA)[0]
EB_before_abatement = sp.solve(sp.Eq(MACB, 0), EB)[0]
print(EA_before_abatement, EB_before_abatement) # 150 150

# step 3
EA_after_abatement = EA_before_abatement*(abatement_percentage / 100)
EB_after_abatement = EB_before_abatement*(abatement_percentage / 100)
print(EA_after_abatement, EB_after_abatement) # 60 60

# step 4
total_abatement_value = EA_after_abatement + EB_after_abatement
print(total_abatement_value) # 120

# step 5
EA_from_abatement = total_abatement_value - EB
print(EA_from_abatement) # 120 - EB

# step 6 bullet 1
combined_eq = sp.Eq(MACA, MACB)
print(combined_eq) # 450 - 3EA = 300 - 2EB

# step 6 bullet 2
combined_eq_subbed = combined_eq.subs(EA, EA_from_abatement)
print(combined_eq_subbed) # 3EB + 90 = 300 - 2EB

# step 6 bullet 3
EB_final = sp.solve(combined_eq_subbed, EB)[0]
print(EB_final) # 42

# step 6 bullet 4
EA_final = EA_from_abatement.subs(EB, EB_final)
print(EA_final) # 78

# step 7
MACA_value = MACA.subs(EA, EA_final)
print(MACA_value) # 216
© www.soinside.com 2019 - 2024. All rights reserved.