This repository was archived by the owner on Jul 11, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterpolation.c
60 lines (49 loc) · 1.84 KB
/
interpolation.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdlib.h>
#include "interpolation.h"
static inline void calculation(double x[], double fx[], size_t number_x, double parameter[]);
static inline void substitution(double x[], size_t number_x, double parameter[], double z[], double fz[], size_t number_z);
void interpolation(double x[], double fx[], size_t number_x, double z[], double fz[], size_t number_z)
{
double *parameter;
parameter=(double*)malloc((size_t)number_x * sizeof(double));
calculation(x, fx, number_x, parameter);
substitution(x, number_x, parameter, z, fz, number_z);
free(parameter);
}
static inline void calculation(double x[], double fx[], size_t number_x, double parameter[])
{
double mullResult;
for(size_t actualX=0; actualX<number_x; actualX++)
{
mullResult=1;
for(size_t anotherX=0; anotherX<number_x; anotherX++)
{
if(actualX==anotherX)
continue;
else
mullResult=mullResult * (x[actualX]-x[anotherX]); // (x-x2)*(x-x3)*(x-x4)
}
parameter[actualX]=fx[actualX]/mullResult; // f(x)=A(x-x2)(x-x3)(x-x4) -> A=f(x)/(x-x2)(x-x3)(x-x4)
}
}
static inline void substitution(double x[], size_t number_x, double parameter[], double z[], double fz[], size_t number_z)
{
double equationResult, mull;
for(size_t k=0; k<number_z; k++)
{
equationResult=0;
for(size_t actualX=0; actualX<number_x; actualX++)
{
mull=parameter[actualX];
for(size_t anotherX=0; anotherX<number_x; anotherX++)
{
if(actualX==anotherX)
continue;
else
mull=mull * (z[k]-x[anotherX]); // A(x-x2)(x-x3)
}
equationResult=equationResult + mull; // A(x-x2)(x-x3)+B(x-x1)(x-x3)+...
}
fz[k]=equationResult;
}
}