1、一元多项式
功能:最小二乘法拟合一元线性多项式 p(1)*x**n+p(2)*x**(n-1)*...*p(n-1)*x+p(n),指数不能是小数
模块:numpy
代码如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
z1 = np.polyfit(x, y, 3)#用3次多项式拟合,输出系数从高到0
p1 = np.poly1d(z1)#使用次数合成多项式
yvals=p1(x)
plt.plot(x,y,'*')
plt.plot(x,yvals)
plt.show()
计算结果:
#np.poly1d函数解释
1)p1 = np.poly1d([1,2,3])使用系数合成多项式 1*x**2+2*x**1+3*x**0
2)p1 = np.poly1d([1,2,3],True)使用根合成多项式(x-1)*(x-2)*(x-3)
3)p1(0.5)表示当x = 0.5时,多项式的值为多少
4)p1.r表示当多项式为 0 时,此等式的根
5)p1.c表示生成多项式的系数数组
6)p1.order表示返回最高项的次方数
7)p1[1]表示返回第一项的系数
8)多项式支持实数的四则运算
2、一元任意函数
功能:最小二乘法拟合一元任意函数 y=f(x)
模块:from scipy import optimize
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(x,a,b):#需要拟合的函数
return a*np.exp(b/x)
# 拟合点
x0 = [1, 2, 3, 4, 5]
y0 = [1, 3, 8, 18, 36]
a4, b4= optimize.curve_fit(func, x0, y0)[0]
x4 = np.arange(1, 6, 0.01)
y4 = a4*np.exp(b4/x4)
plt.figure()
plt.scatter(x0[:], y0[:], 25, "red")
plt.plot(x4, y4, "purple")
plt.show()
计算结果:
存在问题:bounds=[[],[]],指定参数范围,长度是1或者和参数一样多,为1时表示所有参数都是这个数,[0,[20,30]]即0<a<20,0<b<30
不能返回残差,如何指定迭代结果?
2、任意函数
功能:最小二乘法任意函数
模块:from scipy import optimize
代码如下:
import numpy as np
from scipy import optimize # 最小二乘法拟合
import matplotlib.pyplot as plt # python matplotlib 绘图
from mpl_toolkits.mplot3d import Axes3D # 3D 绘图
def func(x, y, p):
""" 数据拟合所用的函数:z=ax+by
:param x: 自变量 x
:param y: 自变量 y
:param p: 拟合参数 a, b
"""
a, b, c = p
return a * x**2 + b * y +c*x
def residuals(p, z, x, y):
""" 得到数据 z 和拟合函数之间的差
"""
print(p)
return z - func(x, y, p)
def main():
x = np.arange(5)
y = np.arange(5)
z = np.array([2, 4, 7, 7, 10]) # 数据随便取的
plsq = optimize.leastsq(residuals, np.array([0, 0, 0]), args=(z, x, y)) # 最小二乘法拟合
# [0, 0] 为参数 a, b 初始值
a, b, c= plsq[0] # 获得拟合结果
print("拟合结果:\na = {}".format(a))
print("b = {}".format(b))
print("c = {}".format(c))
# 绘图
xp = np.linspace(-1, 6, 100)
yp = np.linspace(-1, 6, 100)
X, Y = np.meshgrid(xp, yp)
Z = func(X, Y, [a, b, c]) # 带入拟合得到的 a, b, c
fig = plt.figure(figsize=(8, 6))
ax = Axes3D(fig) # 3D 绘图
ax.plot_surface(X, Y, Z, alpha=0.5)
ax.scatter(x, y, z, color="r")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
plt.show()
main()