Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python/scipy对曲线族进行曲线拟合_Python_Scipy_Curve Fitting_Scipy Optimize - Fatal编程技术网

如何使用python/scipy对曲线族进行曲线拟合

如何使用python/scipy对曲线族进行曲线拟合,python,scipy,curve-fitting,scipy-optimize,Python,Scipy,Curve Fitting,Scipy Optimize,我有一个解决以下问题的方法: 我想用一个方程拟合一系列曲线(参见代码) 拟合参数(C1-C4)应为常数 所以我可以通过改变“Sigma和T”来拟合(或描述)这个族的一条曲线 我希望我能描述我的问题,希望你们能帮助我,我将非常感激 编辑问题(由于误解-2020年4月4日) 我现在将尝试更具体地说,因为我附上了一张图片,在这里你可以看到一个“曲线族”的例子,它因不同的“Sigma”而改变。我想用一对常数来描述这些曲线族–C1、C2、C3和C4,而不改变它们。线索是找到一个常数的最佳值,它可以描述

我有一个解决以下问题的方法:

  • 我想用一个方程拟合一系列曲线(参见代码)
  • 拟合参数(C1-C4)应为常数
  • 所以我可以通过改变“Sigma和T”来拟合(或描述)这个族的一条曲线
我希望我能描述我的问题,希望你们能帮助我,我将非常感激

编辑问题(由于误解-2020年4月4日)

我现在将尝试更具体地说,因为我附上了一张图片,在这里你可以看到一个“曲线族”的例子,它因不同的“Sigma”而改变。我想用一对常数来描述这些曲线族–C1、C2、C3和C4,而不改变它们。线索是找到一个常数的最佳值,它可以描述这个曲线族,只要改变Sigma和T作为变量。因此,我必须以最小的误差拟合一系列曲线的参数。然后,只要改变“Sigma和T”,方程就应该覆盖整个曲线族

致以最良好的祝愿

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


#Equation --> Eps_Cr = (C1*Sigma**C2*x**(C3+1)*e(-C4/T))/(C3+1)

def func(x, C1, C2, C3,C4):
    Sigma = 20
    T = 1
    return (C1*Sigma**C2*x**(C3+1)*np.exp(-C4*1/T))/(C3+1)

#Example Data 1
xdata = [1, 10, 100, 1000, 10000, 100000]
ydata = [0.000382,0.000407,0.000658,0.001169,0.002205,0.004304]

#Example Data 2
xdata1 = [1, 10, 100, 1000, 10000, 100000]
ydata1 = [0.002164,0.002371,0.004441,0.008571,0.016811,0.033261]

#Example Data 3
xdata2 = [1, 10, 100, 1000, 10000, 100000]
ydata2 = [0.001332,0.001457,0.002707,0.005157,0.010007,0.019597]

plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata1, ydata1, 'g-', label='data')
plt.plot(xdata2, ydata2, 'y-', label='data')

popt, pcov = curve_fit(func, xdata, ydata)

plt.plot(xdata, func(xdata, *popt), 'r--',
         label='fit: C1=%5.2e, C2=%5.3f, C3=%5.3f,C4=%5.3f' % tuple(popt))


plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

根据您的查询,我可以理解您需要分别为三个不同的数据集拟合一个方程。因此,我通过保持sigma和T不变来更新您的代码。请看一看,让我进一步了解

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


#Equation --> Eps_Cr = (C1*Sigma**C2*x**(C3+1)*e(-C4/T))/(C3+1)

def func(x, C1, C2, C3,C4):
    Sigma = 20
    T = 1
    return (C1*Sigma**C2*x**(C3+1)*np.exp(-C4*1/T))/(C3+1)

#Example Data 1
xdata = [1, 10, 100, 1000, 10000, 100000]
ydata = [0.000382,0.000407,0.000658,0.001169,0.002205,0.004304]

#Example Data 2
xdata1 = [1, 10, 100, 1000, 10000, 100000]
ydata1 = [0.002164,0.002371,0.004441,0.008571,0.016811,0.033261]

#Example Data 3
xdata2 = [1, 10, 100, 1000, 10000, 100000]
ydata2 = [0.001332,0.001457,0.002707,0.005157,0.010007,0.019597]

plt.plot(xdata, ydata, 'b-', label='data 1')
plt.plot(xdata1, ydata1, 'g-', label='data 2')
plt.plot(xdata2, ydata2, 'y-', label='data 3')

popt, pcov = curve_fit(func, xdata, ydata)
popt1, pcov1 = curve_fit(func, xdata1, ydata1)
popt2, pcov2 = curve_fit(func, xdata2, ydata2)

plt.plot(xdata, func(xdata, *popt), 'r.',
         label='fit for Data 1: C1=%5.2e, C2=%5.3f, C3=%5.3f,C4=%5.3f' % tuple(popt))

plt.plot(xdata1, func(xdata1, *popt1), 'r+',
         label='fit for Data 2: C1=%5.2e, C2=%5.3f, C3=%5.3f,C4=%5.3f' % tuple(popt1))

