Python 如何识别哪一个数学函数生成了由symphy中的X和Y数组给出的曲线

Python 如何识别哪一个数学函数生成了由symphy中的X和Y数组给出的曲线,python,sympy,Python,Sympy,如何使用sympy或Python中的其他方法从X和Y数组的数值中获取数学函数 我想说清楚: 对于以下X和Y: X = [0, 1, 2, 3, 4, 5] Y = [2, 2, 2, 2, 2, 2] 我想说,它是f(x)=kx+l,如果可能的话,还有k和l 我必须找到一个函数的倒数,我只知道它的形状。它可以是一个拟合,不必100%精确。您可能正在从中寻找函数,该函数可以为数据点构造插值多项式。请注意,这只做多项式插值,它不是一些通用的方程求解器,这将是更加困难的。您给出的示例非常基本,因为您

如何使用sympy或Python中的其他方法从X和Y数组的数值中获取数学函数

我想说清楚: 对于以下X和Y:

X = [0, 1, 2, 3, 4, 5]
Y = [2, 2, 2, 2, 2, 2]
我想说,它是f(x)=kx+l,如果可能的话,还有k和l


我必须找到一个函数的倒数,我只知道它的形状。它可以是一个拟合,不必100%精确。

您可能正在从中寻找函数,该函数可以为数据点构造插值多项式。请注意,这只做多项式插值,它不是一些通用的方程求解器,这将是更加困难的。您给出的示例非常基本,因为您的
f(x)
将是
2
,其中
k=0
l=2
,但对于更一般的示例,您可能有

from sympy.polys.polyfuncs import interpolate
from sympy.abc import x
a = [1, 2, 3]
b = [3, 5, 7]
data = list(zip(a,b))
print(interpolate(data,x))
输出

2*x + 1
[2,1]

您可以从多项式中提取系数

result = sympy.polys.polyfuncs.interpolate(data,x)
coefficients = sympy.Poly(result).coeffs()
print(coefficients)
输出

2*x + 1
[2,1]

不可能确定生成序列的唯一函数,因为我们可以有多个多项式(或非线性)解

想象一下。。。有许多函数的点与序列中的点重合

我认为解决问题最合理的方法是使用一些回归技术

例如,可以使用最小二乘法拟合数据

您应该指定一个模型(例如,
y=a+bx+error
),并将数据与此功能表相匹配

然后你会得到如下系数:

a = 0.2
b = 0.05

y = 0.2 + 0.05*x + error

深入研究:

好吧,您确实需要一个合适的例程,这里有一些代码

import numpy as np
from scipy.optimize import curve_fit

def func(x, k, l):
    return k * x + l

X = [0, 1, 2, 3, 4, 5]
Y = [2, 2, 2, 2, 2, 2]

popt, pcov = curve_fit(func, X, Y)

print(popt)
print(pcov)
k,l
的输出为

[ -2.18143147e-12   2.00000000e+00]
这是有道理的,
Y
是常数


您可以尝试任何函数形状,只要根据自己的喜好重写
func

没有通用的解决方案,因为可能没有简单的数学函数描述。例如,您可以使用scipy中提供的各种曲线拟合函数,但由您决定拟合哪种曲线以及如何确定哪种曲线最好。您的示例中发生了什么?Y值都是一样的,所以这只是一条水平线,我不知道你说的“f(Y)=kx+l”是什么意思,因为“kx+l”显然不是Y的函数。你是说
f(x)
?是否有一系列可能的函数类型(即多项式、指数、幂等)?@Jasper:是的,谢谢。开始写y=kx+l,改变了我的想法,显然成功地把事情搞砸了调整我需要的东西!就我的例子来说,为什么仅仅因为k和l不是代表性的东西就毫无意义呢。它成功了。我希望所有人都能看到这是一条线,因为并不是所有人都把线系数k和l命名。以缩短任何可能的混淆。有些人不善于把东西形象化。所以…@Dalen也许荒谬是错误的术语,只是“基本的”:)很高兴我能帮上忙。你知道如何从x得到y吗?我成功地得到了一个多项式,对于给定的x值,它近似地给出y。但是无论我做什么,我都不能从y得到x。X从17到零,Y是[19.683,20.257,20.802,21.317,21.801,22.253,22.673,23.059,23.412,23.731,24.015,24.264,24.478,24.655,24.796,24.901,24.969,25.000]