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

对数空间拟合的多项式如何直接转换回非对数空间?

高效计算对数拟合曲线的二阶导数

你已经验证了对数空间多项式拟合的降噪效果,最终的平滑曲线是 ( f(x) = e^{P(x)} )(其中 ( P(x) ) 是对数空间拟合得到的多项式)。无需生成离散点再求导,直接通过解析求导就能高效得到干净的二阶导,步骤如下:

解析导数推导

对于 ( f(x) = e^{P(x)} ),利用链式法则和乘积法则推导二阶导:

  1. 一阶导数:( f'(x) = e^{P(x)} \cdot P'(x) = f(x) \cdot P'(x) )
  2. 二阶导数:( f''(x) = f(x) \cdot \left( [P'(x)]^2 + P''(x) \right) )

其中 ( P'(x) ) 是多项式 ( P(x) ) 的一阶导数,( P''(x) ) 是二阶导数,均可通过numpy.poly1d直接计算,无需数值差分。

代码实现

修正你原代码中的变量名错误后,完整实现如下:

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

# 假设df是你的含噪声数据
df = pd.DataFrame({'x': np.arange(0, 100), 'y': np.random.exponential(10, 100) + np.random.normal(0, 1, 100)})

# 1. 对数空间拟合多项式(指定拟合阶数,比如3阶)
df['log_y'] = np.log(df['y'])
log_poly_coeffs = np.polyfit(df['x'], df['log_y'], deg=3)
P = np.poly1d(log_poly_coeffs)

# 2. 计算多项式的一阶、二阶导数
P1 = P.deriv(m=1)  # 一阶导多项式
P2 = P.deriv(m=2)  # 二阶导多项式

# 3. 定义平滑曲线及其二阶导函数
def f(x):
    return np.exp(P(x))

def f_double_prime(x):
    return f(x) * (P1(x)**2 + P2(x))

# 示例:计算任意x点的二阶导
x_test = 50.0
print(f"x={x_test}处的二阶导:{f_double_prime(x_test)}")

# 可视化验证
x_values = np.arange(0, 100, 0.01)
plt.figure(figsize=(12, 6))
plt.subplot(211)
plt.scatter(df['x'], df['y'], label='原始噪声数据')
plt.plot(x_values, f(x_values), 'r-', label='对数拟合平滑曲线')
plt.legend()
plt.subplot(212)
plt.plot(x_values, f_double_prime(x_values), 'g-', label='平滑曲线二阶导')
plt.legend()
plt.show()

关键优势

  • 完全避免离散点数值求导带来的噪声,解析导数保证结果干净
  • 复用对数空间的多项式拟合结果,无需额外拟合步骤,计算高效
  • 完美保留你验证有效的对数拟合降噪特性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:43:11