Python,基于x和y值建模函数

时间:2018-05-12 14:04:23

标签: python function math interpolation

我有一个问题,我有两个带有x和y值的列表,我想基于这些创建一个函数。但问题是我想构建一个像这样的函数:

f(x)= a *(x-b)** c

我已经知道了scipy.interpolate,但是找不到任何可以返回像这样的函数。

是否有一种非常简单的方法可以通过搜索a,b和c的哪个值最匹配来尝试创建最佳函数?

感谢您的帮助!

编辑:

这是我目前的x和y值:

enter image description here

我创建了这个函数:

def problem(values):
    s = sum((y - values[0]*(x-values[1])**values[2])**2 for x,y in zip(X,Y))
    return(s)

我尝试用scipy.optimize.minimize找到a,b和c的最佳值,但我不知道a,b和c的值是否应该开始......

values = minimize(problem,(a,b,c))

1 个答案:

答案 0 :(得分:1)

(编辑为OP增加的代码和子问题。)

一般的想法是使用最小二乘最小化来找到最好的" abc的值。首先定义一个参数为a, b, c的函数,该函数返回给定y值与计算值a * (x-b)**c之间差异的平方和。 (该函数可以作为单行执行。)然后使用优化例程(例如scipy中的一个)来最小化该函数值的值。那些a, b, c的值就是你想要的 - 用它们来定义你想要的功能。

需要检查一些细节,例如对a, b, c的允许值的限制,但这些细节在某种程度上取决于您的xy值列表。

现在您已经显示了xy值的图表,我发现您的值都是正数,而且函数通常会增加。对于这种常见情况,我会使用初始值

a = 1.0
b = 0.0
c = 1.0

这给出了原点的直线,实际上是y = x行,这通常是一个不错的第一猜测。在您的情况下,xy值具有非常不同的比例,yx大约一百倍,因此您可能会在更改时获得更好的结果价值a

a = 100.0
b = 0.0
c = 1.0

我可以看到更好的价值观和对最终价值的一些限制,但我宁愿让这个答案更加通用,也可以用于其他类似的问题。

你的函数problem()看起来对我来说是正确的,尽管为了更清晰,我会以不同的方式编写它。一定要测试一下。