如何根据x,y值推断函数?

The*_*ist 2 python numpy matplotlib extrapolation

好的,所以我几天前开始使用Python.我主要将它用于DataScience,因为我是一名本科化学专业的学生.好吧,现在我手上有一个小问题,因为我必须推断一个功能.我知道如何制作简单的图表和图表,所以请尽量解释它对我来说很容易.我从以下开始:

from matplotlib import pyplot as plt
from matplotlib import style
style.use('classic')
x = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715]
y = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938]
x2 = [0.707, 0.2, 0.057, 0.016, 0.00453]
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625]
Run Code Online (Sandbox Code Playgroud)

所以有了这些值,我必须找出一种方法来推断,以便在我的x = 0时获得ay(或y2)值.我知道如何以数学方式做到这一点,但我想知道python是否可以做到这一点以及如何在Python中执行它.有一个简单的方法吗?你能给我一个我给定值的例子吗?谢谢

Hug*_*ell 5

快速浏览一下您的数据,

from matplotlib import pyplot as plt
from matplotlib import style
style.use('classic')

x1 = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715]
y1 = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938]
plt.plot(x1, y1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

x2 = [0.707, 0.2, 0.057, 0.016, 0.00453]
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625]
plt.plot(x2, y2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这绝对不是线性的.如果你知道这是什么类型的函数,你可能想要使用scipy的曲线拟合来获得一个你可以使用的最合适的函数.

编辑:

如果我们将图转换为log-log,

import numpy as np

plt.plot(np.log(x1), np.log(y1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

plt.plot(np.log(x2), np.log(y2))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它们看起来非常线性(如果你稍微眯一下).找到最合适的线,

np.polyfit(np.log(x1), np.log(y1), 1)
# array([-0.05817402,  4.73809081])

np.polyfit(np.log(x2), np.log(y2), 1)
# array([-1.01664659,  0.36759068])
Run Code Online (Sandbox Code Playgroud)

我们可以转换回功能,

# f1:
# log(y) = -0.05817402 * log(x) + 4.73809081
# so
# y = (e ** 4.73809081) * x ** (-0.05817402)
def f1(x):
    return np.e ** 4.73809081 * x ** (-0.05817402)

xs = np.linspace(0.01, 0.8, 100)
plt.plot(x1, y1, xs, f1(xs))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# f2:
# log(y) = -1.01664659 * log(x) + 0.36759068
# so
# y = (e ** 0.36759068) * x ** (-1.01664659)
def f2(x):
    return np.e ** 0.36759068 * x ** (-1.01664659)

plt.plot(x2, y2, xs, f2(xs))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第二个看起来很不错; 第一个仍然需要一些改进(即找到更具代表性的功能并曲线拟合).但你应该对这个过程有很好的了解;-)

  • 你的号码来自哪里?你知道他们应该遵循什么样的等式吗?Scipy的三次样条拟合https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html适用于插值,但不太准确(即通常很糟糕)进行外推. (2认同)