Python科学计算与数据处理 数值计算库docWord下载.docx
《Python科学计算与数据处理 数值计算库docWord下载.docx》由会员分享,可在线阅读,更多相关《Python科学计算与数据处理 数值计算库docWord下载.docx(10页珍藏版)》请在冰豆网上搜索。
它的增长速度非常快,因为的阶乘已经超出了双精度浮点数的表示范围,所以结果是无限的。
为了计算更大的范围,可以使用sgammaln():
sgammaln(x)来计算ln的值(||)。
它使用一种特殊的算法来直接计算函数的对数值,因此它可以代表一个更大的范围。
Sgammaln()常数和特殊函数的特殊模中的一些函数在数学意义上不是特殊函数,如计算log(x)值的logp(x)。
这是由于浮点数的精度有限,无法准确表示非常接近的实数。
例如,e的值不能用浮点数表示,所以log(e)的值是,而当使用logp()时,它可以非常精确地计算出来:
当x很小时,logp(x)近似等于x。
Elog(e)Slogp(e)e优化最小二乘拟合假设有一组实验数据(伊稀),它应该预先满足一定的函数关系yi=f(xi)。
通过这些已知信息,需要确定函数f的一些参数。
例如,如果函数f是线性函数f(x)=kxb,则参数k和b是要确定的值。
优化如果用P来表示函数中要确定的参数,那么目标就是找到一组P,从而优化下面函数S的值:
这个算法叫做最小二乘优化。
可在优化模块中使用Leastsq()对数据进行最小二乘拟合计算。
leastsq()的用法很简单,只需把计算误差的函数和要确定的参数的初始值传给它。
以下是用最小二乘法拟合线性函数的过程()。
优化使用最小二乘法拟合直线,并显示误差曲面(scipylesshsquarelinpy)importnumpyasfrommschhopizeimporttastesqx=NParray(,,,,,,Defresiduals):
计算以P为参数的直线与原始数据之间的误差K,B=PRETURNY(K*XB)#MISTANTSQ,使参数的初始值为残差输出数组的最小平方和(),R=最小二乘(残差),,,,,,,,,,,,,,函数的作用是:
传递一个误差计算函数和一个初始值。
初始值作为误差计算函数的第一参数传入计算结果r。
第一个元素是包含两个元素的元组。
第一个元素是表示拟合参数k、b的数组,如果第二个元素等于整数之一、、、,则拟合成功。
否则,将返回mesg程序的输出:
残差的参数p()是拟合直线的参数函数,它返回原始数据和拟合直线之间的误差。
K=Sb=优化让我们看另一个拟合正弦波数据的例子:
使用最小二乘法拟合有噪声的正复数波数据(scipyleastsquaresinpy),使用最小二乘法拟合有噪声的正弦波数据。
尽管通过拟合获得的参数可能与实际参数完全不同,但是由于正弦函数的周期性,拟合结果与实际函数一致。
importnumpyasnpfromsicoptimizeimportlestsqdeffunc(x,p):
用于数据拟合的函数:
a*sin(*pi*k*xta)a,k,Theta=preturna*npsin(*nppi*k*xta)优化函数(p,y,xy,x):
实验数据x,y和拟合函数之间的差值p是系数returnnyfunc(x,p)x=nplinspice(*nppi、、、)a,k,Theta=函数theta)#真实数据#实验数据y=y*nprandomrand(len(x))p=,#函数拟合参数optimize#对于第一个猜测调用leastsq进行数据拟合,残差是函数#p对于计算误差是拟合参数的初始值。
#args是实验数据PLSQ=最小平方(住宅,P,args=(Y,X))#除初始值外,还调用args参数来指定残差中使用的其他参数(X,Y的全局变量直接用于线拟合),元组的第一个元素也作为拟合参数数组printu的实参数返回。
Label=U实数)plplplot(x,y,label=u有噪声的实验数据)plplplot(x,func(x,plsq),优化程序中要拟合的func()是一个正弦函数,其参数p是一个包含三个决定正弦波的参数的数组:
A、k、θ,分别对应于正弦函数的振幅、频率和相角。
一组包含噪声的数据:
(x,y),其中数组y将随机噪声加到标准正弦波数据y上。
通过用最小二乘法拟合有噪声的实验数据(x,y),它可以找到阵列x和真实数据y之间的正弦关系,即确定参数,例如A、k、θ。
这里,(y,x)被传递给args参数。
Leastsq()将这两个附加参数传递给残差()。
因此,残差()有三个参数p作为正弦函数参数y,x作为表示实验数据的数组。
程序输出如下:
虽然拟合参数与实际参数完全不同,但由于正弦函数的周期性,拟合参数得到的函数与实际参数对应的函数是一致的。
实参数:
,,,拟合参数优化优化函数最小优化模块还提供了许多算法来寻找函数最小值:
fmin、fminpowerwell、fminCG、fminBG等。
以下是观察这些fmin*
(1)如何找到函数最小值的一个例子。
在这个例子中,函数f(x,y)计算的最小值是:
f(x,y)=(x)(yx)。
为了提高运算速度和精度,一些fmin()有一个fprime参数,它是一个计算目标函数f对每个自变量的偏导数的函数。
优化函数对变量x和y的偏导数是:
这个函数叫做罗森布鲁克(Rosenbrock)函数,它通常用来测试最小化算法的收敛速度。
它有一个非常平坦的山谷地区。
收敛到这个山谷区域相对容易,但是在山谷区域中寻找最小的点相对困难。
根据函数的计算公式,不难看出函数的最小值在(,)。
以下程序计算f(x,y)的最小值,并在搜索最小值时绘制由f表示的曲面和搜索路径。
当fmin*函数计算最小值(scipyfmindemopy)时,优化观察路径。
使用fmin()计算函数的最小值,并绘制路径以使用matplotlib搜索最小值。
importscipyoptizeasoptimportnumpyanmportsyspoints=deff(p):
x,Y=pz=(x)***(yx**)**pointappend((x,Y,z))returnzoptizedfprime(p):
x,Y=pdx=*x*x*(yx**)dy=*Y*x**returnnparay(dx,dy)initpoint=(,)try:
method=sysargvexcept:
method=fminfgsoptimizafminfunc=opdictFMINPOWELL:
RESULT=FMINFUNC(F,initpoint)#参数是目标函数和初始值Elifmethiodinfmincg,FMINLBFGSB,FMINTNC:
RESULT=FMINFUNC(F,initpoint,TheFPprime)#参数是目标函数、初始值和导数函数Elifmethodincobyla:
RESULT=fminfunc(F,initpoint),否则:
printfimplicationnotfoundsysexit()optimizeefF()计算f(x,y)的函数值。
为了记录最小化过程中的计算轨迹,每个计算点都被添加到f()中的全局列表点中。
Fprime()计算两个独立变量的f(x,y)在p处的偏导数函数值。
最小初始值设置为(,),该程序从优化模块的字典中获取命令行参数指定的最小值函数。
不同的fmin*
(1)参数是不同的,例如,有些算法不需要fprime()。
通过求解卷积的逆运算,优化下面的程序来演示fmin的功能,并比较FMIN、FMINPowell、FMINCG、FMINBFGS。
对于离散线性时不变系统h,如果它的输入是x,它的输出y可以用x和h的卷积表示:
y=x(*)h已知系统的输入x和输出y计算已知系统的传递函数h或传递函数h,输出y计算系统的输入x。
这个操作叫做反卷积。
Fmin计算反卷积方法只能用于极少数的序列,但评价fmin函数的性能仍然是好的。
(scipytestfminpy)OptimizeimiportscipyOptimizeasoptimportnumpYasnpDedminconvolve(fminfunc,X,h,y,yn,x):
#x(*)h=y,(*)表示卷积,yn是在y的基础上添加一些干扰噪声的结果,X是求解X的初始值defconvolfunc(h):
#计算ynx(*)h的幂,fmin将使该幂最小化返回npsum((ynn卷积(X,h))**)#调用fmin函数x)printfminfuncnameprintoptimize#the#outputx(*)h和yprinterrorfy之间的相对误差:
,Npsum((Np卷积(x,h)y)**)Npsum(y**)#h和hprinterrorofh之间的相对误差:
,Npsum((hh)**)Npsum(h**)printdefestn(m,n,nscale):
随机生成x,h,y,yn,x系列,并调用各种fmin函数来求解x长度的bm和h长度的n。
Nscale是干扰的强度x=nprandomrand(m)H=nprandomrand(n)y=npconvolve(x,H)yn=ynprandland(len(y))*NScalex=nprandomrand(n)优化以下是程序的输出:
testminconvolve(optfmin,x,H,y,yn,x)testminconvolve(optfminpower,x,H,y,yn,x)testfminconvolve(optfmincg,x,H,y,yn,yn)它的参数x是一个数组,它的值是方程的一组可能的解。
Func返回一组初始值,其中通过将x代入方程得到的每个方程的误差x是一个未知数。
假设要求解以下方程:
f(u,U,u)=,f(u,U,u)=,f(u,U,u)=优化,那么函数可以定义如下:
使用下列函数求解非线性方程:
(scipyfsolvepy)deffunc(x):
u,U,u=xruenf(u,U,U),f(u,U,U),f(u,U,U),U,U)optizefromschoptimizeimportfsolvefromthimportindeff(x)这是未知结果的初始值=fsolve(f,,,printtresultprintf(result)优化的输出是:
由于调用函数f时fsolve函数传递的参数是数组,如果数组中的元素直接用于计算,计算速度将会降低。
因此,在Python中,float函数用于将数组中的元素转换为标准浮点数,然后调用标准数学库中的函数进行计算。
当求解方程时,fsolve将自动计算方程的雅可比矩阵。
如果方程中有许多未知量,但与每个方程相关的未知量很少,即雅可比矩阵是稀疏的,则传递函数来计算雅可比矩阵将大大提高运算速度。
在仿真程序中,需要求解大量的近似未知的非线性方程。
每个方程平均与一个未知数相关,通过传递雅可比矩阵的计算函数,计算速度成倍提高。
优化雅可比矩阵的雅可比矩阵是一阶偏导数以某种方式排列的矩阵。
它给出了微分方程和给定点之间的最佳线性近似,因此它类似于多元函数的导数。
例如,前面的函数F,F,F和未知数u,u,u的雅可比矩阵如下:
优化optizefromsochoptimizeimportfsolvrommathimportin,cosdefj(x):
x,X,x=xtolist()return,,,X,*x*cos(x*x),*x*cos(x*x),,(scipyfsolvejacobianpy)优化雅可比矩阵的函数J(),它与F()一样,是一组其X参数未知的值。
它计算非线性方程的雅可比矩阵
通过fprime参数将j()传递给fsolve()。
由于本例中的未知数很少,雅可比矩阵的计算不能显著提高计算速度。
插值是一种通过已知的离散数据发现未知数据的方法。
与拟合不同,它要求曲线通过所有已知数据。
SciPy的插值模块提供了许多插值数据的功能。
用B样条曲线对一维数据进行插值可以用interpd()来完成。
调用形式如下:
实际上它不是一个函数而是一个类:
参数类型是一个插值类型。
给出插值的b样条曲线的阶数可以具有以下候选值:
interpd(x,y,kind=#linear#)插值插值elsquozerorsque、rsquonear:
步长插值等效于b样条曲线的阶数。
线性插值使用一条直线来连接所有采样点,这相当于使用扩展库中的相关函数来计算二次B样条曲线RSQUOSILINEARSQUAO,而LSQUOLINEARSQUAO直接使用用Python编写的函数来计算它们,结果是相同的。
#quadraticsquo、#cubic:
可以使用整数值直接指定高阶曲线和B样条曲线。
Interpd对象可以计算x值范围内任意点的函数值。
它可以像函数一样直接调用像NumPy一样的ufunc函数,并且可以计算数组中的每个元素并返回一个新的数组。
插值插值使用插值以不同的顺序插值数据。
(scipyinterpdpy)importnumpyasnpfromscipyimportinterpolateimportpylabasplx=nplinspispace(,,)y=npsin(x)xnew=nplinspispace(,)plplplplplplplplplot(x,y,ro#)forkindin#near###zero###linear###quandradic#:
f=interpolateinpinterped(x,y,kind=kind)ynew=f(xnew)plplot(xnew,ynew,label=str(kind))插值插值插值插值程序使用循环来
首先,使用数据点创建一个interpd对象f,并通过kind参数指定其顺序。
调用f()计算一系列插值结果。
Pllegend(loc=#右下角#)plshow()插值插值样条插值:
使用两个基本步骤:
()首先使用splrep()计算要插值的曲线的样条系数(splprep用于n维空间)()使用splev()计算给定点的样条插值结果。
tck=scipyinterpolsplip(x,y,w=none,XB=none,xe=none,k=,task=,s=none,t=none,fulloutput=,per=,quiet=)参数s用于确定平滑点数,通常为mSQRT(m),m是曲线点数。
如果插值不需要平滑,则s=1。
插值插值esplrep()输出一个单元数组(t,c,k)的一个元素,其中t是曲线点c,计算系数k是样条顺序,这通常是顺序,但可以改变k。
其中der用于样条计算或实际计算顺序必须满足条件DER=K
插值插值下面是一个用直线和基线在正弦波上插值点的例子。
(ScipyBSpline)importnumpyanpimportpylabasplfromcipyimportinterpolatex=nplinspace(,*nppinppi),y=npsin(x)xnew=nplinspace(,*nppinppi,(x,y)tck=interplantsprep(x,y)ybsplit=interplantsprep(x,y)ybsplit=interplantsprev(x,y,o,label=uraw数据)plplplplplplot(xnew,flinter(xnew),Label=ulinearinterpolation)插值插值插值插值
plplplot(xnew,ybSpline,label=UBSplineinterpolation)pllegend()plshow()interpolationinterplateextrapolation和splinefitting前面描述的interpd类要求其参数x是增量序列,并且只能在x的值范围内进行插值,它不能用于外推,即不能计算x的值范围之外的数据点。
单叶线类插值比插值更先进。
它支持外推。
其调用形式如下:
单变量样条(X,Y,W=无,BBOXS=无,无,K=,S=无)插值ex、y是保存数据点的XY坐标的数组,其中X必须是递增序列。
w是分配给每个数据点的权重值。
由bboxs序列指定的近似区间的边界K是样条曲线的阶。
S是一个平滑参数,它使最终生成的样条曲线满足条件SUM(W(YSP线(X)))LES,也就是说,当S时,样条曲线不一定通过每个数据点。
为了使曲线通过所有数据点,必须将S参数设置为单变量样条(X,Y,W=NONE,BBOXS=NONE,NONE,K=,S=NONE)插值插值使用单变量插值线:
(Scipypuslinepy)ImpNumPYanportPylaBasPlFromScipImport插值EX=NP)sy=interplantanivaritestpline(x,y,s=)(sx)interplantplfigure(figuresize=(,))plplplplplplot(x,y,label=u数据点)plplplplplot(sx,sy,label=u无噪声曲线)pllegend()plplplplplplot(x,y,label=u数据点)plplplplot(sx,sy,linewidth=,Label=u数据点)plplplplot(x,npsin(x),Label=u无噪声曲线)pllegend()plshow()插值
为有噪声的输入数据选择合适的S参数可以使样条曲线在没有噪声时接近波形。
可以认为是用样条曲线拟合数据。
插值插值二维插值使用插值()执行二维插值。
它的调用形式如下:
x、y、z都是一维数组。
如果多维数组被传入,它首先被转换成一维数组类型参数。
将插值操作的顺序指定为RSQUOLINEARROW、RSQUOCUCBICLSQO或rsquoquinticrsquo。
二维插值(scipyinterpdpy)使用interpd函数interpd(x,y,z,kind=#linearsquo),插值插值演示二维插值。
importnumpyasnpfromschyimportimportimportimportyplabaspldeffunc(X,y):
return(xy)*npexp(*(x**y**)#将xy轴分成*的网格Y,X=NPMgrid:
:
j:
JFvals=func(X,Y)#计算每个网格点的函数值#二维插值NEWFNC=插值#(X,Y,fvals,KIND=LSQUOCCUBICLSQO)插值XNEW=NPLINSPACE(,,YNEW=NPLINSPACE
plsubspot()plimshow(fval,extent=,,,cmap=plcmjet,interpolation=#nearest#,origin=lower)plsubspot()plimshow(fnew,extent=,,,,cmap=plcmjet,Interpolation=#nearest#,origin=lower)plshow()interpolatefunc是一个计算曲面上每个点的高度的函数。
获得的二维阵列的第一轴对应于Y轴,第一轴对应于X轴。
interpd对象可以像函数一样调用,以计算密集网格中插值曲面的高度值。
这里的参数是两个一维数组分别指定网格的XY轴坐标,而不通过网格创建网格坐标数组。
Interpd只能插值网格形状的采样值。
如果随机散列采样点需要插值,则需要径向基函数插值算法。
径向基函数支持多维散列点的插值。
插值插值使用径向基函数插值二维随机采样点。
(scipyrbfpy)importnumpyasnpfromscompumportimportimportimportpillaspldeffunc(x,y):
return(xy)*npexp(*(x**y**)#计算最后一个随机分布点x=nprandomuniform(,,Size=)y=nprandomuniform(,,size=)fvals=func(x,y)插值插值使用Rbfnewfunc=InterPlantRbf(x,y,fvals,function=#multiquadrac#)ynew,xnew=npmgridextend=,,,,,,cmap=plcmjet,Origin=lower)plsubset()plspread(x,y,fvals,cmap=plcmjet)plmshow(fnew,extend=,,,,,,cmap=plcmjet,origin=lower)plshow()插值使用随机点创建一个径向基函数,并通过函数参数指定使用的径向基函数。
径向基函数对象也可以像函数一样调用,用于计算密集网格上的点的值。
它的两个参数是指定XY轴坐标的两个数组。
与interpd对象不同