#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <functional>
using namespace std;
#define MIN -10.
#define MAX 10.
#define EPS 0.01
template <typename T, class F> T trapezoid(F f, T a, T b, T eps) {
T result = T(0);
while (a <= b) {
result += f(a);
a += eps;
}
result -= (f(a) + f(b)) / T(2);
return result * eps;
}
template <class F>
double splot(F g, F l, double x, double sigma, double gamma) {
//template <class F1, class F2>
//double splot(F1 g, F2 l, double x, double sigma, double gamma) {
cout << typeid(g).name()<<" vs." <<typeid(g).name()<<endl;
auto s = [g, l, x, sigma, gamma](double x_prime)->double {
return g(x_prime, sigma) * l(x - x_prime, gamma);
};
return trapezoid(s, MIN, MAX, EPS);
}
int main (void) {
double x = 0., sigma = 1.5, gamma = 0.1;
auto gauss = [](double x, double sigma)->double {
return exp(-1*x*x / (2*sigma*sigma)) / (sigma * sqrt(2*M_PI));
};
auto lorentz = [](double x, double gamma)->double {
return gamma / (M_PI*(x*x + gamma*gamma));
};
cout << "x: " << x << endl << "V(x): " <<
splot(gauss, lorentz, x, sigma, gamma) << endl;
return 0;
}
I2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgTUlOIC0xMC4KI2RlZmluZSBNQVggMTAuCiNkZWZpbmUgRVBTIDAuMDEKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBjbGFzcyBGPiBUIHRyYXBlem9pZChGIGYsIFQgYSwgVCBiLCBUIGVwcykgewogICAgVCByZXN1bHQgPSBUKDApOwogICAgd2hpbGUgKGEgPD0gYikgewogICAgICAgIHJlc3VsdCArPSBmKGEpOwogICAgICAgIGEgKz0gZXBzOwogICAgfQogICAgcmVzdWx0IC09IChmKGEpICsgZihiKSkgLyBUKDIpOwogICAgcmV0dXJuIHJlc3VsdCAqIGVwczsKfQoKdGVtcGxhdGUgPGNsYXNzIEY+CmRvdWJsZSBzcGxvdChGIGcsIEYgbCwgZG91YmxlIHgsIGRvdWJsZSBzaWdtYSwgZG91YmxlIGdhbW1hKSB7Ci8vdGVtcGxhdGUgPGNsYXNzIEYxLCBjbGFzcyBGMj4KLy9kb3VibGUgc3Bsb3QoRjEgZywgRjIgbCwgZG91YmxlIHgsIGRvdWJsZSBzaWdtYSwgZG91YmxlIGdhbW1hKSB7CgkKICAgIGNvdXQgPDwgdHlwZWlkKGcpLm5hbWUoKTw8IiB2cy4iIDw8dHlwZWlkKGcpLm5hbWUoKTw8ZW5kbDsgCgogICAgYXV0byBzID0gW2csIGwsIHgsIHNpZ21hLCBnYW1tYV0oZG91YmxlIHhfcHJpbWUpLT5kb3VibGUgewogICAgICAgIHJldHVybiBnKHhfcHJpbWUsIHNpZ21hKSAqIGwoeCAtIHhfcHJpbWUsIGdhbW1hKTsKICAgIH07CgogICAgcmV0dXJuIHRyYXBlem9pZChzLCBNSU4sIE1BWCwgRVBTKTsKfQoKaW50IG1haW4gKHZvaWQpIHsKICAgIGRvdWJsZSB4ID0gMC4sIHNpZ21hID0gMS41LCBnYW1tYSA9IDAuMTsKCiAgICBhdXRvIGdhdXNzID0gW10oZG91YmxlIHgsIGRvdWJsZSBzaWdtYSktPmRvdWJsZSB7CiAgICAgICAgcmV0dXJuIGV4cCgtMSp4KnggLyAoMipzaWdtYSpzaWdtYSkpIC8gKHNpZ21hICogc3FydCgyKk1fUEkpKTsKICAgIH07CgogICAgYXV0byBsb3JlbnR6ID0gW10oZG91YmxlIHgsIGRvdWJsZSBnYW1tYSktPmRvdWJsZSB7CiAgICAgICAgcmV0dXJuIGdhbW1hIC8gKE1fUEkqKHgqeCArIGdhbW1hKmdhbW1hKSk7CiAgICB9OwoKICAgIGNvdXQgPDwgIng6ICIgPDwgeCA8PCBlbmRsIDw8ICJWKHgpOiAiIDw8CiAgICAgc3Bsb3QoZ2F1c3MsIGxvcmVudHosIHgsIHNpZ21hLCBnYW1tYSkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In function ‘int main()’:
prog.cpp:49:43: error: no matching function for call to ‘splot(main()::<lambda(double, double)>&, main()::<lambda(double, double)>&, double&, double&, double&)’
splot(gauss, lorentz, x, sigma, gamma) << endl;
^
prog.cpp:24:8: note: candidate: template<class F> double splot(F, F, double, double, double)
double splot(F g, F l, double x, double sigma, double gamma) {
^~~~~
prog.cpp:24:8: note: template argument deduction/substitution failed:
prog.cpp:49:43: note: deduced conflicting types for parameter ‘F’ (‘main()::<lambda(double, double)>’ and ‘main()::<lambda(double, double)>’)
splot(gauss, lorentz, x, sigma, gamma) << endl;
^