Ich möchte eine globale Anpassung einer Reihe von Daten machen. Die Gleichung hat 5 Parameter (r1
r2
dw
pop
kex
). 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 (r11
r21
r12
r22
dw1
dw2
pop
kex
) 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 r11
r21
dw1
k
und pop
das erste Mal, dann r12
r22
dw2
k
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
Ihr Code ist unvollständig, und es ist schwer, Ihr Problem – Elazar
zu verstehen, was die Argumente der leastsq Funktion sein sollte? –
sollte r11 r21 r21 r22 und so weiter sein ... Ich würde gerne die Anzahl der Parameter von Anfang an wählen ... –