Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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中的二次链接或分段连接_Python_Scipy_Curve Fitting_Piecewise - Fatal编程技术网

Python中的二次链接或分段连接

Python中的二次链接或分段连接,python,scipy,curve-fitting,piecewise,Python,Scipy,Curve Fitting,Piecewise,我已经在stackoverflow中挖掘了一段时间,没有找到任何多分段曲线拟合的例子。我想将一个二次函数转换为分段函数的多重链接(我不知道它的确切名称,但我需要将每个尾部连接到下一个分段函数的头部,简单地说是“连接的”)。这是我目前使用的代码,使用scipy.optimize将二次函数转换为2个分段线性函数 导入scipy.optimize作为选项 将numpy作为np导入 导入副本 def func_2部件(x,m_0,x_1,y_1,m_1): y=np.分段(x,[x x_1], [lam

我已经在stackoverflow中挖掘了一段时间,没有找到任何多分段曲线拟合的例子。我想将一个二次函数转换为分段函数的多重链接(我不知道它的确切名称,但我需要将每个尾部连接到下一个分段函数的头部,简单地说是“连接的”)。这是我目前使用的代码,使用
scipy.optimize
将二次函数转换为2个分段线性函数

导入scipy.optimize作为选项
将numpy作为np导入
导入副本
def func_2部件(x,m_0,x_1,y_1,m_1):
y=np.分段(x,[x x_1],
[lambda x:m_0*(x-x_1)+y_1,lambda x:m_1*(x-x_1)+y_1])
返回y
xmin=0
xmax=100
a=0.1
a0=1
a00=10
件号=2
sigma=np.ones(numberOfStep)
如果件号=2:
下限=[-np.inf,xmin,-np.inf,-np.inf]
上界=[np.inf,xmax,np.inf,np.inf]
w、 选择曲线拟合(函数2分段,x样本,y样本,边界=(下界,上界),σ=σ)
x_0=copy.deepcopy(xmin)
y_0=func_2片段(x_0,*w).tolist()
[m_0,x_1,y_1,m_1]=w
结果=[x_0,y_0,m_0,x_1,y_1,m_1]
问题是,我不能对三个分段实现相同的方法(我不知道如何使x_2>x_1):

def func_渐变(x_列表,y_列表):
len_x_list=len(x_list)
如果len_x_list==1:
m_列表=y_列表/x_列表
返回m_列表
m_列表=[]
对于范围内的idx(len_x_列表-1):
m_list.append((y_list[idx+1]-y_list[idx])/(x_list[idx+1]-x_list[idx]))
返回m_列表
def func_3部件(x,m_0,x_1,y_1,x_2,y_2,m_2):
y=np.分段(x,[x_1)和(x_2],
[lambda x:m_0*(x-x_1)+y_1,lambda x:y_1+(y_2-y_1)*(x-x_1)/(x_2-x_1),lambda x:m_2*(x-x_2)+y_2])
返回y
如果件号=3:
下限=[-np.inf,xmin,-np.inf,xmin,-np.inf,-np.inf]
上界=[np.inf,xmax,np.inf,xmax,np.inf,np.inf]
w、 选择曲线拟合(函数3分段,x样本,y样本,边界=(下界,上界),西格玛=西格玛)
x_0=copy.deepcopy(xmin)
y_0=func_3piecewise(x_0,*w).tolist()
[m_0,x_1,y_1,x_2,y_2,m_2]=w
m_1=函数梯度(x_2-x_1,y_2-y_1)
结果=[x_0,y_0,m_0,x_1,y_1,m_1,x_2,y_2,m_2]
完整的代码可以在中看到

因此,问题是: 如何在python中为一般n个片段创建链接(分段函数的每个尾部连接到下一个片段的头部,或简单地“连接”)picewise函数?其他算法或解算器是可以接受的

编辑:我将目前为止的结果分为2个部分进行添加

更新:我发现我的代码(三段代码)因为一个小的输入错误而无法工作(很抱歉,请告诉我是否应该删除这个问题)。现在它工作了,我更新了粘贴箱。但是,如果您有一个通用的(灵活的,不需要为每个数字变量编写函数)函数,可以生成n个片段,我很乐意接受这个答案


您可以在距离
x2-x1
上进行参数化,而不是在
x2
上进行参数化。因为可以给优化器边界,所以可以将距离设置为大于0

例如,要生成具有4个区间的一般分段线性函数,请定义以下内容:

分隔间隔和x0、x1和x2的点。4个层段的坡度分别为m0、m1、m2和m3。x0处的函数值为y0

定义d1=x1-x0,d2=x2-x1。从这里开始:

x1 = x0 + d1
x2 = x0 + d1 + d2
然后,您有8个优化参数:x0、y0、d1、d2、m0、m1、m2和m3。根据优化问题的性质,除了x0和y0之外,所有的都是非负的

第一个间隔的方程式:

y = m0 * (x - x0) + y0
y = m1 * (x - x0) + y0
第二个间隔的方程式:

y = m0 * (x - x0) + y0
y = m1 * (x - x0) + y0
现在,您可以通过在其区间的最右侧点应用上一个方程,以递归方式获得其余的方程。对于x1点,函数值为:

y1 = m1 * d1 + y0
所以第三个等式是

y =
    m2 * (x - x1) + y1 =
    m2 * (x - x0 - d1) + m1 * d1 + y0
y =
    m3 * (x - x2) + y2 =
    m3 * (x - x0 - d1 - d2) + m2 * d2 + m1 * d1 + y0
对于x2点,这给出了

y2 = m2 * d2 + y1
所以第四个等式是

y =
    m2 * (x - x1) + y1 =
    m2 * (x - x0 - d1) + m1 * d1 + y0
y =
    m3 * (x - x2) + y2 =
    m3 * (x - x0 - d1 - d2) + m2 * d2 + m1 * d1 + y0

你说“我不能实现相同的方法”,然后立即展示你的实现。这里有什么问题?您的实现不起作用吗?它是否以一种不好的方式工作?你可以澄清你的问题,“链接”是什么意思?你说“在x中继续,但不是继续函数”,但我不明白这一点。澄清吗?@Anatolig我解释一下。我的意思是,链接就像一条链,每一个分段的尾部都与下一个分段的头部相连接。我将尝试编写代码。并报告结果。谢谢。我发现了在实现你的代码时的问题(这是我代码中的小错误)。我更新了我的问题,现在我将把你的答案标记为接受答案。非常感谢。