【问题标题】:Approximating Solution to Stochastic Integral随机积分的近似解
【发布时间】:2015-03-26 04:32:59
【问题描述】:

我正在尝试将解决方案近似为:

其中 和 表示等式两边。

我的左侧代码是:

N = 2000;  Tend = 2*pi;  dt = Tend/N;  t = 0:dt:Tend;
f = sin(t)*sqrt(dt);
f = [0 ff(1:end-1)];
[fL,junk] = meshgrid(f,1);
dW = cumsum([0 randn(1,N)].*fL,2);

但我根本无法弄清楚右侧,这要困难得多。有人可以帮忙吗?

【问题讨论】:

  • StackOverflow 不支持 LaTeX,所以我采用了您的语法,将它们呈现为图像并将它们嵌入到您的帖子中。
  • fprime(s) = cos(s), b(s) = sum(randn(N * s/t,1 )*sqrt(dt)) 和 ds = dt... 你应该自然地,左右两边使用相同的随机数

标签: matlab probability differential-equations stochastic


【解决方案1】:

这看起来更像是部分积分公式,或者相当于乘积规则

(f*b)'=f'*b+f*b' or
d(f*b)=df*b+f*db = f'*b*dt+f*db

的微分,比任何随机微分方程。从这个意义上说,那里没有什么可以解决的,除非您想用b 作为维纳过程来数字验证规则的有效性。

或者你想测试数值方法的错误。但是第一步是确定数值方法,这似乎是欧拉法或欧拉-丸山法。

请参阅wikipedia: Euler-Maruyama methodwikipedia: Milstein method 和可读性很强的P. Forsyth: An introduction to Computational Finance without Agonizing Pain.


对于 Wiener 过程 b,您需要保留增量数组 db=randn(1,N)*sqrt(dt)(并将根排除在 f=sin(t) 之外)。那么左侧是f.*db 的总和,右侧是db 的部分和数组,理论上应该计算为

b(i+1)=b(i)+db(i)

使用更方便的matlab函数

b = cumsum(db)

将为您提供 b(i)=b(i-1)+db(i) 的转换版本。总而言之,这种转变可能会导致幅度为 sqrt(dt) 的误差,只有当您想将误差限制在幅度 dt 时才重要。

经过该操作,右边的项是f(N)*b(N)-f(0)*b(0)cos(t(i))*b(t(i))*dt(i)i=0,...,N-1 的总和。

所以你在左边比较

cumsum(sin(t).*db)

在右边

sin(t).*b - cumsum(cos(t).*b).*dt

这应该给出几乎相同的值。

在 matlab 的表弟 scilab 中,以下脚本给出了完全重叠的结果:

N=6000; dt=2*%pi/N;

t=0:1:N; t=t*dt;

dW=rand(t,"normal")*sqrt(dt);
W = cumsum(dW);

f=sin(t); fp=cos(t);

ex1=cumsum(f.*dW);
ex2=f.*W;
ex3=cumsum(fp.*W).*dt;

clf;
subplot(211);
plot(t+5*dt,ex1,t,ex2-ex3)
subplot(212);
plot(t,ex2-ex1-ex3)

人们也可以通过应用索引移位直接在离散化中看到恒等式。设置b=cumsum(db)f=sin(t)fp(t)=cos(t)的导数,cumsum(f.*db)的元素n是并变换为:

sum(i=1..n) f(i)*db(i) = sum(i=1..n) f(i)*(b(i)-b(i-1))

= -f(1)*b(0)+sum(i=1..n) (f(i)-f(i+1))*b(i) + f(n+1)*b(n)

= f(n)*b(n) - sum(i=1..n) fp(i)*b(i)*dt 
    + (f(n+1)-f(n))*b(n) - sum(i=1..n) (f(i+1)-f(i)-fp(i)*dt)*b(i)

具有虚拟值b(0)=0。最后一行包含f.*b-cumsum(fp.*b)*dtnth 元素,最后一行是离散化的误差项,大小为dt(t(n)-t(1))*dt

【讨论】:

  • 嗯...也许我应该问一下当我生成 db 和生成 b 时有什么区别,其中 b 是一个维纳过程。这个问题已经清楚地表明我认为我不再理解其中的区别了。
  • db是白噪声,b是维纳过程,也称为布朗运动(物理布朗运动是Ornstein-Uhlenbeck过程,命名方案有一些疑虑)。如果dt(i)=t(i+1)-t(i) 那么db(i)=randn()*sqrt(dt(i))b(i+1)=b(i)+db(i)
  • 是的,这是布朗运动的通常定义。
  • 你怎么用sum?我被教导使用累积和。
  • 这不完全是 matlab 语法。我不知道 `cumsum 实际上计算了部分和的数组。我打开了文档页面,但显然已阅读过它。现在你只需要处理 Ito 积分的约定。随机过程。 cumsum([1 -1 -1 1]) 是 [1 0 -1 0] 而部分和,如 b(i+1)=b(i)+db(i)`` 中的前加应该从零开始, [0 1 0 -1 0]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2010-12-07
  • 2014-09-25
相关资源
最近更新 更多