math/example/fourier_transform_daubechies_ulp_plot.cpp
Nick 7887d43f83
Numerical evaluation of Fourier transform of Daubechies scaling funct… (#921)
* Numerical evaluation of Fourier transform of Daubechies scaling functions.

* Update example/calculate_fourier_transform_daubechies_constants.cpp

Co-authored-by: Matt Borland <matt@mattborland.com>

* Update example/fourier_transform_daubechies_ulp_plot.cpp

Co-authored-by: Matt Borland <matt@mattborland.com>

* Update include/boost/math/special_functions/fourier_transform_daubechies_scaling.hpp

Co-authored-by: Matt Borland <matt@mattborland.com>

* Update include/boost/math/special_functions/fourier_transform_daubechies_scaling.hpp

Co-authored-by: Matt Borland <matt@mattborland.com>

* Rename include file to reflect it implements both the scaling and wavelet.

* Add performance to docs.

* Update test/math_unit_test.hpp

Co-authored-by: Matt Borland <matt@mattborland.com>

* Add boost-no-inspect to files with non-ASCII characters.

---------

Co-authored-by: Matt Borland <matt@mattborland.com>
2023-06-13 08:05:00 -07:00

61 lines
1.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// boost-no-inspect
// (C) Copyright Nick Thompson 2023.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/math/special_functions/fourier_transform_daubechies.hpp>
#include <boost/math/tools/ulps_plot.hpp>
using boost::math::fourier_transform_daubechies_scaling;
using boost::math::tools::ulps_plot;
template<int p>
void real_part() {
auto phi_real_hi_acc = [](double omega) {
auto z = fourier_transform_daubechies_scaling<double, p>(omega);
return z.real();
};
auto phi_real_lo_acc = [](float omega) {
auto z = fourier_transform_daubechies_scaling<float, p>(omega);
return z.real();
};
auto plot = ulps_plot<decltype(phi_real_hi_acc), double, float>(phi_real_hi_acc, float(0.0), float(100.0), 20000);
plot.ulp_envelope(false);
plot.add_fn(phi_real_lo_acc);
plot.clip(100);
plot.title("Accuracy of 𝔑(𝓕[𝜙](ω)) with " + std::to_string(p) + " vanishing moments.");
plot.write("real_ft_daub_scaling_" + std::to_string(p) + ".svg");
}
template<int p>
void imaginary_part() {
auto phi_imag_hi_acc = [](double omega) {
auto z = fourier_transform_daubechies_scaling<double, p>(omega);
return z.imag();
};
auto phi_imag_lo_acc = [](float omega) {
auto z = fourier_transform_daubechies_scaling<float, p>(omega);
return z.imag();
};
auto plot = ulps_plot<decltype(phi_imag_hi_acc), double, float>(phi_imag_hi_acc, float(0.0), float(100.0), 20000);
plot.ulp_envelope(false);
plot.add_fn(phi_imag_lo_acc);
plot.clip(100);
plot.title("Accuracy of 𝕴(𝓕[𝜙](ω)) with " + std::to_string(p) + " vanishing moments.");
plot.write("imag_ft_daub_scaling_" + std::to_string(p) + ".svg");
}
int main() {
real_part<3>();
imaginary_part<3>();
real_part<6>();
imaginary_part<6>();
return 0;
}