You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void firstderiv1D(int n, double a, double b, double *fx);
void firstderiv1D_vec(int n, double dx, double *f, double *fx);
double fun(double x);
double funprime( double x);
int main(int argc, char **argv){
double a,b,dx,*f,*fx;
int n;
if(argc != 2){
n = 20;
}else{
n = atoi(argv[1]);
}
a = 0.0;
b = 1.0;
f = (double *) malloc(sizeof(double)*n);
fx = (double *) malloc(sizeof(double)*n);
// firstderiv1D(n, a, b, fx);
dx = (b-a)/((double) n);
for( int i = 0; i <= n; i++){
f[i] = fun(a+((double) i)*dx);
}
firstderiv1D_vec(n, dx, f, fx);
for(int i = 0; i < n; i++){
printf("fx[%d] = %1.2f f'[%d] = %1.2f |fx - f'| = %1.1e\n",
i,fx[i],i,funprime(a+((b-a)*i)/n),abs(fx[i]-
funprime(a+((b-a)*((double) i))/((double) (n-1)))));
}
return 1;
}
void firstderiv1D(int n, double a, double b, double *fx){
double dx = (b-a)/((double) n-1);
double scale = 1.0/(2.0*dx);
for (int i = 1; i < n-1; i++){
fx[i] = (fun(a + (i+1)*dx) - fun(a + (i-1)*dx))*scale;
}
fx[0] = (-3.0*fun(a) + 4.0*fun(a + dx) - fun(a + 2.0*dx))*scale;
fx[n-1] = (3.0*fun(a+ (n-1)*dx) - 4.0*fun(a + (n-2)*dx) + fun(a + (n-3)*dx))*scale;
return;
}
void firstderiv1D_vec(int n, double dx, double *f, double *fx){
double scale;
scale = 1.0/(2.0*dx);
for (int i = 1; i < n-1; i++){
fx[i] = (f[i+1] - f[i-1])*scale;
}
fx[0] = (-3.0*f[0] + 4.0*f[1] - f[2])*scale;
fx[n-1] = (3.0*f[n-1] - 4.0*f[n-2] + f[n-3])*scale;
return;
}
double fun(double x){
return(x*x + 1);
}
double funprime( double x){
return(2*x);
}