我正在尝试使用C ++中的数字配方实现的Romberg方法进行数值积分。
我的问题是我不知道如何处理多变量函数的1D积分中的常量变量,即f(x)dx
的积分有效,但我不知道计算{的积分的语法{1}}。
我认为它与类和模板有关,我根本不熟悉这些,而且我在使用指针,额外的功能等等都没有成功。
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)
集成到3.此代码有效,但如果我取消注释上面的3行,即尝试将x=1
从ftwo(x, 2)
集成到3,我得到
x=1
我似乎缺乏对C ++中某些基本概念的理解,但我不知道哪一个,这使得谷歌难以解决问题。这也是我第一次遇到我可以传递一个没有参数的函数,即 invalid initialization of non-const reference of type ‘double&’ from an rvalue
of type ‘double’|
而不是romberg(fone,..)
,我不知道如何调用它。
如果有人能指出我需要学习的方向,我将非常感激。谢谢!
答案 0 :(得分:5)
您可以使用lambda来绑定参数:
auto f2 = [](double x) { return ftwo(x, 2.0);};
Itwo = qromb(f2, 1, 3);
答案 1 :(得分:3)
根据this deprecated library,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
,double
参数是ftwo
的非常量左值引用。哪个不能绑定到rvalue参数(这是错误消息所说的。)
您可能希望从std::bind
创建一元函数,您可以使用@ Jarod42建议的fun
或lambda函数来完成。