gpt4 book ai didi

c++ - 使用 c++ eigen 库的未知错误

转载 作者:行者123 更新时间:2023-11-27 23:57:06 25 4
gpt4 key购买 nike

我是佛罗里达州立大学金融数学专业的一名研究生。我仍然是 C++ 的新手,但我正在尝试实现 Longstaff-Schwartz 方法来为美式期权定价。虽然,期刊中的算法有点令人生畏,因此我试图将用 Matlab 编写的代码转换为 C++。本质上,我使用 Matlab 代码作为指南。

一些 stackexchange 用户推荐我使用 Eigen 库,它包含一个很好的矩阵类。不幸的网站here没有告诉我如何从类里面制作我自己的功能。我坚持的是为 Matlab 中的函数制作一个 C++ 函数来执行此操作:

假设 t = 0:1/2:1 那么在 Matlab 中输出将是 t = 0 0.500 1

因此,我使用 Eigen 类创建了一个名为 range 的函数来实现上述后者。该函数如下所示:

MatrixXd range(double min, double max, double N){
MatrixXd m(N,1);
double delta = (max-min)/N;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
m(i,j) = min + i*delta;
}
}
return m;
}

我的 IDE (Eclipse) 上没有任何错误,但是当我运行我的代码并测试此功能时,我收到此错误消息:

c:\mingw\include\c++\6.2.0\eigen\src/Core/PlainObjectBase.h:736:7: 

error: static assertion failed:



FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED

我不确定哪里出了问题。非常感谢任何关于实现我正在尝试做的事情的建议或任何建议。

根据 Martijn Courteaux 的建议,我现在将 $N$ 更改为 int,但我现在收到一个我不理解的新错误:

c:\mingw\include\c++\6.2.0\eigen\src/Core/Matrix.h:350:7: error: static

assertion failed: THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE

EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3)

为了完整起见,我将在下面发布我的全部代码:

#include <iostream>
#include <cmath>
#include <limits>
#include <algorithm>
#include <Eigen/Dense>
#include <Eigen/Geometry>

using namespace Eigen;
using namespace std;


double LaguerreExplicit(int R, double x); // Generates the (weighted) laguerre value
double payoff_Call(double S, double K); // Pay off of a call option
double generateGaussianNoise(double mu, double sigma); // Generates Normally distributed random numbers
double LSM(int T, double r, double sigma, double K, double S0, int N, int M, int R);
// T Expiration time
// r Riskless interest rate
// sigma Volatility
// K Strike price
// S0 Initial asset price
// N Number of time steps
// M Number of paths
// R Number of basis functions

MatrixXd range(double min, double max, int N);

int main(){

MatrixXd range(0, 1, 2);



}


double payoff_Call(double S, double K){
double payoff;
if((S - K) > 0)
{
payoff = S - K;
}else
{
payoff = 0.0;
}
return payoff;
}

double LaguerreExplicit(int R, double x){
double value;
if(R==0)
{
value = 1;
}
else if(R==1)
{
value = 0.5*(pow(x,2) - 4.0*x + 2);
}
else if(R==3)
{
value = (1.0/6.0)*(-1*pow(x,3) + 9*pow(x,2) - 18*x + 6);
}
else if(R==4)
{
value = (1.0/24.0)*(pow(x,4) - 16*pow(x,3) + 72*pow(x,2) - 96*x + 24);
}
else if(R==5)
{
value = (1.0/120.0)*(-1*pow(x,5) + 25*pow(x,4) - 200*pow(x,3) + 600*pow(x,2) - 600*x + 120);
}
else if (R==6)
{
value = (1.0/720.0)*(pow(x,6) - 36*pow(x,5) + 450*pow(x,4) - 2400*pow(x,3) + 5400*pow(x,2) - 4320*x + 720);
}
else{
cout << "Error!, R is out of range" << endl;
value = 0;
}
value = exp(-0.5*x)*value; // Weighted used in Longstaff-Scwartz
return value;
}

double generateGaussianNoise(double mu, double sigma)
{
const double epsilon = std::numeric_limits<double>::min();
const double two_pi = 2.0*M_PI;

static double z0, z1;
static bool generate;
generate = !generate;

if (!generate)
return z1 * sigma + mu;

double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
}
while ( u1 <= epsilon );

z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
return z0 * sigma + mu;
}

MatrixXd range(double min, double max, int N){
MatrixXd m(N,1);
double delta = (max-min)/N;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
m(i,j) = min + i*delta;
}
}
return m;
}

double LSM(int T, double r, double sigma, double K, double S0, int N, int M, int R){
double dt = T/N;
MatrixXd m(T,1);

return 0;

}

这是我修复的更正函数代码:

VectorXd range(double min, double max, int N){
VectorXd m(N + 1);
double delta = (max-min)/N;
for(int i = 0; i <= N; i++){
m(i) = min + i*delta;
}
return m;
}

最佳答案

错误在这里:

MatrixXd range(double min, double max, double N){
MatrixXd m(N,1);

N 是 double 。 MatrixXd::MatrixXd(int, int) 的参数是 int

您可能希望将 N 设为 int


关于您的编辑:

第二个错误在这里:

MatrixXd range(0, 1, 2);

main() 函数中。不确定您在这里要做什么,但该构造函数无效。 编辑: 啊,我相信我有一个想法。您正在尝试调用名为 range 的函数。这样做:

MatrixXd result = range(0.0, 1.0, 2);

关于c++ - 使用 c++ eigen 库的未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com