【问题标题】:I need to solve an equation numerically, but fsolve gives me a seemingly incorrect answer我需要用数值解方程,但 fsolve 给了我一个看似不正确的答案
【发布时间】:2022-11-25 18:03:51
【问题描述】:

我需要用数字求解方程中的单个变量。我尝试在两个不同的函数上使用 fsolve,根据我的理解,这两个函数是等价的。调用这些函数 func1 和 func2。如果我指定要求解的变量,则两个函数都会返回相同的值(方程的残差)。但是,当我不指定变量并使用 fsolve 查找它时,根据我使用的是 func1 还是 func2,我会得到不同的答案。我究竟做错了什么?

我的问题的数据

dHi=array([-125790,49080,4.2])     #  [n butane :  1,3 butadiene  :   H2]
dGi=array([-16570,124520,17.6])
V=array([-1,1,2])
No=array([1,0,0])

dH=sum(V*dHi)
dG=sum(V*dGi)

现在函数 1

def func1(e):
    R=8.314
    T1=298
    T2=925
    Nt=1+2*e
    Ni=array([1-e,e,2*e])
    
    lnk1=(-dG/(R*T1))
    lnk2=-(dH/R)*(1/T2 - 1/T1)+lnk1
    k2=exp(lnk2)
    
    A1=prod((Ni/Nt)**V)-k2
    
    
    return A1

对于函数 2,我编写了一个单独的函数,它不需要我指定 Ni,而是将其计算为 e 的函数。

def N(e):
    return No+e*V
def func2(e):
    R=8.314
    T1=298
    T2=925
    Nt=1+2*e
     
    lnk1=(-dG/(R*T1))
    lnk2=-(dH/R)*(1/T2 - 1/T1)+lnk1
    k2=exp(lnk2)
    
    A1=prod(((N(e))/Nt)**V)-k2
    
    
    return A1

证明 N(e) 和 Ni 是等价的

e=0.1
Ni=array([1-e,e,2*e])
print(Ni,N(e))

我得到

[0.9 0.1 0.2] [0.9 0.1 0.2]

现在比较 func1 和 func2

print(fsolve(func1,0.03), fsolve(func2,0.03))
[0.10045184] [0.03108138]

如果我用这两个函数检查第二个答案..

print(func1(0.03108138),func2(0.03108138))
1.2794325793047054e-11 1.2794325793047054e-11

所以 e = 0.03108138,两个函数都可以证实这一点,但为什么 fsolve 给出了 func1 的错误答案?

【问题讨论】:

标签: python fsolve


【解决方案1】:

您传递给scipy.optimize.fsolve 的函数应该接受一个数组。 scipy.optimize.fsolve经过在测试候选解决方案或估计雅可比行列式时,该函数是一个数组。即使您将初始估计根作为标量给出,scipy.optimize.fsolve 也会传递您的函数 1 元素数组。

您的两个函数都不是为处理数组输入而设计的。幸运的是,你的func2在传递一个单元素数组时恰好做了正确的事情,但是func1构建了一个错误形状的Ni数组,然后以你不知道的方式广播(Ni/Nt)**V计算t 想要,并最终计算出错误的值。

编写您的函数来处理数组输入,您将获得正确的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2023-01-24
    • 2021-03-16
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多