You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python从Excel导入的XY坐标生成拟合方程?

从XY坐标生成数学方程的Python实现方案

Hey there! 既然你已经搞定了Excel数据导入和绘图,那生成对应的数学方程本质就是曲线拟合的工作,我给你分享几个实用的方法,完全贴合你的需求(X是capacity,Y是power):

一、先搞定数据准备(你可能已经会,但还是提一下)

首先用pandas读取你的Excel数据,确保把X和Y轴数据提取成数组:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 替换成你的Excel文件路径和sheet名
df = pd.read_excel("your_data.xlsx", sheet_name="Sheet1")
x = df["capacity"].values  # X轴:容量
y = df["power"].values     # Y轴:功率

二、最常用的:多项式拟合(适合多数常规趋势)

如果你的数据看起来是线性、二次或者三次曲线,用numpypolyfitpoly1d就能快速生成方程,还能直接得到拟合函数:

1. 线性拟合(y = ax + b)

# 拟合1次多项式(线性)
coeffs_linear = np.polyfit(x, y, deg=1)
linear_model = np.poly1d(coeffs_linear)

# 打印格式化后的方程
print(f"线性拟合方程:y = {coeffs_linear[0]:.4f}x + {coeffs_linear[1]:.4f}")

# 绘图对比原始数据和拟合结果
plt.scatter(x, y, label="原始数据点", alpha=0.6)
plt.plot(x, linear_model(x), color="red", linewidth=2, label=f"线性拟合: {linear_model}")
plt.xlabel("Capacity")
plt.ylabel("Power")
plt.legend()
plt.show()

2. 高阶多项式拟合(比如二次y=ax²+bx+c)

如果数据是曲线趋势,把deg参数改成2、3就行:

# 二次多项式拟合
coeffs_quad = np.polyfit(x, y, deg=2)
quad_model = np.poly1d(coeffs_quad)

print(f"二次拟合方程:y = {coeffs_quad[0]:.4f}x² + {coeffs_quad[1]:.4f}x + {coeffs_quad[2]:.4f}")

# 绘图
plt.scatter(x, y, label="原始数据点", alpha=0.6)
plt.plot(x, quad_model(x), color="green", linewidth=2, label=f"二次拟合: {quad_model}")
plt.xlabel("Capacity")
plt.ylabel("Power")
plt.legend()
plt.show()

三、自定义函数拟合(适合特定趋势,比如指数、对数)

如果你的数据符合特定的物理模型或者非多项式趋势(比如指数增长),用scipy.optimize.curve_fit来拟合自定义函数:

示例:指数模型拟合(y = a·e^(bx) + c)

from scipy.optimize import curve_fit

# 定义你想要拟合的自定义函数(这里是指数模型,你可以换成对数、幂函数等)
def exponential_model(x, a, b, c):
    return a * np.exp(b * x) + c

# 初始参数猜测(根据你的数据大概估一下,比如a=1, b=0.1, c=0,猜不准也没关系,curve_fit会自动优化)
initial_guess = [1, 0.1, 0]
# 执行拟合
params, _ = curve_fit(exponential_model, x, y, p0=initial_guess)

a, b, c = params
print(f"指数拟合方程:y = {a:.4f}·e^({b:.4f}x) + {c:.4f}")

# 绘图验证
plt.scatter(x, y, label="原始数据点", alpha=0.6)
plt.plot(x, exponential_model(x, *params), color="blue", linewidth=2, 
         label=f"指数拟合: y={a:.4f}e^({b:.4f}x)+{c:.4f}")
plt.xlabel("Capacity")
plt.ylabel("Power")
plt.legend()
plt.show()

四、评估拟合效果(选做)

可以用R²值判断拟合的好坏,越接近1说明拟合效果越好:

from sklearn.metrics import r2_score

# 以线性拟合为例
y_pred = linear_model(x)
r2 = r2_score(y, y_pred)
print(f"线性拟合的R²值:{r2:.4f}")

小提示

  • 先看你画的原始数据图,判断数据趋势是线性、多项式还是其他模型,再选对应的拟合方法
  • 如果数据有噪声,可以先做平滑处理(比如用pd.Series(y).rolling(window=3).mean())再拟合

内容的提问来源于stack exchange,提问作者python33

火山引擎 最新活动