【发布时间】:2021-09-18 23:21:15
【问题描述】:
我只想解决here 中提到的氨溶液的 pH 值。
详细的完整方程在here 中提到,这是我的数值求解:
import numpy as np
import scipy.optimize as optimize
C = np.array([0, 0, 0.1, 0])
N = np.array([
[1, 1, 0, 0],
[0, 1, -1, 1]
])
K = np.array([1E-14, 1.77E-5])
def eq1(X):
return N.transpose() @ np.array(X) + C
def eq2(X):
return N @ np.log(eq1(X)) - np.log(K)
X = optimize.fsolve(eq2, [1E-14, 1E-14])
print("X=",X)
print("Y=",eq1(X))
但我收到了这些警告:
RuntimeWarning: invalid value encountered in log
return N @ np.log(eq1(X)) - np.log(K)
/usr/local/lib64/python3.6/site-packages/scipy/optimize/minpack.py:175: RuntimeWarning: The iteration is not making good progress, as measured by the
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning)
X= [2.39338797e-06 2.27841240e-05]
Y= [2.39338797e-06 2.51775120e-05 9.99772159e-02 2.27841240e-05]
这个问题对于 fsolve 来说很棘手,因为在正确的解决方案中[7.57E-12 1.32E-3] X1 太接近于零。
我尝试了其他初始值[1E-7, 1E-7]、[1E-1, 1E-1] 等,但没有一个可以避免这种情况,直到我尝试了接近正确解决方案的配对,例如[1E-12, 1E-3].
fsolve 是否有任何参数可以避免此类问题?或者有什么方法可以给出合适的初始值?
【问题讨论】:
标签: python numpy scipy numerical-methods chemistry