Monthly Archives: August 2017

Mathematica: 偏微分方程(1) 简单动力学系统的可视化

在Mathematica中可视化微分方程组的方式一般有两种,第一种是绘制向量场,涉及到的命令有VectorPlot[]和VectorPlot3D[]。而第二种是先将其求解出来,再绘制相应的图像,涉及到的命令主要有DSolve[]、NDSolve[]、DSolveValue[],第一个命令是求解析解,而第二个命令是求数值解 ,得到函数,第三个命令得到的数值。

以Volterra-Lotka方程为例,它是一个描述捕食者与被捕食者种群的方程组:

\frac{d x}{dt}=ax-bxy

\frac{dy}{dt}=cxy-dy

其中a,b,c,d四个参数均为正数。

Mathematica: 偏微分方程(1)

Mathematica可能是地表最强的数学软件,现在我们用它来解一下PDE。

PDE求解

以金融随机分析领域著名的BSM方程为例:

\frac{\partial f}{\partial s}+\frac{\partial f}{\partial S}rS+ \frac{1}{2}\frac{\partial f}{\partial S}\sigma ^2 S^2=rf

边界条件:f(S,T)=max(S-X,0)

式中,S表示基础资产的价值,而t自然是表示时间,\sigma表示基础资产的波动率,通常小于1,r为无风险利率,f表示期权价格,X为期权的执行价格,注意区分期权的价格与执行价格,T表示期权的到期时间,它的单位与波动率的单位相同,通常对于两者我们都以年为单位。在给定r, \sigma, T, X的情况下通过求解这个方程,我们可以得到期权的价格关于基础资产价格S与时间t的函数。

在Mathematica中我们用以下代码求解这个方程:

r=0.1;sigma=0.3;T=0.25;

sol=DSolve[{D[f[S, t], t] + r S D[f[S, t], S] + 1/2 D[f[S, t], {S, 2}] sigma^2 S^2 == r f[S, t],
f[S, T] == Max[S – X, 0]}, f[S, t], {S, t}]

在输入这个方程时,有几点需要注意的地方:

  1. 方程中的函数名后一定要加参数,比如f[S,t],无论是不是偏导数,不要只写f
  2. 偏导数的形式为D[f[S,t],{S,2}]表示对S的2阶偏导数。
  3. 边界条件与主方程一起设定。
  4. 一定记住是==而不要写成=,后者是赋值运算。

注意在输入的方程中,我们没有设定X,原因是运行时发现如果指定了X,则方程解不出来。

得到以下结果(直接copy as Latex):

$latex \left\{\left\{f(S,t)\to -0.487655 \left(e^{0.1 t} X \text{erfc}\left(\frac{1.17851 (-2 \log (S)+0.11 (t-0.25)+2 \log (X))}{\sqrt{0.25\, -t}}\right)-1.02532 S \text{erfc}\left(\frac{1.17851 (-2 \log (S)+0.29 (t-0.25)+2 \log (X))}{\sqrt{0.25\, -t}}\right)\right)\right\}\right\}$

可视化

用Plot3D可以进行可视化,对于X,我们可以用Manipulate动态展示:


c[S_, t_, X_] := Evaluate[f[S, t] /. sol];
Manipulate[Plot3D[c[S, t, X], {S, 0, X}, {t, 0, T}, AxesLabel -> Automatic,
PlotRange -> All], {{X, 40, "parameter"}, 30, 80,
Appearance -> "Labeled"}]

在Manipulate语句中用Apperance->”Labeled”来显示可变参数的数值。

结果如下:

2017-08-28_23-43-52

从图中可以看出,随着基础资产价格的升高,期权的价格也会变高,而随着时间接近有效期,期权价格也会降低。