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()