子程序surfit(iopt、m、x、y、z、w、xb、xe、yb、ye、kx、ky、s、nxest、nyest,*nmax、eps、nx、tx、ny、ty、c、fp、wrk1、lwrk1,wrk2、lwrk 2、iwrk、kwrk、ier)c给定一组数据点(x(i)、y(i)和z(i))和一组正c数w(i),i=1,。。。,m、 surfit子例程确定平滑双变量-矩形上kx和ky次的c样条逼近s(x,y)-c角xb<=x<=xe,yb<=y<=ye。c如果iopt=-1 surfit计算加权最小二乘样条c根据一组给定的节。c如果iopt>=0,这些结的总数nx和ny及其c位置tx(j),j=1,。。。,nx和ty(j),j=1,。。。,ny是自动选择的-按照惯例行事。然后通过以下方法实现s(x,y)的平滑度c最小化s(x,y)导数中的间断跳跃c跨越子面板的边界(tx(i),tx(i+1))*(ty(j),ty(j+1))。c光滑度由f(p)条件决定=c和((w(i)*(z(i)-s(x(i),y(i)))**2)小于等于s,s为给定的非负-活性常数,称为平滑因子。c拟合在b样条表示中给出(b样条系数c c((ny-ky-1)*(i-1)+j),i=1,。。。,nx-kx-1;j=1,。。。,ny-ky-1),可以进行评估-通过子程序bispev实现。c(c)c调用序列:c调用surfit(iopt,m,x,y,z,w,xb,xe,yb,ye,kx,ky,s,nxest,nyest,c*nmax、eps、nx、tx、ny、ty、c、fp、wrk1、lwrk1,wrk2、lwrk、iwrk、kwrk、ier)c(c)c参数:ciopt:整数标志。入口iopt必须指定加权c最小二乘样条(iopt=-1)或平滑样条(iopt=0c或1)必须确定。c如果iopt=0,例程将以一组初始节点开始c tx(i)=xb,tx(i+kx+1)=xe,i=1,。。。,kx+1;ty(i)=yb,ty(i+ky+1)=ye,i=c1,。。。,ky+1。如果iopt=1,例程将继续使用集合在最后一次调用例程时发现的节点数。c注意:iopt=1的呼叫必须始终是前一个-被iopt=1或iopt=0的另一个调用放弃。退出时c保持不变。c m:整数。在条目m上必须指定数据点的数量。c m>=(kx+1)*(ky+1)。退出时保持不变。c x:维数至少为(m)的实数数组。c y:维数至少为(m)的实数数组。cz:维数至少为(m)的实数数组。输入前,必须将x(i)、y(i)和z(i)设置为坐标第i个数据点的c,对于i=1,。。。,m.数据的顺序c分不重要。退出时保持不变。cw:维数至少为(m)的实数数组。在进入之前,w(i)必须c被设置为该组权重中的第i个值。w(i)必须c严格肯定。退出时保持不变。c xb,xe:实值。在条目xb、xe、yb和ye中必须指定界限-c yb,yearies的矩形近似域。c xb<=x(i)<=xe,yb<=y(i)<=ye,i=1,。。。,m.退出时保持不变。c kx,ky:整数值。输入kx和ky时必须指定度数花键的c。1<=kx,ky<=5。建议使用双三次曲线c(kx=ky=3)样条曲线。退出时保持不变。c s:真实。在输入时(在iopt>=0的情况下)s必须指定平滑c系数。s>=0。退出时保持不变。c关于选择s的建议,请参阅更多评论c nxest:整数。退出时保持不变。c nyest:整数。退出时保持不变。对于条目c,nxest和nyest必须指定c x和y方向所需的节数。c这些数字还将决定c例行程序。nxest>=2*(kx+1),nyest>=2*(ky+1)。c在大多数实际情况下nxest=kx+1+sqrt(m/2),nyest=c ky+1+平方米(m/2)就足够了。另请参阅更多评论。c nmax:整数。输入时nmax必须指定的实际尺寸c数组tx和ty.nmax>=nxest,nmax>=nyest。退出时c保持不变。c eps:真实的。c输入时,eps必须指定阈值以确定超定线性方程组的c有效秩-碳离子。0<每股收益<1。如果c实数的计算机表示是q,然后是10**(-q)c是eps在大多数实际应用中的合适值。退出时c保持不变。c nx:整数。c除非ier=10(如果iopt>=0),否则nx将包含总数c关于样条曲线的x变量的节数返回c近似值。如果计算模式iopt=1为c使用时,nx的值在sub之间应保持不变-c连续调用。c如果iopt=-1,则应在条目中指定nx的值c tx:维数为nmax的实数数组。c成功退出时,此数组将包含关于x变量的c样条曲线,即c内部节点tx(kx+2),。。。,tx(nx-kx-1)以及c附加节的位置tx(1)==tx(kx+1)=xb和c tx(nx-kx)==tx(nx)=b样条表示所需的xe。c如果使用计算模式iopt=1,则tx(1)的值,c。。。,在后续调用之间,tx(nx)应该保持不变。c如果使用计算模式iopt=-1,则值tx(kx+2),c。。。输入前,用户必须提供tx(nx-kx-1)。c另见限制(ier=10)。c ny:整数。c除非ier=10(如果iopt>=0),否则ny将包含总数c相对于样条曲线y变量的节数返回c近似值。如果计算模式iopt=1为使用c时,ny的值应在sub之间保持不变-c连续调用。c如果iopt=-1,则应在条目中指定ny的值c ty:维数nmax的实数数组。c成功退出时,此数组将包含关于y变量的c样条曲线,即c内部节点ty(ky+2),。。。,ty(ny-ky-1)以及c附加节的位置ty(1)==ty(ky+1)=yb和c ty(ny-ky)==ty(ny)=b样条表示所需的ye。c如果使用计算模式iopt=1,则ty(1)的值,c。。。,在后续调用之间,ty(ny)应保持不变。c如果使用计算模式iopt=-1,则值ty(ky+2),c。。。ty(ny-ky-1)必须由用户在输入之前提供。c另见限制(ier=10)。c c:维数至少为(nxest-kx-1)*(nyest-ky-1)的实数数组。c在成功退出时,c包含样条曲线的系数c近似值s(x,y)c fp:真实。除非ier=10,否则fp包含返回的样条曲线近似的c平方残差。c wrk1:维的实数数组(lwrk1)。用作工作区。c如果使用计算模式iopt=1,则wrk1(1)的值在随后的调用之间,c应该保持不变。c在出口wrk1(2)、wrk(3)、…、,。。。,wrk1(1+(nx-kx-1)*(ny-ky-1))将c包含值d(i)/max(d(i,。。。,(nx-kx-1)*(ny-ky-1)c与d(i)缩减三角形的第i对角元c矩阵用于计算b样条系数。它包括c那些平方小于eps的元素-假定秩亏数为0(ier<-2)。c lwrk1:整数。入口lwrk1必须指定c调用(子)程序中声明的数组wrk1。c lwrk1不得太小。c u=nxest-kx-1,v=nyest-ky-1,km=最大值(kx,ky)+1,c ne=最大值(nxest,nyest),bx=kx*v+ky+1,by=ky*u+kx+1,c如果(bx.le.by)b1=bx,b2=b1+v-kyc如果(bx.gt.by)b1=by,b2=b1+u-kx,则c lwrk1>=u*v*(2+b1+b2)+2*(u+v+km*(m+ne)+ne-kx-ky)+b2+1c wrk2:维的实数数组(lwrk2)。用作工作区,但c仅在遇到秩亏系统的情况下。c lwrk2:整数。入口lwrk2必须指定c调用(子)程序中声明的数组wrk2。c lwrk2>0。lwrk2=u*v*(b2+1)+b2的保存上限c,其中u、v和b2如上所示。如果有足够的数据c点,均匀散布在近似域上c,如果平滑因子s不太小,则存在c很可能不需要这个额外的工作空间。很多因此,通过设置lwrk2=1,可以节省内存的c。c(另请参见ier>10)c iwrk:维的整数数组(kwrk)。用作工作区。c kwrk:整数。入境时kwrk必须指定c调用(子)程序中声明的数组iwrk。c kwrk>=m+(nxest-2*kx-1)*(nyest-2*ky-1)。c ier:整数。除非例程检测到错误,否则ier包含c退出时为非正值,即。c ier=0:正常回报。返回的样条曲线的剩余和为c平方fp,使abs(fp-s)/s<=tol与tol a相关-程序将公差设置为0.001。c ier=-1:正常返回。返回的样条是插值c样条曲线(fp=0)。c ier=-2:正常回报。返回的样条曲线是加权最小的-kx和ky次的c平方多项式c情况fp给出了平滑因子s的上界。c ier<-2:警告。返回的样条曲线的系数为c计算为a的最小范数最小二乘解c(数值)缺秩系统。(-ier)给出等级。c特别是如果秩亏可以计算为c(nx-kx-1)*(ny-ky-1)+ier较大,结果可能为inac-c策展。他们还可能严重依赖每股收益。c ier=1:错误。所需存储空间超过可用空间c存储空间,由参数nxest和c最新。c可能导致:nxest或nyest太小。如果这些参数-系数已经很大,也可能表示s是c太小c返回的近似值是加权最小二乘c样条根据当前节点集。c参数fp给出了相应的加权和c平方残差(fp>s)。c ier=2:错误。c求光滑样条的迭代过程c fp=s。可能导致:s太小或eps选择不当。c返回了一个近似值,但相应的c加权残差平方和不满足c条件abs(fp-s)/s<tol。c ier=3:错误。最大迭代次数maxit(设置为20c通过程序),以便找到平滑样条曲线已达到fp=s的c。可能原因:太小c返回了一个近似值,但相应的c加权残差平方和不满足c条件abs(fp-s)/s<tol。c ier=4:错误。无法添加更多结,因为c b样条曲线系数(nx-kx-1)*(ny-ky-1)已经超过c数据点数量m。c可能导致:s或m太小。c返回的近似值是加权最小二乘c样条根据当前节点集。c参数fp给出了相应的加权和c平方残差(fp>s)。c ier=5:错误。无法添加更多结,因为c结将(准)与旧结重合。c可能导致:重量太小或太大c数据点不准确。c返回的近似值是加权最小二乘c样条根据当前节点集。c参数fp给出了相应的加权和c平方残差(fp>s)。c ier=10:错误。输入时,输入数据的有效性受到控制c必须满足以下限制。c-1≤iopt≤1,1≤kx,ky≤5,m>=(kx+1)*(ky+1),nxest>=2*kx+2,c nyest>=2*ky+2,0=nxest,nmax>=nyest,c xb<=x(i)<=xe,yb<=y(i)<=ye,w(i)>0,i=1,。。。,c lwrk1>=u*v*(2+b1+b2)+2*(u+v+km*(m+ne)+ne-kx-ky)+b2+1c kwrk>=m+(nxest-2*kx-1)*(nyest-2*ky-1)如果iopt=-1:2*kx+2<=nx<=nxest,则为cc x b(c x b)=0:s>=0c如果发现违反了其中一个条件,则控制c立即重新传递给调用程序。在那里面c的情况下,没有返回近似值。c ier>10:错误。lwrk2太小,即工作不足-计算最小最小二乘解的c空间c一个缺秩线性方程组。ier给出c lwrk2的请求值。没有近似re-c转身,但在保存了nx中包含的信息后,c ny、tx、ty、wrk1,并调整了lwrk2和c数组wrk2的维数相应地,用户可以c通过调用c使用iopt=1进行surfit。c(c)c进一步评论:c通过参数s,用户可以控制折衷拟合的贴近度和近似拟合的平滑度之间的关系。c如果s太大,则样条曲线将太平滑,信号将c丢失;如果s太小,样条线将拾取太多噪声。在里面c在极端情况下,如果c s=0,如果s为c非常大。在这些极端之间,将产生一个正确选择的sc在紧密度和平滑度之间取得良好的折衷。c决定对应于某个s的近似值是否为c令人满意,强烈建议用户检查配合c以图形方式显示。c s的建议值取决于权重w(i)。如果这些是c取1/d(i),d(i)为标准偏差的估计值cz(i),良好的s值应在范围(m-sqrt(2*m),m)内找到+c平方英尺(2*m))。如果z(i)中的统计误差未知c每个w(i)可以设为1,s通过试验确定c错误,考虑到上面的评论。最好的办法是c从非常大的s值开始(以确定最小平方c多项式和s)的相应上界fp0,然后到c逐渐减小s的值(例如,在c开始,即s=fp0/10,fp0/100,。。。并且更加小心c近似值显示更多细节)以获得更紧密的拟合。强烈建议选择s很小。这个相当大c增加了计算时间和内存需求。它也可能c导致秩亏(ier<-2)和endager数值稳定性。c以节省对程序提供的良好s值的搜索c不同的计算模式。在例程的第一次调用时,或c每当他想重新启动初始节点集时,用户c必须设置iopt=0。c如果iopt=1,程序将继续使用在c例程的最后一次调用。这将节省大量计算c时间,如果针对不同的s值重复调用surfit。c返回的样条曲线的结数及其位置c取决于s的值和形状的复杂性c函数。如果计算模式iopt=1如果使用c,则返回的节也可能取决于c以前的调用(如果这些调用较小)。因此,如果在数字之后在不同s值和iopt=1的试验中,用户最终可以c接受一个令人满意的适合,他可能值得打电话来c再次使用s的选定值surfit,但现在iopt=0。事实上,surfit可能会返回相同质量的近似值拟合度为c,但节点数较少,因此如果数据减少,效果会更好c也是用户的一个重要目标。c结的数量也可能取决于上限nxest和c奈斯特。事实上,如果在冲浪的某个阶段一个方向上的c(例如nx)已达到其上限值c(nxest),然后从该时刻开始,添加所有后续结c在另一(y)方向。这可能表明c nxest太小。另一方面,它为用户提供了选项限制程序在任何方向上定位的节数例如,通过设置nxest=2*kx+2(c nxest),用户可以指示他想要一个近似值c是变量x中kx次的简单多项式。c(c)c所需的其他子程序:c fpback、fpbspl、fpsurf、fpdisc、fpgivs、fprank、fprati、fprota、fpordec(c)c参考文献:c dierckx p.:一种基于样条函数的曲面拟合算法c ima j.数字。肛门。1 (1981) 267-283.c dierckx p.:一种基于样条函数的曲面拟合算法c报告tw50,计算机科学系,k.u.leuven,1980年。c dierckx p.:用样条曲线和曲面拟合,专著c《数值分析》,牛津大学出版社,1993年。c(c)c作者:c p.dierckx公司英国鲁汶大学计算机科学系c celestijnellaan 200a,b-3001 heverley,比利时。c电子邮件:Paul.Dierckx@cs.kuleuven.ac.bec(c)c创建日期:1979年5月c最新更新:1987年3月c(c)c。。c。。标量参数。。实xb,xe,yb,ye,s,eps,fp整数iopt,m,kx,ky,nxest,nyest,nmax,nx,ny,lwrk1,lwrck2,kwrk,ierc。。数组参数。。实x(m),y(m),*c((nxest-kx-1)*(nyest-ky-1)),wrk1(lwrk1),wrk(lwrk 2)整数iwrk(kwrk)c。。局部标量。。实际tol整数i,ib1,ib3,jb1,ki,kmax,km1,km2,kn,kwest,kx1,ky1,la,lbx,*lby、lco、lf、lff、lfp、lh、lq、lsx、lsy、lwest、maxit、ncest、nest、nek、,*nminx、nminy、nmx、nmy、nreg、nrint、nxk、nykc。。函数引用。。整数max0c。。子程序引用。。c fpsurfc。。我们设置了参数tol和maxit。最大值=20公差=0.1e-02c在开始计算之前进行数据检查。如果输入数据c无效,控制立即重新传递给调用程序。ier=10如果(eps.le.0。或。eps.ge.1)转到70如果(kx.le.0.或.kx.gt.5)转到70kx1=kx+1如果(ky.le.0.或.ky.gt.5)转到70ky1=ky+1kmax=最大值0(kx,ky)km1=kmax+1km2=km1+1如果(iopt.lt.(-1).或。iopt.gt.1)转到70如果(m.lt.(kx1*ky1))转到70nminx=2*kx1如果(nxest.lt.nminx.或.nxest.gt.nmax)转到70nminy=2*ky1毫米如果(nyest.lt.nminy.或.nyest.gt.nmax),则转到70嵌套=max0(nxest,nyest)nxk=nxest-kx1nyk=nyest-ky1ncest=nxk*nyknmx=nxest-nminx+1nmy=nyest-nminy+1nrint=nmx+nmynreg=nmx*nmyib1=kx*nyk+ky1jb1=ky*nxk+kx1ib3=kx1*nyk+1如果(ib1.le.jb1)转到10ib1=jb1ib3=ky1*nxk+110 lwest=ncest*(2+ib1+ib3)+2*(nrint+nest*km2+m*km1)+ib3kwest=m+nreg如果(lwrk1.lt.lwest.或.kwrk.lt.kwest)转到70如果(xb.ge.xe.或.yb.ge.ye)转到70做20 i=1,m如果(w(i).le.0.)转到70如果(x(i).lt.xb.或。x(i).gt.xe)转至70如果(y(i).lt.yb.或。y(i).gt.ye)转到7020继续如果(iopt.ge.0)转到50如果(nx.lt.nminx.或.nx.gt.nxest)转到70nxk=nx-kx1tx(kx1)=xbtx(nxk+1)=xe做30 i=kx1,nxk如果(tx(i+1).le.tx(i))转至7030继续如果(ny.lt.nminy.或.ny.gt.nyest),则转到70nyk=ny-ky1ty(ky1)=ybty(nyk+1)=yedo 40 i=千分之一,千分之一如果(ty(i+1).le.ty(i))转到7040继续转到6050如果(s.lt.0.)转到7060 ier=0我们划分工作空间并确定样条逼近节=1ki=kn+mlq=2la=lq+ncest*ib3lf=la+ncest*ib1lff=lf+ncestlfp=lff+ncestlco=lfp+nrintlh=lco+nrintlbx=lh+ib3nek=巢*km2lby=lbx+neklsx=lby+neklsy=lsx+m*km1调用fpsurf(iopt,m,x,y,z,w,xb,xe,yb,ye,kx,ky,s,nxest,nyest,*eps、tol、maxit、nest、km1、km2、ib1、ib3、ncest、nrint、nreg、nx、tx、,*ny,ty,c,fp,wrk1(1),wrk1(lfp),wrk1(lco),wrk1(lf),wrk1(lff),*wrk1(la)、wrk1,*wrk1(lh)、iwrk(ki)、iwrk(kn)、wrk2、lwrk2,ier)70返回结束