SciPy的介紹
在numpy庫的基礎(chǔ)上增加了眾多的數(shù)學(xué)、科學(xué)以及工程計(jì)算中的常用的庫函數(shù)
例如:線性代數(shù)、常微分方程數(shù)值求解氛改、信號處理稍刀、圖像處理撩独、稀疏矩陣......
SciPy的constants模塊包含了眾多的物理常數(shù):
from scipy import constants
print(constants.c)#真空中的光速299792458.0
print(constants.h)#普朗克常數(shù)6.62607004e-34
constants模塊中還包含了許多單位信息,它們是1單元的量轉(zhuǎn)換成標(biāo)準(zhǔn)單位時(shí)的數(shù)值:
print(constants.mile)? #1英里等于多少米
print(constants.inch)? #1英寸等于多少米
print(constants.gram)? #1克等于多少千克
print(constants.pound)? #1磅等于多少克
SciPy擬合與優(yōu)化-optimize
optimize模塊提供了許多數(shù)值優(yōu)化算法账月,可以實(shí)現(xiàn)综膀;非線性方程組求解、數(shù)據(jù)擬合局齿、函數(shù)最小值......
最小二乘擬合
optimize庫中的leastsq函數(shù):對數(shù)據(jù)進(jìn)行最小二乘擬合調(diào)用形式為:
leastsq(func,x0)
func(x)是計(jì)算方程組誤差的函數(shù)剧劝,它使得誤差的平方和最小抓歼;x0為待確定參數(shù)的初始值讥此。
import numpy as np
from scipy.optimize import leastsq
X = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])
Y = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
#計(jì)算以p為參數(shù)的直線和原始數(shù)據(jù)之間的誤差
def f(p):
??????? k,b = p
??????? return (Y-(k*X+b))
#leastsq使得f的輸出數(shù)組的平方和最小,參數(shù)初始值為[1,0]
r = leastsq(f,[1,0])
k,b = r[0]
print("k=",k,"b=",b)
非線性方程組求解
optimize庫中的fsolve函數(shù):對非線性方程組進(jìn)行求解谣妻,調(diào)用形式為:
fsolve(func,x0)
func(x)是計(jì)算方程組誤差的函數(shù)萄喳,它的參數(shù)x是一個(gè)矢量,表示方程組的各個(gè)未知數(shù)的一組可能解蹋半,func返回將x代入方程組之后得到的誤差:x0為未知數(shù)矢量的初始值他巨。
誤差函數(shù)定義:
from math import sin
def f(x):
??????? #轉(zhuǎn)換為標(biāo)準(zhǔn)的浮點(diǎn)數(shù)列表
??????? x0,x1,x2 = x.tolist()
??????? return[5*x1+3,
??????????????????? 4*x0*x0 - 2*sin(x1*x2),
??????????????????? x1*x2-1.5]
tolist()將x轉(zhuǎn)換為python的標(biāo)準(zhǔn)浮點(diǎn)數(shù)列表,在單個(gè)數(shù)值運(yùn)算時(shí)减江,標(biāo)準(zhǔn)浮點(diǎn)數(shù)比numpy的浮點(diǎn)數(shù)類型更快染突,從而縮短計(jì)算時(shí)間
#求解和結(jié)果輸出:
from scipy.optimize import fsolve
#f是計(jì)算的方程組誤差函數(shù),[1,1,1]是未知數(shù)的初始值
result = fsolve(f,[1,1,1])
#輸出方程組的解
print(result)
#輸出誤差
print(f(result))
SciPy插值-interpolate
插值:通過已知的離散數(shù)據(jù)來求解未知數(shù)據(jù)的方法辈灼,要求曲線通過所有的已知數(shù)據(jù)份企。
擬合:要求曲線函數(shù)與已知數(shù)據(jù)集的誤差最小,不要求曲線通過所有的已知數(shù)據(jù)茵休。
interpolate模塊提供了許多對數(shù)據(jù)進(jìn)行插值運(yùn)算的函數(shù):B樣條曲線差值薪棒、外推、spline擬合(UnivariateSpline插值運(yùn)算)榕莺、二維插值運(yùn)算等.....
B樣條曲線差值
一維數(shù)據(jù)的插值運(yùn)算可以通過interpld()實(shí)現(xiàn)俐芯,調(diào)用形式為:
interpld(x,y,kind='linear',...)
interpld可以計(jì)算x的取值范圍之內(nèi)任意點(diǎn)的函數(shù)值,并返回新的數(shù)組钉鸯。
參數(shù)x和y是一系列已知的數(shù)據(jù)點(diǎn)
參數(shù)kind是插值類型吧史,可以是字符串或整數(shù)
#創(chuàng)建數(shù)據(jù)點(diǎn)集
import numpy as np
x = np.linspace(0,10,11)
y = np.sin(x)
#繪制數(shù)據(jù)點(diǎn)集
import pylab as pl
pl.plot(x,y,'ro')
import numpy as np
import pylab as pl
from scipy import interpolate
#創(chuàng)建數(shù)據(jù)點(diǎn)集并繪制
x = np.linspace(0,10,11)
y = np.sin(x)
pl.plot(x,y,'ro')
#建立插值數(shù)據(jù)點(diǎn)
xnew = np.linspace(0,10,101)
for kind in ['nearest','zero','linear','quadratic']:
#創(chuàng)建interpld對象f、計(jì)算插值結(jié)果:
f = interpolate.interp1d(x,y,kind = kind)
ynew = f(xnew) #計(jì)算插值結(jié)果
pl.plot(xnew,ynew,label = str(kind))#繪制結(jié)果
pl.legend(loc = 'lower right')
pl.show()