(十一)用SciPy模块求积分、插值与解方程组

integrate子模块求积分

1、格式为integrate.quad(func,a,b),分别表示被积函数、区间下限和上限;
2、quad表示自适应求积分,还可选固定高斯求积分fixed_quad()、自适应高斯求积分quadrature()和用于龙贝格积分的romberg();
3、func必须是自定义函数
4、输出的值是积分值和最大误差。

from scipy import integrate
import numpy as np
#求标准正态分布下在区间[-3,3]内的概率
def f(x):
    return 1/(np.sqrt(2*np.pi))*np.exp(-0.5*x**2)
integrate.quad(f,-3,3)
Out[3]: (0.9973002039367399, 1.1072256488739329e-14)

interpolate子模块插值运算

1、格式为interp1d(x,y,kind),x和y是一系列已知的数据点,有y=f(x)的关系,kind参数是插值类型;
2、常用的kind是linear和quadratic,线性和2阶非线性插值

import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus']=False
from scipy.interpolate import interp1d
t=np.array([0.25,0.5,0.75,1.0,3.0,5.0])#输入已有期限的数组
r=np.array([0.27334,0.27898,0.28382,0.2882,0.30414,0.31746])
#输入已有期限的利率数据,每一数据与t数组的期限对应
tnew=np.array([0.25,0.5,0.75,1.0,2.0,3.0,4.0,5.0])
#增加了未知的2年和4年期限的数组
types=['linear','quadratic','cubic']#用三种方法插值求2年和4年的利率,并且画图
for i in types:
	f=interp1d(x=t,y=r,kind=i)
	rnew=f(tnew)#f是一个函数,需要传入新的x
	print(i,rnew)
	plt.plot(tnew,rnew,label=i)
	plt.xlabel('期限')
	plt.ylabel('利率')
	plt.legend()
plt.grid()
plt.title('三种插值方法求2年和4年的利率')

linear [0.27334 0.27898 0.28382 0.2882  *0.29617* 0.30414 *0.3108*  0.31746]
quadratic [0.27334 0.27898 0.28382 0.2882 *0.29879359* 0.30414 *0.31036214* 0.31746]
cubic [0.27334 0.27898 0.28382 0.2882 *0.29937769* 0.30414 *0.30824731* 0.31746]

在这里插入图片描述

求解方程组

1、用子模块linalg中的solve函数,格式为linalg.solve(a,b),a为等号左边的系数矩阵,b为等号右边的系数。

#ri为四支股票的收益率矩阵,索引为交易日期,列为股票;
#rp为四支股票每天的组合收益率,求每支股票的权重。
ri=np.array([[ 0.003731,  0.021066, -0.004854,  0.006098],
       [-0.001838,  0.001842, -0.016544, -0.003738],
       [-0.003087, -0.000344, -0.033391,  0.007123],
       [-0.024112,  0.011704, -0.029563, -0.01457]])
rp=[0.00606,-0.003752,-0.004597,-0.016129]
from scipy import linalg
weight=linalg.solve(ri,rp)#求出来的是一个array
stock=(['a','b','c','d'])
for i in range(4):
    print(stock[i],round(weight[i],2))

a 0.44
b 0.18
c 0.15
d 0.23

2、用子模块optimize中的fsolve函数,格式为optimize.fsolve(func,x0),func是求解的方程,需要定义;x0表示初始猜测方程组的解(随便填)。

from scipy import optimize
def g(w):
    w1,w2,w3,w4=w
    e1=0.003731*w1+0.021066*w2-0.004854*w3+0.006098*w4-0.00606
    e2=-0.001838*w1+0.001842*w2-0.016544*w3-0.003738*w4+0.003752
    e3=-0.003087*w1-0.000344*w2-0.033391*w3+0.007123*w4+0.004597
    e4=-0.024112*w1+0.011704*w2-0.029563*w3-0.01457*w4+0.016129
    return [e1,e2,e3,e4]#此处返回等于0的式子
optimize.fsolve(g,[0.1,0.1,0.1,0.1])
Out[25]: array([0.43541844, 0.17651768, 0.14536151, 0.233276])

3、个人认为求解线性方程组问题用子模块linalg中的solve函数更简单一些,但是在一些非线性的求解问题中(比如求债券的YTM),用fsolve函数更好。

发布了31 篇原创文章 · 获赞 2 · 访问量 1612

猜你喜欢

转载自blog.csdn.net/hzk427/article/details/104042500
今日推荐