XWWitPark/witpark_jzzs/xw_jzzs_web/public/lib/kriging/kriging.min.js

2 lines
6.9 KiB
JavaScript
Raw Permalink Normal View History

2024-09-12 00:10:00 +00:00
/* 2020-9-22 15:23:19 | 版权所有 军懋国兴 */
Array.prototype.max=function(){return Math.max.apply(null,this)},Array.prototype.min=function(){return Math.min.apply(null,this)},Array.prototype.mean=function(){for(var r=0,i=0;r<this.length;r++)i+=this[r];return i/this.length},Array.prototype.rep=function(r){return Array.apply(null,new Array(r)).map(Number.prototype.valueOf,this[0])},Array.prototype.pip=function(r,i){for(var t=!1,a=0,n=this.length-1;a<this.length;n=a++)this[a][1]>i!=this[n][1]>i&&r<(this[n][0]-this[a][0])*(i-this[a][1])/(this[n][1]-this[a][1])+this[a][0]&&(t=!t);return t};var kriging=function(){var x={};return kriging_matrix_diag=function(r,i){for(var t=[0].rep(i*i),a=0;a<i;a++)t[a*i+a]=r;return t},kriging_matrix_transpose=function(r,i,t){for(var a,n=Array(t*i),o=0;o<i;o++)for(a=0;a<t;a++)n[a*i+o]=r[o*t+a];return n},kriging_matrix_scale=function(r,i,t,a){for(var n,o=0;o<t;o++)for(n=0;n<a;n++)r[o*a+n]*=i},kriging_matrix_add=function(r,i,t,a){for(var n,o=Array(t*a),e=0;e<t;e++)for(n=0;n<a;n++)o[e*a+n]=r[e*a+n]+i[e*a+n];return o},kriging_matrix_multiply=function(r,i,t,a,n){for(var o,e,g=Array(t*n),l=0;l<t;l++)for(o=0;o<n;o++)for(e=g[l*n+o]=0;e<a;e++)g[l*n+o]+=r[l*a+e]*i[e*n+o];return g},kriging_matrix_chol=function(r,i){for(var t,a,n=Array(i),o=0;o<i;o++)n[o]=r[o*i+o];for(o=0;o<i;o++){for(t=0;t<o;t++)n[o]-=r[o*i+t]*r[o*i+t];if(n[o]<=0)return!1;for(n[o]=Math.sqrt(n[o]),t=o+1;t<i;t++){for(a=0;a<o;a++)r[t*i+o]-=r[t*i+a]*r[o*i+a];r[t*i+o]/=n[o]}}for(o=0;o<i;o++)r[o*i+o]=n[o];return!0},kriging_matrix_chol2inv=function(r,i){for(var t,a,n,o=0;o<i;o++)for(r[o*i+o]=1/r[o*i+o],t=o+1;t<i;t++){for(n=0,a=o;a<t;a++)n-=r[t*i+a]*r[a*i+o];r[t*i+o]=n/r[t*i+t]}for(o=0;o<i;o++)for(t=o+1;t<i;t++)r[o*i+t]=0;for(o=0;o<i;o++){for(r[o*i+o]*=r[o*i+o],a=o+1;a<i;a++)r[o*i+o]+=r[a*i+o]*r[a*i+o];for(t=o+1;t<i;t++)for(a=t;a<i;a++)r[o*i+t]+=r[a*i+o]*r[a*i+t]}for(o=0;o<i;o++)for(t=0;t<o;t++)r[o*i+t]=r[t*i+o]},kriging_matrix_solve=function(r,i){for(var t,a,n,o,e,g,l,f,h,u,p=i,m=Array(i*i),_=Array(i),s=Array(i),c=Array(i),y=0;y<i;y++)for(n=0;n<i;n++)m[y*i+n]=y==n?1:0;for(n=0;n<i;n++)c[n]=0;for(y=0;y<i;y++){for(n=l=0;n<i;n++)if(1!=c[n])for(o=0;o<i;o++)0==c[o]&&Math.abs(r[n*i+o])>=l&&(l=Math.abs(r[n*i+o]),a=n,t=o);if(++c[t],a!=t){for(e=0;e<i;e++)u=r[a*i+e],r[a*i+e]=r[t*i+e],r[t*i+e]=u;for(e=0;e<p;e++)u=m[a*i+e],m[a*i+e]=m[t*i+e],m[t*i+e]=u}if(s[y]=a,0==r[(_[y]=t)*i+t])return!1;for(h=1/r[t*i+t],r[t*i+t]=1,e=0;e<i;e++)r[t*i+e]*=h;for(e=0;e<p;e++)m[t*i+e]*=h;for(g=0;g<i;g++)if(g!=t){for(f=r[g*i+t],e=r[g*i+t]=0;e<i;e++)r[g*i+e]-=r[t*i+e]*f;for(e=0;e<p;e++)m[g*i+e]-=m[t*i+e]*f}}for(e=i-1;0<=e;e--)if(s[e]!=_[e])for(o=0;o<i;o++)u=r[o*i+s[e]],r[o*i+s[e]]=r[o*i+_[e]],r[o*i+_[e]]=u;return!0},kriging_variogram_gaussian=function(r,i,t,a,n){return i+(a-i)/t*(1-Math.exp(-1/n*Math.pow(r/t,2)))},kriging_variogram_exponential=function(r,i,t,a,n){return i+(a-i)/t*(1-Math.exp(-1/n*(r/t)))},kriging_variogram_spherical=function(r,i,t,a){return t<r?i+(a-i)/t:i+(a-i)/t*(r/t*1.5-.5*Math.pow(r/t,3))},x.train=function(r,i,t,a,n,o){var e={t:r,x:i,y:t,nugget:0,range:0,sill:0,A:1/3,n:0};switch(a){case"gaussian":e.model=kriging_variogram_gaussian;break;case"exponential":e.model=kriging_variogram_exponential;break;case"spherical":e.model=kriging_variogram_spherical}for(var g,l,f=r.length,h=Array((f*f-f)/2),u=0,p=0;u<f;u++)for(g=0;g<u;g++,p++)h[p]=Array(2),h[p][0]=Math.pow(Math.pow(i[u]-i[g],2)+Math.pow(t[u]-t[g],2),.5),h[p][1]=Math.abs(r[u]-r[g]);h.sort(function(r,i){return r[0]-i[0]}),e.range=h[(f*f-f)/2-1][0];var m=30<(f*f-f)/2?30:(f*f-f)/2,_=e.range/m,s=[0].rep(m),c=[0].rep(m);if(m<30)for(l=0;l<m;l++)s[l]=h[l][0],c[l]=h[l][1];else{for(l=p=g=u=0;u<m&&g<(f*f-f)/2;u++,p=0){for(;h[g][0]<=(u+1)*_&&(s[l]+=h[g][0],c[l]+=h[g][1],p++,!((f*f-f)/2<=++g)););0<p&&(s[l]/=p,c[l]/=p,l++)}if(l<2)return e}f=l,e.range=s[f-1]-s[0];var y=[1].rep(2*f),x=Array(f),v=e.A;for(u=0;u<f;u++){switch(a){case"gaussian":y[2*u+1]=1-Math.exp(-1/v*Math.pow(s[u]/e.range,2));break;case"exponential":y[2*u+1]=1-Math.exp(-1/v*s[u]/e.range);break;case"spherical":y[2*u+1]=s[u]/e.range*1.5-.5*Math.pow(s[u]/e.range,3)}x[u]=c[u]}var M=kriging_matrix_transpose(y,f