插值是对值序列中两个已知值内的值的估计。
牛顿除法差插值公式是当所有值序列的区间差值不相同时使用的插值技术。
假设 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 ]=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