Стратегии решения систем многомерных нелинейных уравнений со Сципи и Математикой - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь решить и воспроизвести решение системы нелинейных уравнений, используя scipy.Я многому научился из разных постов, и я мог выяснить некоторые проблемы, которые у меня были до .Однако, исходя из решения, которое я выложил выше для моего собственного вопроса, кажется, что scipy.optimize весьма чувствителен к различным доступным методам Я пытаюсь использовать нелинейных решателей в качествекто-то еще указал это здесь, но я получаю те же решения, которые, как я полагаю, ошибочны.Я говорю это потому, что в научной статье, за которой я следую (и пытаюсь воспроизвести результаты), они решили одну и ту же систему с 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

А вот эволюция тета1, тета2 и тета как функции с2.

enter image description here


РЕДАКТ. Результаты из вышеупомянутой бумаги:

enter image description here

...