2016-07-15 19 views
-1

Ich möchte eine globale Anpassung einer Reihe von Daten machen. Die Gleichung hat 5 Parameter (r1r2dwpopkex). Wenn ich eine individuelle Anpassung mache, habe ich diese Parameter für 1 Eingabedatei und das ist ok, ich kann das tun. Aber wenn ich versuche, eine globale Anpassung vorzunehmen, habe ich viele Probleme. In der Tat, wenn ich 2 Eingabedatei verwenden möchten, und ich nehme an, dass ich möchte, dass sie pop und kex teilen werde ich mit 8 Parameter am Ende (r11r21r12r22dw1dw2popkex) mit 3 werde ich 11 Parameter und so weiter ...Ändern Sie die Anzahl der Parameter in einer Funktion und im kleinsten Quadrat (globale Anpassung)

ich habe versucht, eine Schleife zu machen, jedes Mal den Wert der Parameter auf diese Weise zu ändern

def fit_function(r1[i], r2[i], kex, pop, dw[i]): 
    return (complicated function) 

def residuals(p, x, y, z, err): 
    r1, r2, kex, pop, dw = p 
    return (y - fit_function(r1, r2, kex, pop, dw))/err 

dann beginne ich mit dem kleinsten Quadrate:

kex = 1311 
pop = 0.025 
dw = [-300,500,700,650] 
while i < len(r1): 
    p0 = [r1[i], r2[i], kex, pop, dw[i]] 
    plsq = leastsq(residuals, p0, args=(x, y, z, err), 
        full_output = True, 
        xtol = 1e-15, 
        ftol = 1e-15, 
        factor = 1) #check in function 

    pres, cov_x, infodict, mesg, ier = plsq 
    print pres[0], pres[1], pres[2], pres[3], pres[4] 

Das Problem ist, ich möchte alle Parameter gleichzeitig anpassen, aber ich weiß nicht, wie es geht. Auf diese Weise bin ich passend r11r21dw1k und pop das erste Mal, dann r12r22dw2k und pop gleichzeitig ....

ich jetzt nicht heißen das wirklich zu lösen .... Jeder Vorschlag ? Dank

import numpy as np 
import scipy 
from scipy.optimize import leastsq, fmin_tnc 
from numpy import sin, cos, arctan, pi, sqrt 
from numpy.random import standard_normal 
import sys 
import scipy.stats 
import os 
import time 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 
n=(input('how many residues?')) 
pathInput='/Users/luca/Desktop/GLOBAL FITTING/global fitting/input' 
pathOutput='/Users/luca/Desktop/GLOBAL FITTING/global fitting/output' 
l=os.listdir(pathInput) 
finalInput=pathOutput+"/mergedInput.txt" 
out=open(finalInput,'w') 
out1=open(pathOutput+"/inputFilenames.txt",'w') 




r1 = [2.25 ,3, 2, 4] 
r2 = [ 24.62, 30, 20, 25] 
EF = 1  
data = np.genfromtxt(datafile_name) 

x = data[:,0] 
y = data[:,1] 
err = data[:,2]*EF 
z = data[:,3] 
kex = 1311 
pop = 0.025 
dw = [-300,500,700,650] 
i=0 
while i < len(r1): 
p0 = [r1[i], r2[i], kex, pop, dw[i]] 

plsq = leastsq(residuals, p0, args=(x, y, z, err), 
     full_output = True, 
     xtol = 1e-15, 
     ftol = 1e-15, 
     factor = 1) 
pres, cov_x, infodict, mesg, ier = plsq 
print pres[0], pres[1], pres[2], pres[3], pres[4] 


i=i+1 
+0

Ihr Code ist unvollständig, und es ist schwer, Ihr Problem – Elazar

+0

zu verstehen, was die Argumente der leastsq Funktion sein sollte? –

+0

sollte r11 r21 r21 r22 und so weiter sein ... Ich würde gerne die Anzahl der Parameter von Anfang an wählen ... –

Antwort

0

Ich verstehe nicht Ihr Problem. Können Sie erklären?

Ich denke, es gibt etwas mit functools.partial zu tun.

Geben Sie ein neues Teilobjekt zurück, das sich beim Aufruf wie func verhält, das mit den Argumenten positional arguments und keyword arguments aufgerufen wird. Wenn dem Aufruf mehr Argumente übergeben werden, werden sie an Argumente angehängt. Wenn zusätzliche Schlüsselwortargumente bereitgestellt werden, erweitern und überschreiben sie Schlüsselwörter.

Oder Sie können ein Funktor (funktionales Objekt) verwenden:

class MyFunctor(collections.Callable): 
    def __init__(self, param1, param2): 
     self.param1 = param1 
     self.param2 = param2 

    def __call__(self, *args, **kwargs): 
     pass # do your calculation here 
+0

Ich versuche zu überprüfen, ob verschiedene Atome am gleichen Ereignis teilnehmen. Dazu mache ich einige Berechnung für jedes Atom. dann estrapoliere ich die 5 Parameter einzeln. Um zu sehen, ob sie etwas teilen, versuche ich, sie zusammenzusetzen, vorausgesetzt, dass die share einige Parameter 'pop' 'kex'. Um ihnen zu entsprechen, muss ich natürlich dieselbe Funktion verwenden, da sie dem gleichen Physikgesetz folgen. Aber wenn ich versuche, die kleinste Zahl zu berechnen, habe ich ein Problem. Ich weiß nicht, heiß, um zu sagen, das Residuum r11 r21 dw1 aus dem ersten Teil der Daten dann r12 und r22 und dw2 für den zweiten Teil und die Kex und Pop für alle passen –