最近工作中经常遇到需要通过散点数据拟合函数曲线的情况,比较典型的例子是通过换热器的压降拟合多孔介质参数,以及拟合流体介质的多项式密度。虽然相关的工作可以通过Excel、Origin等实现,但是操作繁琐而且支持的函数类型有限。这里使用Python编写了一个简单的工具包,通过numpy和scipy实现函数拟合功能,用PySide编写了用户界面,实现了从输入数据到输出拟合函数参数的功能,并且支持数据预测和自定义函数功能。

1. 软件简介

源码地址:PyCFF

1.1 用户界面

下面是软件的启动界面。软件界面通过PySide(Qt)实现。支持函数绘图功能,用户可以自定义绘图内容及输出保存图片。

c6219195050ac1b0866829f371239172.png

下面是软件的输入界面。输入数据通过表格的方式展示,用户通过指定列来选择要拟合函数的自变量(x)和因变量(y)。用户不仅可以在表格中手动输入数据,也可以通过Excel等表格软件粘贴输入,还可以通过粘贴替换列的方式快速输入大量数据。

1dbefea8b95c2677587b4f885c9df838.png

下面是软件的输出界面。软件预定义了一些常用函数,用户点击运算后在左侧表格中输出函数参数,并且在文本框中输出函数的完整表达式。用户可以自定义输出参数的精度和是否采用科学计数法,输出参数默认采用的是6位小数的科学计数法表示,满足大部分工程计算的需求。

98ecd6a60f59bed8a70596750a11fd4d.png

1.2 自定义函数说明

软件的预定义函数包括多项式、指数函数、对数函数及幂函数等,除了以上预定义函数也支持用户自定义函数。类似a+b*x**1+c*x**2-omega-alpha * exp(x)等自定义函数,会自动提取其中的参数并通过输入数据进行拟合。自定义函数除了四则运算(+、-、*、/)和幂运算(**或^),还支持常用的函数运算,具体函数和相关说明见下表。

cc51005d3b909b23abebc855fbc2e641.png

函数名 用法 说明
exp exp(a) 求a的指数值
pow pow(a, b) 求a的b次幂
abs abs(a) 求a的绝对值
sqrt sqrt(a) 求a的平方根
cbrt cbrt(a) 求a的立方根
log log(a) 求a的对数(以e为底)
log10 log10(a) 求a的对数(以10为底)
log2 log2(a) 求a的对数(以2为底)
min min(a) 求a的最小值
max max(a) 求a的最大值
sin sin(a) 求a的正弦值
cos cos(a) 求a的余弦值
tan tan(a) 求a的正切值
asin asin(a) 求a的反正弦
acos acos(a) 求a的反余弦
atan atan(a) 求a的反正切
sinh sinh(a) 求a的双曲正弦值
cosh cosh(a) 求a的双曲余弦值
tanh tanh(a) 求a的双曲正切值
asinh asinh(a) 求a的反双曲正弦
acosh acosh(a) 求a的反双曲余弦
atanh atanh(a) 求a的反双曲正切
pi pi() 圆周率
e e() 自然对数的底数

2. 构建说明

2.1 构建环境

源代码提供了build.py脚本方便快速构建,用户构建前应先建立虚拟环境:

python -m venv myvenv # myvenv 为虚拟环境名称,根据需要自己定义

Windows平台下通过以下命令激活虚拟环境:

./myvenv/Scripts/activate # win环境下激活虚拟环境,建议在posershell中运行

Linux平台下通过以下命令激活虚拟环境:

source ./myvenv/bin/activate # posix环境下激活虚拟环境

激活虚拟环境之后会在命令行开头显示(myvenv)字符,表明此时命令行下的python运行在虚拟环境myvenv中。通过以下命令安装依赖:

pip install -r requirements.txt

构建完成后通过deactivate退出虚拟环境:

deactivate # win、posix都是同一个命令

