# -*- coding: GB2312 -*-
"""
Created on Thu Jan 21 20:56:24 2016
@author: Administrator
"""
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
import sys
def func(x, p):
"""
数据拟合所用的函数: a + b*sin(cx + d)
"""
a, b, c, d = p
return a + b*np.sin(c*x+d)
def residuals(p, y, x):
"""
实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数
"""
return y - func(x, p)
file=open("E:\\fit\\AM_new.csv",'r')
dataLines = file.readlines()
angle = []
dataA = []
#dataB = []
#dataC = []
#dataD = []
for line in dataLines:
angleCur,dataACur,dataBCur,dataCCur,dataDCur = line.split(',')
if angleCur != 'NaN':
angle.append(float(angleCur)/180*np.pi)
if dataACur != 'NaN':
dataA.append(float(dataACur))
#if dataBCur != 'NaN':
#dataB.append(float(dataBCur))
#if dataCCur != 'NaN':
#dataC.append(float(dataCCur))
#if dataDCur != 'NaN':
#dataD.append(float(dataDCur))
p0 = [3, 1, 1, 0] # 第一次猜测的函数拟合参数
# 调用leastsq进行数据拟合
# residuals为计算误差的函数
# p0为拟合参数的初始值
# args为需要拟合的实验数据
plsq = leastsq(residuals, p0, args=(dataA, angle))
print u"拟合参数", plsq[0] # 实验数据拟合后的参数
pl.plot(angle, dataA, label="raw data")
pl.plot(angle, func(angle, plsq[0]), label="fitting data")
pl.legend()
pl.show()