Advertisement
Guest User

Newton Ahmed korriegert

a guest
Jan 20th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. typedef double (*func_t)(double);
  6. double func1(double x);
  7. double func2(double x);
  8.  
  9. double func1 (double x)
  10. {
  11.  
  12.     return 2*sin(x)-0.5;
  13.  
  14. }
  15.  
  16. double func2(double x)
  17.  
  18. {
  19.  
  20.     return 2*cos(x);
  21.  
  22. }
  23.  
  24. typedef struct value_s
  25.  
  26. {
  27.     double *arg;
  28.     double *funcval;
  29.     long size;
  30. } value_t;
  31.  
  32. typedef enum boolean_e
  33. {
  34.     FALSE=0,
  35.     TRUE=1
  36. } boolean_t;
  37.  
  38. value_t *values_allocate(long size)
  39.  
  40. {
  41.  
  42.        /* value_t *val=0;
  43.         if(!(val=malloc(sizeof(value_t))))
  44.            {
  45.                fprintf(stderr,"Fehler val allozieren.\n");
  46.                return 0;
  47.            }
  48.         if(!(val->arg=calloc(size,sizeof(double))))
  49.             {
  50.                 fprintf(stderr,"Fehler arg alloz.\n");
  51.                 free(val);
  52.                 return 0;
  53.             }
  54.             if(!(val->funcval=calloc(size,sizeof(double))))
  55.             {
  56.                 fprintf(stderr,"Fehler funcval allozi.\n");
  57.                 free(val);
  58.                 return 0;
  59.             }
  60.             val->size=size;
  61.             return val;
  62. */
  63.  
  64.    value_t *val=calloc(1,sizeof(value_t));
  65.  
  66.     if(!val)
  67.     {
  68.         fprintf(stderr,"Kein Speicher Alloziert\n");
  69.         return 0;
  70.     }
  71.  
  72.     val->arg=calloc(size,sizeof(double));
  73.     val->funcval=calloc(size,sizeof(double));
  74.  
  75.     if(!val->arg || !val->funcval)
  76.     {
  77.         fprintf(stderr,"Kein Speicher alloziert\n");
  78.         free(val);
  79.         return 0;
  80.     }
  81.     val->size=size;
  82. return val;
  83. }
  84.  
  85. boolean_t values_insert(value_t *val,double arg,double values,long index)
  86.  
  87. {
  88.     /*if(index>=0 && index<val->size)
  89.     {
  90.         val->arg[index]=arg;
  91.         val->arg[index]=values;
  92.         return 1;
  93.     }
  94.     return 0;*/
  95.    
  96.     if(!val)
  97.     {
  98.         fprintf(stderr,"Kein Speicher vorhanden\n");
  99.         return 0;
  100.     }
  101.  
  102.     if(index<0 || index>=val->size)
  103.     {
  104.         fprintf(stderr,"Falscher Index\n");
  105.     }
  106.  
  107.     val->arg[index]=arg;
  108.     val->funcval[index]=values;
  109.  
  110.     return 1;
  111. }
  112.  
  113. boolean_t values_free(value_t *val)
  114.  
  115. {
  116.     /*if(val!=NULL)
  117.     {
  118.         free(val->arg);
  119.         free(val->funcval);
  120.         free(val);
  121.         return 1;
  122.     }
  123.     else
  124.         return 0;*/
  125.        
  126.     if(!val)
  127.     {
  128.         fprintf(stderr,"Kein Speicher zum freigeben\n");
  129.         return 0;
  130.     }
  131.  
  132.     free(val->arg);
  133.     free(val->funcval);
  134.     free(val);
  135.  
  136.     return 1;
  137.  
  138. }
  139.  
  140. boolean_t values_print(value_t *val)
  141.  
  142. {
  143.  
  144.     long i=0;
  145.  
  146.     if(!val)
  147.     {
  148.         fprintf(stderr,"Nichts zum ausgeben");
  149.         return 0;
  150.     }
  151.  
  152.     printf("Index    Argument   Functionsvalue\n");
  153.  
  154.     for(i=0; i<val->size; i++)
  155.         {
  156.             printf("%ld:      %5g         %5g\n",i,val->arg[i],val->funcval[i]);
  157.         }
  158.  
  159.     return 1;
  160.  
  161. }
  162.  
  163. double newton_step(double x0,func_t func,func_t derivate)
  164.  
  165. {
  166.     if(derivate(x0) ==0)
  167.     {
  168.         fprintf(stderr,"Divison durch NULL\n");
  169.         return 0;
  170.     }
  171.    
  172.     return x0-func(x0)/derivate(x0);
  173.  
  174. }
  175.  
  176. void newton_iter(double x0,long steps,double precision,func_t func,func_t derivate)
  177.  
  178. {
  179.  
  180.     long i=0;
  181.  
  182.     double xn=0;
  183.  
  184.     value_t *val=values_allocate(steps);
  185.  
  186.     values_insert(val,x0,func(x0),0);
  187.  
  188.     for(i=0; i<steps && (fabs(val->funcval[i])>precision); i++)
  189.  
  190.     {
  191.  
  192.         xn=newton_step(val->arg[i],func,derivate);
  193.  
  194.         values_insert(val,xn,func(xn),i+1);
  195.  
  196.     }
  197.  
  198.     values_print(val);
  199.  
  200.     values_free(val);
  201.  
  202. }
  203.  
  204.  
  205.  
  206. int main()
  207.  
  208. {
  209.  
  210.     value_t *val=0;
  211.  
  212.     long size=0,c=0,index=0,steps=0;
  213.  
  214.     double arg=0,funcval=0,x0=0,precision=0;
  215.  
  216.     do
  217.  
  218.     {
  219.  
  220.         printf("1:Allocate\n");
  221.  
  222.         printf("2:Insert Value\n");
  223.  
  224.         printf("3:Free Memory\n");
  225.  
  226.         printf("4:Print\n");
  227.  
  228.         printf("4:Newton Step\n");
  229.  
  230.         printf("5:Newton Iteration\n");
  231.  
  232.         printf("0:Terminate\n");
  233.  
  234.         scanf("%ld",&c);
  235.  
  236.         switch(c)
  237.  
  238.         {
  239.  
  240.         case 1:
  241.  
  242.             printf("Size: ");
  243.  
  244.             scanf("%ld",&size);
  245.  
  246.             val=values_allocate(size);
  247.  
  248.             break;
  249.  
  250.         case 2:
  251.  
  252.             printf("Index: ");
  253.  
  254.             scanf("%ld",&index);
  255.  
  256.             printf("Argument: ");
  257.  
  258.             scanf("%lf",&arg);
  259.  
  260.             values_insert(val,arg,func1(arg),index);
  261.  
  262.             break;
  263.  
  264.         case 3:
  265.  
  266.             values_free(val);
  267.  
  268.             val=0;
  269.  
  270.             break;
  271.  
  272.         case 4:
  273.  
  274.             values_print(val);
  275.  
  276.             break;
  277.  
  278.         case 5:
  279.  
  280.             printf("x0: ");
  281.  
  282.             scanf("%lf",&x0);
  283.  
  284.             printf("x1= %lf",newton_step(x0,func1,func2));
  285.  
  286.             break;
  287.  
  288.         case 6:
  289.  
  290.             printf("Startwert:");
  291.  
  292.             scanf("%lf",&arg);
  293.  
  294.             printf("Steps: ");
  295.  
  296.             scanf("%ld",&steps);
  297.  
  298.             printf("Genauigkeit: ");
  299.  
  300.             scanf("%lf",&precision);
  301.  
  302.             newton_iter(arg,steps,precision,func1,func2);
  303.  
  304.             break;
  305.  
  306.  
  307.  
  308.         }
  309.  
  310.     }
  311.     while(c != 0);
  312.  
  313.  
  314.  
  315.  
  316.  
  317.     return 0;
  318.  
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement