一般来说,没有简单的方法。对于七次多项式,任意多项式的闭合形式解不可用。
反向拟合是可能的,但仅限于原多项式单调变化的区域。如果原多项式在您感兴趣的域上具有极小值或最大值,则尽管y是x的函数,但x不能是y的函数,因为它们之间没有一对一的关系。
如果您(i)可以重新进行拟合过程,并且(ii)可以分段处理单个拟合的单调区域,则可以采取以下操作:
-
import numpy as np
degree = 1
a = 2 * np.random.random(degree+1) - 1
def y_of_x(x, coeff_vector):
"""
Evaluate a polynomial with coeff_vector and degree len(coeff_vector)-1 using Horner's method.
Coefficients are ordered by increasing degree, from the constant term at coeff_vector[0],
to the linear term at coeff_vector[1], to the n-th degree term at coeff_vector[n]
"""
coeff_rev = coeff_vector[::-1]
b = 0
for a in coeff_rev:
b = b * x + a
return b
my_x = np.arange(-1, 1, 0.01)
my_y = y_of_x(my_x, a)
p_test = np.polyfit(my_x, my_y, deg=degree)[::-1]
print p_test, a
p = np.polyfit(my_y, my_x, deg=degree)[::-1]
def x_of_y(yy, a):
return y_of_x(yy, a)
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(my_x, my_y, '-b', x_of_y(my_y, p), my_y, '-r')
注意:此代码未检查单调性,仅假定其存在。
通过调整 degree
的值,您应该可以看到,只有在 degree=1
时,该代码适用于所有随机值的 a
。 对于其他度数,它偶尔可以正常工作,但在存在许多极小值/极大值时不行。由于用平方根函数近似抛物线并不总是有效,因此对于degree>1
,它永远不会完美地工作等。
p
的y(x)
值来获取新的x(y)
的p
集合,还是使用相同的x
和y
数据来找到新的p
?如果是后者,在polyfit
中只需交换x
和y
即可... - Frank M