分别计算求和参数

Calculating the summation parameters separately

我正在尝试将 curve_fitting 用于以下形式的已定义函数:

Z = (Rth(1 - np.exp(- x/tau))

我想计算参数 Rth 和 tau 的第一个四个值。目前,它工作正常如果我像这样使用整个功能:

 Z = (a * (1- np.exp (- x / b))) + (c * (1- np.exp (- x / d)))+ (e * (1- np.exp (- x / f)))  + (g * (1- np.exp (- x / f)))

但这肯定不是一个好的方法,例如,如果我有一个非常长的函数,有超过 4 个指数项,并且我想获取所有参数。我如何调整它,使其在曲线拟合后 returns 特定数量的 Rth 和 tau 值?

例如,如果我想从 8 项指数函数中获取 16 个参数,我不必编写完整的 8 项,而只需编写一个通用形式即可给出所需的输出。

谢谢。

使用least_squares得到任意函数和是非常简单的。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import least_squares

def partition( inList, n ):
    return zip( *[ iter( inList ) ] * n )

def f( x, a, b ):
    return a * ( 1 - np.exp( -b * x ) )

def multi_f( x, params ):
    if len( params) % 2:
        raise TypeError
    subparams = partition( params, 2 )
    out = np.zeros( len(x) )
    for p in subparams:
        out += f( x, *p )
    return out

def residuals( params, xdata, ydata ):
    return multi_f( xdata, params ) - ydata


xl = np.linspace( 0, 8, 150 )
yl = multi_f( xl, ( .21, 5, 0.5, 0.1,2.7, .01 ) )

res = least_squares( residuals, x0=( 1,.9, 1, 1, 1, 1.1 ), args=( xl, yl ) )

print( res.x )
yth = multi_f( xl, res.x )
fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )

ax.plot( xl, yl )
ax.plot( xl, yth )

plt.show( )

我设法通过以下方式解决了它,也许不是聪明的方式,但它对我有用。

def func(x,*args):
Z=0
for i in range(0,round(len(args)/2)):
    Z += (args[i*2] * (1- np.exp (- x / args[2*i+1])))
return Z

然后在单独的函数中调用参数,我可以调整参数个数。

def func2(x,a,b,c,d,e,f,g,h):
return func(x,a,b,c,d,e,f,g,h)
popt , pcov = curve_fit(func2,x,y, method = 'trf', maxfev = 100000)

对我来说效果很好。