📜  牛顿的除法插值公式

📅  最后修改于: 2021-09-22 10:42:13             🧑  作者: Mango

插值是对值序列中两个已知值内的值的估计。

牛顿除法差插值公式是当所有值序列的区间差值不相同时使用的插值技术。

假设 f(x 0 ), f(x 1 ), f(x 2 )………f(x n ) 是函数y=f(x) 对应于参数 x=x 的 (n+1) 个值0 , x 1 , x 2 …x n ,其中间隔差异不相同
然后第一个划分的差异由下式给出

 f[x_0, x_1]=\frac{f(x_1)-f(x_0)}{x_1-x_0}

第二个划分的差异由下式给出

 f[x_0, x_1, x_2]=\frac{f[x_1, x_2]-f[x_0, x_1]}{x_2-x_0}

等等…
划分的差异关于参数是对称的,即与参数的顺序无关。
所以,
f[x 0 , x 1 ]=f[x 1 , x 0 ]
f[x 0 , x 1 , x 2 ]=f[x 2 , x 1 , x 0 ]=f[x 1 , x 2 , x 0 ]

用一分之差,二分之差,依此类推,形成一个表,称为分差表。

分差表:

牛顿的微分插值公式

例子:

输入:值为 7 输出 : 7 处的值为 13.47

下面是牛顿分差插值法的实现。

C++
// CPP program for implementing
// Newton divided difference formula
#include 
using namespace std;
  
// Function to find the product term
float proterm(int i, float value, float x[])
{
    float pro = 1;
    for (int j = 0; j < i; j++) {
        pro = pro * (value - x[j]);
    }
    return pro;
}
  
// Function for calculating
// divided difference table
void dividedDiffTable(float x[], float y[][10], int n)
{
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            y[j][i] = (y[j][i - 1] - y[j + 1]
                         [i - 1]) / (x[j] - x[i + j]);
        }
    }
}
  
// Function for applying Newton's
// divided difference formula
float applyFormula(float value, float x[],
                   float y[][10], int n)
{
    float sum = y[0][0];
  
    for (int i = 1; i < n; i++) {
      sum = sum + (proterm(i, value, x) * y[0][i]);
    }
    return sum;
}
  
// Function for displaying 
// divided difference table
void printDiffTable(float y[][10],int n)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            cout << setprecision(4) << 
                                 y[i][j] << "\t ";
        }
        cout << "\n";
    }
}
  
// Driver Function
int main()
{
    // number of inputs given
    int n = 4;
    float value, sum, y[10][10];
    float x[] = { 5, 6, 9, 11 };
  
    // y[][] is used for divided difference
    // table where y[][0] is used for input
    y[0][0] = 12;
    y[1][0] = 13;
    y[2][0] = 14;
    y[3][0] = 16;
  
    // calculating divided difference table
    dividedDiffTable(x, y, n);
  
    // displaying divided difference table
    printDiffTable(y,n);
  
    // value to be interpolated
    value = 7;
  
    // printing the value
    cout << "\nValue at " << value << " is "
               << applyFormula(value, x, y, n) << endl;
    return 0;
}


Java
// Java program for implementing
// Newton divided difference formula
import java.text.*;
import java.math.*;
  
class GFG{
// Function to find the product term
static float proterm(int i, float value, float x[])
{
    float pro = 1;
    for (int j = 0; j < i; j++) {
        pro = pro * (value - x[j]);
    }
    return pro;
}
  
// Function for calculating
// divided difference table
static void dividedDiffTable(float x[], float y[][], int n)
{
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            y[j][i] = (y[j][i - 1] - y[j + 1]
                        [i - 1]) / (x[j] - x[i + j]);
        }
    }
}
  
// Function for applying Newton's
// divided difference formula
static float applyFormula(float value, float x[],
                float y[][], int n)
{
    float sum = y[0][0];
  
    for (int i = 1; i < n; i++) {
    sum = sum + (proterm(i, value, x) * y[0][i]);
    }
    return sum;
}
  
// Function for displaying 
// divided difference table
static void printDiffTable(float y[][],int n)
{
    DecimalFormat df = new DecimalFormat("#.####");
    df.setRoundingMode(RoundingMode.HALF_UP);
      
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            String str1 = df.format(y[i][j]);
            System.out.print(str1+"\t ");
        }
        System.out.println("");
    }
}
  
