- added numeric differentation

This commit is contained in:
Patrice Matz 2017-12-07 23:47:54 +01:00
parent f8033ef4ac
commit 723a8d3567
3 changed files with 45 additions and 28 deletions

View File

@ -24,27 +24,6 @@ vector<long double> DIFF::diff()
return xdiff;
}
vector<long double> DIFF::forward_diff()
{
for(unsigned int i=0; i < xvalues.size()-1; i++)
{
y1values.at(i) = (yvalues.at(i + 1) - yvalues.at(i)) / (xvalues.at(i + 1) - xvalues.at(i));
}
y1values.at(25) = 0;
return y1values;
}
vector<long double> DIFF::backward_diff()
{
for (unsigned int i = 1; i < xvalues.size(); i++)
{
y1values.at(i) = (yvalues.at(i) - yvalues.at(i-1)) / (xvalues.at(i) - xvalues.at(i-1));
}
y1values.at(0) = 0;
return y1values;
}
vector<long double> DIFF::backward_diff(vector<long double> y)
{
vector<long double> temp;
@ -54,7 +33,7 @@ vector<long double> DIFF::backward_diff(vector<long double> y)
{
temp.at(i) = (y.at(i + 1) - y.at(i)) / (xvalues.at(i + 1) - xvalues.at(i));
}
temp.at(25) = 0;
temp.at(y.size()-1) = 0;
return temp;
}
vector<long double> DIFF::forward_diff(vector<long double> y)
@ -69,6 +48,35 @@ vector<long double> DIFF::forward_diff(vector<long double> y)
temp.at(0) = 0;
return temp;
}
vector<long double> DIFF::central_diff(vector<long double> y, vector<long double> x)
{
vector<long double> temp;
temp.resize(y.size());
for (unsigned int i = 1; i < y.size() - 1; i++)
{
temp.at(i) = (y.at(i+1) - y.at(i - 1)) / (x.at(i+1) - x.at(i - 1));
}
temp.at(0) = 0;
temp.at(y.size() - 1) = 0;
return temp;
}
vector<long double> DIFF::mid_diff(vector<long double>y, vector<long double>x)
{
vector<long double> temp;
temp.resize(y.size());
unsigned int i = 0;
temp.at(i) = (y.at(i + 1) - y.at(i)) / (x.at(i + 1) - x.at(i));
i++;
for (; i < y.size() - 1; 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) - y.at(i - 1)) / (x.at(i) - x.at(i - 1));
return temp;
}

View File

@ -10,11 +10,12 @@ public:
vector<long double> y1values; //y-values of 1st derivative
vector<long double> y2values; //y-values of 2nd derivative
vector<long double> diff();
vector<long double> forward_diff();
vector<long double> backward_diff();
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> mid_diff(vector<long double>, vector<long double>);
DIFF();

View File

@ -83,9 +83,17 @@ void nlgs()
}
void diff() {
DIFF diff;
//Plotter: https://www.desmos.com/calculator
print_array(diff.xvalues.data(), diff.forward_diff().data(), diff.xvalues.size());
print_array(diff.xvalues.data(), diff.backward_diff(diff.forward_diff()).data(), diff.xvalues.size());
DIFF diff;
vector<long double> AbfullX = {0, 5, 10, 15, 20 };
vector<long double> AbfullY = {1, 0.8811, 0.7366, 0.5430, 0.1698};
cout << "Erste Ableitung mit forward und backward" << endl;
print_array(diff.xvalues.data(), diff.forward_diff(diff.yvalues).data(), diff.xvalues.size());
print_array(diff.xvalues.data(), diff.central_diff(diff.yvalues, diff.xvalues).data(), diff.xvalues.size());
cout << "Zweite Ableitung mit backward" << endl;
print_array(diff.xvalues.data(), diff.backward_diff(diff.forward_diff(diff.yvalues)).data(), diff.xvalues.size());
cout << "Erste Ableitung 6.1.2" << endl;
print_array(diff.xvalues.data(), diff.mid_diff(AbfullY, AbfullX).data(), AbfullX.size());
}