Как решить эту проблему вызова broyden1 np.ndarray? - PullRequest
1 голос
/ 31 января 2020

Первый постер здесь, сейчас я работаю над проектом для универа, и я немного застрял.

Эта часть задачи состоит в том, чтобы использовать метод Монте-Карло для оценки значения интеграла (в в этом случае мы интегрируем функцию f (r). Вот мой текущий код:

import numpy as np # import numpy
from scipy.optimize #import broyden1

def U(r, ep, sig):
    return 4*ep*((sig/r)**(12)-(sig/r)**(6)) # return U(r) 

# Function to calculate f(r)
def f(r, ep, sig):
    Ur = 4*ep*((sig/r)**(12)-(sig/r)**(6)) # puts U(r) into this function
    return (1-np.exp(-Ur/(k*T)))*(r**2) # return f(r)

data = np.array([[2.56,3.75,3.4,4.07],[1.41,1.32,1.66,3.04]]) #He, N2, Ar, Xe
k =  1.38*10**-23 # Boltzmann constant
T = 300 # temperature value T
R = np.linspace(1*10**-10, 10, 1000) # r defined with 1000 values between 2.5 and 10
U = U(R, data[1,0], data[0,0])# calculate U((r)
F = f(R, data[1,0], data[0,0]) # calculate f(r)

cutoff = broyden1(F,6)

Я получаю сообщение об ошибке «TypeError: 'numpy .ndarray' объект не может быть вызван". I знаю, что это очень распространенное сообщение об ошибке, но я не могу понять из других сообщений здесь, в чем заключается моя проблема.

Любая помощь будет высоко ценится, спасибо!

1 Ответ

0 голосов
/ 31 января 2020

Я думаю, что вы смешиваете джоуль с эВ.

Эта часть в вашей силовой функции взрывается

np.exp(-Ur/(k*T))

Ваш сценарий не достигает последнего вызова функции (т. Е. cutoff = broyden1(F,6))

Я думаю, потому что ваши константы Больцмана должны быть выражены в eVK-1, а не в JK-1. Так k = 8.617333262145*10**-5

РЕДАКТИРОВАТЬ

Возможно, ваша проблема связана с этой проблемой . Я сделал некоторые изменения в вашем коде и теперь работает. Однако требуется время, чтобы найти решение.

from functools import partial
import numpy as np # import numpy
from scipy.optimize import broyden1

def U(r, ep, sig):
    return 4*ep*((sig/r)**(12)-(sig/r)**(6)) # return U(r) 

# Function to calculate f(r)
def F(r):
    ep = 1.41
    sig = 2.56
    Ur = 4*ep*((sig/r)**(12)-(sig/r)**(6)) # puts U(r) into this function
    return (1-np.exp(-Ur/(k*T)))*(r**2) # return f(r)

data = np.array([[2.56,3.75,3.4,4.07],[1.41,1.32,1.66,3.04]]) #He, N2, Ar, Xe
#k =  1.38*10**-23 # Boltzmann constant
k = 8.617333262145*10**-5
T = 300 # temperature value T
R = np.linspace(1*10**-10, 10, 1000) # r defined with 1000 values between 2.5 and 10
U = U(R, data[1,0], data[0,0])# calculate U((r)
#F = f(R, data[1,0], data[0,0])# calculate f(r)
cutoff = broyden1(F,R,f_tol=1e-2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...