[英]argumentless function, classes and templates
我正在嘗試使用Romberg方法進行數字積分,該方法由C ++中的數字配方實現。
我的問題是我不知道如何處理多變量函數的1D積分中的常量,即f(x)dx
的積分有效,但是我不知道用於計算f(x,y=2,z=5,...)dx
我相信這與類和模板有關,我一點都不熟悉,並且我在玩指針,額外的函數等都沒有成功。
#include <iostream>
#include <math.h>
#include <NR/nr3.h>
#include <NR/interp_1d.h>
#include <NR/quadrature.h>
#include <NR/romberg.h>
double fone (double x) { return 2*x*x*x; }
double ftwo (double x, double y){ return 2*x*x*x*y; }
int main()
{
double Ione = qromb(fone, 1, 3);
std::cout << Ione << std::endl;
//double Itwo = qromb(ftwo(x, 2.0), 1, 3);
//std::cout << Itwo << std::endl;
}
在這里,我將fone(x)
從x=1
集成到3。此代碼有效,但是如果我取消注釋上面的3行,即嘗試將ftwo(x, 2)
從x=1
集成到3,我得到
invalid initialization of non-const reference of type ‘double&’ from an rvalue
of type ‘double’|
似乎我缺乏對C ++中一些基本概念的理解,但我不知道哪個概念,這使得很難用Google搜索這個問題。 這也是我第一次遇到可以不帶參數的函數,即romberg(fone,..)
而不是romberg(fone(x),..)
而且我不知道該如何調用。
如果有人能指出我需要學習的方向,我將不勝感激。 謝謝!
您可以使用lambda綁定參數:
auto f2 = [](double x) { return ftwo(x, 2.0);};
Itwo = qromb(f2, 1, 3);
根據https://github.com/leonid-pishchulin/humanshape/blob/master/shapemodel/lib/nr/romberg.h ,所述qromb
函數被定義為:
template <class T>
Doub qromb(T &func, Doub a, Doub b, const Doub eps=1.0e-10) { /* ... */ }
調用時
double Itwo = qromb(ftwo(x, 2.0), 1, 3);
您將傳遞double
類型的右值對象作為第一個參數( ftwo
函數調用的結果)。 因此,模板參數T
被推斷為是double
和func
參數是一個非const左值參照double
。 哪個不能綁定到右值參數(這就是錯誤消息所說明的內容。)
您可能想從ftwo
生成一元函數,可以按照@ Jarod42的建議使用std::bind
或lambda函數來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.