Ошибка «Желаемая ошибка не обязательно достигается из-за потери точности» при минимизации функции двух переменных.SciPy - PullRequest
0 голосов
/ 25 сентября 2019

** Мне нужно минимизировать функцию «энергия» (код ниже) двух переменных - лямда, бета.Другие параметры известны.Лямда и бета также ограничены (лямда> 0, бета> 0).После запуска появляется ошибка «Требуемая ошибка не обязательно достигается из-за потери точности».В чем может быть ошибка?**

def energy(params):
    lamda, beta = params
    def t_kinetic_in(r):
        return C_kin * 4 * np.pi * r**2 * (a * (1 - 0.625*np.exp(-lamda * (R - r)) + 0.4 * (np.sin(beta * (R - r)) +
                                                                        np.sin(2 * kf * (R - r))) / (R - r) )) ** 5/3
    def t_kinetic_ex(r):
        return C_kin * 4 * np.pi * r**2 * (np.exp(-lamda * (r - R))) ** 5/3

#electrostatic energy for electron-electron interaction
    def w_electron_in(r):
        return 8/3 * np.pi**2 * r**4 * (a * (1 - 0.625*np.exp(-lamda * (R - r)) + 0.4 * (np.sin(beta* (R - r)) +\
            np.sin(2 * kf * (R - r))) / (R - r) )) ** 2.0
    def w_electron_ex(r):
        return 8/3 * np.pi**2 * r**4 * (np.exp(-lamda * (r - R)))**2.0

#electrostatic energy for ion-electron interaction
    def v_ion_in(r):
        return -8/3 * np.pi**2 * r**4 * (a * (1 - 0.625*np.exp(-lamda * (R - r)) + 0.4 * (np.sin(beta * (R - r)) + \
                                                        np.sin(2 * kf * (R - r))) / (R - r) ))**2.0
    def v_ion_ex(r):
        return -8/3 * np.pi**2 * r ** 4 * (np.exp(-lamda * (r - R))) ** 2.0

#LDA version for homogenious
    def vxc_in_2(r):
        return 4 * np.pi * r**2 * (-3/4 * (3/np.pi)**(1/3) * (a * (1-0.625*np.exp(-lamda*(R-r))+\
    0.4*(np.sin(beta*(R-r))/(R-r)+np.sin(2*kf*(R-r))/(R-r))))**(4/3) - 0.056 * (a * (1-0.625*np.exp(-lamda*(R-r))+\
    0.4*(np.sin(beta*(R-r))/(R-r)+np.sin(2*kf*(R-r))/(R-r))))**(4/3) / (0.079 + (a * (1-0.625*np.exp(-lamda*(R-r))+\
    0.4*(np.sin(beta*(R-r))/(R-r)+np.sin(2*kf*(R-r))/(R-r))))**(1/3)))
    def vxc_ex_2(r):
        return 4 * np.pi * r**2 * (-3/4 * (3/np.pi)**(1/3) * (np.exp(-lamda*(r-R)))**(4/3) - 0.056 * (np.exp(-lamda*(r-R)))**(4/3)\
                               / (0.079 + (np.exp(-lamda*(r-R)))**(1/3)))
    return integrate.quad(t_kinetic_in, 0, R )[0] + integrate.quad(t_kinetic_ex, R, 10000 )[0] + \
           0.5*integrate.quad(w_electron_in, 0, R )[0] + 0.5*integrate.quad(w_electron_ex, R, 10000)[0] + \
           integrate.quad(v_ion_in, 0, R )[0] + integrate.quad(v_ion_ex, R, 10000)[0] + \
           integrate.quad(vxc_in_2, 0, R )[0] + integrate.quad(vxc_ex_2, R, 10000)[0]

initial_guess = [1.57, 0.008]
result = optimize.minimize(energy, initial_guess)
if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...