2.2 构建脚本

运行以下命令显示构建脚本的帮助信息:

python build.py -h

c526195ad4f9c0928665d83df792851b.png

  • 开关-h/--help显示命令行帮助信息
  • 开关-c/--copy将源文件复制到指定目录,用于调试
  • 开关-b/--build运行pyinstaller将源码打包成可执行文件,dir表示打包成目录(默认情况),one表示打包成单独的可执行文件
  • 开关-u/--update将源文件中的.ui.qrc编译成.py文件,用于调试
  • 开关-t/--translate用于多语言翻译,up表示更新源码中的.ts文件,gui表示启动linguistgui界面并打开.ts文件,gen表示将.ts文件编译成.qm文件,此开关一般单独用于调试
  • 开关-p/--pyd,先将.py文件编译成.pyd/.so,再运行pyinstaller打包成可执行文件,dir表示打包成目录(默认情况),one表示打包成单独的可执行文件
  • 开关-g/--genwhl,生成whl发布包

一般情况下,使用以下命令即可快速构建可执行程序:

python build.py -p

生成的可执行文件/文件夹在[source_dir]/build/pycff/dist路径下。

使用以下命令即可快速构建whl发布包:

python build.py -g

生成的whl文件在[source_dir]/build/dist路径下,通过pip install pycff-{version}-py3-none-{platform}.whl安装该发布包。发布包安装后,可以通过pycff或者python -m pycff启动主程序。

3. 快速上手

3.1 输入

输入标签进行数据输入操作。

  • 程序初始展示的是一个2×5大小的表格数据,除了可以通过顶部的输入栏调整表格大小外,还可以根据右键菜单的插入删除操作调整表格大小。
  • 可以通过复制粘贴excel表格获取数据,也可以通过读写文件(目前只支持csv文件读写)来加载/保存数据。
  • 可以自己定义行标题和列标题名称,用于对数据作区分。
  • 可以通过右键菜单的“粘贴替换列”将剪贴板中的数据快速载入指定列中,自动按非数字字符分割,用于快速读取大量数据。
  • 数据输入完毕之后,通过右侧的复选框选择自变量(x)和因变量(y)对应的数据列,再点击刷新按钮将表格数据载入。
    08d924f7c34483ac3b9fac9ab3bcfcaa.png

3.2 绘图

绘图标签中进行简单的绘图操作。

  • 初始绘图展示的是前面5×2表格散点数据(红色实线段)和拟合曲线(黑色平滑虚线)。
  • 点击该标签中的刷新按钮,通过输入数据绘制散点图。
  • 可以自定义绘图标题、坐标轴标签和数字格式,以及曲线的标签、颜色、线型和粗细等参数。
  • 支持保存绘图,目前支持输出SVG和PNG格式文件。
    6781c6902ea52192aac443d99ae10d08.png

3.3 输出

输出标签中进行函数拟合操作。

  • 在左侧顶部复选框中选择函数类型,预定义函数或者自定义函数。
  • 点击右侧上方的计算按钮,在左侧表格中显示计算的函数参数和R2值,同时右侧文本框中显示完整的函数表达式。
  • 可以通过右侧顶部的复选框自定义显示参数的数字格式。
  • 计算出函数参数之后,点击刷新按钮,在绘图标签中绘制散点图和函数曲线对比,可以自定义函数曲线的细化程度。
  • 在底部的左右两组输入框,可以通过输入X值计算函数的Y值,或者通过给定Y值预测X值,用于数据预测。
    363f66cf5fc80ae388534d21623831ca.png
    4d24afb2912539b86aa61ece5ff11e07.png

4. 规划

目前程序实现了表格输入输出、绘图、函数拟合等基本功能,未来计划新增以下功能:

  • 表格实现公式计算
  • 实现excel文件读写
  • 绘图数据复制到剪贴板
  • 其他用户关心的问题……

更多意见和建议,欢迎提交Issues