9 #include <gsl/gsl_integration.h> 22 double f(
double x,
void *params) {
23 double alpha = *(
double *) params;
24 double f = log(alpha * x) / sqrt(x);
34 gsl_integration_workspace *w = gsl_integration_workspace_alloc(1000);
37 double expected = -4.0;
47 gsl_integration_qags(&F, 0, 1, 0, 1e-7, 1000, w, &result, &error);
49 printf(
"result = % .18f\n", result);
50 printf(
"exact result = % .18f\n", expected);
51 printf(
"estimated error = % .18f\n", error);
52 printf(
"actual error = % .18f\n", result - expected);
53 printf(
"intervals = %zu\n", w->size);
56 gsl_integration_workspace_free(w);
64 static inline auto get_output_stream(
const char *name,
Format fmt) {
74 auto fn = [](
double x) {
return 4.0 / (1 + pow(x, 2)); };
90 auto fn = [](
double x) {
return log(x) / sqrt(x); };
97 const double expected = -4;
107 auto fn = [](
double x) {
return exp(-.5 * pow(x, 2)); };
113 const double expected = 2.5066282746310002;
123 auto fn = [](
double x) {
return exp(-.5 * pow(x, 2)); };
129 const double expected = 1.2533141373155001;
139 auto fn = [](
double x) {
return exp(-.5 * pow(x, 2)); };
145 const double expected = 1.2533141373155001;
155 auto fn = [](
double x) {
return exp(-.5 * pow(x, 2)); };
159 integral.
apply(2, 5);
162 const double expected = 5.7025405463957006e-2;
173 const auto mass = 10.0;
180 for (
auto mu : { 0.1, 0.4, 0.8 }) {
181 auto fn = [mu, mass](
double x) {
187 integral.
qng(0.0, s);
188 const auto v0Exact = sqrt(2 * mu * g * s);
189 const auto v0Approx = sqrt(-2.0 / mass * integral.
result());
190 data += { mass, s, mu, v0Approx, v0Exact };
193 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
203 const double l = 1.0;
204 const double density = 7.7 / 1e-3;
207 auto fnnum = [density](
double x) {
return x * density; };
208 auto fnden = [density](
double x) {
215 integralnum.qng(0, l);
216 integralden.
qng(0, l);
219 const double xcm = integralnum.result() / integralden.
result();
220 const double m = density * l;
223 sout <<
"mass =" << m << std::endl;
224 sout <<
"xcm=" << xcm << std::endl;
225 sout <<
"xcm=" << 0.5 * l <<
" (exact)" << std::endl;
236 const double density = 7.7 / pow(0.1, 3);
240 auto fnnumx = [density, radius](
double phi) {
241 return cos(phi) * density * pow(radius, 2);
245 auto fnnumy = [density, radius](
double phi) {
246 return sin(phi) * density * pow(radius, 2);
250 auto fnden = [density, radius](
double x) {
252 return density * radius;
256 gsl::Integral integralnumx(fnnumx), integralden(fnden), integralnumy(fnnumy);
258 integralnumx.qag(0.0,
Math::PI, 6, 1e-9);
263 const double xcm = integralnumx.result() / integralden.result();
264 const double ycm = integralnumy.
result() / integralden.result();
265 const double w = density * l;
268 sout <<
"w =" << w << std::endl;
269 sout <<
"xcm=" << xcm << std::endl;
270 sout <<
"ycm=" << ycm << std::endl;
271 sout <<
"xcm=" << 0 <<
" (exact)" << std::endl;
272 sout <<
"ycm=" << 2 * radius /
Math::PI <<
" (exact)" << std::endl;
281 const double mass = 1e3;
284 auto workFn = [](
double u) {
return 1 / pow(u, 2); };
287 auto exactFn = [](
double z) {
return 1 / z; };
291 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
295 for (
auto u : { 1e1, 1e2, 1e3, 1e4 }) {
297 integral.
qagiu(u, 1e-8);
298 const auto approxValue = -mass * integral.
result();
299 const auto exactValue = -mass * exactFn(u);
300 const auto error = abs(exactValue - approxValue);
301 data += { u, approxValue, exactValue, error };
315 const double x0 = 0, v0 = 0;
316 const double c1 = 10;
317 for (
auto c2 : { 1., -3. }) {
319 auto afn = [c1, c2](
double t) {
320 return c1 * t + c2 * sqrt(t);
324 auto vex = [c1, c2, v0](
double t) {
325 const auto static f1 = 2. / 3.;
326 const auto static f2 = 3. / 2.;
327 return 0.5 * c1 * pow(t, 2) + f1 * c2 * pow(t, f2) + v0;
330 auto xex = [c1, c2, v0, x0](
double t) {
331 const auto static f1 = 1. / 6.;
332 const auto static f2 = 4. / 15.;
333 const auto static f3 = 5. / 2.;
334 return f1 * c1 * pow(t, 3)
335 + f2 * c2 * pow(t, f3) + v0 * t + x0;
342 auto vfn = [&afn](
double t) {
344 integral.
apply(0, t);
348 for (
double tmax : { 10, 20, 30 }) {
350 integral1.
qng(v0, tmax, 0, 1e-6);
352 integral2.
qng(x0, tmax, 0, 1e-6);
364 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
375 for (
double c1 : { 10, 20 }) {
376 for (
double c2 : { 0.1, 0.2 }) {
378 auto fnex = [c1, c2](
double v) {
379 return 1 / c2 * log(c1 / (c1 - c2 * v));
383 auto fn = [c1, c2](
double v) {
384 return 1 / (c1 - c2 * v);
388 for (
double v : { 10, 30 }) {
390 integral.
qag(0, v, 6, 0, 1e-5);
391 data += { c1, c2, v, integral.
result(), fnex(v) };
397 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
406 const double v0 = -6;
408 const double F0 = 25, omega =
Math::PI / 10;
410 auto force = [F0, omega](
double t) {
411 return F0 * cos(omega * t);
415 auto vex = [v0, F0, m, omega](
double t) {
416 return v0 + F0 / (m * omega) * sin(omega * t);
419 for (
double t : { 2., 10., 15. }) {
421 integral.
qag(0, t, 6);
422 const double vnum = v0 + 1 / m * integral.
result();
423 data += { t, v0, force(t), vnum, vex(t) };
427 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
438 const double l0 = 1, v0 = 15;
441 auto force = [l0](
double x) {
442 return x - l0 * x / sqrt(pow(l0, 2) + pow(x, 2));
445 auto vex = [l0, v0, k, m](
double x) {
446 const static double trm1 = pow(v0, 2);
447 const static double trm2 = 2 * k / m;
448 const double trm3 = sqrt(pow(l0, 2) + pow(x, 2));
449 return sqrt(trm1 - trm2 * (0.5 * pow(x, 2) - l0 * trm3 + pow(l0, 2)));
452 auto vnum = [v0, k, m](
const auto &intresult) {
453 return sqrt(pow(v0, 2) - 2 * k / m * intresult);
456 for (
double x : { 1., 2.5, 4. }) {
458 integral.
qng(0, x, 0, 1e-6);
467 std::ofstream ofs = get_output_stream(__func__,
Output::latex);
468 ofs << std::setprecision(4);
477 const double k = 100;
479 const double m1 = 10, m2 = 5;
481 const double l = 20._cm;
483 auto vex = [k, m1, m2](
double x) {
484 return sqrt(k / (m1 + m2)) * x;
487 auto fn = [k, m1, m2](
double x) {
488 return k / (m1 + m2) * x;
495 ofs <<
"exact :" << vex(l) << std::endl;
496 ofs <<
"numerical :" << sqrt(2 * integral.
result()) << std::endl;
504 auto fn = [](
double x) {
return 1 / sqrt(sin(x)); };
510 const double expected = 2.0348053;
522 inline void show_results(std::ofstream &sout,
const T &gslint,
double expected) {
523 sout <<
"result = " << gslint.result() <<
"\n";
524 sout <<
"exact result = " << expected <<
"\n";
525 sout <<
"estimated error= " << gslint.error() <<
"\n";
526 sout <<
"actual error = " << abs(gslint.result() - expected) <<
"\n";
527 sout <<
"intervals = " << gslint.intervals() <<
"\n";
536 gsl_integration_cquad_workspace *w = gsl_integration_cquad_workspace_alloc(100);
538 double expected = -4;
542 double result, error;
550 gsl_integration_cquad(&F, 0, 1, 0, 1e-7, w, &result, &error, &nevals);
552 printf(
"result = % .18f\n", result);
553 printf(
"exact result = % .18f\n", expected);
554 printf(
"estimated error = % .18f\n", error);
555 printf(
"actual error = % .18f\n", result - expected);
556 printf(
"intervals = %zu\n", w->size);
559 gsl_integration_cquad_workspace_free(w);
int qagiu(double xmin, double epsabs=0, double epsrel=1e-9)
qagiu numerische Integration mit automatischer Schrittweitenanpassung von xmin bis + Unendlich ...
int qagil(double xmax, double epsabs=1e-9, double epsrel=1e-9)
qagil numerische Integration mit automatischer Schrittweitenanpassung von - Unendlich bis xmax ...
void ex11()
ex11 Teilchen bewegt sich geradlinig mit einer geschwindigkeitsabhängigen Beschleunigung ...
The CQUADIntegral class adaptive numerische Integration geeignet für Integranden mit Singularitäten o...
void save(std::ostream &ofs, Format fmt) const
save Schreibe Tabelle in Datei
void ex8()
ex8 Massenmittelpunkt eines homogenen Halbkreisrings
The Data class Eine Klasse für Zahlentabellen mit fester Anzahl von Spalten. Die Anzahl der Reihen wä...
auto qng(double xmin, double xmax, double epsabs=1e-9, double epsrel=1e-9)
qng Integration von stetigen Funktionen keine automatische Schrittweitenanpassung ...
void ex9()
ex9 Potenzielle Energie einer Masse im Gravitationsfeld der Erde
void gslex()
gslex numerische Integration Beispiel mit Kommentaren https://www.gnu.org/software/gsl/doc/html/integ...
static const Format terminal
void ex12()
ex12 Geschwindigkeitsänderung durch Kraftstoß
static std::ofstream get_stream(const std::string &fname)
get_output_stream Öffnen einer Ausgabedatei falls die Datei nicht geöffnet werden kann wird ein Fehle...
void show_results(std::ofstream &sout, const T &gslint, double expected)
show_results
void ex7()
ex7 Massenmittelpunkt eines homogenen dünnen zylindrischen Stabs
void ex10()
ex10 Teilchen bewegt sich geradlinig mit zeitabhängiger Beschleunigung
int qags(double xmin, double xmax, double epsabs=1e-9, double epsrel=1e-9)
qags numerische Integration mit automatischer Schrittweitenanpassung von singulären Funktionen ...
void show_results(std::ofstream &sout, double expected)
show_results einfache Ausgabe des Ergebnisses mit Zusatzinformationen
void gslex_cquad()
gslex_cquad numerische Integration mit CQUAD (gsl-Beispiel mit Kommentaren)
void ex0()
ex0 nicht adaptive Gauß-Kronrod Integration
void ex14()
ex14 Zwei Blöcke und eine Feder
double f(double x, void *params)
f Integrand (gsl-Funktion)
The Integral class erste Varianten der gsl-Klasse zur numerischen Integration. Der Template-Parameter...
static constexpr double PI
void ex6()
ex6 Teilchen bremst auf geradliniger Strecke
static const Format latex
static constexpr double g
int apply(double xmin, double xmax, double epsabs=1e-9, double epsrel=1e-9)
apply Ausführung der numerischen Integration
int qagi(double epsabs=1e-9, double epsrel=1e-9)
qagi numerische Integration mit automatischer Schrittweitenanpassung von - Unendlich bis + Unendlich ...
int qag(double xmin, double xmax, int key, double epsabs=1e-9, double epsrel=1e-9)
qag numerische Integration mit automatischer Schrittweitenanpassung (Gauß-Kronrod) ...
double result() const
result
void ex13()
ex13 Perle bewegt sich reibungsfrei entlang einer Schiene unter dem Einfluss einer Feder ...