Проблемы с аппроксимацией средствами SciPy

5065584

Есть текстовый файл, в котором числа в три колонки, разделенные табуляцией, вот так:

0.00 0.0020 1.4523
0.04 0.0038 1.6296
0.08 0.0069 1.7824
0.12 0.0122 1.9002
0.16 0.0212 1.9746
0.20 0.0359 2.0000
0.24 0.0591 1.9746
0.28 0.0949 1.9002

И есть код на Питоне, который аппроксимирует 2 и 3 колонки суммой двух гауссовых кривых, используя библиотеки NumPy и SciPy:

#! /usr/bin/python
#-*- coding: utf-8 -*-
import sys
from scipy import *
from scipy.optimize import leastsq
import numpy, locale

def gauss(x,p):
a1,s1,c1,a2,s2,c2=p
result=a1*exp(-s1*x-c1)**2+a2*exp(-s2*x-c2)**2
return result

def residue(p,y,x):
return (y-gauss(x,p

data = numpy.loadtxt('2gauss.dat',delimiter='\t')
print("a1\ts1\tc1\ta2\ts2\tc2")
for i in xrange(1,3):
x=data[0:99,0]
y=data[0:99,i]
p=[1,1,0,1,1,1]
pi=array(p)
po=leastsq(residue,pi,args=(y,xmaxfev=100000)
print("{0:.3f}\t{1:.3f}\t{2:.3f}\t{3:.3f}\t{4:.3f}\t{5:.3f}".format(po[0][0],po[0][1],po[0][2],po[0][3],po[0][4],po[0][5]

Когда он запускается, он выдает сообщение об ошибке
./approximation.py:12: RuntimeWarning: invalid value encountered in add
result=a1*exp(-s1*x-c1)**2+a2*exp(-s2*x-c2)**2+a3*exp(-s3*x-c3)**2

Кто-нибудь знает, что это такое и как с этим бороться?

Ushkvarok

RuntimeWarning: invalid value encountered in add
скорее всего в операции сложения попадает не числовой тип (или не тот числовой тип, который нужен)
а что-то другое, например None или string
не пиши такие длинные формулы, разбей на короткие выражения
и прогони отладчиком
Ваш К.О.

tucha96

учитывая, что в исходном коде a3 не встречается, а в сообщении об ошибке встречается, думаю, запускаешь не то
но я питон не знаю, может так и должно быть

Plok2008

Ещё одно соображение - если надо просто часть точек аппроксимировать, то не проще ли использовать scipy.curve_fit вместо leastsq. В результате ещё и погрешности аппроксимации в виде covariance matrix получишь.
Оставить комментарий
Имя или ник:
Комментарий: