首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::shared_ptr / QuantLib /随机过程/路径生成

boost::shared_ptr / QuantLib /随机过程/路径生成
EN

Stack Overflow用户
提问于 2011-12-27 12:52:22
回答 2查看 461关注 0票数 0

大家假期快乐!

我正在尝试使用QuantLib/Boost C++库生成平方根进程的路径,并且遇到了我认为是一个快速而简单的解决方案令人讨厌的小问题!我对编程非常陌生,所以请不要对我太苛刻:)下面是我所知道的: 1.构造函数如下所示:

SquareRootProcess( Real b, Real a, Volatility sigma, Real x0 = 0.0, const boost::shared_ptr<discretization>& d = boost::shared_ptr<discretization>(new EulerDiscretization))

  1. 用QuantLib模拟随机过程的关键函数是进化(t,x,dt,dw)。
  2. 下面是我的代码: #列入"stdafx.h“#include #include #include #include 使用命名空间QuantLib;SquareRootProcessSimulation() { Real miu0=0.0;Real miu;Real b=0.3;Real a=5.5;a=5.5 sigma=2.02;BigInteger seed=12324;MersenneTwisterUniformRng unifMt(种子);BoxMullerGaussianRng bmGauss(unifMt);const boost::shared_ptr &d = boost::shared_ptr( EndEulerDiscretization;boost::shared_ptr SquareRootProcess(b,a,sigma,miu0,d&);Time dt=0.1,t=0.0;Real dw;Size numVals=10;for (Size j=1;j<=numVals;++j) ( dw=bmGauss.next().value;(t,miu0,dt,dw);std::cout << "Time:“<< t+dt <<,miu_t:”<< miu << std::endl;t+=dt;};};int _tmain(int argc,_TCHAR* argv[]) { SquareRootProcessSimulation();std::cin.get();返回0;} `

我在编译/运行代码时没有出现错误,但是得到的是一个常量值,即某些东西显然是错误的。我认为问题在于我定义随机过程的方式,我不太清楚如何用boost::shared_ptr解释构造函数的最后一部分。

我很高兴听到任何建议和提示,并感谢您抽出时间阅读我的问题!

最诚挚的问候:)

EN

回答 2

Stack Overflow用户

发布于 2011-12-27 13:05:56

我不太确定这是否能解决这个问题,但至少我想帮忙:

首先,让我们看看SquareRootProcess的构造函数:

代码语言:javascript
复制
SquareRootProcess( Real b, 
                Real a, 
                Volatility sigma, 
                Real x0 = 0.0, 
                const boost::shared_ptr<discretization>& d = boost::shared_ptr<discretization>(new EulerDiscretization))

如您所见,最后两个参数都有默认值。这意味着您可以像这样调用这个函数

代码语言:javascript
复制
SquareRoot(b,a,sigma);

这意味着用b、a和西格玛的值调用函数。x0和d(最后两个参数)将获得它们在构造函数中写入的默认值。在这种情况下,对于x0和一个新的类型为离散化的共享指针对象,这个值为0.0。但是,由于您需要最后一个参数的值,所以默认值对您来说不是正确的选择。

据我所知,SquareRootProcess将计算一些内容,然后将数据存储在指针地址。这里我们来讨论构造器的第二部分& &。

参数列表中的&表示将函数传递给共享指针的引用。这意味着,如果调用函数,则指针(很可能)将被更改,并指向所需的值。如果函数具有引用调用,则实际上不需要在函数调用中添加任何符号。为了说明清楚,一些整数的处理过程是相同的:

代码语言:javascript
复制
void add(int a,int b,int& sum)
{
    sum = a + b;
}
int main()
{
     int sum;
     add(5,12,sum);
     // Now sum has the value 17 
     return 0;
}

长话短说:如果一个函数需要对一个对象的引用,那么您只需在函数调用中传递对象本身。

现在回到你的案子:

您只需要使用类型离散创建一个共享指针,然后在函数调用中传递它。

代码语言:javascript
复制
const boost::shared_ptr<StochasticProcess1D::discretization> d(new StochasticProcess1D::discretizitation(/*Whatever constructor is needed for this type*/));
boost::shared_ptr<SquareRootProcess> squareRootProcess(new SquareRootProcess(b, a, sigma, miu0, d));

这应该能做成这笔交易。如果成功了或者你还有什么问题就告诉我。诚挚的问候

票数 1
EN

Stack Overflow用户

发布于 2011-12-27 16:13:09

如前所述,如果不想自定义离散化对象,则不需要传递它,所以

代码语言:javascript
复制
boost::shared_ptr<SquareRootProcess> squareRootProcess(new 
                              SquareRootProcess(b, a, sigma, miu0));

会为你服务的。我看到的问题是不断发展的呼吁,你写道

代码语言:javascript
复制
miu=squareRootProcess->evolve(t,miu0,dt,dw);

但这将导致每一步始终从miu0开始。这里的想法是,您从t=0和x=miu0开始,然后向您提供t=0.1的新miu。然后从t=0.1和x=miu (而不是miu0)开始,生成另一个步骤。所以你得写些这样的东西

代码语言:javascript
复制
miu = miu0;
for (Size j=1;j<=numVals;++j)
{
    ...
    miu=squareRootProcess->evolve(t,miu,dt,dw);  // not miu0
    ...
}

才能得到想要的行为。

至于文档,您可能想看看实现QuantLib的第6章,它描述了Monte框架。它还将使您开始使用路径生成器;您可以使用这些生成器生成路径,而不必自己驱动流程。

哦,顺便问一下:您在sourcearchive.com使用的文档而不是quantlib.org上的“官方”文档有什么特别的原因吗?你觉得我们应该改进他们吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8644864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档