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

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

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

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

函数名 | 用法 | 说明 |
---|---|---|
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

- 开关
-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)对应的数据列,再点击
刷新
按钮将表格数据载入。
3.2 绘图
在绘图
标签中进行简单的绘图操作。
- 初始绘图展示的是前面5×2表格散点数据(红色实线段)和拟合曲线(黑色平滑虚线)。
- 点击该标签中的
刷新
按钮,通过输入数据绘制散点图。 - 可以自定义绘图标题、坐标轴标签和数字格式,以及曲线的标签、颜色、线型和粗细等参数。
- 支持保存绘图,目前支持输出SVG和PNG格式文件。
3.3 输出
在输出
标签中进行函数拟合操作。
- 在左侧顶部复选框中选择函数类型,预定义函数或者自定义函数。
- 点击右侧上方的
计算
按钮,在左侧表格中显示计算的函数参数和R2值,同时右侧文本框中显示完整的函数表达式。 - 可以通过右侧顶部的复选框自定义显示参数的数字格式。
- 计算出函数参数之后,点击
刷新
按钮,在绘图
标签中绘制散点图和函数曲线对比,可以自定义函数曲线的细化程度。 - 在底部的左右两组输入框,可以通过输入X值计算函数的Y值,或者通过给定Y值预测X值,用于数据预测。
4. 规划
目前程序实现了表格输入输出、绘图、函数拟合等基本功能,未来计划新增以下功能:
- 表格实现公式计算
- 实现excel文件读写
- 绘图数据复制到剪贴板
- 其他用户关心的问题……
更多意见和建议,欢迎提交Issues