#include #include #include typedef struct values_s { double *x; double *funcval ; double *derivate ; long size ; } values_t ; values_t * values_allocate (long size ) { values_t *elem; if(!(elem=calloc(1,sizeof(values_t)))) { fprintf(stderr,"Fehler bei Speicherallozierung!\n"); return 0; } elem->size=size; if(!(elem->x=calloc(size,sizeof(double)))) { fprintf(stderr,"Fehler bei Speicherallozierung!\n"); free(elem); return 0; } if(!(elem->funcval=calloc(size,sizeof(double)))) { fprintf(stderr,"Fehler bei Speicherallozierung!\n"); free(elem->x); free(elem); return 0; } if(!(elem->derivate=calloc(size,sizeof(double)))) { fprintf(stderr,"Fehler bei Speicherallozierung!\n"); free(elem->x); free(elem->funcval); free(elem); return 0; } return elem; } typedef enum boolean_e { FALSE = 0, TRUE = 1 } boolean_t ; boolean_t values_insert ( values_t *val , double x1 , double x2 , double x3 , long index ) { if(val==0||index<0||index>=val->size) return FALSE; val->x[index]=x1; val->funcval[index]=x2; val->derivate[index]=x3; return TRUE; } boolean_t values_free ( values_t *val) { if(val==0) return FALSE; free(val->derivate); val->derivate=0; free(val->funcval); val->funcval=0; free(val->x); val->x=0; free(val); return TRUE; } boolean_t values_print ( values_t *val) { if(val==0) return FALSE; long i; for(i=0;isize;i++) printf("%3ld: %10g | %10g %10g\n",i,val->x[i],val->funcval[i],val->derivate[i]); return TRUE; } double function1(double x) { return pow(x,4)+6*pow(x,2)-1; } double function2(double x) { return cos(x); } double function3(double x) { return exp(pow(x,2)); } double function4(double x) { return sqrt(pow(x,2)+3); } typedef double (*func_t)(double); boolean_t differentiate ( values_t *val , func_t func ) { if(val==0) return FALSE; long i; for(i=0;isize;i++) val->funcval[i]=func(val->x[i]); for(i=0;isize;i++) { if(!(val->x[i+1]-val->x[i-1])) { fprintf(stderr,"Division durch 0!\n"); return FALSE; } val->derivate[i]=(val->funcval[i+1]-val->funcval[i-1])/(val->x[i+1]-val->x[i-1]); } return TRUE; } boolean_t values_save ( values_t *val , char *file ) { if(val==0) return FALSE; FILE *f; if(!(f=fopen(file,"w"))) return FALSE; long i; for(i=0;isize;i++) fprintf(f,"%3ld: %10g | %10g %10g\n",i,val->x[i],val->funcval[i],val->derivate[i]); fclose(f); return TRUE; } double function5(double x) { return atan(x)*x; } int main() { printf("Nummerisches Differenzieren!\n"); values_t *elem=values_allocate(20); //double x=3; long i; double ug=0,og=5; double dx=(og-ug)/elem->size; for(i=0;isize;i++,ug+=dx) values_insert(elem,ug,0,0,i);//hier habe ich verändert differentiate(elem,function1); values_print(elem); if(values_save(elem,"test.txt")!=TRUE) fprintf(stderr,"Fehler beim Speichern!\n"); if(values_free(elem)!=TRUE) { fprintf(stderr,"Fehler bei Speicherfreigabe!\n"); exit(-1); } elem=0; return 0; }