我正在尝试解决以下线性化方程:
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 回答
我不太清楚你的问题 .
在这一刻,我会在很多方面思考 . (当然我不知道他们是不是最好的)
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
干杯 .
安东尼奥 .
我怀疑你的代码中的问题是c参数,因为curve_fit尝试使用负数值导致错误 . 不幸的是,我没有在文档中找到关于如何“绑定”输出参数的任何参考(有人可以通过指出如何做到这一点来改进这个答案) . 尝试用log_c替换c,它可以有任何值:
这段代码对我来说很好 . 另请注意,如果使用np.array而不是列表,则可以应用没有循环的数学函数 .