首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

牛頓均勻插值多項式 C++ 實現:差分表構建與區間中點求值完整指南

     編輯:關於C語言

多項式插值是數值分析核心課題。牛頓插值法以其增量構建特性(新增節點無需重算舊係數)成為工程首選。本文深度解析一個完整的 C++ 實現,涵蓋節點排序、差分表構建、多項式係數提取、霍納法則求值等關鍵步驟。

演算法流程

  1. 輸入與排序:讀取 n 個節點 (xᵢ, yᵢ),按 x 升序排列(插值要求節點有序)
  2. 構建差分表:計算各階差商 f[xᵢ, ..., xⱼ]
  3. 提取牛頓係數:對角線元素即為多項式係數
  4. 霍納法則求值:以嵌套乘法高效計算插值多項式值
  5. 區間中點評估:在相鄰節點中點驗證插值質量

關鍵資料結構:三角陣列壓縮存儲

差分表為下三角矩陣,採用一維陣列壓縮映射:

#define Q(a,b) Q[(a)*(a+1)/2 + b]
// Q(i,j) 對應第 i 行第 j 列 (0 ≤ j ≤ i < n)
// 總大小:n(n+1)/2

這消除了動態二維陣列指針開銷,提升快取局部性。

核心函數解析

節點排序 setroot()

void setroot() {
    // 冒泡排序 x[] 並同步調整 Q(i,0)
    for (i=0; i

差分表構建 Newton()

void Newton() {
    for (i=1; i

遞推公式:f[xᵢ,...,xᵢ₋ⱼ] = (f[xᵢ,...,xᵢ₋ⱼ₊₁] - f[xᵢ₋₁,...,xᵢ₋ⱼ]) / (xᵢ - xᵢ₋ⱼ)

霍納法則求值 f(x₀)

void f(double x0) {
    for (i=n-1; i>0; i--)
        b[i-1] = Q(i-1,i-1) + b[i] * (x0 - x[i-1]);
    // b[0] 即為 Pₙ(x₀)
}

對應多項式嵌套形式:P(x) = a₀ + (x-x₀)[a₁ + (x-x₁)[a₂ + ...]]

測試案例與輸出分析

// in.txt
7
-3 -4.5
6  2.1
-1 -3.2
5  2.8
-2 -1.8
3  1.7
0  0.5

// out.txt 差分表片段
0 -3 -4.5
1 -2 -1.8  2.7
2 -1 -3.2 -1.4 -2.05
3  0  0.5  3.7  2.55  1.53333
...

// 中點插值結果
f(-2.5) = -1.06517
f(-1.5) = -3.06750
f(-0.5) = -1.86002
f(1.5)  = 5.90552
f(4.0)  = -0.57778
f(5.5)  = 4.59237

工程化注意事項

  • 數值穩定性:高次插值(n>10)易發生龍格現象,建議改用樣條插值
  • 節點分布:均勻節點在區間端點誤差大,切比雪夫節點更優
  • 精度控制:雙精度對中等次數足夠,極高次需考慮長雙精度或任意精度庫
  • 記憶體管理:new[]/delete[] 配對使用,現代 C++ 建議 std::vector 自動管理

現代化重構建議

class NewtonInterpolator {
    std::vector x_, coef_;
public:
    NewtonInterpolator(std::vector> nodes) {
        // 排序、構建差分表、提取係數
    }
    double operator()(double x) const { /* 霍納法則 */ }
    void printDiffTable(std::ostream& os) const;
};

總結

牛頓均勻插值的 C++ 實現展示了數學演算法到工程代碼的轉化精髓:三角陣列壓縮存儲、遞推差分計算、霍納法則求值、中點驗證質量。掌握這套流程,不僅能解決插值問題,更能建立「演算法工程化」的系統性思維——這正是從程式設計師邁向計算科學工程師的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved