这次说一说构造均分向量的操作。
1. 造轮子
在数值计算中 ,我们通常要在区间[a,b]之间产生指定步长或者给定采样点的一组等差数列(或者说是一个向量),例如MATLAB中的linspace函数,linspace(a,b,n)在区间[a,b]之间产生n个元素,定义一下我们自己的函数,如下:
def lincount(a,b,n):
if n<2:
raise("'n' should be n>=2")
dh=(b-a)/(n-1)
cnt=0
ret=[]
while cnt<n:
ret.append(a+cnt*dh)
cnt+=1
return ret
#测试
print(lincount(1,5,7)) # [1.0, 1.6666666666666665, 2.333333333333333, 3.0, 3.6666666666666665, 4.333333333333333, 5.0]
另外一种是给定步长的方式,定义函数如下:
def linstep(a,b,dx):
ret=[]
x=a
while x<b:
ret.append(x)
x+=dx
return ret
#测试
print(linstep(1,3,0.3)) # [1, 1.3, 1.6, 1.9000000000000001, 2.2, 2.5, 2.8]
2. 用轮子
这么基本而又常见的需求,肯定是有其他大佬早就完成了这样的工作,我们完全没必要自己造轮子,numpy模块中就有这样的函数,分别是arange和linspace。
arange和Python原生的range类似,但是后者只支持整数,而arange则更加强大,支持浮点数,它的语法是这样的:
numpy.arange(startstop,step)
例如:
import numpy as np
x=np.arange(1,3,0.3)
print(x) # [1. 1.3 1.6 1.9 2.2 2.5 2.8]
可以看到,这比前面自己定义的运算结果要好一些
linspace的用法如下:
numpy.linspace(start, stop, num=50)
例如:
import numpy as np
x=np.linspace(1,5,7)
print(x) # [1. 1.66666667 2.33333333 3. 3.66666667 4.33333333 5.]
当然,numpy还提供了geomspace和logspace生成特定规律的向量,不过这两个函数出场率不高,这里就不展开介绍了,感兴趣的可以去numpy官网检索一下。
总结
本次的内容也奠定了后面的基调,主要是使用现成的工具软件,解决我们的问题,而不是去阐述原理,例如高斯消元法,需要自己去准备数学知识,文章只会告诉如何使用现有的工具包。
另外,使用Python的时候,一定要有这种意识,就是在有特定需求的时候,不要急着去造轮子,你会发现你需要的很多工具,别人都已经提供了(而且大概率比你做的更好)。虽然我们可以通过数学或者工程知识去制造我们的轮子(例如lincount和linstep函数),甚至诸如线性方程的求解,或者函数的求根等,我们也可以自己实现。虽然可以,但没必要,因为是这明显违背了我们使用Python的初衷,能用现成的库,还去自己写,在Python中这不啻为一种犯罪行为。不过,并不是所有的工作都有对应的轮子,或者你想造个自行车结果发现只有现成的汽车轮子,这个时候,还是要学会自己写一写算法的。