拟合指数衰减

时间:2016-07-11 23:37:34

标签: python scipy

我试图解决以下线性化方程:

ln⁡{1-Y / Y} =ln⁡(C)-b(x)的

使用python scipy curvefit或其他类似的方法,请你告诉我怎么做?

示例数据:

x = [15, 16, 17, 18, 19, 20]

y = [0.78, 0.67, 0.56, 0.41, 0.31, 0.20]

我到目前为止尝试过的代码:

import numpy as np
import scipy as sp
import pylab
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math
import warnings   

def sigmoid(x,c,b):
    y = np.log(c)-b*x
    return y

def sigmoid_solve(y, c, b):
    x = (np.log(c)+np.log((1-y)/y))/b
    return x

y_new = []

x_data = [15, 16, 17, 18, 19, 20]
y_data = [0.78, 0.67, 0.56, 0.41, 0.31, 0.20]


for data in y_data:
    y_new.append(np.log((1-data)/data))


popt, pcov = curve_fit(sigmoid, x_data, y_new)
ce50 = sigmoid_solve(0.5,popt[0],popt[1])

x = np.linspace(10,40,10)
y = 1/(1+np.exp(sigmoid(x, *popt)))
plt.plot(x, y, 'r',label='logistic exp curve fit')
plt.plot(x_data, y_data,'o',label='data plot')
plt.ylim(0, 1)
plt.xlim(10, 50)
plt.legend(loc='best')
plt.savefig('test.png')
plt.close("all")

有更好的解决方法吗?

2 个答案:

答案 0 :(得分:0)

我不太了解你的问题。

在这一刻,我会在很多方面思考。 (当然我不知道他们是不是最好的)

1.-我会采取你的功能。

<强>ln⁡{1-Y / Y} =ln⁡(C)-b(x)的

如果这是你要解决的等式(找到曲线的交点),我会找到ln⁡{1-y / y}的解 - (ln⁡(c)-b(x)) = 0。

2.-如果你想知道最适合数据的曲线,你会使用贝塞尔曲线的拟合,matplotlib已经有了一些函数,请看这里:

Bézier example

3.-但如果你想解决这个系统(我认为它是一个EDO)你会在这里查看,python有很多这个:

Scipy Integration and ODEs

而且:

Solve Differential Equations in Python

干杯。

安东尼奥。

答案 1 :(得分:0)

我怀疑代码中的问题是c参数,因为curve_fit尝试使用负数值导致错误。不幸的是,我没有在文档中找到任何关于如何绑定&#39;输出参数(有人可以通过指出如何做到这一点来改进这个答案)。尝试用log_c替换c,它可以有任何值:

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

def sigmoid(x, log_c, b):
    return log_c - b * x

def sigmoid_solve(y, log_c, b):
    x = (log_c + np.log((1-y)/y))/b
    return x

x_data = np.array([15, 16, 17, 18, 19, 20])
y_data = np.array([0.78, 0.67, 0.56, 0.41, 0.31, 0.20])
y_new = (np.log((1.0-y_data)/y_data))

popt, pcov = curve_fit(sigmoid, x_data, y_new)
ce50 = sigmoid_solve(0.5,popt[0],popt[1])

x = np.linspace(10,40,10)
y = 1/(1+np.exp(sigmoid(x, *popt)))

plt.plot(x, y, 'r',label='logistic exp curve fit')
plt.plot(x_data, y_data,'o',label='data plot')
plt.ylim(0, 1)
plt.xlim(10, 50)
plt.legend(loc='best')
plt.savefig('test.png')
plt.close("all")

这段代码对我来说很好。另请注意,如果使用np.array而不是列表,则可以应用没有循环的数学函数。