首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写灵活的多重指数拟合

如何编写灵活的多重指数拟合
EN

Stack Overflow用户
提问于 2018-07-11 17:07:11
回答 1查看 798关注 0票数 2

我想为一般函数编写一个或多或少的通用拟合函数。

$f_i = \sum_i a_i exp(-t/τ_i)$

我有一些数据。

下面是一个双指数函数的示例代码,但我希望能够用最小的代码适配来拟合单指数函数或三指数函数。

代码语言:javascript
运行
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

t = np.linspace(0, 10, 100)

a_1 = 1
a_2 = 1
tau_1 = 5
tau_2 = 1

data = 1*np.exp(-t/5) + 1*np.exp(-t/1)
data += 0.2 * np.random.normal(size=t.size)

def func(t, a_1, tau_1, a_2, tau_2): # plus more exponential functions
    return a_1*np.exp(-t/tau_1)+a_2*np.exp(-t/tau_2)

popt, pcov = curve_fit(func, t, data)
print(popt)
plt.plot(t, data, label="data")
plt.plot(t, func(t, *popt), label="fit")
plt.legend()
plt.show()

原则上,我考虑将函数重新定义为一般形式。

代码语言:javascript
运行
复制
def func(t, a, tau): # with a and tau as a list
    tmp = 0
    tmp += a[i]*np.exp(-t/tau[i])
    return tmp

并以列表或元组的形式将参数传递给curve_fit。但是,我得到了一个TypeError,如下所示。

代码语言:javascript
运行
复制
 TypeError: func() takes 4 positional arguments but 7 were given

是否有重写代码,您只能通过curve_fit的输入参数“确定”多指数函数的程度?所以经过

代码语言:javascript
运行
复制
a = (1)

结果是一个单指数函数

代码语言:javascript
运行
复制
a = (1, 2, 3)

结果是一个三指数函数?

问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 17:19:03

是的,用np.broadcasting可以很容易地做到

代码语言:javascript
运行
复制
def func(t, a, taus): # plus more exponential functions
    a=np.array(a)[:,None]
    taus=np.array(taus)[:,None]
    return (a*np.exp(-t/taus)).sum(axis=0)

func接受2个列表,将它们转换为2 np.array,用所有指数计算一个矩阵,然后对其进行汇总。示例:

代码语言:javascript
运行
复制
t=np.arange(100).astype(float)
out=func(t,[1,2],[0.3,4])
plt.plot(out)

请记住,ataus必须保持相同的长度,因此根据需要对输入进行消毒。或者您也可以直接传递np.arrays而不是列表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51290914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档