【发布时间】: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 的错误答案?
【问题讨论】:
-
你检查过第一个解决方案吗?赔率都是解决方案。
-
欢迎来到堆栈溢出。请阅读How to Ask和minimal reproducible example,以及carefully check the execution of the code, step by step,以便准确诊断与您的预期不同的情况。