Forward Difference Error Function Only Continuous
Interpolation is the technique of estimating the value of a function for any intermediate value of the independent variable, while the process of computing the value of the function outside the given range is called extrapolation.
Forward Differences: The differences y1 – y0, y2 – y1, y3 – y2, ……, yn – yn–1 when denoted by dy0, dy1, dy2, ……, dyn–1 are respectively, called the first forward differences. Thus, the first forward differences are :
NEWTON'S GREGORY FORWARD INTERPOLATION FORMULA :
This formula is particularly useful for interpolating the values of f(x) near the beginning of the set of values given. h is called the interval of difference and u = ( x – a ) / h, Here a is the first term.
Example :
Input : Value of Sin 52
Output :
Value at Sin 52 is 0.788003
Below is the implementation of the Newton forward interpolation method.
C++
#include <bits/stdc++.h>
using
namespace
std;
float
u_cal(
float
u,
int
n)
{
float
temp = u;
for
(
int
i = 1; i < n; i++)
temp = temp * (u - i);
return
temp;
}
int
fact(
int
n)
{
int
f = 1;
for
(
int
i = 2; i <= n; i++)
f *= i;
return
f;
}
int
main()
{
int
n = 4;
float
x[] = { 45, 50, 55, 60 };
float
y[n][n];
y[0][0] = 0.7071;
y[1][0] = 0.7660;
y[2][0] = 0.8192;
y[3][0] = 0.8660;
for
(
int
i = 1; i < n; i++) {
for
(
int
j = 0; j < n - i; j++)
y[j][i] = y[j + 1][i - 1] - y[j][i - 1];
}
for
(
int
i = 0; i < n; i++) {
cout << setw(4) << x[i]
<<
"\t"
;
for
(
int
j = 0; j < n - i; j++)
cout << setw(4) << y[i][j]
<<
"\t"
;
cout << endl;
}
float
value = 52;
float
sum = y[0][0];
float
u = (value - x[0]) / (x[1] - x[0]);
for
(
int
i = 1; i < n; i++) {
sum = sum + (u_cal(u, i) * y[0][i]) /
fact(i);
}
cout <<
"\n Value at "
<< value <<
" is "
<< sum << endl;
return
0;
}
Java
class
GFG{
static
double
u_cal(
double
u,
int
n)
{
double
temp = u;
for
(
int
i =
1
; i < n; i++)
temp = temp * (u - i);
return
temp;
}
static
int
fact(
int
n)
{
int
f =
1
;
for
(
int
i =
2
; i <= n; i++)
f *= i;
return
f;
}
public
static
void
main(String[] args)
{
int
n =
4
;
double
x[] = {
45
,
50
,
55
,
60
};
double
y[][]=
new
double
[n][n];
y[
0
][
0
] =
0.7071
;
y[
1
][
0
] =
0.7660
;
y[
2
][
0
] =
0.8192
;
y[
3
][
0
] =
0.8660
;
for
(
int
i =
1
; i < n; i++) {
for
(
int
j =
0
; j < n - i; j++)
y[j][i] = y[j +
1
][i -
1
] - y[j][i -
1
];
}
for
(
int
i =
0
; i < n; i++) {
System.out.print(x[i]+
"\t"
);
for
(
int
j =
0
; j < n - i; j++)
System.out.print(y[i][j]+
"\t"
);
System.out.println();
}
double
value =
52
;
double
sum = y[
0
][
0
];
double
u = (value - x[
0
]) / (x[
1
] - x[
0
]);
for
(
int
i =
1
; i < n; i++) {
sum = sum + (u_cal(u, i) * y[
0
][i]) /
fact(i);
}
System.out.println(
"\n Value at "
+value+
" is "
+String.format(
"%.6g%n"
,sum));
}
}
Python3
def
u_cal(u, n):
temp
=
u;
for
i
in
range
(
1
, n):
temp
=
temp
*
(u
-
i);
return
temp;
def
fact(n):
f
=
1
;
for
i
in
range
(
2
, n
+
1
):
f
*
=
i;
return
f;
n
=
4
;
x
=
[
45
,
50
,
55
,
60
];
y
=
[[
0
for
i
in
range
(n)]
for
j
in
range
(n)];
y[
0
][
0
]
=
0.7071
;
y[
1
][
0
]
=
0.7660
;
y[
2
][
0
]
=
0.8192
;
y[
3
][
0
]
=
0.8660
;
for
i
in
range
(
1
, n):
for
j
in
range
(n
-
i):
y[j][i]
=
y[j
+
1
][i
-
1
]
-
y[j][i
-
1
];
for
i
in
range
(n):
print
(x[i], end
=
"\t"
);
for
j
in
range
(n
-
i):
print
(y[i][j], end
=
"\t"
);
print
("");
value
=
52
;
sum
=
y[
0
][
0
];
u
=
(value
-
x[
0
])
/
(x[
1
]
-
x[
0
]);
for
i
in
range
(
1
,n):
sum
=
sum
+
(u_cal(u, i)
*
y[
0
][i])
/
fact(i);
print
(
"\nValue at"
, value,
"is"
,
round
(
sum
,
6
));
C#
using
System;
class
GFG
{
static
double
u_cal(
double
u,
int
n)
{
double
temp = u;
for
(
int
i = 1; i < n; i++)
temp = temp * (u - i);
return
temp;
}
static
int
fact(
int
n)
{
int
f = 1;
for
(
int
i = 2; i <= n; i++)
f *= i;
return
f;
}
public
static
void
Main()
{
int
n = 4;
double
[] x = { 45, 50, 55, 60 };
double
[,] y=
new
double
[n,n];
y[0,0] = 0.7071;
y[1,0] = 0.7660;
y[2,0] = 0.8192;
y[3,0] = 0.8660;
for
(
int
i = 1; i < n; i++) {
for
(
int
j = 0; j < n - i; j++)
y[j,i] = y[j + 1,i - 1] - y[j,i - 1];
}
for
(
int
i = 0; i < n; i++) {
Console.Write(x[i]+
"\t"
);
for
(
int
j = 0; j < n - i; j++)
Console.Write(y[i,j]+
"\t"
);
Console.WriteLine();
}
double
value = 52;
double
sum = y[0,0];
double
u = (value - x[0]) / (x[1] - x[0]);
for
(
int
i = 1; i < n; i++) {
sum = sum + (u_cal(u, i) * y[0,i]) /
fact(i);
}
Console.WriteLine(
"\n Value at "
+value+
" is "
+Math.Round(sum,6));
}
}
PHP
<?php
function
u_cal(
$u
,
$n
)
{
$temp
=
$u
;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
$temp
=
$temp
* (
$u
-
$i
);
return
$temp
;
}
function
fact(
$n
)
{
$f
= 1;
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
$f
*=
$i
;
return
$f
;
}
$n
= 4;
$x
=
array
( 45, 50, 55, 60 );
$y
=
array_fill
(0,
$n
,
array_fill
(0,
$n
, 0));
$y
[0][0] = 0.7071;
$y
[1][0] = 0.7660;
$y
[2][0] = 0.8192;
$y
[3][0] = 0.8660;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
for
(
$j
= 0;
$j
<
$n
-
$i
;
$j
++)
$y
[
$j
][
$i
] =
$y
[
$j
+ 1][
$i
- 1] -
$y
[
$j
][
$i
- 1];
}
for
(
$i
= 0;
$i
<
$n
;
$i
++)
{
print
(
$x
[
$i
] .
"\t"
);
for
(
$j
= 0;
$j
<
$n
-
$i
;
$j
++)
print
(
$y
[
$i
][
$j
] .
"\t"
);
print
(
"\n"
);
}
$value
= 52;
$sum
=
$y
[0][0];
$u
= (
$value
-
$x
[0]) / (
$x
[1] -
$x
[0]);
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
$sum
=
$sum
+ (u_cal(
$u
,
$i
) *
$y
[0][
$i
]) /
fact(
$i
);
}
print
(
"\nValue at "
.
$value
.
" is "
.
round
(
$sum
, 6));
Javascript
<script>
function
u_cal(u , n)
{
var
temp = u;
for
(
var
i = 1; i < n; i++)
temp = temp * (u - i);
return
temp;
}
function
fact(n)
{
var
f = 1;
for
(
var
i = 2; i <= n; i++)
f *= i;
return
f;
}
var
n = 4;
var
x = [ 45, 50, 55, 60 ];
var
y=Array(n).fill(0.0).map(x => Array(n).fill(0.0));
y[0][0] = 0.7071;
y[1][0] = 0.7660;
y[2][0] = 0.8192;
y[3][0] = 0.8660;
for
(
var
i = 1; i < n; i++) {
for
(
var
j = 0; j < n - i; j++)
y[j][i] = y[j + 1][i - 1] - y[j][i - 1];
}
for
(
var
i = 0; i < n; i++) {
document.write(x[i].toFixed(6)+
" "
);
for
(
var
j = 0; j < n - i; j++)
document.write(y[i][j].toFixed(6)+
" "
);
document.write(
'<br>'
);
}
var
value = 52;
var
sum = y[0][0];
var
u = (value - x[0]) / (x[1] - x[0]);
for
(
var
i = 1; i < n; i++) {
sum = sum + (u_cal(u, i) * y[0][i]) /
fact(i);
}
document.write(
"\n Value at "
+value.toFixed(6)+
" is "
+sum.toFixed(6));
</script>
Output:
45 0.7071 0.0589 -0.00569999 -0.000699997 50 0.766 0.0532 -0.00639999 55 0.8192 0.0468 60 0.866 Value at 52 is 0.788003
Backward Differences: The differences y1 – y0, y2 – y1, ……, yn – yn–1 when denoted by dy1, dy2, ……, dyn, respectively, are called first backward difference. Thus, the first backward differences are :
NEWTON'S GREGORY BACKWARD INTERPOLATION FORMULA :
This formula is useful when the value of f(x) is required near the end of the table. h is called the interval of difference and u = ( x – an ) / h, Here an is last term.
Example :
Input : Population in 1925
Output :
Value in 1925 is 96.8368
Below is the implementation of the Newton backward interpolation method.
C++
#include <bits/stdc++.h>
using
namespace
std;
float
u_cal(
float
u,
int
n)
{
float
temp = u;
for
(
int
i = 1; i < n; i++)
temp = temp * (u + i);
return
temp;
}
int
fact(
int
n)
{
int
f = 1;
for
(
int
i = 2; i <= n; i++)
f *= i;
return
f;
}
int
main()
{
int
n = 5;
float
x[] = { 1891, 1901, 1911,
1921, 1931 };
float
y[n][n];
y[0][0] = 46;
y[1][0] = 66;
y[2][0] = 81;
y[3][0] = 93;
y[4][0] = 101;
for
(
int
i = 1; i < n; i++) {
for
(
int
j = n - 1; j >= i; j--)
y[j][i] = y[j][i - 1] - y[j - 1][i - 1];
}
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j <= i; j++)
cout << setw(4) << y[i][j]
<<
"\t"
;
cout << endl;
}
float
value = 1925;
float
sum = y[n - 1][0];
float
u = (value - x[n - 1]) / (x[1] - x[0]);
for
(
int
i = 1; i < n; i++) {
sum = sum + (u_cal(u, i) * y[n - 1][i]) /
fact(i);
}
cout <<
"\n Value at "
<< value <<
" is "
<< sum << endl;
return
0;
}
Java
class
GFG
{
static
double
u_cal(
double
u,
int
n)
{
double
temp = u;
for
(
int
i =
1
; i < n; i++)
temp = temp * (u + i);
return
temp;
}
static
int
fact(
int
n)
{
int
f =
1
;
for
(
int
i =
2
; i <= n; i++)
f *= i;
return
f;
}
public
static
void
main(String[] args)
{
int
n =
5
;
double
x[] = {
1891
,
1901
,
1911
,
1921
,
1931
};
double
[][] y =
new
double
[n][n];
y[
0
][
0
] =
46
;
y[
1
][
0
] =
66
;
y[
2
][
0
] =
81
;
y[
3
][
0
] =
93
;
y[
4
][
0
] =
101
;
for
(
int
i =
1
; i < n; i++)
{
for
(
int
j = n -
1
; j >= i; j--)
y[j][i] = y[j][i -
1
] - y[j -
1
][i -
1
];
}
for
(
int
i =
0
; i < n; i++)
{
for
(
int
j =
0
; j <= i; j++)
System.out.print(y[i][j] +
"\t"
);
System.out.println(
""
);;
}
double
value =
1925
;
double
sum = y[n -
1
][
0
];
double
u = (value - x[n -
1
]) / (x[
1
] - x[
0
]);
for
(
int
i =
1
; i < n; i++)
{
sum = sum + (u_cal(u, i) * y[n -
1
][i]) /
fact(i);
}
System.out.println(
"\n Value at "
+ value +
" is "
+ String.format(
"%.6g%n"
,sum));
}
}
Python3
def
u_cal(u, n):
temp
=
u
for
i
in
range
(n):
temp
=
temp
*
(u
+
i)
return
temp
def
fact(n):
f
=
1
for
i
in
range
(
2
, n
+
1
):
f
*
=
i
return
f
n
=
5
x
=
[
1891
,
1901
,
1911
,
1921
,
1931
]
y
=
[[
0.0
for
_
in
range
(n)]
for
__
in
range
(n)]
y[
0
][
0
]
=
46
y[
1
][
0
]
=
66
y[
2
][
0
]
=
81
y[
3
][
0
]
=
93
y[
4
][
0
]
=
101
for
i
in
range
(
1
, n):
for
j
in
range
(n
-
1
, i
-
1
,
-
1
):
y[j][i]
=
y[j][i
-
1
]
-
y[j
-
1
][i
-
1
]
for
i
in
range
(n):
for
j
in
range
(i
+
1
):
print
(y[i][j], end
=
"\t"
)
print
()
value
=
1925
sum
=
y[n
-
1
][
0
]
u
=
(value
-
x[n
-
1
])
/
(x[
1
]
-
x[
0
])
for
i
in
range
(
1
, n):
sum
=
sum
+
(u_cal(u, i)
*
y[n
-
1
][i])
/
fact(i)
print
(
"\n Value at"
, value,
"is"
,
sum
)
C#
using
System;
class
GFG
{
static
double
u_cal(
double
u,
int
n)
{
double
temp = u;
for
(
int
i = 1; i < n; i++)
temp = temp * (u + i);
return
temp;
}
static
int
fact(
int
n)
{
int
f = 1;
for
(
int
i = 2; i <= n; i++)
f *= i;
return
f;
}
static
void
Main()
{
int
n = 5;
double
[] x = { 1891, 1901, 1911,
1921, 1931 };
double
[,] y =
new
double
[n,n];
y[0,0] = 46;
y[1,0] = 66;
y[2,0] = 81;
y[3,0] = 93;
y[4,0] = 101;
for
(
int
i = 1; i < n; i++)
{
for
(
int
j = n - 1; j >= i; j--)
y[j,i] = y[j,i - 1] - y[j - 1,i - 1];
}
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = 0; j <= i; j++)
Console.Write(y[i,j]+
"\t"
);
Console.WriteLine(
""
);;
}
double
value = 1925;
double
sum = y[n - 1,0];
double
u = (value - x[n - 1]) / (x[1] - x[0]);
for
(
int
i = 1; i < n; i++)
{
sum = sum + (u_cal(u, i) * y[n - 1,i]) /
fact(i);
}
Console.WriteLine(
"\n Value at "
+value+
" is "
+Math.Round(sum,4));
}
}
PHP
<?php
function
u_cal(
$u
,
$n
)
{
$temp
=
$u
;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
$temp
=
$temp
* (
$u
+
$i
);
return
$temp
;
}
function
fact(
$n
)
{
$f
= 1;
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
$f
*=
$i
;
return
$f
;
}
$n
= 5;
$x
=
array
(1891, 1901, 1911,
1921, 1931);
$y
=
array_fill
(0,
$n
,
array_fill
(0,
$n
, 0));
$y
[0][0] = 46;
$y
[1][0] = 66;
$y
[2][0] = 81;
$y
[3][0] = 93;
$y
[4][0] = 101;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
for
(
$j
=
$n
- 1;
$j
>=
$i
;
$j
--)
$y
[
$j
][
$i
] =
$y
[
$j
][
$i
- 1] -
$y
[
$j
- 1][
$i
- 1];
}
for
(
$i
= 0;
$i
<
$n
;
$i
++)
{
for
(
$j
= 0;
$j
<=
$i
;
$j
++)
print
(
$y
[
$i
][
$j
] .
"\t"
);
print
(
"\n"
);
}
$value
= 1925;
$sum
=
$y
[
$n
- 1][0];
$u
= (
$value
-
$x
[
$n
- 1]) / (
$x
[1] -
$x
[0]);
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
$sum
=
$sum
+ (u_cal(
$u
,
$i
) *
$y
[
$n
- 1][
$i
]) / fact(
$i
);
}
print
(
"\n Value at "
.
$value
.
" is "
.
round
(
$sum
, 4));
?>
Javascript
<script>
function
u_cal(u , n)
{
var
temp = u;
for
(
var
i = 1; i < n; i++)
temp = temp * (u + i);
return
temp;
}
function
fact(n)
{
var
f = 1;
for
(
var
i = 2; i <= n; i++)
f *= i;
return
f;
}
var
n = 5;
var
x = [ 1891, 1901, 1911,
1921, 1931 ];
var
y = Array(n).fill(0.0).map(x => Array(n).fill(0.0));
y[0][0] = 46;
y[1][0] = 66;
y[2][0] = 81;
y[3][0] = 93;
y[4][0] = 101;
for
(
var
i = 1; i < n; i++)
{
for
(
var
j = n - 1; j >= i; j--)
y[j][i] = y[j][i - 1] - y[j - 1][i - 1];
}
for
(
var
i = 0; i < n; i++)
{
for
(
var
j = 0; j <= i; j++)
document.write(y[i][j] +
"\t"
);
document.write(
'<br>'
);;
}
var
value = 1925;
var
sum = y[n - 1][0];
var
u = (value - x[n - 1]) / (x[1] - x[0]);
for
(
var
i = 1; i < n; i++)
{
sum = sum + (u_cal(u, i) * y[n - 1][i]) /
fact(i);
}
document.write(
"\n Value at "
+ value +
" is "
+sum);
</script>
Output:
46 66 20 81 15 -5 93 12 -3 2 101 8 -4 -1 -3 Value at 1925 is 96.8368
Time Complexity : O(N*N) ,N is the number of rows.
Space Complexity : O(N*N) ,for storing elements in difference table.
This article is contributed by Shubham Rana. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Source: https://www.geeksforgeeks.org/newton-forward-backward-interpolation/
0 Response to "Forward Difference Error Function Only Continuous"
Post a Comment