用scipy和Mathematica解决多维非线性方程组的策略

时间:2019-04-23 22:23:54

标签: python scipy wolfram-mathematica numerical-methods nonlinear-optimization

我正在尝试使用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的函数的演化。

enter image description here


编辑 上述论文的结果:

enter image description here

0 个答案:

没有答案