A-M baby
This commit is contained in:
parent
764da6cbbb
commit
db842d013d
19005 changed files with 197040 additions and 7 deletions
39
Task/Forward-difference/C/forward-difference-1.c
Normal file
39
Task/Forward-difference/C/forward-difference-1.c
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
double* fwd_diff(double* x, unsigned int len, unsigned int order)
|
||||
{
|
||||
unsigned int i, j;
|
||||
double* y;
|
||||
|
||||
/* handle two special cases */
|
||||
if (order >= len) return 0;
|
||||
|
||||
y = malloc(sizeof(double) * len);
|
||||
if (!order) {
|
||||
memcpy(y, x, sizeof(double) * len);
|
||||
return y;
|
||||
}
|
||||
|
||||
/* first order diff goes from x->y, later ones go from y->y */
|
||||
for (j = 0; j < order; j++, x = y)
|
||||
for (i = 0, len--; i < len; i++)
|
||||
y[i] = x[i + 1] - x[i];
|
||||
|
||||
y = realloc(y, sizeof(double) * len);
|
||||
return y;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
double *y, x[] = {90, 47, 58, 29, 22, 32, 55, 5, 55, 73};
|
||||
int i, len = sizeof(x) / sizeof(x[0]);
|
||||
|
||||
y = fwd_diff(x, len, 1);
|
||||
for (i = 0; i < len - 1; i++)
|
||||
printf("%g ", y[i]);
|
||||
putchar('\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
33
Task/Forward-difference/C/forward-difference-2.c
Normal file
33
Task/Forward-difference/C/forward-difference-2.c
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int* binomCoeff(int n) {
|
||||
int *b = calloc(n+1,sizeof(int));
|
||||
int j;
|
||||
b[0] = n%2 ? -1 : 1;
|
||||
for (j=1 ; j<=n; j++)
|
||||
b[j] = -b[j-1]*(n+1-j)/j;
|
||||
|
||||
return(b);
|
||||
};
|
||||
|
||||
main () {
|
||||
double array[] = { 90, 47, 58, 29, 22, 32, 55, 5, 55, 73 };
|
||||
size_t lenArray = sizeof(array)/sizeof(array[0]);
|
||||
|
||||
int p = 4; // order
|
||||
int *b = binomCoeff(p); // pre-compute binomial coefficients for order p
|
||||
|
||||
int j, k;
|
||||
|
||||
// compute p-th difference
|
||||
for (k=0 ; k < lenArray; k++)
|
||||
for (array[k] *= b[0], j=1 ; j<=p; j++)
|
||||
array[k] += b[j] * array[k+j];
|
||||
|
||||
free(b);
|
||||
|
||||
// resulting series is shorter by p elements
|
||||
lenArray -= p;
|
||||
for (k=0 ; k < lenArray; k++) printf("%f ",array[k]);
|
||||
printf("\n");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue