使用scipy来进行曲线拟合

article/2025/8/23 1:24:43

导读

曲线拟合的应用在生活中随处可见,不知道大家是否还记得物理实验中的自由落体运动中下降高度与时间关系之间的探究,在初速度为0的情况下,我们想要探究下降高度与时间的关系。

我们当时采用的方法是通过设置不同的下降时间来记录下降的高度,测量记录多组数据之后,再利用二维坐标系将记录的点绘制到坐标系当中去,然后保证绘制的曲线到这些点的距离之和最小,最终得到的曲线就是h与t的关系

绘制出ht的关系之后,我就可以知道任意取值t在初速度为0的情况下,下降高度h对应的值。除此之外,曲线拟合的应用还有很多例如房价预测经济预测股价预测等。

不知道,大家有没有思考过,为什么我们可以通过测量值来绘制出th的关系曲线呢?这里面用到的逻辑究竟是什么呢?其实关于曲线的拟合通常有两种解决方案:

  1. 我们已经知道了自变量(x)和因变量(y)的关系,只是不知道参数,通过观察值来计算出参数,就能计算出自变量和因变量之间的关系
  2. 利用万能函数逼近器神经网络来拟合曲线,通过定义代价函数,利用已有观察值的输入值来计算出预测值,再计算出预测值与观测值的输出值之间的差距,在通过反向传播,来计算出神经网络的参数

下面我们主要探讨如何利用方法1来实现曲线的拟合

曲线拟合

曲线拟合还可以分为两种情况,第一种就是没有约束的曲线拟合,第二种就是带有约束条件的曲线拟合。scipy中提供了curve_fit函数使用非线性的最小二乘法用来拟合没有约束条件的曲线,提供了least_squares函数用来拟合带有约束条件的曲线。

  • 没有约束条件的曲线拟合
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt#设置随机数的种子
np.random.seed(28)def simlate_data(time_array):#用来模拟测量误差measurement_error = np.random.randn(len(time_array))g = 9.8#模拟数据h_array = 0.5 * g * time_array ** 2 + measurement_errorreturn h_arraydef objective_fun(x,a):#定义二次函数作为目标函数return a * x**2def objective_fun1(x,a):#定义三次函数作为目标函数return a * x**3#定义输入数据(t)和输出数据(h)
time_array =  np.arange(0,10,1) * 0.2
h_array = simlate_data(time_array)#计算定义函数的参数
popt,_ = curve_fit(objective_fun,time_array,h_array)
#获取参数
a = poptpopt1,_ = curve_fit(objective_fun1,time_array,h_array)
a1 = popt1#绘制数据点和预测的函数
plt.scatter(time_array,h_array)
plt.plot(time_array,objective_fun(time_array,a),"--",color="r")
plt.plot(time_array,objective_fun1(time_array,a1),":",color="b")
plt.legend(["data","objective quadratic function","objective cubic function"])plt.show()

在这里插入图片描述

  • 带约束条件的曲线拟合

有时候在求解曲线参数的时候,会对参数的边界做出一些限制,下面就展示了在对参数的边界做出限制的情况下如何来求解的问题。我们使用jac矩阵结合最小二乘法来计算曲线的参数

import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as pltdef model(x,u):"""定义拟合的曲线:param x:输入值自变量:param u:输入值函数的参数:return:返回值因变量"""return x[0] * (u ** 2 + x[1] * u) / (u ** 2 + x[2] * u + x[3])def fun(x,u,y):return model(x,u) - ydef jac(x,u,y):J = np.empty((u.size,x.size))den = u ** 2 + x[2] * u + x[3]num = u ** 2 + x[1] * uJ[:,0] = num / denJ[:,1] = x[0] * u / denJ[:,2] = -x[0] * num * u / den ** 2J[:,3] = -x[0] * num / den ** 2return J#输入值自变量
u = np.array([4.0, 2.0, 1.0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1,8.33e-2, 7.14e-2, 6.25e-2])
#输入值因变量
y = np.array([1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2,4.56e-2, 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2])
#函数的参数
x0 = np.array([2.5, 3.9, 4.15, 3.9])
#利用jac矩阵结合最小二乘法来计算曲线的参数,设置参数的取值在(0,100)之间
res = least_squares(fun, x0, jac=jac, bounds=(0, 100), args=(u, y), verbose=1)#需要预测值得输入值
u_test = np.linspace(0, 5)
#利用计算的曲线参数来计算预测值
y_test = model(res.x, u_test)
plt.plot(u, y, 'o', markersize=4, label='data')
plt.plot(u_test, y_test, label='fitted model')
plt.xlabel("u")
plt.ylabel("y")
plt.legend(loc='lower right')
plt.show()

在这里插入图片描述


http://chatgpt.dhexx.cn/article/n6dSDGxY.shtml

相关文章

SciPy 优化

章节 SciPy 介绍SciPy 安装SciPy 基础功能SciPy 特殊函数SciPy k均值聚类SciPy 常量SciPy fftpack(傅里叶变换)SciPy 积分SciPy 插值SciPy 输入输出SciPy 线性代数SciPy 图像处理SciPy 优化SciPy 信号处理SciPy 统计 优化是指在某些约束条件下,求解目标函数最优解的…

