2 python任意函数拟合

本文详细介绍了如何使用Python的numpy和scipy库进行一元多项式和任意函数的最小二乘法拟合,包括代码示例和关键概念解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值