plt.plot(xdata2, func(xdata2, *popt2), 'r--',
         label='fit for Data 3 : C1=%5.2e, C2=%5.3f, C3=%5.3f,C4=%5.3f' % tuple(popt2))


plt.xlabel('X')
plt.ylabel('Y')
plt.legend(loc='upper left',prop={'size': 8})
plt.show()

从您在“答案”中提供的额外信息来看,您似乎希望符合层次模型。至少统计人员经常这样称呼他们。一些参数在所有数据点之间共享(参数
C1
C4
,一些参数在数据集组内共享(
T
Sigma
)。所有这些参数都需要从数据中估计

这通常是通过为所有数据建立一个更大的模型来解决的,并在模型中选择要使用的分组参数。如果数据点属于数据组
1
,我们选择
Sigma1
T1
,依此类推

由于您已经在使用
curve\u fit
,因此我为您的代码制作了一个版本来完成这项工作。由于我在
scipy
方面不是专家,因此代码样式还有一些要求,但我想您至少会理解该方法

导入matplotlib.pyplot作为plt
将numpy作为np导入
从scipy.optimize导入曲线\u拟合
def func(x_和_grp、C1、C2、C3、C4、Sigma0、Sigma1、Sigma2、T0、T1、T2):
#我们估计每组数据点一个西格玛和一个T
x=x_和_-grp[:,0]
grp_id=x_和_grp[:,1]
#在这里,我们根据组id为每个数据点选择适当的T和Sigma
T=np.数组([[T0,T1,T2][int(gid)],用于grp_id中的gid])
Sigma=np.数组([[Sigma0,Sigma1,Sigma2][int(gid)],用于grp_id中的gid])
返回值(C1*西格玛**C2*x**(C3+1)*np.exp(-C4*1/T))/(C3+1)
#示例数据分为3组
xdata0=[1,10,100,1000,10000,100000]
ydata0=[0.000382,0.000407,0.000658,0.001169,0.002205,0.004304]
xdata1=[1,10,100,1000,10000,100000]
ydata1=[0.002164,0.002371,0.004441,0.008571,0.016811,0.033261]
xdata2=[1,10,100,1000,10000,100000]
ydata2=[0.001332,0.001457,0.002707,0.005157,0.010007,0.019597]
#合并所有数据并将组id添加到x数据向量
y_all=np.连接([ydata0,ydata1,ydata2])
x_和_grp_all=np.zero(形状=(3*6,2))
x_和_grp_all[:,0]=np.连接([xdata0,xdata1,xdata2])
x_和_grp_all[0:6,1]=0
x_和_grp_all[6:12,1]=1
x_和_grp_all[12:18,1]=2
#将模型与所有数据拟合在一起
popt,pcov=曲线拟合(func,x和y-grp-all,y-all)
xspace=np.logspace(1,5)
plt.plot(xdata0,ydata0,'b-',label='data')
plt.plot(xdata1,ydata1,'g-',label='data')
plt.plot(xdata2,ydata2,'y-',label='data')
对于gid,拉链中的颜色([0,1,2]、'r'、'k'、'purple']):
T=popt[4+gid]
西格玛=popt[7+gid]
x_和_grp=np.column_堆栈([xspace,np.one_-like(xspace)*gid])
plt.plot(xspace,
func(x_和_grp,*popt),
linestyle='虚线',color=color,
label='fit:T=%5.2e,Sigma=%5.3f'(T,Sigma))
plt.xlabel('X')
plt.ylabel('Y')
plt.title('fit:C1=%5.2e,C2=%5.3f,C3=%5.3f,C4=%5.3f'%tuple(popt[0:4]))
plt.legend()
plt.show()
输出如下所示:

<>最后,我想补充一下, CurvyFult不适合这个任务,如果你有很多不同的组。考虑其他可能相关的库。STATMODEM可能是有可能的。一个选择是达到<代码> SimPy。优化。MelimeS/<代码>,因为它给了你更多的灵活性。你需要做的是CON。通过手动进行置信区间估计


我还想补充一点,如果你知道每组数据的
T
Sigma
,那么上面的方法就太复杂了。在这种情况下,我们将
Sigma
T
的相关值添加到x向量中,而不是组id。

嗨!请把你的问题更具体一些。你的代码在做什么,你做了什么你想这样做吗?哇,卢德维格,我非常感谢你的努力。我会尽力了解你在那里做了什么!我希望我有问题时能与你联系。没问题。只要记住接受答案,如果它回答了你的问题,就投上一票。:)嗨,卢德维格,我想我理解你在那里做了什么。但我必须承认我有点困惑,如果我想用确定的参数重建方程(例如在excel中),比如说现在通过改变“x”来重建xdata0/ydata0-曲线拟合不起作用。。。我的Y值(结果)甚至不太吻合——为什么?在代码中,fit似乎起作用。是否可以检查更大范围的参数(应该有多个最佳值)以及C1>0?附言:你有一些我可以查看的Statmodels/scipy.optimize.minimize的例子吗(例如,层次模型)?更改了绘图并将回归结果包含在我的答案中。我觉得这个方法很好。既然我已经回答了你的问题