Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <math.h>
  4. #include <stdlib.h> //für Absolutbetrag für long: labs(long k)
  5.  
  6. #include <string>
  7. #include <fstream>
  8.  
  9. using namespace std;
  10.  
  11. //Deklarationen
  12. double ffun(double x);
  13. double gfun(double x, double* a);
  14. double avabsError(double f[1001][2], double g[1001][2]);
  15. double* aufgabe3(double f[1001][2]);
  16. void funToData(double f[1001][2], double g[1001][2], int i);
  17.  
  18. int main()
  19. {
  20.     //Zufallsgenerator
  21.     //std::random_device rand;
  22.     //std::mt19937 gen(rand());
  23.     std::default_random_engine gen;
  24.     std::uniform_real_distribution<double> distr10(-10, 10);
  25.     std::uniform_real_distribution<double> distr3(-3, 3);
  26.     std::uniform_real_distribution<double> distr01(-0.1, 0.1);
  27.  
  28.     double arr_f[1001][2];
  29.     double arr_g[1001][2];
  30.     //Aufgabe2
  31.     double a[7]= {-0.5, 0.25, -0.125, 0.0625, -0.03125, 0.015625, -0.0078125};
  32.  
  33.     for (int i = 0; i < 1001; ++i)
  34.     {
  35.         double x=distr10(gen);
  36.         arr_f[i][0]=x;
  37.         arr_f[i][1]=ffun(x);
  38.         arr_g[i][0]=x;
  39.         arr_g[i][1]=gfun(x, a);
  40.     }
  41.     cerr << "Aufgabe2:" << endl;
  42.     cerr << "Durchschnittlicher absoluter Fehler: " << avabsError(arr_f,arr_g) <<endl;
  43.     funToData(arr_f, arr_g, 2);
  44.     cerr << "Zum Plotten bitte die Dateien funFA2.txt und funGA2.txt benutzen" << endl <<endl;
  45.  
  46.     //Aufgabe3
  47.     double var_a[7];
  48.     double a_best[7];
  49.     double err=INFINITY;
  50.  
  51.     for(int j=0; j<1000; ++j)
  52.     {
  53.         for (int i = 0; i < 7; ++i)
  54.             var_a[i]=distr3(gen); //zufällige Kombination der a_i
  55.         //Berechnung des Fehlerwertes
  56.         for (int i = 0; i < 1001; ++i)
  57.         {
  58.             arr_g[i][0]=arr_f[i][0];            //auch wenn es die Aufgabenstellung nicht präzisiert: ist irwie schöner die alten x Werte festzulassen
  59.             arr_g[i][1]=gfun(arr_f[i][0], var_a);
  60.         }
  61.  
  62.         double fg_err=avabsError(arr_f,arr_g);
  63.         if(fg_err<err)
  64.         {
  65.             err=fg_err;
  66.             for(int i=0; i<7; ++i)
  67.             {
  68.                 a_best[i]=var_a[i];
  69.                 funToData(arr_f, arr_g, 3); //schon hier erstellen, damit das beste g nicht zwischengespeichert werden muss
  70.             }
  71.         }
  72.     }
  73.     cerr << "Aufgabe3:" << endl;
  74.     cerr << "Minimaler durchschnittlicher absoluter Fehler: " << err << endl;
  75.     cerr << "Bei Koeffizienten:" << endl;
  76.     for(int i=0; i<7; ++i)
  77.     {
  78.         cerr << "a_" << i << "= " << a_best[i] << endl;
  79.     }
  80.     cerr << "Zum Plotten bitte die Dateien funFA3.txt und funGA3.txt benutzen" << endl;
  81.  
  82.     //Aufgabe4
  83.     err=INFINITY;
  84.     for(int i=0; i<7; ++i)
  85.     {
  86.         a_best[i]=var_a[i];
  87.         funToData(arr_f, arr_g, 4); //schon hier erstellen, damit das beste g nicht zwischengespeichert werden muss
  88.     }
  89.  
  90.     for(int j=0; j<100; ++j)
  91.     {
  92.         for (int i = 0; i < 7; ++i)
  93.             var_a[i]=distr3(gen); //zufällige Kombination der a_i
  94.         //Inkrement addieren
  95.         for(int k=0; k<1000; ++k)
  96.         {
  97.             double inkm=distr01(gen);
  98.             for(int i=0; i<7; i++)
  99.             {
  100.                 var_a[i]+=inkm;
  101.             }
  102.             //g neu berechnen
  103.             for (int i = 0; i < 1001; ++i)
  104.             {
  105.                 arr_g[i][0]=arr_f[i][0];
  106.                 arr_g[i][1]=gfun(arr_f[i][0], var_a);
  107.             }
  108.             //falls besserer Fehler...
  109.             double fg_err=avabsError(arr_f,arr_g);
  110.             if(fg_err<err)
  111.             {
  112.                 err=fg_err;
  113.                 //...dann als beste Kombination speichern
  114.                 for(int i=0; i<7; ++i)
  115.                 {
  116.                     a_best[i]=var_a[i];
  117.                     funToData(arr_f, arr_g, 4); //schon hier erstellen, damit das beste g nicht zwischengespeichert werden muss
  118.                 }
  119.             }
  120.         }
  121.     }
  122.     cerr << "Aufgabe4:" << endl;
  123.     cerr << "Minimaler durchschnittlicher absoluter Fehler: " << err << endl;
  124.     cerr << "Bei Koeffizienten:" << endl;
  125.     for(int i=0; i<7; ++i)
  126.     {
  127.         cerr << "a_" << i << "= " << a_best[i] << endl;
  128.     }
  129.     cerr << "Zum Plotten bitte die Dateien funFA4.txt und funGA4.txt benutzen" << endl;
  130. }
  131.  
  132. double ffun(double x)
  133. {
  134.     return (-4*cos(x/3)+sin(15/(labs(0.5*x+2)+1)+0.2*x));
  135. }
  136.  
  137. double gfun(double x, double* a)
  138. {
  139.     long long sum=0;
  140.     for(int i=0; i<7; i++)
  141.     {
  142.         sum+=a[i]*pow(x,i);
  143.     }
  144.     return sum;
  145. }
  146.  
  147. double avabsError(double f[1001][2], double g[1001][2])
  148. {
  149.     long long sum=0;
  150.     for(int i=0; i<1001; i++)
  151.     {
  152.         sum+=labs(f[i][1]-g[i][1]);
  153.     }
  154.     return sum/1001;
  155. }
  156.  
  157. void funToData(double f[1001][2], double g[1001][2], int aufgabe)
  158. {
  159.     std::ofstream fschreiben;
  160.     std::ofstream gschreiben;
  161.  
  162.     if(aufgabe==2)
  163.     {
  164.         fschreiben.open("funFA2.txt");
  165.         gschreiben.open("funGA2.txt");
  166.     }
  167.     else if (aufgabe==3)
  168.     {
  169.         fschreiben.open("funFA3.txt");
  170.         fschreiben.open("funGA3.txt");
  171.     }
  172.     else if (aufgabe==4)
  173.     {
  174.         fschreiben.open("funFA4.txt");
  175.         fschreiben.open("funGA4.txt");
  176.     }
  177.     for(int i=0; i<1001; i++)
  178.     {
  179.         fschreiben << f[i][0] << " " <<  f[i][1] << endl;
  180.         gschreiben << g[i][0] << " " << g[i][1] << endl;
  181.     }
  182.     fschreiben.close();
  183.     gschreiben.close();
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement