Я пытаюсь численно интегрировать особенно неприятный класс функций, для которых изначально я использовал GSL, но ошибки округления слишком велики для моей желаемой терпимости. После быстрого Google для квадратурных библиотек произвольной точности я нашел Quadpack ++, который, кажется, делает то, что я хочу, но я не могу заставить его работать, в частности, я не могу передать функцию этой формы:
mpf MyClass::foo( mpf t, const mpf_array& fourier ){
// do stuf
}
как вход, который он хочет в этой форме:
template<typename Real, class param_t>
class Function : public FtnBase<Real> {
public:
typedef Real defn_t(Real, param_t*);
defn_t& function_;
param_t* params_;
virtual Real operator() (Real x) {return function_(x, params_); }
Function(defn_t& function) : function_(function), params_(0) {}
Function(defn_t& function, param_t* params) : function_(function), params_(params) {}
~Function() {}
};
Я довольно новичок в C ++, так что, возможно, это что-то простое, но я попробовал каждую комбинацию указателей и std :: bind, о которой я могу думать, основываясь на Q1 а также Q2 но безрезультатно. Любая помощь с этим, или предложения для лучшего тестирования & задокументированные квадратурные библиотеки произвольной точности будут с благодарностью.
Прототип функции должен иметь два аргумента, а второй должен быть указателем. Я не знаю достаточно о mpf_array
знать, к чему это сводится. Если это не тип указателя, это проблема. (Также немного тестирования показывает, что имея const
перед параметрами не поможет.)
Вероятно, более важно, хотя, это должно быть свободно функция, и не может принадлежать к классу, как MyClass
(если это не статическая функция IIRC). Нужны ли вам элементы MyClass
внутри вашей функции?
(редактировать на основе комментария ниже). Показанный прототип функции требует (предположительно действительного) типа и указателя, в основном, на все другие аргументы, для которых вам потребуется не только эта вещь mpf_array, но и объект MyClass, из которого вам нужно ее вызвать. Так что вам нужно собрать все эти параметры в одну большую … вещь.
struct helper {
mpf_array foo;
MyClass bob;
}
Затем мы можем сделать функцию реле, которая упаковывает один из них в качестве аргументов, которые вам нужны:
mpf relay(mpf t, helper* args) {
return args->bob.actual_function(t, args->foo);
}
Затем создайте вспомогательную структуру с вашим fourier
массив и ваш фактический объект и передать его адрес в качестве второго параметра. Вероятно, здесь должны быть какие-то ссылки, чтобы избежать копирования, но я вписываю прямо в это поле (так что, возможно, здесь есть и другая ошибка).
Это … в лучшем случае хакерство, но в любом случае оно должно выполнить работу с этим пакетом. (Должен признать, я не знаю ни одной упаковки, которая бы подходила лучше, извините.)
Других решений пока нет …