Python scipy拟合分布

scipy 拟合分布文档:https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#fitting-distributions 代码: import numpy as np from scipy import statsnumber np.random.normal(10, 5, 4000) # 生成均值为10,方差为5的正态分布…

scipy求极值代码

1.求解一元函数极值 1.1 导包: from scipy.optimize import fmin这个函数主要用于求某个点附近的极小值。相应的,如果要求某个点附近的最大值,可以使用↓ from scipy.optimize import fmax1.2 定义求导函数 def f(x):return x(x-1) #retu…

scipy.interpolate插值

python SciPy库依赖于NumPy,提供了便捷且快速的N维数组操作。 可以实现插值,积分,优化,图像处理,特殊函数等等操作。 参考官方文档: Interpolation (scipy.interpolate) — SciPy v1.7.1 Manualhttps:/…

Scipy系列目录

Python科学计算和数据分析库系列目录 Scipy简介 Scipy是基于Numpy的科学计算工具库,方便、易于使用、专为科学和工程设计,是一个用于数学、科学、工程领域的常用软件包。 Scipy提供了许多用户友好和高效的高阶方法,如插值,积分&…

scipy笔记:FFT

数学笔记;离散傅里叶变化 DFT_UQI-LIUWJ的博客-CSDN博客 数学笔记:FFT(快速傅里叶变换)_快速傅里叶变换矩阵_UQI-LIUWJ的博客-CSDN博客 【个人理解:FFT是DFT的一种优化,DFT需要N个谱域信号来表示N个时域信…

Scipy简介

Scipy简介 Scipy依赖于NumpyScipy包含的功能:最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解器等应用场景:Scipy是高端科学计算工具包,用于数学、科学、工程学等领域Scipy由一些特定功能的子模块组…

系统工程--011详细设计 伪码 程序流程图 PAD图 N-S图 判断表和判断树

详细设计 三种控制结构:顺序、选择、循环 一个程序的代码块仅仅通过顺序、选择和循环,3种基本控制结构进行连接,并每个代码块只有一个入口和一个出口伪码 程序流程图 PAD图 N-S图 判断表和判断树

程序流程图、N-S图、PAD图

在需求分阶段经常使用3种方法去剖析我们所面对的业务。 程序流程图 任何复杂的程序图都应由5种基本控制结构组成或嵌套而成。 盒图(N-S图) Nassi和Scheiderman提出了一种符合结构化程序设计原则的图形描述工具,叫作盒图,也叫做N…

PAD图初认识

程序流程图&N-S图&PAD图 程序流程图 任何复杂的程序图都应由5种基本控制结构组成或嵌套而成。 盒图(N-S图) Nassi和Scheiderman提出了一种符合结构化程序设计原则的图形描述工具,叫作盒图,也叫做N-S图。任何一个N-S图&a…

python numpy 图片 pad 参数详解

python numpy 图片 pad 参数详解 ‘constant’, ‘edge’, ‘linear_ramp’, ‘maximum’, ‘mean’, ‘median’, ‘minimum’, ‘reflect’, ‘symmetric’, ‘wrap’, ‘empty’ 光看文档不太好理解,因为在网上找不到详细的例子,所以我就自己动手做了…

E-R图、N-S图、PAD图、程序流程图

E-R图: E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。 矩形框:表示实体,在框中记入实体名。 菱形框:表示联系,在框…

np.pad()用于卷积网络中对图片进行填充

有一张RGB的图像,我们要在这个图像的周围加上填充元素,使得这个图像不会再卷积操作后导致边缘信息丢失和图像尺寸的减小。 为此,我们需要padding操作,numpy库中对这个进行了封装numpy.pad()函数: 对一个一维数组来说…

numpy.pad对图片进行填充

一、接口 pad(array, pad_width, mode, **kwargs) 其中,第一个参数是输入数组; 第二个参数是需要pad的值,参数输入方式为:((before_1, after_1), … (before_N, after_N)),其中(before_1, af…

第六章:详细设计。盒图、问题分析图即PAD图、过程设计语言PDL伪码

第六章:详细设计 盒图 PAD图 PAD图即:问题分析图。使用表示结构化控制结构的PAD符号设计出来的程序必然是结构化程序。 PAD图所描绘的程序结构十分清晰。PAD图表现程序逻辑易读、易懂、易记。 例题: 过程设计语言(PDL&#xff…

分别画出程序的软件流程图、NS图、PAD图; 程序

1、分别画出程序的软件流程图、NS图、PAD图&#xff1b; 程序 #include<stdio.h> #include<stdlib.h> int main(int argc, char *argv[]) {int Edge_a,Edge_b,Edge_c;printf("Input three int type data between space:\n");scanf("%d %d %d"…

程序流程图 分别用N-S图和PAD图、伪码表示。n阶乘(软件工程)

例题&#xff1a;某程序流程图如右图所示&#xff0c;请分别用 N-S图和PAD图表示。 PAD图&#xff1a; N-S&#xff1a;盒图 2.计算n阶乘的程序N-S图&#xff0c;PAD图

PAD图

地址链接&#xff1a;http://star.aust.edu.cn/~jjguan/guanjj/rjgc/chapter4/cha4_11_3_c1.htm