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

不使用Scipy库实现Python Hermite插值时遇除零错误的解决咨询

解决Hermite插值的除以零错误与误差问题

错误原因分析

你的代码存在两个核心问题:

  1. 除以零直接触发错误:在result += ...这一行中,x[j]-x[i]没有限制i≠j,当循环到i=j时,分母为0,直接触发除法错误。
  2. Hermite基函数实现逻辑错误:你混淆了拉格朗日插值与Hermite插值的基函数构造逻辑,Hermite插值需要为每个节点的函数值和导数值分别构造专属基函数,而非简单修改拉格朗日项。

正确的Hermite插值实现

基于Hermite插值的标准公式,重新实现代码如下:

def hermite_interpolation(x, y, yp, xi):
    n = len(x)
    result = 0.0
    for j in range(n):
        # 计算拉格朗日基函数 L_j(xi)
        L_j = 1.0
        for i in range(n):
            if i != j:
                L_j *= (xi - x[i]) / (x[j] - x[i])
        
        # 计算拉格朗日基函数在x_j处的导数 L_j'(x_j)
        L_j_prime = 0.0
        for i in range(n):
            if i != j:
                L_j_prime += 1.0 / (x[j] - x[i])
        
        # 构造Hermite基函数 H_j0(对应函数值)和 H_j1(对应导数值)
        H_j0 = (L_j ** 2) * (1 - 2 * L_j_prime * (xi - x[j]))
        H_j1 = (L_j ** 2) * (xi - x[j])
        
        # 累加当前节点的插值贡献
        result += y[j] * H_j0 + yp[j] * H_j1
    return result

误差优化建议

你提到添加epsilon后误差大幅增加,原因是epsilon破坏了基函数的正交性与插值的精确性。针对y=1/(x²+1)的插值场景,可以通过以下方式优化误差:

  • 使用解析导数:目标函数的导数为yp = -2x/(x²+1)²,直接用该公式计算导数值,避免数值求导带来的误差。
  • 无需添加epsilon:正确实现的代码不会出现除以零的情况,因为所有涉及x[j]-x[i]的计算都限制了i≠j,而你的插值节点是[0,1]上的等距点,本身无重复节点,不需要引入epsilon。

测试示例

针对你的目标函数,测试代码如下:

import numpy as np

# 生成[0,1]上的等距节点
x = np.linspace(0, 1, 5)
y = 1 / (x ** 2 + 1)
# 计算解析导数
yp = -2 * x / (x ** 2 + 1) ** 2

# 测试插值点
xi = 0.3
interp_val = hermite_interpolation(x, y, yp, xi)
true_val = 1 / (xi ** 2 + 1)
print(f"插值值:{interp_val:.6f},真实值:{true_val:.6f},误差:{abs(interp_val - true_val):.8f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:42:54