上QQ阅读APP看书,第一时间看更新
3.3 利用SciPy求根
在开始编写求根算法之前,你可以先看一下关于scipy.optimize
的文档[1],SciPy包含了基于Python的一系列科学计算功能。这些开源的第三方库可能更适用于计算。
3.3.1 求根标量函数
scipy.optimize
模块包含bisect
、newton
、brentq
、ridder
等求根函数,下面用SciPy实现前述示例:
运行上述代码,输出如下结果:
可以看出SciPy得出的结果与之前非常相近。
SciPy为每种函数的实现设定了明确的条件。例如,二分法的常规函数调用如下:
该函数会返回f的零点。f(a)和f(b)不能是相同的符号。某些情况下,这些约束难以全部满足。例如,求解非线性隐含波动率模型时,波动率值不能为负。现实情况中,不修改函数条件很难求出波动率函数的根,我们需要根据实际情况自己编写合适的求根算法。
3.3.2 通用非线性求解器
scipy.optimize
模块还包含多维通用求解器,其中root
和fsolve
函数具有如下特征:
root(fun, x0[, args, method, jac, tol, ...])
:求一个向量函数的根。fsolve(func, x0[, args, fprime, ...])
:求一个函数的根。
返回的输出作为字典对象。再次使用前述非线性函数作为输入函数,得到以下输出:
初始预估值为5
,最终的根收敛到1.241 896 56
,这与我们之前得到的答案非常接近。接下来输入-5
作为初始预估值:
输出结果显示,该算法不收敛,返回与之前结果有偏差的根。如果我们看一下图,会发现曲线周围有许多点非常接近根。求解器会在保持理想精度的情况下,用最短时间求得最接近的答案。
[1]这是一个常用的Python第三方库,在前面的章节中我们已经下载。——译者注