我正在尝试使用scipy解决和重现非线性方程组的解决方案。
我从不同的帖子中学到了很多东西,并且可以弄清楚before遇到的一些问题。
但是,根据我上面针对自己的问题发布的解决方案,看来scipy.optimize
对不同的available methods十分敏感
我正在尝试使用nonlinear solvers,正如其他人在这里指出的那样,但是我得到的是相同的解决方案,我认为这是错误的。我之所以这样说,是因为我正在研究科学论文(并尝试再现结果),他们用Mathematica
解决了相同的系统,并得到了与人们期望的结果更加接近的不同结果。过去,我只发布了代码的最小工作示例,但现在我决定发布真实的代码。
我想知道Mathematica
是否可以轻松地管理求解器的选择并解决问题。我最初希望优先使用Python,但是现在无论语言如何,我的首要任务都是解决这个问题。如果有人想出一种解决scipy
更好的方法。
遵循我的代码:
import numpy as np
from scipy import optimize
c1 = 43.524e-3
Z1 = 1
Z2 = 3
b = 1.7e-10
q = 1.6e-19
k_B = 1.38e-23
T = 296.15
N = 6.02e23
lB=0.71e-9
xi = 4.2
v1 = 4*np.pi*np.exp(1.0)*N*(1.0+Z1)*(xi-Z1**(-1.0))*b**(3.0)
v2 = 4*np.pi*np.exp(1.0)*N*(1.0+Z2)*(xi-Z2**(-1.0))*b**(3.0)
epsilon = q**2/(xi*k_B*T*b)
I = 46.311e-3
kappa2 = (3.29e7)*c1**(0.5) * (1e2)
def f(p,*args):
theta1,theta2 = p
c2 = args[0]
eq1 = theta1-(c1*v1/10**3)*np.exp(-1-2*Z1*xi*(1-Z1*theta1-Z2*theta2)*np.log(1-np.exp(-kappa2*b)))
eq2 = theta2-c2*((v2/(10**3*np.exp(1)))*((10**3*theta1*np.exp(1))/(c1*v1))**3)
return(eq1,eq2)
c2 = np.arange(0,150e-6,1e-6)
THETA1 = []
THETA2 =[]
THETA = []
for i in c2:
sol=optimize.root(f,np.array([0.12024367, 0.00062351]),args=(i),method='hybr')
theta1,theta2 = sol.x[0],sol.x[1]
sol.message
theta=3*theta2+theta1
THETA1.append(theta1)
THETA2.append(theta2)
THETA.append(theta)
print (theta1,theta2,theta)
据认为错误的是theta1
下降得非常快,两个第一次交互的数值为:
theta1,theta2,theta
0.12154778645003049, 6.444608966498463e-30, 0.12154778645003049
6.961522754431233e-05, 0.17477403029874458, 0.5243917061237781
这是theta1,theta2和theta作为c2的函数的演化。
编辑 上述论文的结果: