【问题标题】:Trouble solving a system of 6 nonlinear equations in Python在 Python 中求解 6 个非线性方程组的问题
【发布时间】:2021-02-15 16:25:36
【问题描述】:

我正在尝试用 Python 求解一个由 6 个非线性方程组成的系统。到目前为止,我得到了:

from scipy.optimize import fsolve 
import math 
from numpy import log

ka1 = 1.045
ka2 = 0.1759
ka3 = 0.3159

def equations(p):
    yh2o, yco2, yh2, ych4, yco = p

    return (yh2o + yco2 + yh2 + ych4 + yco - 1,
        ka1 - (yh2o ** 2)/(yco * (yh2 ** 2),
        ka2 - (yco ** 2) / yco2,
        ka3 - ych4 / (yh2 ** 2),
        0.5 - (2.0 * yco2 + yco + yh2o) / (2 * yh2o + 2 * yh2 + 4 * ych4)))

yh2o, yco2, yh2, ych4, yco = fsolve(equations, [0.2, 0.2, 0.2, 0.2, 0.2])

print(f"yh2o = {yh2o}, yco2 = {yco2}, yh2 = {yh2}, ych4 = {ych4}, yco = {yco}")

当我尝试运行它时,我得到了

TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'equations'.Shape should be (5,) but it is (2,).

我已尝试更改初始猜测,但错误仍然相同。

我也尝试将方程更改为多项式,如下所示:

    return (yh2o + yco2 + yh2 + ych4 + yco - 1.0,
        ka1 * (yco * (yh2 ** 2.0)) - (yh2o * yh2o),
        ka2 * (yco2) - (yco ** 2.0),
        ka3 * (yh2 ** 2.0) - ych4,
        0.5 * (2.0 * yh2o + 2.0 * yh2 + 4 * ych4) - (2.0 * yco2 + yco + yh2o)) 

但我收到一个错误提示

TypeError: can't multiply sequence by non-int of type 'float'

【问题讨论】:

  • 我不知道那个具体的错误,但为了更容易找到解决方案,您可以考虑清除分数,以便获得多项式而不是有理函数。我只是想乘以分母——请注意,这对结果施加了隐含的限制,即必须从任何解决方案中过滤掉分母的根。几个变量的方程有点棘手。也许考虑解决一个特殊情况,通过假设变量的特定值并为其他变量求解,以便开始。祝你好运,玩得开心。
  • 谢谢,我试过了,但在第 13 行出现以下错误:TypeError: can't multiply sequence by non-int of type 'float' 不太清楚这是什么意思
  • 感谢您的更新。目前尚不清楚您尝试了什么。您可以通过更新您的问题来帮助他人帮助您,以准确显示您尝试过的内容和遇到的错误。
  • 你能检查my solution,我是对还是错?
  • 你说得对,我把括号弄乱了。犯这些类型的错误真是令人沮丧。谢谢!

标签: python numpy scipy solver scipy-optimize


【解决方案1】:

我认为您的方程式(返回元组)中的括号(即放置 ())有问题。

以下是完整更正的工作代码:

Try it online!

from scipy.optimize import fsolve 
import math 
from numpy import log

ka1 = 1.045
ka2 = 0.1759
ka3 = 0.3159

def equations(p):
    yh2o, yco2, yh2, ych4, yco = p

    return (
        (yh2o + yco2 + yh2 + ych4 + yco - 1),
        ka1 - (yh2o ** 2) / (yco * (yh2 ** 2)),
        ka2 - (yco ** 2) / yco2,
        ka3 - ych4 / (yh2 ** 2),
        0.5 - (2.0 * yco2 + yco + yh2o) / (2 * yh2o + 2 * yh2 + 4 * ych4)
    )

yh2o, yco2, yh2, ych4, yco = fsolve(equations, [0.2, 0.2, 0.2, 0.2, 0.2])

print(f"yh2o = {yh2o}, yco2 = {yco2}, yh2 = {yh2}, ych4 = {ych4}, yco = {yco}")

输出:

yh2o = 0.17829101808889491, yco2 = 0.17513942402710805, yh2 = 0.4163023675952086, ych4 = 0.05474789024926531, yco = 0.1755193000395232

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多