// Driver Function
public static void main(String[] args)
{
    // number of inputs given
    int n = 4;
    float value, sum;
    float y[][]=new float[10][10];
    float x[] = { 5, 6, 9, 11 };
  
    // y[][] is used for divided difference
    // table where y[][0] is used for input
    y[0][0] = 12;
    y[1][0] = 13;
    y[2][0] = 14;
    y[3][0] = 16;
  
    // calculating divided difference table
    dividedDiffTable(x, y, n);
  
    // displaying divided difference table
    printDiffTable(y,n);
  
    // value to be interpolated
    value = 7;
  
    // printing the value
    DecimalFormat df = new DecimalFormat("#.##");
    df.setRoundingMode(RoundingMode.HALF_UP);
      
    System.out.println("\nValue at "+df.format(value)+" is "
            +df.format(applyFormula(value, x, y, n)));
}
}
// This code is contributed by mits


Python3
# Python3 program for implementing 
# Newton divided difference formula 
  
# Function to find the product term 
def proterm(i, value, x): 
    pro = 1; 
    for j in range(i): 
        pro = pro * (value - x[j]); 
    return pro; 
  
# Function for calculating 
# divided difference table 
def dividedDiffTable(x, y, n):
  
    for i in range(1, n): 
        for j in range(n - i): 
            y[j][i] = ((y[j][i - 1] - y[j + 1][i - 1]) /
                                     (x[j] - x[i + j]));
    return y;
  
# Function for applying Newton's 
# divided difference formula 
def applyFormula(value, x, y, n): 
  
    sum = y[0][0]; 
  
    for i in range(1, n):
        sum = sum + (proterm(i, value, x) * y[0][i]); 
      
    return sum; 
  
# Function for displaying divided 
# difference table 
def printDiffTable(y, n): 
  
    for i in range(n): 
        for j in range(n - i): 
            print(round(y[i][j], 4), "\t", 
                               end = " "); 
  
        print(""); 
  
# Driver Code
  
# number of inputs given 
n = 4; 
y = [[0 for i in range(10)] 
        for j in range(10)]; 
x = [ 5, 6, 9, 11 ]; 
  
# y[][] is used for divided difference 
# table where y[][0] is used for input 
y[0][0] = 12; 
y[1][0] = 13; 
y[2][0] = 14; 
y[3][0] = 16; 
  
# calculating divided difference table 
y=dividedDiffTable(x, y, n); 
  
# displaying divided difference table 
printDiffTable(y, n); 
  
# value to be interpolated 
value = 7; 
  
# printing the value 
print("\nValue at", value, "is",
        round(applyFormula(value, x, y, n), 2))
  
# This code is contributed by mits


C#
// C# program for implementing 
// Newton divided difference formula 
using System;
  
class GFG{ 
// Function to find the product term 
static float proterm(int i, float value, float[] x) 
{ 
    float pro = 1; 
    for (int j = 0; j < i; j++) { 
        pro = pro * (value - x[j]); 
    } 
    return pro; 
} 
  
// Function for calculating 
// divided difference table 
static void dividedDiffTable(float[] x, float[,] y, int n) 
{ 
    for (int i = 1; i < n; i++) { 
        for (int j = 0; j < n - i; j++) { 
            y[j,i] = (y[j,i - 1] - y[j + 1,i - 1]) / (x[j] - x[i + j]); 
        } 
    } 
} 
  
// Function for applying Newton's 
// divided difference formula 
static float applyFormula(float value, float[] x, 
                float[,] y, int n) 
{ 
    float sum = y[0,0]; 
  
    for (int i = 1; i < n; i++) { 
    sum = sum + (proterm(i, value, x) * y[0,i]); 
    } 
    return sum; 
} 
  
// Function for displaying 
// divided difference table 
static void printDiffTable(float[,] y,int n) 
{ 
    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < n - i; j++) { 
            Console.Write(Math.Round(y[i,j],4)+"\t "); 
        } 
        Console.WriteLine(""); 
    } 
} 
  
// Driver Function 
public static void Main() 
{ 
    // number of inputs given 
    int n = 4; 
    float value; 
    float[,] y=new float[10,10]; 
    float[] x = { 5, 6, 9, 11 }; 
  
    // y[][] is used for divided difference 
    // table where y[][0] is used for input 
    y[0,0] = 12; 
    y[1,0] = 13; 
    y[2,0] = 14; 
    y[3,0] = 16; 
  
    // calculating divided difference table 
    dividedDiffTable(x, y, n); 
  
    // displaying divided difference table 
    printDiffTable(y,n); 
  
    // value to be interpolated 
    value = 7; 
  
    // printing the value 
      
    Console.WriteLine("\nValue at "+(value)+" is "
            +Math.Round(applyFormula(value, x, y, n),2)); 
} 
} 
// This code is contributed by mits


PHP


输出:

12     1     -0.1667     0.05     
13     0.3333     0.1333     
14     1     
16     

Value at 7 is 13.47