Python 将两个不同的方程拟合到一个函数(曲线拟合)
我有一个问题:我有两个不同的方程,一个是线性方程,另一个是指数方程。然而,并非两个方程同时有效,这意味着存在两个不同的区域Python 将两个不同的方程拟合到一个函数(曲线拟合),python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我有一个问题:我有两个不同的方程,一个是线性方程,另一个是指数方程。然而,并非两个方程同时有效,这意味着存在两个不同的区域 Equation 1 (x < a): E*x Equation 2 (x >=a): a+b*x+c*(1-np.exp(-d*np.array(x))) 定义分段函数: def fit_fun(x,a,b,c,d,E): funktion1=E*np.array(x) funktion2=a+b*x+c*(1-np.ex
Equation 1 (x < a): E*x
Equation 2 (x >=a): a+b*x+c*(1-np.exp(-d*np.array(x)))
定义分段函数:
def fit_fun(x,a,b,c,d,E):
funktion1=E*np.array(x)
funktion2=a+b*x+c*(1-np.exp(-d*np.array(x)))
return np.heaviside(x+a,0)*funktion2+(1-np.heaviside(x+a,0))*funktion1
def fit_fun(x,a,b,c,d,E):
return np.piecewise(x, [x <= a, x > a], [lambda x: E*np.array(x), lambda x: a+b*x+c*(1-np.exp(-d*np.array(x)))])
别误会我的意思,我确实得到了“一些”拟合,但它们似乎要么接受一个等式,要么接受另一个等式,而不是两者都使用。我也尝试过使用一些边界和初始猜测,但它从未改变
任何意见都将不胜感激
数据:
到目前为止,我发现了这两个问题,但我无法解决:
我怀疑你在第二个等式中犯了错误,在这里你做了
a+b*x+c*(1-np.exp(-d+x))
。其中a
是x
的值,从一条曲线更改为另一条曲线。我认为您应该使用y
的值,即a*E
。此外,定义拟合的初始参数也非常重要。我已经用.txt文件中的数据运行了以下代码,拟合效果似乎很好,如您所见:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import optimize, stats
def fit_fun(x,a,b,c,d,E):
return np.piecewise(x, [x <= a, x > a], [lambda x: E*x, lambda x: a*E+b*x+c*(1-np.exp(-d*x))])
df = pd.read_csv('teste.txt', delimiter='\s+', header=None)
df.columns = ['x','y']
xdata = df['x']
ydata = df['y']
p0 = [0.001,1,1,1,100000]
popt, pcov = optimize.curve_fit(fit_fun, xdata.values, ydata.values, p0=p0, maxfev=10000, absolute_sigma=True, method='trf')
print(popt)
plt.plot(xdata, ydata,'*')
plt.plot(xdata, fit_fun(xdata.values, *popt), 'r')
plt.show()
将numpy导入为np
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
从scipy导入优化,统计
def fit_fun(x、a、b、c、d、E):
逐段返回np.(x,[xa],[lambda x:E*x,lambda x:a*E+b*x+c*(1-np.exp(-d*x)))
df=pd.read_csv('teste.txt',分隔符='\s+',标头=无)
df.columns=['x','y']
扩展数据=df['x']
ydata=df['y']
p0=[0.001,1,1,1100000]
popt,pcov=优化曲线拟合(拟合乐趣,扩展数据值,ydata值,p0=p0,maxfev=10000,绝对σ=True,方法='trf')
打印(popt)
plt.绘图(扩展数据、ydata、'*')
plt.plot(扩展数据,fit_-fun(扩展数据值,*popt),'r')
plt.show()
为什么要尝试拟合这些数据?一旦你适应了数据,你想做什么?使用最近的方法,比如神经网络,你可以用一个模型得到一个很好的拟合…@duhaime:我想用拟合参数进行不同的优化。这两个方程基本上定义了一个模型,我想用在另一个计算中。如果你想知道更多细节,我可以用一个PM^^^来回答,为了避免一个奇怪的间断,你应该把第二个方程设置为
lambda x:a*E+b*(x-a)+c*(1-np.exp(-d*(x-a))
。在更精细的网格上绘图将使差异变得明显。。。。。当然,除非希望它是非连续的。@mikuszefski,谢谢你的贡献。然而,这种不连续性是由于曲线有两种不同的行为,并且曲线被分段函数拟合。如果你使用x-a
你说第二部分从in(a,E)开始,如果你不使用,你说它从(0,E)开始,两者都可以有效。通常我更喜欢从(0,0)开始,使用y0
而不是a*E
。请注意,如果您这样做,那么使用x
或x-a
并不重要,因为差异可以通过参数c
和y0
进行调整。对不起,这种解释没有意义。这两个函数都是R上的连续函数,没有从0
或a
开始的函数。函数是分段定义的这一事实并不意味着它必须是不连续的;它甚至可以在一阶导数中是连续的。唯一的区别是版本1强制曲线2通过(0,0)
,而第二个选项强制曲线2通过(a,ea)
,使整个图形连续。假设,例如,物理数据,人们可能会找到两者的例子。从这个角度来看,我的第一个评论应该是说“可能”只是一个数学上的附加。具有无限连续导数的分段函数,即$C^infty$将是Exp(1/(x^2-1))
,用于-1
0.000000 -1.570670
0.000434 83.292677
0.000867 108.909402
0.001301 124.121676
0.001734 138.187659
0.002168 151.278839
0.002601 163.160478
0.003035 174.255626
0.003468 185.035092
0.003902 195.629820
0.004336 205.887161
0.004769 215.611995
0.005203 224.752083
0.005636 233.436680
0.006070 241.897851
0.006503 250.352697
0.006937 258.915168
0.007370 267.569337
0.007804 276.199005
0.008237 284.646778
0.008671 292.772349
0.009105 300.489611
0.009538 307.776858
0.009972 314.666291
0.010405 321.224211
0.010839 327.531594
0.011272 333.669261
0.011706 339.706420
0.012139 345.689265
0.012573 351.628362
0.013007 357.488150
0.013440 363.185771
0.013874 368.606298
0.014307 373.635696
0.014741 378.203192
0.015174 382.315634
0.015608 386.064126
0.016041 389.592120
0.016475 393.033854
0.016908 396.454226
0.017342 399.831519
0.017776 403.107084
0.018209 406.277016
0.018643 409.441119
0.019076 412.710982
0.019510 415.987331
0.019943 418.873140
0.020377 421.178098
0.020810 423.756827
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import optimize, stats
def fit_fun(x,a,b,c,d,E):
return np.piecewise(x, [x <= a, x > a], [lambda x: E*x, lambda x: a*E+b*x+c*(1-np.exp(-d*x))])
df = pd.read_csv('teste.txt', delimiter='\s+', header=None)
df.columns = ['x','y']
xdata = df['x']
ydata = df['y']
p0 = [0.001,1,1,1,100000]
popt, pcov = optimize.curve_fit(fit_fun, xdata.values, ydata.values, p0=p0, maxfev=10000, absolute_sigma=True, method='trf')
print(popt)
plt.plot(xdata, ydata,'*')
plt.plot(xdata, fit_fun(xdata.values, *popt), 'r')
plt.show()