Blatt 2 Aufg 2

This commit is contained in:
david 2019-05-07 09:30:09 +02:00
parent b21a005c2f
commit 6d1fa9687f
6 changed files with 32 additions and 17 deletions

View File

@ -37,9 +37,9 @@ Data::Data(const std::string& filename) {
} }
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
double uncertainty; double error;
file >> uncertainty; file >> error;
m_uncertainty.push_back(uncertainty); m_error.push_back(error);
} }
// done! close the file // done! close the file
@ -51,29 +51,37 @@ int Data::checkCompatibility(const Data* in, int N) const {
int fails = 0; int fails = 0;
for (int i = 0; i < size(); i++) { for (int i = 0; i < size(); i++) {
if (abs(in->measurement(i) - measurement(i)) > N * (in->uncertainty(i) if (abs(in->measurement(i) - measurement(i)) > N * (in->error(i)
+ uncertainty(i))) { + error(i))) {
fails++; fails++;
} }
} }
return fails; return fails;
} }
double Data::chisquare(double (*f)(double)) const {
double res = 0;
for (unsigned int i = 0; i < size(); i++) {
res += pow(measurement(i) - f(binCenter(i)), 2) / pow(error(i), 2);
}
return res / 52;
}
Data operator+(const Data& a, const Data& b) { Data operator+(const Data& a, const Data& b) {
assert(a.checkCompatibility(&b, 3) == 0); assert(a.checkCompatibility(&b, 3) == 0);
vector<double> avg_y; vector<double> avg_y;
vector<double> avg_w; vector<double> avg_w;
for (unsigned int i = 0; i < a.size(); i++) { for (unsigned int i = 0; i < a.size(); i++) {
double w1 = 1/(a.uncertainty(i) * a.uncertainty(i)); double w1 = 1/(a.error(i) * a.error(i));
double w2 = 1/(b.uncertainty(i) * b.uncertainty(i)); double w2 = 1/(b.error(i) * b.error(i));
avg_y.push_back((w1 * a.measurement(i) + w2 * b.measurement(i)) / (w1 + w2)); avg_y.push_back((w1 * a.measurement(i) + w2 * b.measurement(i)) / (w1 + w2));
avg_w.push_back(sqrt(1/(w1 + w2))); avg_w.push_back(sqrt(1/(w1 + w2)));
} }
Data d; Data d;
d.m_bins = a.m_bins; d.m_bins = a.m_bins;
d.m_data = avg_y; d.m_data = avg_y;
d.m_uncertainty = avg_w; d.m_error = avg_w;
return d; return d;
} }

View File

@ -11,14 +11,14 @@ class Data {
unsigned int size() const { return m_data.size(); } unsigned int size() const { return m_data.size(); }
double measurement(int i) const { return m_data[i]; } double measurement(int i) const { return m_data[i]; }
double uncertainty(int i) const { return m_uncertainty[i]; } double binCenter(int i) const { return m_bins[i] + (m_bins[i+1] - m_bins[i]) / 2.; }
double binCenter(int i) const { return 0; } double binLow(int i) const { return m_bins[i]; }
double binLow(int i) const { return 0; } double binHigh(int i) const { return m_bins[i+1]; }
double binHigh(int i) const { return 0; } double error(int i) const { return m_error[i]; }
double error(int i) const { return 0; }
std::string name() const { return m_name; } std::string name() const { return m_name; }
int checkCompatibility(const Data* in, int N) const; int checkCompatibility(const Data* in, int N) const;
double chisquare(double (*f)(double)) const;
friend Data operator+(const Data& a, const Data& b); friend Data operator+(const Data& a, const Data& b);
@ -27,7 +27,7 @@ class Data {
void assertSizes(); void assertSizes();
std::string m_name; std::string m_name;
std::vector<double> m_data; std::vector<double> m_data;
std::vector<double> m_uncertainty; std::vector<double> m_error;
std::vector<double> m_bins; std::vector<double> m_bins;
}; };

Binary file not shown.

BIN
exc2/run

Binary file not shown.

View File

@ -2,6 +2,7 @@
#include <vector> #include <vector>
#include <functional> #include <functional>
#include <string> #include <string>
#include <math.h>
#include "Data.hh" #include "Data.hh"
@ -59,6 +60,10 @@ void runTests() {
std::cout << (test() ? " ok" : " FAILED!") << std::endl; std::cout << (test() ? " ok" : " FAILED!") << std::endl;
} }
double background(double x) {
return 0.005 - 0.00001 * x + 0.08 * exp(-0.015 * x);
}
int main() { int main() {
using namespace std; using namespace std;
@ -83,10 +88,11 @@ int main() {
for(auto data : datas) { for(auto data : datas) {
cout << "measurement of " << data.name() << " in bin 27: " cout << "measurement of " << data.name() << " in bin 27: "
<< data.measurement(27) << " +- " << data.uncertainty(27) << endl; << data.measurement(27) << " +- " << data.error(27) << endl;
cout << "Chisquare of " << data.name() << ": " << data.chisquare(background) << endl;
for (auto data2 : datas) { for (auto data2 : datas) {
if (abs(data.measurement(27) - data2.measurement(27)) > if (abs(data.measurement(27) - data2.measurement(27)) >
data.uncertainty(27) + data2.uncertainty(27)) { data.error(27) + data2.error(27)) {
cout << "Data point doesnt agree" << endl; cout << "Data point doesnt agree" << endl;
} }
if (data.name() != data2.name()) { if (data.name() != data2.name()) {
@ -98,7 +104,8 @@ int main() {
} }
Data dat_avg = datA + datB + datC + datD; Data dat_avg = datA + datB + datC + datD;
cout << "Combined data: " << dat_avg.measurement(27) << endl cout << "Combined data: " << dat_avg.measurement(27) << endl
<< "Combined uncertainty: " << dat_avg.uncertainty(27) << endl; << "Combined error: " << dat_avg.error(27) << endl
<< "Combined chisquare: " << dat_avg.chisquare(background) << endl;
return 0; return 0;
} }

Binary file not shown.