在python中,余弦平方scipy优化curvefit的参数不正确

时间:2017-01-15 13:08:19

标签: python matlab numpy curve-fitting cosine

我试图通过光学干涉测量强度测量将余弦平方拟合到数据阵列。不幸的是,拟合会返回远离的幅度和周期。只有通过从阵列中选择前200个数据点(以及其他一些选择),我才收到更多reasonable fit。这些拟合参数被用作初始猜测以将拟合扩展到整个阵列,这返回了类似于image的图。

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

# reads the data from the csv file
csvfile ="</home/pi/Desktop/molecularpolOutput_No2.csv>"
csv = genfromtxt ('molecularpolOutput_No2.csv', delimiter=",")

# defines the data as variables
pressure = csv[100:200,2]
intensity = csv[100:200,3]
temperature = csv[:,1]

pi = 3.14
P = pressure

# defines the function and initial fit parameters
def func(P, T, a, b, c):
    return a*np.cos((2*pi*P)/T+b)**2+c

p0 = sy.array([2200, 45, 4000, 85])

# fits the function
coeffs, pcov = curve_fit(func, pressure, intensity, p0)
I = func(P, coeffs[0], coeffs[1], coeffs[2], coeffs[3])
print 'period =',(coeffs[0]), 'Pa'

# plots the data and the function
fig = plt.figure(figsize=(10, 3), dpi=100)
plt.plot(pressure, intensity, linestyle="none", marker=".")
plt.plot(pressure, I)
plt.xlabel('Pressure (Pa)')
plt.ylabel('Relative intensity')
plt.title('interference intensity plot of Newtons rings ')
plt.show()

我希望大型和小型数据阵列的拟合正确。然而,如图所示,扩展阵列混乱的幅度和周期。看起来不错的拟合也给出了与其他实验相当的时间值。光敏电阻产生的数据不是精确线性的,但我认为这不应该是curve_fit的问题。他们可以在代码中更改它们以使其适合工作吗?我已经尝试过这段代码:How do I fit a sine curve to my data with pylab and numpy?

更新 Matlab中的最小二乘曲线拟合给出了同样的问题。我应该尝试其他方法来拟合曲线,还是导致问题的数据? Matlab代码:

%% Opens excel file 
filename = 'vpnat_1.xlsx';
Pr = xlsread(filename,'D1:D500');
I = xlsread(filename, 'E1:E500');

P = Pr;
% defines figure size relative to screen
scrsz = get(groot,'ScreenSize');
figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/4])
%% fit & plots 
hold on
scatter(P,I,'.'); % scatter plot
%% defines parameter guesses
Im = mean(I);
Iu = max(I); 
Il = min(I);
Ia = Iu-Il;
Ip = 2000;
Id = -4000;

a_0 = [Ia; Ip; Id; Im]; % initial guesses
fun = @(a,P) a(1).*(cos((2*pi*P)./a(2)+a(3)).^2)+a(4); % defines function
fcn = @(a) sum((fun(a,P)-I).^2); % finds best fit
s = fminsearch(fcn, a_0);
plot(P,fun(s,P)) % plots fitted function
hold off

1 个答案:

答案 0 :(得分:0)

我使用Matlab解决了这个问题。看起来python中的curve_fit参数设置不佳,无法在给定的边界内找到最小二乘(对迭代次数的约束?)。

Matlab似乎在初始参数中接受了更大的误差范围,因此适合所有选择的数据。使用matlab中的fit参数作为Python中的初始参数返回一个合适的拟合。通过计算参数的猜测来获得更好的开始,可以防止python中的问题。