【发布时间】:2018-09-04 02:39:16
【问题描述】:
我是 python 新手。使用来自scipy.optimize 的curve_fit,我试图用两个不同的模型函数(每个模型函数(每个用于一组数据))同时拟合两组数据,并使用相同的参数进行优化。
这里是拟合代码的草图:
def f(x,a,b,c,d,e):
return some function
def g(x,a,b,c,d,e):
return some other function
a=1
b=2
c=3
d=4
e=5
guesspar=(a,b,c,d,e)
optimalparf, covf=opti.curve_fit(f,x,ydata1,guesspar,some sigma)
print optimalparf
guesspar=(a,b,c,d,e)
optimalparg, covg=opti.curve_fit(g,x,ydata2,guesspar,some sigma)
print optimalparg
其中guesspar是参数的初始值,optimalparf和optimalparg是我要搜索的最优值,ydata1和ydata2是两组数据,covf和covg是协方差矩阵。
现在,我的问题如下:我确实得到了guesspar 的两组不同的最佳值,这显然是错误的,因为整个图表的最佳值应该是相同的,也就是说,对于两个模型函数。 (除此之外,一组最优值在我感兴趣的上下文中是无稽之谈)。
我知道,我在这里编写的代码非常具有误导性。我会很感激一个提示,即如何用两个不同的函数拟合两组数据,同时拟合每组数据,从而产生一组独特的最佳参数。
PS: 这里是原始代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import ion
import time
import random as rd
import scipy.optimize as opti
import sys
from numpy import *
n0=1.5
data =np.genfromtxt('some data')
data=1000*data
pos=[]
for j in range(len(data)):
pos.append(np.arcsin(np.sin(np.deg2rad(data[j,0]/1000))/1.5))
m1=[]
for j in range(len(data)):
m1.append(data[j,1])
m1Sig=[]
for j in range(len(data)):
m1Sig.append(data[j,2])
p1=[]
for j in range(len(data)):
p1.append(data[j,3])
p1Sig=[]
for j in range(len(data)):
p1Sig.append(data[j,4])
zero=[]
for j in range(len(data)):
zero.append(data[j,5])
zeroSig=[]
for j in range(len(data)):
zeroSig.append(data[j,6])
#define theta plot-range
thetaMin=-0.5 #[rad]
thetaMax=0.5
thetaStep=1./635.
theta=np.arange(thetaMin,thetaMax,thetaStep)
#define r plot-range
rMin=0.02
rMax=0.09
comboY = np.append(m1, p1)
comboX = np.append(pos, pos)
comboTheta = np.append(theta, theta)
def rM1(theta,lam,d0,deltan,per,y0):
return y0+((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.*np.sin(np.sqrt(((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.+((np.pi*d0*(-np.arcsin(lam/(2*per*n0))-theta))/per)**2.))**2./(((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.+((np.pi*d0*(-np.arcsin(lam/(2*per*n0))-theta))/per)**2.)
def rP1(theta,lam,d0,deltan,per,y0):
return y0+((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.*np.sin(np.sqrt(((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.+((np.pi*d0*(np.arcsin(lam/(2*per*n0))-theta))/per)**2.))**2./(((np.pi*deltan*d0)/(lam*np.cos(theta)))**2.+((np.pi*d0*(np.arcsin(lam/(2*per*n0))-theta))/per)**2.)
def combinedFunction(comboData,lam,d0,deltan,per,y0):
result1 = rM1(theta,lam,d0,deltan,per,y0)
result2 = rP1(theta,lam,d0,deltan,per,y0)
return np.append(result1, result2)
lam1=0.633
d01=100.
deltan1=0.0005
per1=1.
y01=0.02
m1Err=np.sqrt(m1)
p1Err=np.sqrt(p1)
comboErr=np.append(m1Err,p1Err)
startParam=[lam1, d01 ,deltan1, per1, y01]
popt, pcov = opti.curve_fit(combinedFunction, comboX, comboY, startParam)
print popt
lam,d0,deltan,per,y0 = popt
y_fit_1 = rM1(theta,lam,d0,deltan,per,y0) # first data set, first equation
y_fit_2 = rP1(theta,lam,d0,deltan,per,y0) # second data set, second equation
plt.plot(comboX, comboY, '.') # plot the raw data
plt.plot(pos, y_fit_1,'b') # plot the equation using the fitted parameters
plt.plot(pos, y_fit_2,'r') # plot the equation using the fitted parameters
plt.show()
print('lam,d0,deltan,per,y0:', popt)
【问题讨论】:
标签: optimization scipy curve-fitting