gsl — передача функции-члена в квадратурную библиотеку C ++ произвольной точности (Quadpack ++)

Я пытаюсь численно интегрировать особенно неприятный класс функций, для которых изначально я использовал 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 но безрезультатно. Любая помощь с этим, или предложения для лучшего тестирования & задокументированные квадратурные библиотеки произвольной точности будут с благодарностью.

2

Решение

Прототип функции должен иметь два аргумента, а второй должен быть указателем. Я не знаю достаточно о 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 массив и ваш фактический объект и передать его адрес в качестве второго параметра. Вероятно, здесь должны быть какие-то ссылки, чтобы избежать копирования, но я вписываю прямо в это поле (так что, возможно, здесь есть и другая ошибка).

Это … в лучшем случае хакерство, но в любом случае оно должно выполнить работу с этим пакетом. (Должен признать, я не знаю ни одной упаковки, которая бы подходила лучше, извините.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]