From 0519e8bd63682da931b28a26352e3bd54c586197 Mon Sep 17 00:00:00 2001 From: fengyang Date: Tue, 27 Aug 2024 18:23:47 +0800 Subject: [PATCH] fea: python build sucess --- .gitignore | 1 + README.md | 27 ++++ data.txt | 5 + images/fitting.png | Bin 0 -> 50048 bytes pyproject.toml | 40 ++++++ src/fy_polyfit/__init__.py | 0 .../__pycache__/polyfit.cpython-311.pyc | Bin 0 -> 6272 bytes src/fy_polyfit/polyfit.py | 122 ++++++++++++++++++ 8 files changed, 195 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 data.txt create mode 100644 images/fitting.png create mode 100644 pyproject.toml create mode 100644 src/fy_polyfit/__init__.py create mode 100644 src/fy_polyfit/__pycache__/polyfit.cpython-311.pyc create mode 100644 src/fy_polyfit/polyfit.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7773828 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dist/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ee5741 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ + +# polyfit 一次/二次拟合工具 + + +## 说明 + +本程序主要功能为读取待拟合的数据文件,文件格式可以为.txt 或者.csv格式,以空格分隔,无头部。 +通过命令行 `polyfit` [filename] 执行,如果未指定文件名,则默认寻找当前目录下的 `data.txt` + +数据样本为N行两列的数据,第一列为x, 第二列为Y, +实例数据如下: + +```text + + 0.134 2.79 + 0.160 3.39 + 0.195 4.09 + 0.244 5.19 + 0.313 6.59 +``` + +## 命令行执行 +调用 `polyfit [data.txt]` + +执行结果如下: + +![拟合图形](images/fitting.png) diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..bb98a81 --- /dev/null +++ b/data.txt @@ -0,0 +1,5 @@ +0.134 2.79 +0.160 3.39 +0.195 4.09 +0.244 5.19 +0.313 6.59 diff --git a/images/fitting.png b/images/fitting.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0b7c17b21612e409acdbca00148b0f29eadac5 GIT binary patch literal 50048 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ßh6$>>Z8D*h>59bZ+<@_Rbl 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 literal 0 HcmV?d00001 diff --git a/src/fy_polyfit/polyfit.py b/src/fy_polyfit/polyfit.py new file mode 100644 index 0000000..63eeaea --- /dev/null +++ b/src/fy_polyfit/polyfit.py @@ -0,0 +1,122 @@ +""" +本文件通过简单的例子展示了numpy的多项式曲线拟合功能 +和matplotlib的绘图功能,主要内容如下: +1. 通过 numpy.loadtxt() 读取data.txt 文件(包含待拟合数据) + 0.134 2.79 + 0.160 3.39 + 0.195 4.09 + 0.244 5.19 + 0.313 6.59 +2. 通过 numpy.polyfit() 分别进行一次/二次曲线拟合 + +3. 分别计算均方根值误差 + +4. 分别绘制 两个图,并显示公式和均方根误差 + +""" +import os +import argparse +import numpy as np +import matplotlib.pyplot as plt + +__version__ = '1.0.0' + +# 计算均方根误差函数 +def cal_rmse(y_true, y_pred): + return np.sqrt(np.mean((y_pred - y_true) **2)) + + +def main(): + parser = argparse.ArgumentParser(description='从指定文件中读取数据,默认为data.txt, 无头部,空格分隔,两列') + parser.add_argument('filename', nargs='?', default='data.txt', + help='数据文件名') + args = parser.parse_args() + filename = args.filename + # 读取 数据 + try: + # 检查文件是否存在 + if not os.path.isfile(filename): + raise FileNotFoundError(f"文件'{filename}'不存在!") + + # 尝试读取数据 + df = np.loadtxt(filename) + print(f"数据文件'{filename}'读取成功:") + print(df) + x = df[: , 0] + y = df[:, 1] + + # 二次曲线拟合 + coefficients2 = np.polyfit(x, y, 2) + + #一次曲线拟合 + coefficients1 = np.polyfit(x, y, 1) + + #打印参数 + print(f"linear coefficients: {coefficients1}") + print(f"Quadratic coefficients: {coefficients2}") + # 获取拟合的多项式系数 + a1, b1 = coefficients1 + a2, b2, c2 = coefficients2 + + polynomial1 = np.poly1d(coefficients1) + polynomial2 = np.poly1d(coefficients2) + + + + x_fit = np.linspace(min(x), max(x), 100) + y_fit1 = polynomial1(x_fit) + y_fit2 = polynomial2(x_fit) + + rmse1 = cal_rmse(y, polynomial1(x)) + rmse2 = cal_rmse(y, polynomial2(x)) + + + + formula1 = f'y = {"-" if a1 < 0 else ""} {abs(a1):.2f}x'\ + f' {"+" if b1>=0 else "-"} {abs(b1):.2f}' + formula2 = f'y = {a2:.2f}x^2 {"+" if b2>=0 else "-"} {abs(b2):.2f}x'\ + f' {"+" if c2>=0 else "-"} {abs(c2):.2f}' + + + # 创建2个子图 + """ + 创建1行2列的子图,figsize 控制整个图的大小 + """ + fig, ax = plt.subplots(1,2, figsize=(10,5)) + + + + #绘制原始数据点和一次拟合曲线 + ax[0].scatter(x, y, label='source points') + ax[0].plot(x_fit, y_fit1, color='red',label=f" Linear Fitted Curve, rmse = {rmse1 *100:.2f}%") + ax[0].set_title('Linear Curve Fitting') + ax[0].set_xlabel('x') + ax[0].set_ylabel('y') + ax[0].legend() + ax[0].grid(True) + ax[0].text(0.5, 0.8, formula1,color='red',fontsize=16, transform=ax[0].transAxes, verticalalignment='top', horizontalalignment='center') + + #绘制原始数据点和二次拟和曲线 + ax[1].scatter(x, y, label='source points') + ax[1].plot(x_fit, y_fit2, color='blue',label=f" Quadratic Fitted Curve, rmse = {rmse2 * 100:.2f}%") + ax[1].set_title('Quadratic Curve Fitting') + ax[1].set_xlabel('x') + ax[1].set_ylabel('y') + ax[1].legend() + ax[1].grid(True) + # transform 变换到[0,1] 的坐标系下,方便定位,左下角0,0, 右上角1,1 + ax[1].text(0.5, 0.8, formula2,color='blue',fontsize=16, transform=ax[1].transAxes, verticalalignment='top', horizontalalignment='center') + + plt.tight_layout() + plt.show() + + except FileNotFoundError as e: + print(e) + + except ValueError as e: + print(f"发生了意外错误:{e}") + + + +if __name__ == '__main__': + main() \ No newline at end of file