2013-09-21 3 views
1

У меня возникла проблема дешифрования сообщения об ошибке для моего кода, чтобы найти некоторые параметры для сложного наименьшего квадрата, вписывающегося в два параметра (eps и sig).Python наименьшие квадраты с scipy.integrate.quad

from pylab import * 
import scipy 
import numpy as np 

from scipy import integrate, optimize 

# Estimate parameters with least squares fit 
T = [90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300] 
B = [-0.2221, -0.18276, -0.15348, -0.13088, -0.11293, -0.09836, -0.086301, -0.076166, -0.067535, -0.060101, -0.053636, -0.047963, -0.04295, -0.038488, -0.034494, -0.030899, -0.027648, -0.02469, -0.022, -0.019534, -0.017268, -0.015181] 


def funeval(Temp,eps,sig): 
    return -2.*np.pi*scipy.integrate.quad(lambda x: np.exp(4.*eps/Temp*((sig/x)**6.-(sig/x)**12.)*(x**2)) ,0.0,Inf)[0] 

def residuals(p,y,Temp): 
    eps,sig = p 
    err = y-(funeval(Temp,eps,sig)) 
    return err 

print funeval(90.,0.001, 0.0002) 

plsq = scipy.optimize.leastsq(residuals, [0.00001, 0.0002], args=(B, T)) 

funeval дает разумное поплавок, но когда я запускаю код возвращается:

error: Supplied function does not return a valid float. 

оленья кожа ошибка, кажется чувствительным к начальным условиям. Я новичок в python, поэтому любая помощь или руководства, которые помогут вам, будут высоко оценены. Благодарю.

ответ

2

С funeval(90.,0.001, 0.0002), Temp - единственное значение; однако, когда вы звоните scipy.optimize, вы передаете весь массив T в funeval, вызывая scipy.integrate.

Быстрое исправление было бы сделать что-то вроде:

def funeval(Temp,eps,sig): 
    out=[] 
    for T in Temp: 
     val = scipy.integrate.quad(lambda x: np.expm1(((4.*eps)/T)* ((sig/x)**12.-(sig/x)**6.)* (x**2.)), 0.0, np.inf)[0] 
     out.append(val) 
    return np.array(out) 

def residuals(p,y,Temp): 
    eps,sig = p 
    err = y-(funeval(Temp,eps,sig)) 
    return err 

print funeval([90],0.001, 0.0002) 

plsq = scipy.optimize.leastsq(residuals, [0.00001, 0.0002], args=(B, T)) 
(array([ 3.52991175e-06, 9.04143361e-02]), 1) 

Это, к сожалению, не сходится очень хорошо. Можете ли вы объяснить, что вы пытаетесь сделать?

+0

Несомненно, спасибо за вашу помощь. Идея состоит в том, чтобы вычислить потенциальные параметры Леннарда Джонса для данных Аргона по второму вириальному коэффициенту. Таким образом, уравнение, описывающее взаимосвязь, - это http://i.imgur.com/VfCl5EE.gif Итак, идея состоит в том, чтобы точно эпсилон и сигма. (Они должны быть около 120 и 341е-9) (Еще интерфейс обучения SO) – doubletheron

+0

@doubletheron Пожалуйста, просмотрите мое редактирование, вы забыли «-1». Также вы должны использовать ['np.expm1'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.expm1.html), пожалуйста, просмотрите страницу для объяснения. Вы можете рассмотреть возможность взвешивания различных температур. – Daniel

+0

Я обнаружил, что лежат учебники. Книга 1 (лжец): http://i.imgur.com/fAO4Fdl.jpg Книга 2 (возможно, по правде говоря): http://i.imgur.com/GVJVSaT.jpg Поэтому я исправил eqn в «funeval», но все еще не сходится. – doubletheron

Смежные вопросы