leastsq传递参数时出错

2024-04-26 11:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将以下函数拟合:去渲染的SNRenter image description here到我的数据中。C1、C2和h是我需要从leastsq方法中获得的参数。C1和C2很简单,但问题是我的h(t)实际上是:Function based on B-Splines。我想得到的是函数中的系数hj(在我的例子中有35个不同的hj)。该函数是不同基B样条的和,每个基B样条加权不同,系数的个数等于B样条的节数。当我想得到C1,C2和h1..35时,我做以下操作:

funcLine = lambda tpl, eix_x: (tpl[0]*np.sin((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1) + tpl[1]*np.cos((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1))*np.exp(-4*np.power(k, 2)*lambda_big*np.power(eix_x, 2))
func = funcLine
ErrorFunc = lambda tpl, eix_x, ydata: np.power(func(tpl, eix_x) - ydata,2)
tplFinal1, success = leastsq(ErrorFunc, [2, -2, 8.2*np.ones(35)], args=(eix_x, ydata))

tpl(0)=C1,tpl(1)=C2和tpl(2..35)=my系数。bsplines\u evaluades是一个矩阵[3586000],其中每一行是每一个基b样条的时间函数,所以我用每一行的系数加权,86000是eix\u x的长度。ydata(eix\u x)是我想要近似的函数。lambda1=0.1903;lambda_big=2;k=2*π/lambda1。输出与初始参数相同,不符合逻辑。 有人能帮我吗?我也尝试过curvefit,但它不起作用。 数据位于:http://www.filedropper.com/data\u 5>;http://www.filedropper.com/download_button.png下载宽度=127高度=145边框=0/>;
http://www.filedropper.com>;在线备份存储器

编辑 现在的代码是:

lambda1 = 0.1903
k = 2 * math.pi / lambda1
lambda_big = 2
def funcLine(tpl, eix_x):
    C1, C2, h = tpl[0], tpl(1), tpl[2:]
    hsum = np.sum(bsplines_evaluades * h, axis=1)  # weight each
    theta = 4 * np.pi * np.array(hsum) * np.array(eix_x) / lambda1
    return (C1*np.sin(theta)+C2*np.cos(theta))*np.exp(-4*lambda_big*(k*eix_x)**2)  # lambda_big = 2
if len(eix_x) != 0:
    ErrorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata
    param_values = 7.5 * np.ones(37)
    param_values[0] = 2
    param_values(1) = -2
    tplFinal2, success = leastsq(ErrorFunc, param_values, args=(eix_x, ydata))

问题是输出参数相对于初始参数没有变化。数据(x轴、Y数据、B轴): gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96afgist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71你知道吗


Tags: 数据lambda函数com参数np样条c2
2条回答

提供一个完整到可以运行的可读示例总是很有帮助的(对你自己和我们都是如此)。你的例子有lambdas和很长的行,肯定是不可读的,使你很容易错过简单的错误。使用Python的要点之一是使代码更易于阅读。你知道吗

使用样条曲线系数作为拟合变量是很好的,但是您希望np.N阵列所有变量都是一维的。所以你的参数数组应该是

param_values = 8.2 * np.ones(37)
param_values[0] = 2
param_values[1] = -2.
result_params, success = leastsq(errorFunc, param_values, ....)

使用curve_fit()也可以。除此之外,很难提供太多帮助,因为您既不提供完整的可运行程序(留下许多未定义的术语),也不提供运行代码的输出或错误消息。你知道吗

这里有几点可能是错误的:我不确定您是否正确地索引了tpl数组(如果它有37个条目,索引应该是0:36)。你的errorFunc应该返回残差而不是平方残差。你知道吗

最后,我认为您的h-sum可能不正确:您希望在$N$轴上求和,而不是在$x$轴上求和,对吗?你知道吗

您可以按以下方式整理代码,看看它是否有用(没有一些数据,我很难测试):

def funcLine(tpl, eix_x):
    C1, C2, h = tpl[0], tpl[1], tpl[2:]
    hsum = np.sum(bsplines_evaluades * h, axis=1)
    theta = 4 * np.pi * hsum * eix_x / lambda1
    return (C1 * np.sin(theta) + C2 * np.cos(theta)) * np.exp(-4  *lambda_big *
                 (k * eix_x)**2)

errorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata
tplFinal2, success = leastsq(errorFunc, [2, -2, 8.2*np.ones(35)],
                             args=(eix_x, ydata))

相关问题 更多 >