You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未知底层函数情况下的Python振荡曲线拟合及拟合方程获取方案咨询

未知底层函数情况下的Python振荡曲线拟合及拟合方程获取方案咨询

嘿,我完全懂你现在的难处——面对振荡曲线,既不知道它的底层函数,试了多项式、高斯乘sinc拟合都没效果,还得最终拿到能描述它的拟合方程对吧?下面给你几个在Python里切实可行的方案,一步步帮你解决问题:

1. 三次样条插值拟合(非参数贴合,分段方程)

这种方法不需要预设任何函数形式,能精准贴合振荡曲线的细节,唯一的小缺点是得到的是分段多项式方程,但胜在简单易实现:

import numpy as np
from scipy.interpolate import CubicSpline
import matplotlib.pyplot as plt

# 替换成你自己的x、y数据数组
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(0, 0.1, 100)  # 模拟振荡带噪数据

# 执行三次样条拟合
cs = CubicSpline(x, y)

# 生成拟合后的连续曲线
x_fit = np.linspace(x.min(), x.max(), 200)
y_fit = cs(x_fit)

# 可视化对比
plt.plot(x, y, 'o', label='原始数据点')
plt.plot(x_fit, y_fit, 'r-', label='三次样条拟合曲线')
plt.legend()
plt.show()

# 提取每一段的拟合系数(每段是三次多项式:y = a + b*x + c*x² + d*x³)
print("各区间的三次样条拟合系数:")
for idx in range(len(cs.x) - 1):
    interval = f"[{cs.x[idx]:.2f}, {cs.x[idx+1]:.2f}]"
    coeffs = cs.c[:, idx]
    print(f"区间 {interval}: d={coeffs[0]:.4f}, c={coeffs[1]:.4f}, b={coeffs[2]:.4f}, a={coeffs[3]:.4f}")

2. 傅里叶级数拟合(适配振荡特性,单一组合方程)

振荡曲线本质上是不同频率正弦/余弦的叠加,傅里叶级数完美适配这种特性,你只需要根据曲线复杂度调整级数项数就能得到不错的拟合效果,还能直接导出单一的组合方程:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

# 定义傅里叶级数通用形式(可自定义项数)
def fourier_series(x, *params):
    term_count = len(params) // 2
    a0 = params[0]
    y_fit = a0 / 2
    for i in range(1, term_count + 1):
        y_fit += params[i] * np.cos(i * x) + params[term_count + i] * np.sin(i * x)
    return y_fit

# 替换成你的真实数据
x = np.linspace(0, 10, 100)
y = 0.5 + 2*np.cos(x) + 1.5*np.sin(x) + 0.8*np.cos(2*x) + 0.6*np.sin(2*x) + np.random.normal(0, 0.2, 100)

# 初始化参数:这里取前3项,需要1个常数项+3*2个三角函数项,共7个参数
initial_params = np.ones(7)

# 执行拟合
popt, _ = curve_fit(fourier_series, x, y, p0=initial_params)

# 生成拟合曲线
y_fit = fourier_series(x, *popt)

# 可视化
plt.plot(x, y, 'o', label='原始数据')
plt.plot(x, y_fit, 'g-', label='傅里叶级数拟合')
plt.legend()
plt.show()

# 输出可读的拟合方程
equation = f"y = {popt[0]/2:.4f}"
for i in range(1, len(popt)//2 + 1):
    equation += f" + {popt[i]:.4f}*cos({i}x) + {popt[len(popt)//2 + i]:.4f}*sin({i}x)"
print("拟合得到的傅里叶级数方程:")
print(equation)

3. 符号回归拟合(自动搜索最优方程,进阶方案)

如果上面的方法都达不到你的预期,可以试试PySR这个符号回归工具——它会自动搜索所有可能的数学表达式组合,找到最贴合数据的方程,完全不需要你预设函数形式:

from pysr import PySRRegressor
import numpy as np

# 替换成你的真实数据(x需要是二维数组)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y = np.sin(x) + np.cos(2*x) + np.random.normal(0, 0.1, 100)

# 初始化模型,设置允许使用的运算符
model = PySRRegressor(
    model_selection="best",
    niterations=100,  # 迭代次数越多,找到的方程可能越优
    binary_operators=["+", "-", "*", "/"],
    unary_operators=["sin", "cos", "exp", "log"],
    loss="loss(prediction, target) = (prediction - target)^2",
)

# 执行拟合
model.fit(x, y)

# 输出最优拟合方程
print("自动搜索得到的最优拟合方程:")
print(model.equations_.iloc[0].equation)

备注:内容来源于stack exchange,提问作者H.AWAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:39:35