mirror of https://github.com/Askill/AP-SCE.git
- added basic optimization
This commit is contained in:
parent
35562c0698
commit
00cbbe80f2
|
|
@ -11,7 +11,7 @@ DIFF::~DIFF()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vector<long double> DIFF::diff()
|
vector<long double> DIFF::diff(vector<long double> yvalues)
|
||||||
{
|
{
|
||||||
vector<long double> diff = yvalues;
|
vector<long double> diff = yvalues;
|
||||||
vector<long double> xdiff (diff.size()-1);
|
vector<long double> xdiff (diff.size()-1);
|
||||||
|
|
@ -23,7 +23,7 @@ vector<long double> DIFF::diff()
|
||||||
return xdiff;
|
return xdiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<long double> DIFF::backward_diff(vector<long double> y)
|
vector<long double> DIFF::backward_diff(vector<long double> y, vector<long double> xvalues)
|
||||||
{
|
{
|
||||||
vector<long double> temp;
|
vector<long double> temp;
|
||||||
temp.resize(y.size());
|
temp.resize(y.size());
|
||||||
|
|
@ -35,7 +35,7 @@ vector<long double> DIFF::backward_diff(vector<long double> y)
|
||||||
temp.at(y.size()-1) = 0;
|
temp.at(y.size()-1) = 0;
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
vector<long double> DIFF::forward_diff(vector<long double> y)
|
vector<long double> DIFF::forward_diff(vector<long double> y, vector<long double> xvalues)
|
||||||
{
|
{
|
||||||
vector<long double> temp;
|
vector<long double> temp;
|
||||||
temp.resize(y.size());
|
temp.resize(y.size());
|
||||||
|
|
@ -72,10 +72,12 @@ vector<long double> DIFF::mid_diff(vector<long double>y, vector<long double>x)
|
||||||
temp.at(i) = (y.at(i + 1) - y.at(i)) / (x.at(i + 1) - x.at(i));
|
temp.at(i) = (y.at(i + 1) - y.at(i)) / (x.at(i + 1) - x.at(i));
|
||||||
temp.at(i) += (y.at(i + 1) - y.at(i - 1)) / (x.at(i + 1) - x.at(i - 1));
|
temp.at(i) += (y.at(i + 1) - y.at(i - 1)) / (x.at(i + 1) - x.at(i - 1));
|
||||||
temp.at(i) /= 2;
|
temp.at(i) /= 2;
|
||||||
|
|
||||||
for (; i < y.size() - 2; ++i)
|
for (; i < y.size() - 2; ++i)
|
||||||
{
|
{
|
||||||
temp.at(i) = (y.at(i + 1) - y.at(i - 1)) / (x.at(i + 1) - x.at(i - 1));
|
temp.at(i) = (y.at(i + 1) - y.at(i - 1)) / (x.at(i + 1) - x.at(i - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
temp.at(i) += (y.at(i) - y.at(i - 1)) / (x.at(i) - x.at(i - 1));
|
temp.at(i) += (y.at(i) - y.at(i - 1)) / (x.at(i) - x.at(i - 1));
|
||||||
temp.at(i) /= 2;
|
temp.at(i) /= 2;
|
||||||
i++;
|
i++;
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,9 @@ using namespace std;
|
||||||
class DIFF
|
class DIFF
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
vector<long double> xvalues = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250};
|
vector<long double> diff(vector<long double>);
|
||||||
vector<long double> yvalues = {0, 2926, 10170, 21486, 33835, 45251, 55634, 65038, 73461, 80905, 87368, 92852, 97355, 100878, 103422, 104986, 106193, 110246, 119626, 136106, 162095, 199506, 238775, 277065, 314375, 350704};
|
vector<long double> forward_diff(vector<long double>, vector<long double>);
|
||||||
vector<long double> diff();
|
vector<long double> backward_diff(vector<long double>, vector<long double>);
|
||||||
|
|
||||||
|
|
||||||
vector<long double> forward_diff(vector<long double>);
|
|
||||||
vector<long double> backward_diff(vector<long double>);
|
|
||||||
static vector<long double> central_diff(vector<long double>, vector<long double>);
|
static vector<long double> central_diff(vector<long double>, vector<long double>);
|
||||||
static vector<long double> mid_diff(vector<long double>, vector<long double>);
|
static vector<long double> mid_diff(vector<long double>, vector<long double>);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,13 @@
|
||||||
#include "lgs.h"
|
#include "lgs.h"
|
||||||
#include "nlgs.h"
|
#include "nlgs.h"
|
||||||
#include "DIFF.h"
|
#include "DIFF.h"
|
||||||
|
#include "OPTIMIZATION.h"
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
void cylinder();
|
void cylinder();
|
||||||
void lgs();
|
void lgs();
|
||||||
void nlgs();
|
void nlgs();
|
||||||
|
void optimization();
|
||||||
void diff();
|
void diff();
|
||||||
void print_array(long double* a, int size)
|
void print_array(long double* a, int size)
|
||||||
{
|
{
|
||||||
|
|
@ -37,6 +39,7 @@ int main()
|
||||||
cout << "1 Berechungen an einem Zylinder" << endl;
|
cout << "1 Berechungen an einem Zylinder" << endl;
|
||||||
cout << "2 LGS loesen" << endl;
|
cout << "2 LGS loesen" << endl;
|
||||||
cout << "3 n.LGS loesen" << endl;
|
cout << "3 n.LGS loesen" << endl;
|
||||||
|
cout << "4 optimization" << endl;
|
||||||
cout << "5 numerische differentation" << endl;
|
cout << "5 numerische differentation" << endl;
|
||||||
|
|
||||||
cout << "e Beenden" << endl;
|
cout << "e Beenden" << endl;
|
||||||
|
|
@ -47,6 +50,7 @@ int main()
|
||||||
case '1': cylinder(); break;
|
case '1': cylinder(); break;
|
||||||
case '2': lgs(); break;
|
case '2': lgs(); break;
|
||||||
case '3': nlgs(); break;
|
case '3': nlgs(); break;
|
||||||
|
case '4': optimization(); break;
|
||||||
case '5': diff(); break;
|
case '5': diff(); break;
|
||||||
|
|
||||||
default: cout << "Okay, bye" << endl; break;
|
default: cout << "Okay, bye" << endl; break;
|
||||||
|
|
@ -77,23 +81,75 @@ void nlgs()
|
||||||
NLGS nlgs;
|
NLGS nlgs;
|
||||||
cout << endl << "Bisektion: " << nlgs.bisektion(1,4,100) << endl;
|
cout << endl << "Bisektion: " << nlgs.bisektion(1,4,100) << endl;
|
||||||
cout << "Fixpunkt: " << nlgs.fixedpoint(1,100) << endl;
|
cout << "Fixpunkt: " << nlgs.fixedpoint(1,100) << endl;
|
||||||
cout << "Newton: " <<nlgs.newton(1,100) << endl;
|
cout << "Newton: " << nlgs.newton(1,100) << endl;
|
||||||
cout << "skantenverfahren fehlt" << endl << endl;
|
cout << "skantenverfahren fehlt" << endl << endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void optimization()
|
||||||
|
{
|
||||||
|
OPTIMIZATION opt;
|
||||||
|
|
||||||
|
long double lower_bound = -2, upper_bound = 2; //upper / lower - _bounds instead of theta-vector
|
||||||
|
long double increments = 0.1;
|
||||||
|
|
||||||
|
long double z = opt.g_von_theta(lower_bound, upper_bound);
|
||||||
|
long double which_theta = 1;
|
||||||
|
|
||||||
|
vector<long double> thetanew(2);
|
||||||
|
cout << "i" << "\t" << "z" << "\t" << "lb" << "\t" << "ub" << endl;
|
||||||
|
|
||||||
|
for(int i = 0; i < 41; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
cout << i << "\t" << z << "\t" << lower_bound << "\t" << upper_bound << endl;
|
||||||
|
if (which_theta == 1)
|
||||||
|
{
|
||||||
|
thetanew.at(0) = lower_bound + increments;
|
||||||
|
thetanew.at(1) = upper_bound;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thetanew.at(0) = lower_bound;
|
||||||
|
thetanew.at(1) = upper_bound - increments;
|
||||||
|
}
|
||||||
|
|
||||||
|
long double znew = opt.g_von_theta(thetanew.at(0), thetanew.at(1));
|
||||||
|
|
||||||
|
if(znew > z)
|
||||||
|
{
|
||||||
|
z = znew;
|
||||||
|
lower_bound = thetanew.at(0);
|
||||||
|
upper_bound = thetanew.at(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (which_theta == 1)
|
||||||
|
which_theta = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void diff() {
|
void diff() {
|
||||||
//Plotter: https://www.desmos.com/calculator
|
//Plotter: https://www.desmos.com/calculator
|
||||||
|
|
||||||
DIFF diff;
|
DIFF diff;
|
||||||
|
vector<long double> xvalues = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250 };
|
||||||
|
vector<long double> yvalues = { 0, 2926, 10170, 21486, 33835, 45251, 55634, 65038, 73461, 80905, 87368, 92852, 97355, 100878, 103422, 104986, 106193, 110246, 119626, 136106, 162095, 199506, 238775, 277065, 314375, 350704 };
|
||||||
vector<long double> AbfullX = {0, 5, 10, 15, 20 };
|
vector<long double> AbfullX = {0, 5, 10, 15, 20 };
|
||||||
vector<long double> AbfullY = {1, 0.8811, 0.7366, 0.5430, 0.1698};
|
vector<long double> AbfullY = {1, 0.8811, 0.7366, 0.5430, 0.1698};
|
||||||
|
|
||||||
cout << "Erste Ableitung mit forward und backward" << endl;
|
cout << "Erste Ableitung mit forward und backward" << endl;
|
||||||
print_array(diff.xvalues.data(), diff.forward_diff(diff.yvalues).data(), diff.xvalues.size());
|
print_array(xvalues.data(), diff.forward_diff(yvalues, xvalues).data(), xvalues.size());
|
||||||
print_array(diff.xvalues.data(), diff.central_diff(diff.yvalues, diff.xvalues).data(), diff.xvalues.size());
|
print_array(xvalues.data(), diff.central_diff(yvalues, xvalues).data(), xvalues.size());
|
||||||
|
|
||||||
cout << "Zweite Ableitung mit backward" << endl;
|
cout << "Zweite Ableitung mit backward" << endl;
|
||||||
print_array(diff.xvalues.data(), diff.backward_diff(diff.forward_diff(diff.yvalues)).data(), diff.xvalues.size());
|
print_array(xvalues.data(), diff.backward_diff(diff.forward_diff(yvalues, xvalues), xvalues).data(), xvalues.size());
|
||||||
|
|
||||||
cout << "Erste Ableitung 6.1.2" << endl;
|
cout << "Erste Ableitung 6.1.2" << endl;
|
||||||
print_array(diff.xvalues.data(), diff.mid_diff(AbfullY, AbfullX).data(), AbfullX.size());
|
print_array(xvalues.data(), diff.mid_diff(AbfullY, AbfullX).data(), AbfullX.size());
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue