Python 更改函数和最小二乘法中的参数数量(全局拟合)

Python 更改函数和最小二乘法中的参数数量(全局拟合),python,function,least-squares,data-fitting,Python,Function,Least Squares,Data Fitting,我想对一组数据进行全局拟合。方程有5个参数(r1r2dwpopkex)。如果我做一个单独的适合我将有这些参数适合1输入文件,这是确定的,我可以这样做。但是当我试着做一个全球性的试穿时,我有很多问题。事实上,如果我想使用2个输入文件,并且我假设我想让它们共享pop和kex,我将得到8个参数(r11r21r12r22dw1popkex)和3个参数,我将有11个参数,以此类推 我试图通过这种方式使循环每次改变参数的值 def fit_function( r1[i], r2[i], kex, pop,

我想对一组数据进行全局拟合。方程有5个参数(
r1
r2
dw
pop
kex
)。如果我做一个单独的适合我将有这些参数适合1输入文件,这是确定的,我可以这样做。但是当我试着做一个全球性的试穿时,我有很多问题。事实上,如果我想使用2个输入文件,并且我假设我想让它们共享
pop
kex
,我将得到8个参数(
r11
r21
r12
r22
dw1
pop
kex
)和3个参数,我将有11个参数,以此类推

我试图通过这种方式使循环每次改变参数的值

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
然后我从最小二乘法开始:

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]

我不明白你的问题。你能解释一下吗

我想这是有关系的

返回一个新的分部对象,该对象在调用时的行为类似于使用位置参数args和关键字参数关键字调用的func。如果为调用提供了更多参数,则这些参数将附加到参数。如果提供了其他关键字参数,它们将扩展和覆盖关键字

或者可以使用函子(函数对象):


您的代码不完整,很难理解您的问题leastsq函数的参数应该是什么?应该是r11 r21 r21 r22等等…我想从一开始就选择参数的数量…我试图验证是否有不同的原子参与同一事件。为此,我对每个原子进行了一些计算。然后,我分别对这5个参数进行极化。为了查看它们是否共享某些内容,我尝试将它们放在一起,假设共享参数“pop”“kex”。为了适应它们,我必须使用相同的函数,因为它们遵循相同的物理定律。但当我试图计算租赁质量时,我遇到了一个问题。我不知道如何从第一部分数据拟合r11 r21 dw1,然后是第二部分的r12、r22和dw2,以及所有数据的kex和pop
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
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