求解非线性曲线拟合当前代码

时间:2013-07-02 14:42:53

标签: python matplotlib curve-fitting nonlinear-optimization

我意识到可能必须添加很多但是如果有人能指出我正确的方向来应用一条最适合指数图的线,我将非常感激。 以下是我到目前为止的情况:

import matplotlib.pyplot as plt

x = []
y = []

readFile = open ('TEXT.txt', 'r')
sepFile = readFile.read().split('\n')
readFile.close()

for plotPair in sepFile:
    xAndY = plotPair.split('\t')
    x.append(int (xAndY[0]))
    y.append(float (xAndY[1]))
print x
print y

plt.plot (x, y, 'o' )
plt.xlabel('')
plt.ylabel('')
plt.show()

2 个答案:

答案 0 :(得分:2)

一般来说,真正拟合非线性曲线是一个非常困难的问题(主要是因为解空间是无限且不连续的),但一般来说,scipy是你想要寻找解决方案的地方有点问题。如果您知道方程的一般形式,您可以对其应用变换并使用多重拟合算法(仍然是无限的,但是连续的)来尝试拟合它。看看这个:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html

当然,对于指数曲线,可以通过取数据的对数来非常简单地使用它。

如果你想真正尝试优化一些任意的最小二乘拟合,你必须停止思考曲线拟合并开始考虑多变量优化。同样,scipy是你应该寻找解决方案的地方,而是在这里查看优化库:

http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

答案 1 :(得分:0)

使用一系列三角函数为曲线拟合提供了一种非常可靠的方法。以下示例使用一系列sinescosines

from scipy import sin, cos, linspace
def f(x, a0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,
            c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12):
    return a0 + s1*sin(1*x) +  c1*cos(1*x) \
              + s2*sin(2*x) +  c2*cos(2*x) \
              + s3*sin(3*x) +  c3*cos(3*x) \
              + s4*sin(4*x) +  c4*cos(4*x) \
              + s5*sin(5*x) +  c5*cos(5*x) \
              + s6*sin(6*x) +  c6*cos(6*x) \
              + s7*sin(7*x) +  c7*cos(7*x) \
              + s8*sin(8*x) +  c8*cos(8*x) \
              + s9*sin(9*x) +  c9*cos(9*x) \
             + s10*sin(9*x) + c10*cos(9*x) \
             + s11*sin(9*x) + c11*cos(9*x) \
             + s12*sin(9*x) + c12*cos(9*x)

from scipy.optimize import curve_fit
popt, pcov = curve_fit(f, x, y)
x_fit = linspace(x.min(), x.max(), 1000)
y_fit = f(x_fit, *popt)

我希望它适合你!