#include #include #include typedef double (*func_t) (double); typedef struct values_s{ double *arg; double *funcval; long size; } values_t; typedef enum boolean_e{ FALSE = 0, TRUE = 1 } boolean_t; double func1 (double x) { return 2*sin(x)-0.5; } double func2 (double x) { return 2*cos(x); } values_t *values_allocate(long size) { values_t *val=calloc(1,sizeof(values_t)); if(!val) { fprintf(stderr,"Allocate Error!"); return 0; } val->arg=calloc(size,sizeof(double)); val->funcval=calloc(size,sizeof(double)); if(!val->arg ||!val->funcval) { fprintf(stderr,"Allocate Error!"); free(val); return 0; } val->size = size; return val; } boolean_t values_insert(values_t *val,double arg,double value,long index) { boolean_t status=FALSE; if(!val) { fprintf(stderr,"Nullpointer!"); return status; } if(index<0 || index >= val->size) { fprintf(stderr,"Index out of range!"); return status; } val->arg[index] = arg; val->funcval[index] = value; return status=TRUE; } boolean_t values_free(values_t *val) { boolean_t status=FALSE; if(!val) { fprintf(stderr,"Nullpointer!"); return status; } free(val->arg); free(val->funcval); free(val); return status=TRUE; } boolean_t values_print(values_t *val) { boolean_t status=FALSE; long i; if(!val) { fprintf(stderr, "Nullpointer.\n"); return status; } for(i=0;isize;i++) printf("%ld. %5g, %5g\n", i, val->arg[i], val->funcval[i]); return status=TRUE; } double newton_step(double x0, func_t func, func_t derivate) { if(derivate(x0)==0) { fprintf(stderr, "Error: Division by Zero.\n"); return 0; } return x0-func(x0)/derivate(x0); } void values_store(values_t *val) { FILE *fp=fopen("C:\\users\\Patrick\\Dropbox\\3tes_Semester\\prog2\\Übung4\\newton.txt","w"); long i; if(fp) { for(i=0;isize;i++) { fprintf(fp,"%lf\t%lf\n",val->arg[i],val->funcval[i]); } } else fprintf(stderr,"Fehler!"); fclose(fp); } void values_plot() { FILE *gnuplot = popen("C:\\Users\\Patrick\\Dropbox\\3tes_Semester\\prog2\\Übung4\\newton.txt -persist","w"); if (gnuplot) { fprintf(gnuplot, "set title 'P2-UE4: Newton'\n"); fprintf(gnuplot, "set style data lines\n"); fprintf(gnuplot, "cd 'C:\\Programme\\gnuplot\\bin'\n"); fprintf(gnuplot, "f(x)=2*sin(x)-0.5\n"); fprintf(gnuplot, "plot [2.8:3.1] \"p2ue4_newton.txt\" using 1:2 with steps, f(x)\n"); } pclose(gnuplot); } void newton_iter(double x0, long steps, double precision, func_t func, func_t derivate) { long i=0; double xn=0; values_t *val=values_allocate(steps); values_insert(val,x0,func(x0),0); for(i=0;ifuncval[i])>precision);i++) { xn=newton_step(val->arg[i],func,derivate); values_insert(val,xn,func(xn),i+1); } values_print(val); values_store(val); values_plot(); values_free(val); } int main() { newton_iter(3,10,0.0001,func1,func2); return 0; }